MailChimp for WooCommerce - Version 2.4.1

Version Description

Download this release

Release Info

Developer ryanhungate
Plugin Icon wp plugin MailChimp for WooCommerce
Version 2.4.1
Comparing to
See all releases

Code changes from version 2.4.0 to 2.4.1

Files changed (93) hide show
  1. CHANGELOG.txt +15 -1
  2. README.md +5 -0
  3. README.txt +23 -7
  4. admin/class-mailchimp-woocommerce-admin.php +83 -31
  5. admin/css/mailchimp-woocommerce-admin-settings-5.2.css +2 -2
  6. admin/css/mailchimp-woocommerce-admin-settings.css +31 -4
  7. admin/js/mailchimp-woocommerce-admin.js +1 -1
  8. admin/partials/mailchimp-woocommerce-admin-tabs.php +8 -2
  9. admin/partials/tabs/api_key_create_account.php +4 -4
  10. admin/partials/tabs/logs.php +10 -11
  11. admin/partials/tabs/newsletter_settings.php +8 -11
  12. admin/partials/tabs/store_info.php +1 -1
  13. admin/partials/tabs/store_sync.php +3 -3
  14. bootstrap.php +60 -38
  15. includes/api/assets/class-mailchimp-cart.php +13 -2
  16. includes/api/assets/class-mailchimp-customer.php +3 -0
  17. includes/api/class-mailchimp-api.php +17 -3
  18. includes/api/class-mailchimp-woocommerce-create-list-submission.php +11 -0
  19. includes/api/class-mailchimp-woocommerce-transform-orders-wc3.php +6 -1
  20. includes/api/class-mailchimp-woocommerce-transform-products.php +8 -1
  21. includes/class-mailchimp-woocommerce-queue.php +226 -0
  22. includes/class-mailchimp-woocommerce-service.php +16 -0
  23. includes/class-mailchimp-woocommerce.php +15 -11
  24. includes/processes/class-mailchimp-woocommerce-cart-update.php +19 -6
  25. includes/processes/class-mailchimp-woocommerce-single-order.php +18 -2
  26. includes/processes/class-mailchimp-woocommerce-user-submit.php +21 -2
  27. includes/vendor/action-scheduler/.editorconfig +24 -0
  28. includes/vendor/action-scheduler/.gitattributes +14 -0
  29. includes/vendor/action-scheduler/.gitignore +4 -0
  30. includes/vendor/action-scheduler/.travis.yml +45 -0
  31. includes/vendor/action-scheduler/Gruntfile.js +57 -0
  32. includes/vendor/action-scheduler/classes/ActionScheduler_ActionFactory.php +6 -6
  33. includes/vendor/action-scheduler/classes/ActionScheduler_DataController.php +2 -2
  34. includes/vendor/action-scheduler/classes/ActionScheduler_ListTable.php +2 -1
  35. includes/vendor/action-scheduler/classes/ActionScheduler_QueueRunner.php +6 -7
  36. includes/vendor/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php +2 -2
  37. includes/vendor/action-scheduler/classes/abstracts/ActionScheduler.php +18 -0
  38. includes/vendor/action-scheduler/classes/abstracts/ActionScheduler_Store.php +1 -1
  39. includes/vendor/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php +84 -38
  40. includes/vendor/action-scheduler/classes/migration/Controller.php +1 -1
  41. includes/vendor/action-scheduler/classes/migration/Scheduler.php +1 -1
  42. includes/vendor/action-scheduler/codecov.yml +13 -0
  43. includes/vendor/action-scheduler/composer.json +36 -0
  44. includes/vendor/action-scheduler/composer.lock +4878 -0
  45. includes/vendor/action-scheduler/docs/_layouts/default.html +2 -5
  46. includes/vendor/action-scheduler/docs/android-chrome-192x192.png +0 -0
  47. includes/vendor/action-scheduler/docs/android-chrome-256x256.png +0 -0
  48. includes/vendor/action-scheduler/docs/api.md +82 -37
  49. includes/vendor/action-scheduler/docs/apple-touch-icon.png +0 -0
  50. includes/vendor/action-scheduler/docs/assets/css/style.scss +2 -2
  51. includes/vendor/action-scheduler/docs/faq.md +22 -16
  52. includes/vendor/action-scheduler/docs/favicon-16x16.png +0 -0
  53. includes/vendor/action-scheduler/docs/favicon-32x32.png +0 -0
  54. includes/vendor/action-scheduler/docs/favicon.ico +0 -0
  55. includes/vendor/action-scheduler/docs/index.md +14 -16
  56. includes/vendor/action-scheduler/docs/perf.md +21 -16
  57. includes/vendor/action-scheduler/docs/usage.md +39 -36
  58. includes/vendor/action-scheduler/docs/version3-0.md +68 -0
  59. includes/vendor/action-scheduler/docs/wp-cli.md +5 -1
  60. includes/vendor/action-scheduler/functions.php +35 -27
  61. includes/vendor/action-scheduler/package-lock.json +2138 -0
  62. includes/vendor/action-scheduler/package.json +39 -0
  63. includes/vendor/action-scheduler/phpcs.xml +39 -0
  64. includes/vendor/action-scheduler/tests/bootstrap.php +3 -0
  65. includes/vendor/action-scheduler/tests/phpunit.xml.dist +17 -1
  66. includes/vendor/action-scheduler/tests/phpunit/ActionScheduler_Mock_Async_Request_QueueRunner.php +19 -0
  67. includes/vendor/action-scheduler/tests/phpunit/ActionScheduler_Mocker.php +35 -0
  68. includes/vendor/action-scheduler/tests/phpunit/jobs/ActionScheduler_NullAction_Test.php +1 -1
  69. includes/vendor/action-scheduler/tests/phpunit/jobstore/ActionScheduler_DBStoreMigrator_Test.php +26 -0
  70. includes/vendor/action-scheduler/tests/phpunit/jobstore/ActionScheduler_DBStore_Test.php +396 -0
  71. includes/vendor/action-scheduler/tests/phpunit/jobstore/ActionScheduler_HybridStore_Test.php +273 -0
  72. includes/vendor/action-scheduler/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php +43 -4
  73. includes/vendor/action-scheduler/tests/phpunit/lock/ActionScheduler_OptionLock_Test.php +45 -0
  74. includes/vendor/action-scheduler/tests/phpunit/logging/ActionScheduler_DBLogger_Test.php +132 -0
  75. includes/vendor/action-scheduler/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php +43 -17
  76. includes/vendor/action-scheduler/tests/phpunit/migration/ActionMigrator_Test.php +145 -0
  77. includes/vendor/action-scheduler/tests/phpunit/migration/BatchFetcher_Test.php +76 -0
  78. includes/vendor/action-scheduler/tests/phpunit/migration/Config_Test.php +33 -0
  79. includes/vendor/action-scheduler/tests/phpunit/migration/LogMigrator_Test.php +44 -0
  80. includes/vendor/action-scheduler/tests/phpunit/migration/Runner_Test.php +92 -0
  81. includes/vendor/action-scheduler/tests/phpunit/migration/Scheduler_Test.php +118 -0
  82. includes/vendor/action-scheduler/tests/phpunit/procedural_api/procedural_api_Test.php +46 -9
  83. includes/vendor/action-scheduler/tests/phpunit/runner/ActionScheduler_QueueCleaner_Test.php +2 -2
  84. includes/vendor/action-scheduler/tests/phpunit/runner/ActionScheduler_QueueRunner_Test.php +102 -34
  85. includes/vendor/action-scheduler/tests/phpunit/schedules/ActionScheduler_CronSchedule_Test.php +40 -9
  86. includes/vendor/action-scheduler/tests/phpunit/schedules/ActionScheduler_IntervalSchedule_Test.php +13 -4
  87. includes/vendor/action-scheduler/tests/phpunit/schedules/ActionScheduler_NullSchedule_Test.php +1 -1
  88. includes/vendor/action-scheduler/tests/phpunit/schedules/ActionScheduler_SimpleSchedule_Test.php +4 -4
  89. languages/mc-woocommerce-pt_BR.mo +0 -0
  90. languages/mc-woocommerce-pt_BR.po +0 -933
  91. languages/mc-woocommerce.pot +317 -295
  92. mailchimp-woocommerce.php +2 -2
  93. public/class-mailchimp-woocommerce-public.php +9 -3
CHANGELOG.txt CHANGED
@@ -1,4 +1,18 @@
1
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  = 2.4.0 =
3
  * update for latest Action Scheduler v3.1.4
4
  * adds customer language on Cart and Order sync
@@ -242,4 +256,4 @@
242
  = 0.1.7 =
243
  * fixing various bugs with the sync and product issues.
244
  = 0.1.2 =
245
- * fixed admin order update hook.
1
  == Changelog ==
2
+ = 2.4.1 =
3
+ * adds scrolling frame for logs
4
+ * fix for Coupon Deletion via WooCommerce API
5
+ * removes all non-Mailchimp notices
6
+ * update for latest version of Action Scheduler v3.1.4
7
+ * documentation updates
8
+ * fix for errors on activation following deactivation
9
+ * fix for PHP notice on Woocommerce Import Tax rate page
10
+ * adds error handling on store add/update
11
+ * use denormalized order items values in initial sync
12
+ * adds function allowing tags for specific users
13
+ * adds include/exclude Mailchimp script
14
+ * fix for double opt-in issues on saved settings
15
+ * fixes transactionals on guest checkout
16
  = 2.4.0 =
17
  * update for latest Action Scheduler v3.1.4
18
  * adds customer language on Cart and Order sync
256
  = 0.1.7 =
257
  * fixing various bugs with the sync and product issues.
258
  = 0.1.2 =
259
+ * fixed admin order update hook.
README.md CHANGED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ # Mailchimp for WooCommerce Wordpress Plugin
2
+
3
+ Have a question or need help? Submit an [issue](https://github.com/mailchimp/mc-woocommerce/issues/new?assignees=&labels=investigating&template=bug_report.md&title=%5BBUG%5D+Description+of+Issue).
4
+
5
+ Also check out our [Wiki](https://github.com/mailchimp/mc-woocommerce/wiki) for documentation on common troubleshooting and features available to developers.
README.txt CHANGED
@@ -4,10 +4,10 @@ Tags: ecommerce,email,workflows,mailchimp
4
  Donate link: https://mailchimp.com
5
  Requires at least: 4.9
6
  Tested up to: 5.4
7
- Stable tag: 2.4.0
8
  Requires PHP: 7.0
9
  WC requires at least: 3.5
10
- WC tested up to: 4.0
11
  License: GPLv2 or later
12
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
13
  Connect your store to your Mailchimp audience to track sales, create targeted emails, send abandoned cart emails, and more.
@@ -16,6 +16,7 @@ Connect your store to your Mailchimp audience to track sales, create targeted em
16
  Join the 17 million customers who use Mailchimp, the world's largest marketing automation platform, to develop their e-commerce marketing strategy. With the official Mailchimp for WooCommerce integration, your customers and their purchase data are automatically synced with your Mailchimp account, making it easy to send targeted campaigns, automatically follow up with customers post-purchase, recommend products, recover abandoned carts, and measure the ROI of your marketing efforts. And it's completely free.
17
  ###What you can do with this plugin
18
  - Sync to your Audience in Mailchimp with purchase data.
 
19
  - Set up marketing automations to remind customers about items they left in their cart or viewed on your site, win back lapsed customers, and follow up post-purchase. (Now available for free accounts!)
20
  - Showcase product recommendations.
21
  - Track and segment customers based on purchase history and purchase frequency.
@@ -49,6 +50,12 @@ You’ll need to do a few things to connect your WooCommerce store to Mailchimp.
49
 
50
  == Frequently Asked Questions ==
51
 
 
 
 
 
 
 
52
  = What is the recommended way to sync larger stores? =
53
 
54
  To optimize the performance of your Mailchimp integration we recommend running the queue in CLI mode. Please refer to [this guide](https://github.com/mailchimp/mc-woocommerce/wiki/Advanced-Queue-Setup-In-CLI-mode) in our Wiki.
@@ -70,8 +77,17 @@ At this time, the synchronization of product categories from WooCommerce to Mail
70
  If you are unable to sync or connect with Mailchimp, you can open a ticket on our [Github plugin page](https://github.com/mailchimp/mc-woocommerce/issues). Please provide the version of the plugin and PHP you're using, any fatal errors in the WooCommerce logs (WooCommerce -> Status -> Logs) you're seeing, along with relevant information to the problem you're experiencing.
71
 
72
  == Changelog ==
73
- = 2.4.0 =
74
- * update for latest Action Scheduler v3.1.4
75
- * adds customer language on Cart and Order sync
76
- * adds batch processing for queues
77
- * support for Brazilian Portuguese pt_BR Language
 
 
 
 
 
 
 
 
 
4
  Donate link: https://mailchimp.com
5
  Requires at least: 4.9
6
  Tested up to: 5.4
7
+ Stable tag: 2.4.1
8
  Requires PHP: 7.0
9
  WC requires at least: 3.5
10
+ WC tested up to: 4.2
11
  License: GPLv2 or later
12
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
13
  Connect your store to your Mailchimp audience to track sales, create targeted emails, send abandoned cart emails, and more.
16
  Join the 17 million customers who use Mailchimp, the world's largest marketing automation platform, to develop their e-commerce marketing strategy. With the official Mailchimp for WooCommerce integration, your customers and their purchase data are automatically synced with your Mailchimp account, making it easy to send targeted campaigns, automatically follow up with customers post-purchase, recommend products, recover abandoned carts, and measure the ROI of your marketing efforts. And it's completely free.
17
  ###What you can do with this plugin
18
  - Sync to your Audience in Mailchimp with purchase data.
19
+ - Sync new subscribers to your Audience when they create an account and opt-in.
20
  - Set up marketing automations to remind customers about items they left in their cart or viewed on your site, win back lapsed customers, and follow up post-purchase. (Now available for free accounts!)
21
  - Showcase product recommendations.
22
  - Track and segment customers based on purchase history and purchase frequency.
50
 
51
  == Frequently Asked Questions ==
52
 
53
+ = Who is subscribed to my Audience with this plugin? =
54
+
55
+ - Customers are subscribed to your Audience when they opt-in at checkout or when an account is created. If an account is created through the standard WooCommerce `My Account` page, they must opt-in to be added.
56
+ - Customers are sent to your Audience as `Transactional` if they do not opt-in. This is done so you can send [abandoned carts](https://mailchimp.com/help/create-an-abandoned-cart-email/) or [order notifications](https://mailchimp.com/help/create-order-notifications/).
57
+ - If double opt-in is enabled, customers will only be subscribed to your Audience if they approve the subscription from the confirmation email that is sent.
58
+
59
  = What is the recommended way to sync larger stores? =
60
 
61
  To optimize the performance of your Mailchimp integration we recommend running the queue in CLI mode. Please refer to [this guide](https://github.com/mailchimp/mc-woocommerce/wiki/Advanced-Queue-Setup-In-CLI-mode) in our Wiki.
77
  If you are unable to sync or connect with Mailchimp, you can open a ticket on our [Github plugin page](https://github.com/mailchimp/mc-woocommerce/issues). Please provide the version of the plugin and PHP you're using, any fatal errors in the WooCommerce logs (WooCommerce -> Status -> Logs) you're seeing, along with relevant information to the problem you're experiencing.
78
 
79
  == Changelog ==
80
+ = 2.4.1 =
81
+ * adds scrolling frame for logs
82
+ * fix for Coupon Deletion via WooCommerce API
83
+ * removes all non-Mailchimp notices
84
+ * update for latest version of Action Scheduler v3.1.4
85
+ * documentation updates
86
+ * fix for errors on activation following deactivation
87
+ * fix for PHP notice on Woocommerce Import Tax rate page
88
+ * adds error handling on store add/update
89
+ * use denormalized order items values in initial sync
90
+ * adds function allowing tags for specific users
91
+ * adds include/exclude Mailchimp script
92
+ * fix for double opt-in issues on saved settings
93
+ * fixes transactionals on guest checkout
admin/class-mailchimp-woocommerce-admin.php CHANGED
@@ -280,17 +280,16 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
280
  public function options_update() {
281
  global $pagenow;
282
 
283
- $this->handle_abandoned_cart_table();
284
-
285
- $this->update_db_check();
286
-
287
  register_setting($this->plugin_name, $this->plugin_name, array($this, 'validate'));
288
 
289
- if ($pagenow == 'admin.php' && 'mailchimp-woocommerce' === $_GET['page']) {
290
- if (get_option('mailchimp-woocommerce-sync.initial_sync') == 1 && get_option('mailchimp-woocommerce-sync.completed_at') > 0 ) {
291
- $this->mailchimp_show_initial_sync_message();
292
- }
293
- }
 
 
 
294
  }
295
 
296
  /**
@@ -311,12 +310,25 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
311
  // resave the site option so this only fires once.
312
  update_site_option('mailchimp_woocommerce_version', $version);
313
 
 
314
  $options = $this->getOptions();
315
 
 
316
  if (!isset($options['mailchimp_permission_cap']) || empty($options['mailchimp_permission_cap']) ) {
317
  $options['mailchimp_permission_cap'] = 'manage_options';
318
  update_option($this->plugin_name, $options);
319
  }
 
 
 
 
 
 
 
 
 
 
 
320
  }
321
 
322
  if (!get_option( $this->plugin_name.'_cart_table_add_index_update')) {
@@ -419,7 +431,17 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
419
  }
420
 
421
  $data = $this->mailchimp_set_store_currency_code($new_currency_code);
422
- return $this->syncStore($data);
 
 
 
 
 
 
 
 
 
 
423
  }
424
 
425
  /**
@@ -506,7 +528,7 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
506
 
507
  $active_tab = isset($input['mailchimp_active_tab']) ? $input['mailchimp_active_tab'] : null;
508
 
509
- if (empty($active_tab) && $input['woocommerce_settings_save_general']) {
510
  unset($input['woocommerce_settings_save_general']);
511
  $data['store_currency_code'] = (string) $input['store_currency_code'];
512
  }
@@ -546,7 +568,7 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
546
  // remove all the pointers to be sure
547
  $service = new MailChimp_Service();
548
  $service->removePointers(true, true);
549
- static::startSync();
550
  $this->showSyncStartedMessage();
551
  $this->setData('sync.config.resync', true);
552
  }
@@ -788,13 +810,22 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
788
 
789
  $this->setData('validation.store_info', true);
790
 
791
- $data['active_tab'] = 'campaign_defaults';
792
- $data['store_currency_code'] = get_woocommerce_currency();
793
-
794
  if ($this->hasValidMailChimpList()) {
795
- $this->syncStore(array_merge($this->getOptions(), $data));
 
 
 
 
 
 
 
 
 
796
  }
797
-
 
 
 
798
  return $data;
799
  }
800
 
@@ -986,7 +1017,16 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
986
  $this->setData('validation.newsletter_settings', true);
987
 
988
  // sync the store with MC
989
- $this->syncStore(array_merge($this->getOptions(), $data));
 
 
 
 
 
 
 
 
 
990
 
991
  // if there was already a store in Mailchimp, use the list ID from Mailchimp
992
  if ($this->swapped_list_id) {
@@ -994,20 +1034,13 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
994
  }
995
 
996
  // start the sync automatically if the sync is false
997
- if ((bool) $this->getData('sync.started_at', false) === false) {
998
- // tell the next page view to start the sync with a transient since the data isn't available yet
999
- set_site_transient('mailchimp_woocommerce_start_sync', microtime(), 30);
1000
-
1001
- $this->setData('sync.config.resync', false);
1002
- $this->setData('sync.orders.current_page', 1);
1003
- $this->setData('sync.products.current_page', 1);
1004
- $this->setData('sync.coupons.current_page', 1);
1005
- $this->setData('sync.syncing', true);
1006
- $this->setData('sync.started_at', time());
1007
 
1008
  $this->showSyncStartedMessage();
1009
  }
1010
-
1011
  $data['active_tab'] = 'sync';
1012
 
1013
  return $data;
@@ -1345,6 +1378,15 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
1345
 
1346
  $submission->setContact($this->address($data));
1347
 
 
 
 
 
 
 
 
 
 
1348
  // let's turn this on for debugging purposes.
1349
  mailchimp_debug('admin', 'list info submission', array('submission' => print_r($submission->getSubmission(), true)));
1350
 
@@ -1457,6 +1499,7 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
1457
  }
1458
  }
1459
  $this->setData('errors.store_info', $e->getMessage());
 
1460
  }
1461
 
1462
  return false;
@@ -1525,19 +1568,28 @@ class MailChimp_WooCommerce_Admin extends MailChimp_WooCommerce_Options {
1525
  /**
1526
  * Start the sync
1527
  */
1528
- public static function startSync()
1529
  {
1530
  // delete the transient so this only happens one time.
1531
  delete_site_transient('mailchimp_woocommerce_start_sync');
1532
 
1533
  $full_sync = new MailChimp_WooCommerce_Process_Full_Sync_Manager();
1534
 
 
 
 
 
 
 
 
 
 
 
1535
  // tell Mailchimp that we're syncing
1536
  $full_sync->start_sync();
1537
 
1538
  // enqueue sync manager
1539
  as_enqueue_async_action( 'MailChimp_WooCommerce_Process_Full_Sync_Manager', array(), 'mc-woocommerce' );
1540
-
1541
  }
1542
 
1543
  /**
280
  public function options_update() {
281
  global $pagenow;
282
 
 
 
 
 
283
  register_setting($this->plugin_name, $this->plugin_name, array($this, 'validate'));
284
 
285
+ // tammullen found this.
286
+ if ($pagenow == 'admin.php' && isset($_GET) && isset($_GET['page']) && 'mailchimp-woocommerce' === $_GET['page']) {
287
+ $this->handle_abandoned_cart_table();
288
+ $this->update_db_check();
289
+ if (get_option('mailchimp-woocommerce-sync.initial_sync') == 1 && get_option('mailchimp-woocommerce-sync.completed_at') > 0 ) {
290
+ $this->mailchimp_show_initial_sync_message();
291
+ }
292
+ }
293
  }
294
 
295
  /**
310
  // resave the site option so this only fires once.
311
  update_site_option('mailchimp_woocommerce_version', $version);
312
 
313
+ // get plugin options
314
  $options = $this->getOptions();
315
 
316
+ // set permission_cap in case there's none set.
317
  if (!isset($options['mailchimp_permission_cap']) || empty($options['mailchimp_permission_cap']) ) {
318
  $options['mailchimp_permission_cap'] = 'manage_options';
319
  update_option($this->plugin_name, $options);
320
  }
321
+
322
+ // resend marketing status to update latest changes
323
+ if (!empty($options['admin_email'])) {
324
+ try {
325
+ // send the post to the mailchimp server
326
+ $comm_opt = get_option('mailchimp-woocommerce-comm.opt', 0);
327
+ $this->mailchimp_set_communications_status_on_server($comm_opt, $options['admin_email']);
328
+ } catch (\Exception $e) {
329
+ mailchimp_error("marketing_status_update", $e->getMessage());
330
+ }
331
+ }
332
  }
333
 
334
  if (!get_option( $this->plugin_name.'_cart_table_add_index_update')) {
431
  }
432
 
433
  $data = $this->mailchimp_set_store_currency_code($new_currency_code);
434
+
435
+ // sync the store with MC
436
+ try {
437
+ $store_created = $this->syncStore($data);
438
+ }
439
+ catch (Exception $e){
440
+ mailchimp_log('store.sync@woo.update', 'Store cannot be synced', $e->getMessage());
441
+ return false;
442
+ }
443
+
444
+ return $store_created;
445
  }
446
 
447
  /**
528
 
529
  $active_tab = isset($input['mailchimp_active_tab']) ? $input['mailchimp_active_tab'] : null;
530
 
531
+ if (empty($active_tab) && isset($input['woocommerce_settings_save_general']) && $input['woocommerce_settings_save_general']) {
532
  unset($input['woocommerce_settings_save_general']);
533
  $data['store_currency_code'] = (string) $input['store_currency_code'];
534
  }
568
  // remove all the pointers to be sure
569
  $service = new MailChimp_Service();
570
  $service->removePointers(true, true);
571
+ $this->startSync();
572
  $this->showSyncStartedMessage();
573
  $this->setData('sync.config.resync', true);
574
  }
810
 
811
  $this->setData('validation.store_info', true);
812
 
 
 
 
813
  if ($this->hasValidMailChimpList()) {
814
+ // sync the store with MC
815
+ try {
816
+ $this->syncStore(array_merge($this->getOptions(), $data));
817
+ }
818
+ catch (Exception $e){
819
+ $this->setData('validation.store_info', false);
820
+ mailchimp_log('errors.store_info', 'Store cannot be synced :: ' . $e->getMessage());
821
+ add_settings_error('mailchimp_store_info', '', __('Cannot create or update Store at Mailchimp.', 'mailchimp-for-woocommerce') . ' Mailchimp says: ' . $e->getMessage());
822
+ return $data;
823
+ }
824
  }
825
+
826
+ $data['active_tab'] = 'campaign_defaults';
827
+ $data['store_currency_code'] = get_woocommerce_currency();
828
+
829
  return $data;
830
  }
831
 
1017
  $this->setData('validation.newsletter_settings', true);
1018
 
1019
  // sync the store with MC
1020
+ try {
1021
+ $store_created = $this->syncStore(array_merge($this->getOptions(), $data));
1022
+ }
1023
+ catch (Exception $e){
1024
+ $this->setData('validation.newsletter_settings', false);
1025
+ mailchimp_log('errors.newsletter_settings', 'Store cannot be synced :: ' . $e->getMessage());
1026
+ add_settings_error('mailchimp_newsletter_settings', '', __('Cannot create or update Store at Mailchimp.', 'mailchimp-for-woocommerce') . ' Mailchimp says: ' . $e->getMessage());
1027
+ $data['active_tab'] = 'newsletter_settings';
1028
+ return $data;
1029
+ }
1030
 
1031
  // if there was already a store in Mailchimp, use the list ID from Mailchimp
1032
  if ($this->swapped_list_id) {
1034
  }
1035
 
1036
  // start the sync automatically if the sync is false
1037
+ if ($store_created && ((bool) $this->getData('sync.started_at', false) === false)) {
1038
+ // tell the next page view to start the sync with a transient since the data isn't available yet
1039
+ set_site_transient('mailchimp_woocommerce_start_sync', microtime(), 300);
 
 
 
 
 
 
 
1040
 
1041
  $this->showSyncStartedMessage();
1042
  }
1043
+
1044
  $data['active_tab'] = 'sync';
1045
 
1046
  return $data;
1378
 
1379
  $submission->setContact($this->address($data));
1380
 
1381
+ try {
1382
+ $submission->setDoi(mailchimp_list_has_double_optin(true));
1383
+ }
1384
+ catch (\Exception $e) {
1385
+ add_settings_error('list_sync_error', '', __('Cannot create or update List at Mailchimp.', 'mailchimp-for-woocommerce') . ' ' . $e->getMessage() . ' ' . __('Please retry.', 'mailchimp-for-woocommerce'));
1386
+ $this->setData('errors.mailchimp_list', $e->getMessage());
1387
+ return false;
1388
+ }
1389
+
1390
  // let's turn this on for debugging purposes.
1391
  mailchimp_debug('admin', 'list info submission', array('submission' => print_r($submission->getSubmission(), true)));
1392
 
1499
  }
1500
  }
1501
  $this->setData('errors.store_info', $e->getMessage());
1502
+ throw($e);
1503
  }
1504
 
1505
  return false;
1568
  /**
1569
  * Start the sync
1570
  */
1571
+ public function startSync()
1572
  {
1573
  // delete the transient so this only happens one time.
1574
  delete_site_transient('mailchimp_woocommerce_start_sync');
1575
 
1576
  $full_sync = new MailChimp_WooCommerce_Process_Full_Sync_Manager();
1577
 
1578
+ // make sure the storeeId saved on DB is the same on Mailchimp
1579
+ try {
1580
+ $this->syncStore();
1581
+ }
1582
+ catch (\Exception $e) {
1583
+ mailchimp_log('error.sync', 'Store cannot be synced :: ' . $e->getMessage());
1584
+ add_settings_error('mailchimp_sync_error', '', __('Cannot create or update Store at Mailchimp.', 'mailchimp-for-woocommerce') . ' Mailchimp says: ' . $e->getMessage());
1585
+ return false;
1586
+ }
1587
+
1588
  // tell Mailchimp that we're syncing
1589
  $full_sync->start_sync();
1590
 
1591
  // enqueue sync manager
1592
  as_enqueue_async_action( 'MailChimp_WooCommerce_Process_Full_Sync_Manager', array(), 'mc-woocommerce' );
 
1593
  }
1594
 
1595
  /**
admin/css/mailchimp-woocommerce-admin-settings-5.2.css CHANGED
@@ -759,7 +759,7 @@
759
  color: #7FAD45 !important;
760
  }
761
 
762
- #mc-woocommerce-create-account h2 {
763
  padding-bottom: 20px;
764
  }
765
 
@@ -800,7 +800,7 @@
800
  padding-top: 30px;
801
  }
802
 
803
- .mc-woocommerce-create-account-modal-header h2{
804
  text-align: center;
805
  padding-top: 30px;
806
  font-size: 2em;
759
  color: #7FAD45 !important;
760
  }
761
 
762
+ #mc-woocommerce-create-account h3 {
763
  padding-bottom: 20px;
764
  }
765
 
800
  padding-top: 30px;
801
  }
802
 
803
+ .mc-woocommerce-create-account-modal-header h3{
804
  text-align: center;
805
  padding-top: 30px;
806
  font-size: 2em;
admin/css/mailchimp-woocommerce-admin-settings.css CHANGED
@@ -331,6 +331,7 @@
331
  transition: background-color 0.3s ease-out,
332
  text-shadow 0.3s ease-out,
333
  box-shadow 0.3s ease-out;
 
334
  }
335
 
336
  .tab-content-submit:focus,.tab-content-submit:hover{
@@ -531,6 +532,7 @@
531
  -moz-transition: background-color 0.3s ease-out;
532
  -o-transition: background-color 0.3s ease-out;
533
  transition: background-color 0.3s ease-out;
 
534
  }
535
 
536
  .sync-content-wrapper .mc-woocommerce-disconnect-button svg,
@@ -725,7 +727,6 @@
725
  background: #fff;
726
  border: 1px solid #e5e5e5;
727
  box-shadow: 0 1px 1px rgba(0,0,0,.04);
728
- padding: 15px 20px;
729
  }
730
 
731
  #log-viewer pre {
@@ -733,6 +734,28 @@
733
  white-space: pre-wrap;
734
  }
735
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
736
 
737
  /* account create modal */
738
  #mc-woocommerce-create-account-link {
@@ -745,7 +768,7 @@
745
  align-items: center;
746
  justify-content: center;
747
  position: absolute;
748
- top: 0;
749
  left: 0;
750
  visibility: hidden;
751
  display: none;
@@ -763,7 +786,7 @@
763
  color: #7FAD45 !important;
764
  }
765
 
766
- #mc-woocommerce-create-account h2 {
767
  padding-bottom: 20px;
768
  }
769
 
@@ -804,7 +827,7 @@
804
  padding-top: 30px;
805
  }
806
 
807
- .mc-woocommerce-create-account-modal-header h2{
808
  text-align: center;
809
  padding-top: 30px;
810
  font-size: 2em;
@@ -903,6 +926,10 @@
903
  text-align: center;
904
  }
905
 
 
 
 
 
906
  .tab-content-wrapper form{
907
  padding: 1em;
908
  }
331
  transition: background-color 0.3s ease-out,
332
  text-shadow 0.3s ease-out,
333
  box-shadow 0.3s ease-out;
334
+ text-decoration: none !important;
335
  }
336
 
337
  .tab-content-submit:focus,.tab-content-submit:hover{
532
  -moz-transition: background-color 0.3s ease-out;
533
  -o-transition: background-color 0.3s ease-out;
534
  transition: background-color 0.3s ease-out;
535
+ text-decoration: none !important;
536
  }
537
 
538
  .sync-content-wrapper .mc-woocommerce-disconnect-button svg,
727
  background: #fff;
728
  border: 1px solid #e5e5e5;
729
  box-shadow: 0 1px 1px rgba(0,0,0,.04);
 
730
  }
731
 
732
  #log-viewer pre {
734
  white-space: pre-wrap;
735
  }
736
 
737
+ #log-viewer #log-header {
738
+ border-bottom: 1px solid #e5e5e5;
739
+ padding: 15px 20px;
740
+ }
741
+
742
+ #log-viewer #log-content {
743
+ height: 500px;
744
+ padding: 15px 20px;
745
+ width: 100%;
746
+ background-color: white;
747
+ color: #444;
748
+ font-family: monospace;
749
+ white-space: pre-wrap;
750
+ font-size: 1em;
751
+
752
+ }
753
+
754
+ #log-viewer #log-content:focus {
755
+ outline: none;
756
+ box-shadow: none !important;
757
+ }
758
+
759
 
760
  /* account create modal */
761
  #mc-woocommerce-create-account-link {
768
  align-items: center;
769
  justify-content: center;
770
  position: absolute;
771
+ top: 50px;
772
  left: 0;
773
  visibility: hidden;
774
  display: none;
786
  color: #7FAD45 !important;
787
  }
788
 
789
+ #mc-woocommerce-create-account h3 {
790
  padding-bottom: 20px;
791
  }
792
 
827
  padding-top: 30px;
828
  }
829
 
830
+ .mc-woocommerce-create-account-modal-header h3{
831
  text-align: center;
832
  padding-top: 30px;
833
  font-size: 2em;
926
  text-align: center;
927
  }
928
 
929
+ .mc-woocommerce-delete-log-button {
930
+ display: none;
931
+ }
932
+
933
  .tab-content-wrapper form{
934
  padding: 1em;
935
  }
admin/js/mailchimp-woocommerce-admin.js CHANGED
@@ -35,7 +35,7 @@
35
  // copy log button
36
  $('.mc-woocommerce-copy-log-button').click(function (e) {
37
  e.preventDefault();
38
- var copyText = $('#log-text');
39
  var $temp = $("<textarea>");
40
  $("body").append($temp);
41
  $temp.val($(copyText).text()).select();
35
  // copy log button
36
  $('.mc-woocommerce-copy-log-button').click(function (e) {
37
  e.preventDefault();
38
+ var copyText = $('#log-content');
39
  var $temp = $("<textarea>");
40
  $("body").append($temp);
41
  $temp.val($(copyText).text()).select();
admin/partials/mailchimp-woocommerce-admin-tabs.php CHANGED
@@ -108,7 +108,12 @@ else {
108
  wp_kses(_e('Please apply your audience settings. If you don’t<br/>have an audience, you can choose to create one', 'mailchimp-for-woocommerce'), $allowed_html);
109
  }
110
  if ($active_tab == 'sync' && $show_sync_tab) {
111
- wp_kses(_e('Connect your WooCommerce store to a<br/>Mailchimp audience in less than 60 seconds', 'mailchimp-for-woocommerce'), $allowed_html);
 
 
 
 
 
112
  }
113
 
114
  if ($active_tab == 'logs' && $show_sync_tab) {
@@ -182,13 +187,14 @@ else {
182
  <?php endif; ?>
183
  </div>
184
  <?php endif; ?>
185
- <h2><!-- Needed to show the notifications on the right spot --></h2>
186
  <?php
187
  $settings_errors = get_settings_errors();
188
  if (!$show_wizard || ($show_wizard && isset($settings_errors[0]) && $settings_errors[0]['type'] != 'updated' )) {
189
  echo mailchimp_settings_errors();
190
  }
191
  ?>
 
192
  <?php if ($active_tab != 'sync'): ?>
193
  <div class="tab-content-wrapper">
194
  <?php endif; ?>
108
  wp_kses(_e('Please apply your audience settings. If you don’t<br/>have an audience, you can choose to create one', 'mailchimp-for-woocommerce'), $allowed_html);
109
  }
110
  if ($active_tab == 'sync' && $show_sync_tab) {
111
+ if (mailchimp_is_done_syncing()) {
112
+ wp_kses(_e('Sweet! You\'re connected with<br/>Mailchimp and syncing data', 'mailchimp-for-woocommerce'), $allowed_html);
113
+ }
114
+ else {
115
+ wp_kses(_e('Connect your WooCommerce store to a<br/>Mailchimp audience in less than 60 seconds', 'mailchimp-for-woocommerce'), $allowed_html);
116
+ }
117
  }
118
 
119
  if ($active_tab == 'logs' && $show_sync_tab) {
187
  <?php endif; ?>
188
  </div>
189
  <?php endif; ?>
190
+
191
  <?php
192
  $settings_errors = get_settings_errors();
193
  if (!$show_wizard || ($show_wizard && isset($settings_errors[0]) && $settings_errors[0]['type'] != 'updated' )) {
194
  echo mailchimp_settings_errors();
195
  }
196
  ?>
197
+
198
  <?php if ($active_tab != 'sync'): ?>
199
  <div class="tab-content-wrapper">
200
  <?php endif; ?>
admin/partials/tabs/api_key_create_account.php CHANGED
@@ -1,4 +1,4 @@
1
- <p id="mc-woocommerce-create-account-link" class="create-account-link alignright">Don’t have a Mailchimp account yet? <a style="font-size: larger; font-weight:bold !important;" href='#mc-woocommerce-create-account'>Create one here</a></p>
2
  <div id="mc-woocommerce-create-account">
3
  <div id="exampleModal" class="reveal-modal">
4
  <a href="#" class="close-modal"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -15,7 +15,7 @@
15
  <path d="M12.1324 33.1577C12.0456 33.0492 11.9056 33.0827 11.7695 33.1143C11.6749 33.136 11.5664 33.1616 11.448 33.1596C11.1936 33.1557 10.9786 33.0452 10.8583 32.8598C10.7006 32.6192 10.7104 32.2583 10.884 31.8461C10.9076 31.7909 10.9353 31.7297 10.9648 31.6607C11.241 31.0394 11.7064 30 11.1857 29.008C10.7932 28.2625 10.1542 27.797 9.38702 27.7004C8.64939 27.6077 7.89006 27.8798 7.40685 28.4143C6.64358 29.2565 6.52328 30.4044 6.6712 30.8087C6.72445 30.9566 6.80925 30.998 6.87237 31.0059C7.00254 31.0237 7.19385 30.929 7.31416 30.6055C7.32205 30.5819 7.33388 30.5464 7.34769 30.501C7.40094 30.3294 7.50152 30.0099 7.66522 29.7555C7.86245 29.4478 8.17012 29.2348 8.53105 29.1579C8.89789 29.079 9.2746 29.15 9.58819 29.3551C10.1227 29.7062 10.3298 30.361 10.101 30.9862C9.98264 31.3096 9.79133 31.9289 9.83275 32.4378C9.91756 33.4673 10.5507 33.8795 11.1206 33.9249C11.6729 33.9466 12.0594 33.6349 12.1581 33.4081C12.2133 33.274 12.164 33.1932 12.1324 33.1577Z" fill="black"/>
16
  <path d="M44.044 31.2761C44.0223 31.2012 43.8862 30.7002 43.6969 30.0967C43.5075 29.4932 43.3142 29.0672 43.3142 29.0672C44.0696 27.9351 44.0834 26.9233 43.9828 26.3514C43.8763 25.6414 43.5805 25.0359 42.9829 24.4107C42.3873 23.7854 41.1684 23.1445 39.4545 22.6632C39.2593 22.608 38.6123 22.4305 38.5551 22.4127C38.5512 22.3753 38.5078 20.2945 38.4684 19.3991C38.4408 18.7522 38.3836 17.7444 38.0719 16.7504C37.6992 15.4053 37.0483 14.2298 36.2377 13.4764C38.4763 11.157 39.8726 8.60091 39.8707 6.40774C39.8647 2.19102 34.6855 0.914962 28.3033 3.55781C28.2974 3.55978 26.9602 4.1278 26.9503 4.13174C26.9444 4.12582 24.5066 1.73346 24.4692 1.7019C17.1954 -4.64488 -5.55475 20.6436 1.71899 26.7853L3.30864 28.1323C2.89644 29.2013 2.73471 30.4241 2.86685 31.7396C3.03647 33.4299 3.90822 35.0511 5.32234 36.3015C6.66348 37.4908 8.42669 38.2422 10.1386 38.2402C12.9688 44.7626 19.4359 48.7643 27.0193 48.9891C35.153 49.2317 41.981 45.4134 44.8428 38.5578C45.0301 38.0765 45.825 35.909 45.825 33.9939C45.825 32.0729 44.7382 31.2761 44.044 31.2761ZM10.7638 36.41C10.5173 36.4514 10.2649 36.4691 10.0104 36.4632C7.55298 36.3981 4.90027 34.1852 4.63598 31.5621C4.34409 28.6629 5.82527 26.4322 8.44839 25.9017C8.76198 25.8386 9.14066 25.8011 9.54892 25.8228C11.0183 25.9037 13.1838 27.0318 13.6789 30.2328C14.1187 33.0689 13.4225 35.9564 10.7638 36.41ZM8.02041 24.1681C6.38736 24.4856 4.9476 25.4106 4.06797 26.6886C3.54137 26.2508 2.56115 25.4007 2.38956 25.0694C0.985306 22.4009 3.92202 17.2138 5.97516 14.285C11.0478 7.04676 18.9922 1.56581 22.6705 2.55984C23.2681 2.72945 25.2482 5.02518 25.2482 5.02518C25.2482 5.02518 21.5719 7.06451 18.1618 9.90853C13.5704 13.4468 10.0992 18.5885 8.02041 24.1681ZM33.8079 35.3252C33.8611 35.3035 33.8986 35.2424 33.8927 35.1812C33.8848 35.1063 33.8177 35.0531 33.7448 35.0609C33.7448 35.0609 29.8969 35.6309 26.26 34.2996C26.6564 33.0117 27.7096 33.4772 29.3012 33.6054C32.1709 33.777 34.7408 33.3569 36.642 32.8125C38.2889 32.3392 40.4505 31.4083 42.1309 30.0829C42.6969 31.3274 42.8981 32.6962 42.8981 32.6962C42.8981 32.6962 43.3359 32.6173 43.7028 32.8441C44.0499 33.0571 44.3024 33.5009 44.1288 34.6448C43.7758 36.7847 42.8665 38.5223 41.338 40.1198C40.4071 41.1217 39.277 41.9935 37.9852 42.6266C37.2988 42.9875 36.5671 43.2991 35.7959 43.5516C30.033 45.4331 24.1339 43.3642 22.2326 38.9207C22.0807 38.5874 21.9525 38.2363 21.852 37.8714C21.0414 34.9426 21.7297 31.43 23.8795 29.2171C23.8795 29.2171 23.8795 29.2171 23.8795 29.2151C24.0116 29.0751 24.1477 28.9094 24.1477 28.7004C24.1477 28.5248 24.0372 28.3414 23.9406 28.2112C23.1892 27.1206 20.5818 25.2607 21.1045 21.6613C21.4792 19.0757 23.7414 17.2553 25.8498 17.3637C26.0273 17.3736 26.2067 17.3834 26.3842 17.3953C27.2974 17.4485 28.0942 17.5669 28.8476 17.5984C30.1059 17.6537 31.238 17.4702 32.5792 16.3519C33.0308 15.9752 33.3937 15.6478 34.0071 15.5453C34.0722 15.5335 34.2319 15.4763 34.5534 15.492C34.8808 15.5098 35.1924 15.5985 35.4725 15.7859C36.5474 16.5018 36.6992 18.2335 36.7545 19.4997C36.786 20.2235 36.8728 21.9729 36.9044 22.4759C36.9734 23.6237 37.2751 23.7874 37.8846 23.9886C38.2278 24.101 38.5473 24.1858 39.0167 24.318C40.4387 24.7183 41.2828 25.1227 41.8153 25.6433C42.1329 25.9688 42.2808 26.3139 42.3261 26.6433C42.4938 27.8661 41.3755 29.3788 38.4171 30.7515C35.1826 32.2524 31.2577 32.6331 28.5459 32.3313C28.3388 32.3076 27.5992 32.2248 27.5952 32.2248C25.4257 31.9329 24.1891 34.7355 25.4908 36.6565C26.329 37.8951 28.6149 38.6998 30.9008 38.6998C36.1431 38.6998 40.1724 36.4613 41.6713 34.5284C41.7167 34.4712 41.7206 34.4633 41.7916 34.3568C41.8646 34.2464 41.8055 34.1852 41.7128 34.2464C40.488 35.0846 35.0484 38.4099 29.2322 37.4099C29.2322 37.4099 28.5261 37.2936 27.8792 37.0431C27.3664 36.8439 26.2935 36.3508 26.1634 35.2483C30.8514 36.6979 33.8079 35.3252 33.8079 35.3252ZM26.3704 34.4476C26.3704 34.4476 26.3724 34.4476 26.3704 34.4476C26.3724 34.4495 26.3724 34.4495 26.3724 34.4515C26.3724 34.4495 26.3724 34.4476 26.3704 34.4476ZM17.3887 14.2554C19.1914 12.1707 21.4121 10.3602 23.4002 9.34249C23.4692 9.30699 23.5422 9.38193 23.5047 9.44899C23.3469 9.73497 23.0432 10.3464 22.9466 10.8118C22.9308 10.8848 23.0097 10.9381 23.0708 10.8966C24.3074 10.0525 26.4612 9.14921 28.3486 9.03284C28.4295 9.02693 28.4689 9.13146 28.4039 9.18076C28.1159 9.40166 27.8023 9.70539 27.5735 10.0131C27.5341 10.0663 27.5716 10.1413 27.6366 10.1413C28.962 10.1511 30.8317 10.6146 32.0486 11.297C32.1315 11.3424 32.0723 11.5021 31.9796 11.4824C30.1375 11.0603 27.1199 10.7389 23.986 11.5041C21.1893 12.1865 19.0533 13.2397 17.4952 14.3738C17.4203 14.4329 17.3256 14.3304 17.3887 14.2554Z" fill="black"/>
17
  </svg>
18
- <h2>Create your mailchimp account (<span id="step_count">1</span> of 2)</h2>
19
 
20
  </div>
21
 
@@ -158,7 +158,7 @@
158
  'br' => array()
159
  );
160
  ?>
161
- <?= sprintf(/* translators: %s - Mailchimp legal pages */wp_kses( __( 'By clicking the "Get Started!" button, you are creating a Mailchimp account, and you agree to Mailchimp\'s <a href=%s target=_blank>Terms of Use</a> and <a href=%s target=_blank>Privacy Policy</a>.', 'mailchimp-for-woocommerce' ), array( 'a' => array( 'href' => array(), 'target'=> '_blank' ) ) ), esc_url( 'https://mailchimp.com/legal/terms/' ), esc_url( 'https://mailchimp.com/legal/privacy/' ) );?>
162
 
163
  </p>
164
  </div>
@@ -188,7 +188,7 @@
188
 
189
 
190
  <div class="mc-woocommerce-create-account-modal-footer">
191
- ©2001–2019 All Rights Reserved. Mailchimp® is a registered trademark of The Rocket Science Group. Cookie Preferences, Privacy, and Terms.
192
  </div>
193
 
194
  </div>
1
+ <p id="mc-woocommerce-create-account-link" class="create-account-link alignright">Don’t have a Mailchimp account yet? <a style="font-weight:bold !important;" href='#mc-woocommerce-create-account'>Create one here</a></p>
2
  <div id="mc-woocommerce-create-account">
3
  <div id="exampleModal" class="reveal-modal">
4
  <a href="#" class="close-modal"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
15
  <path d="M12.1324 33.1577C12.0456 33.0492 11.9056 33.0827 11.7695 33.1143C11.6749 33.136 11.5664 33.1616 11.448 33.1596C11.1936 33.1557 10.9786 33.0452 10.8583 32.8598C10.7006 32.6192 10.7104 32.2583 10.884 31.8461C10.9076 31.7909 10.9353 31.7297 10.9648 31.6607C11.241 31.0394 11.7064 30 11.1857 29.008C10.7932 28.2625 10.1542 27.797 9.38702 27.7004C8.64939 27.6077 7.89006 27.8798 7.40685 28.4143C6.64358 29.2565 6.52328 30.4044 6.6712 30.8087C6.72445 30.9566 6.80925 30.998 6.87237 31.0059C7.00254 31.0237 7.19385 30.929 7.31416 30.6055C7.32205 30.5819 7.33388 30.5464 7.34769 30.501C7.40094 30.3294 7.50152 30.0099 7.66522 29.7555C7.86245 29.4478 8.17012 29.2348 8.53105 29.1579C8.89789 29.079 9.2746 29.15 9.58819 29.3551C10.1227 29.7062 10.3298 30.361 10.101 30.9862C9.98264 31.3096 9.79133 31.9289 9.83275 32.4378C9.91756 33.4673 10.5507 33.8795 11.1206 33.9249C11.6729 33.9466 12.0594 33.6349 12.1581 33.4081C12.2133 33.274 12.164 33.1932 12.1324 33.1577Z" fill="black"/>
16
  <path d="M44.044 31.2761C44.0223 31.2012 43.8862 30.7002 43.6969 30.0967C43.5075 29.4932 43.3142 29.0672 43.3142 29.0672C44.0696 27.9351 44.0834 26.9233 43.9828 26.3514C43.8763 25.6414 43.5805 25.0359 42.9829 24.4107C42.3873 23.7854 41.1684 23.1445 39.4545 22.6632C39.2593 22.608 38.6123 22.4305 38.5551 22.4127C38.5512 22.3753 38.5078 20.2945 38.4684 19.3991C38.4408 18.7522 38.3836 17.7444 38.0719 16.7504C37.6992 15.4053 37.0483 14.2298 36.2377 13.4764C38.4763 11.157 39.8726 8.60091 39.8707 6.40774C39.8647 2.19102 34.6855 0.914962 28.3033 3.55781C28.2974 3.55978 26.9602 4.1278 26.9503 4.13174C26.9444 4.12582 24.5066 1.73346 24.4692 1.7019C17.1954 -4.64488 -5.55475 20.6436 1.71899 26.7853L3.30864 28.1323C2.89644 29.2013 2.73471 30.4241 2.86685 31.7396C3.03647 33.4299 3.90822 35.0511 5.32234 36.3015C6.66348 37.4908 8.42669 38.2422 10.1386 38.2402C12.9688 44.7626 19.4359 48.7643 27.0193 48.9891C35.153 49.2317 41.981 45.4134 44.8428 38.5578C45.0301 38.0765 45.825 35.909 45.825 33.9939C45.825 32.0729 44.7382 31.2761 44.044 31.2761ZM10.7638 36.41C10.5173 36.4514 10.2649 36.4691 10.0104 36.4632C7.55298 36.3981 4.90027 34.1852 4.63598 31.5621C4.34409 28.6629 5.82527 26.4322 8.44839 25.9017C8.76198 25.8386 9.14066 25.8011 9.54892 25.8228C11.0183 25.9037 13.1838 27.0318 13.6789 30.2328C14.1187 33.0689 13.4225 35.9564 10.7638 36.41ZM8.02041 24.1681C6.38736 24.4856 4.9476 25.4106 4.06797 26.6886C3.54137 26.2508 2.56115 25.4007 2.38956 25.0694C0.985306 22.4009 3.92202 17.2138 5.97516 14.285C11.0478 7.04676 18.9922 1.56581 22.6705 2.55984C23.2681 2.72945 25.2482 5.02518 25.2482 5.02518C25.2482 5.02518 21.5719 7.06451 18.1618 9.90853C13.5704 13.4468 10.0992 18.5885 8.02041 24.1681ZM33.8079 35.3252C33.8611 35.3035 33.8986 35.2424 33.8927 35.1812C33.8848 35.1063 33.8177 35.0531 33.7448 35.0609C33.7448 35.0609 29.8969 35.6309 26.26 34.2996C26.6564 33.0117 27.7096 33.4772 29.3012 33.6054C32.1709 33.777 34.7408 33.3569 36.642 32.8125C38.2889 32.3392 40.4505 31.4083 42.1309 30.0829C42.6969 31.3274 42.8981 32.6962 42.8981 32.6962C42.8981 32.6962 43.3359 32.6173 43.7028 32.8441C44.0499 33.0571 44.3024 33.5009 44.1288 34.6448C43.7758 36.7847 42.8665 38.5223 41.338 40.1198C40.4071 41.1217 39.277 41.9935 37.9852 42.6266C37.2988 42.9875 36.5671 43.2991 35.7959 43.5516C30.033 45.4331 24.1339 43.3642 22.2326 38.9207C22.0807 38.5874 21.9525 38.2363 21.852 37.8714C21.0414 34.9426 21.7297 31.43 23.8795 29.2171C23.8795 29.2171 23.8795 29.2171 23.8795 29.2151C24.0116 29.0751 24.1477 28.9094 24.1477 28.7004C24.1477 28.5248 24.0372 28.3414 23.9406 28.2112C23.1892 27.1206 20.5818 25.2607 21.1045 21.6613C21.4792 19.0757 23.7414 17.2553 25.8498 17.3637C26.0273 17.3736 26.2067 17.3834 26.3842 17.3953C27.2974 17.4485 28.0942 17.5669 28.8476 17.5984C30.1059 17.6537 31.238 17.4702 32.5792 16.3519C33.0308 15.9752 33.3937 15.6478 34.0071 15.5453C34.0722 15.5335 34.2319 15.4763 34.5534 15.492C34.8808 15.5098 35.1924 15.5985 35.4725 15.7859C36.5474 16.5018 36.6992 18.2335 36.7545 19.4997C36.786 20.2235 36.8728 21.9729 36.9044 22.4759C36.9734 23.6237 37.2751 23.7874 37.8846 23.9886C38.2278 24.101 38.5473 24.1858 39.0167 24.318C40.4387 24.7183 41.2828 25.1227 41.8153 25.6433C42.1329 25.9688 42.2808 26.3139 42.3261 26.6433C42.4938 27.8661 41.3755 29.3788 38.4171 30.7515C35.1826 32.2524 31.2577 32.6331 28.5459 32.3313C28.3388 32.3076 27.5992 32.2248 27.5952 32.2248C25.4257 31.9329 24.1891 34.7355 25.4908 36.6565C26.329 37.8951 28.6149 38.6998 30.9008 38.6998C36.1431 38.6998 40.1724 36.4613 41.6713 34.5284C41.7167 34.4712 41.7206 34.4633 41.7916 34.3568C41.8646 34.2464 41.8055 34.1852 41.7128 34.2464C40.488 35.0846 35.0484 38.4099 29.2322 37.4099C29.2322 37.4099 28.5261 37.2936 27.8792 37.0431C27.3664 36.8439 26.2935 36.3508 26.1634 35.2483C30.8514 36.6979 33.8079 35.3252 33.8079 35.3252ZM26.3704 34.4476C26.3704 34.4476 26.3724 34.4476 26.3704 34.4476C26.3724 34.4495 26.3724 34.4495 26.3724 34.4515C26.3724 34.4495 26.3724 34.4476 26.3704 34.4476ZM17.3887 14.2554C19.1914 12.1707 21.4121 10.3602 23.4002 9.34249C23.4692 9.30699 23.5422 9.38193 23.5047 9.44899C23.3469 9.73497 23.0432 10.3464 22.9466 10.8118C22.9308 10.8848 23.0097 10.9381 23.0708 10.8966C24.3074 10.0525 26.4612 9.14921 28.3486 9.03284C28.4295 9.02693 28.4689 9.13146 28.4039 9.18076C28.1159 9.40166 27.8023 9.70539 27.5735 10.0131C27.5341 10.0663 27.5716 10.1413 27.6366 10.1413C28.962 10.1511 30.8317 10.6146 32.0486 11.297C32.1315 11.3424 32.0723 11.5021 31.9796 11.4824C30.1375 11.0603 27.1199 10.7389 23.986 11.5041C21.1893 12.1865 19.0533 13.2397 17.4952 14.3738C17.4203 14.4329 17.3256 14.3304 17.3887 14.2554Z" fill="black"/>
17
  </svg>
18
+ <h3>Create your mailchimp account (<span id="step_count">1</span> of 2)</h3>
19
 
20
  </div>
21
 
158
  'br' => array()
159
  );
160
  ?>
161
+ <?= sprintf(/* translators: %s - Mailchimp legal pages */wp_kses( __( 'By clicking the "Get Started!" button, you are creating a Mailchimp account, and you agree to Mailchimp\'s <a href=%1$s target=_blank>Terms of Use</a> and <a href=%2$s target=_blank>Privacy Policy</a>.', 'mailchimp-for-woocommerce' ), array( 'a' => array( 'href' => array(), 'target'=> '_blank' ) ) ), esc_url( 'https://mailchimp.com/legal/terms' ), esc_url( 'https://mailchimp.com/legal/privacy' ) );?>
162
 
163
  </p>
164
  </div>
188
 
189
 
190
  <div class="mc-woocommerce-create-account-modal-footer">
191
+ ©2001–<?= date('Y') ?> All Rights Reserved. Mailchimp® is a registered trademark of The Rocket Science Group. Cookie Preferences, Privacy, and Terms.
192
  </div>
193
 
194
  </div>
admin/partials/tabs/logs.php CHANGED
@@ -39,7 +39,7 @@ $handle = !empty($viewed_log) ? substr($viewed_log, 0, strlen($viewed_log) > 37
39
  </legend>
40
 
41
  <div class="box fieldset-header" >
42
- <label for="<?php echo $this->plugin_name; ?>-logging"><h2 style="padding-top: 1em;"><?php esc_html_e('Logging Preferences', 'mailchimp-for-woocommerce');?></h2></label>
43
  </div>
44
 
45
  <div class="box box-half">
@@ -67,9 +67,9 @@ $handle = !empty($viewed_log) ? substr($viewed_log, 0, strlen($viewed_log) > 37
67
 
68
  <fieldset>
69
  <div class="box fieldset-header" >
70
- <h2>
71
  <?php esc_html_e('Recent Logs', 'mailchimp-for-woocommerce'); ?>
72
- </h2>
73
  </div>
74
 
75
  <div class="box">
@@ -88,23 +88,22 @@ $handle = !empty($viewed_log) ? substr($viewed_log, 0, strlen($viewed_log) > 37
88
  <div class="box">
89
  <?php if (isset($logs) && isset($viewed_log)) : ?>
90
  <div id="log-viewer">
91
- <div style="height: 100px;">
92
  <?php if ( ! empty( $handle ) ) : ?>
93
- <a style="display:inline-block" class="mc-woocommerce-delete-log-button" href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'handle' => sanitize_title($viewed_log) ), admin_url( 'admin.php?page=mailchimp-woocommerce&tab=logs&mc_action=remove_log' ) ), 'remove_log' ) ); ?>">
 
 
 
94
  <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
95
  <path d="M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z" fill="#3C3C3C"/>
96
  </svg>
97
  <?php esc_html_e('Delete log', 'mailchimp-for-woocommerce'); ?>
98
 
99
  </a>
100
- <a style="display:inline-block" class="mc-woocommerce-copy-log-button" href="#">
101
- <?php esc_html_e('Copy log', 'mailchimp-for-woocommerce'); ?>
102
- </a>
103
  <?php endif; ?>
104
  </div>
105
- <div>
106
- <pre id="log-text"><?php echo esc_html( file_get_contents( WC_LOG_DIR . $viewed_log ) ); ?></pre>
107
- </div>
108
  </div>
109
  <?php else : ?>
110
  <div class="updated woocommerce-message inline"><p><?php _e( 'There are currently no logs to view.', 'woocommerce' ); ?></p></div>
39
  </legend>
40
 
41
  <div class="box fieldset-header" >
42
+ <label for="<?php echo $this->plugin_name; ?>-logging"><h3 style="padding-top: 1em;"><?php esc_html_e('Logging Preferences', 'mailchimp-for-woocommerce');?></h3></label>
43
  </div>
44
 
45
  <div class="box box-half">
67
 
68
  <fieldset>
69
  <div class="box fieldset-header" >
70
+ <h3>
71
  <?php esc_html_e('Recent Logs', 'mailchimp-for-woocommerce'); ?>
72
+ </h3>
73
  </div>
74
 
75
  <div class="box">
88
  <div class="box">
89
  <?php if (isset($logs) && isset($viewed_log)) : ?>
90
  <div id="log-viewer">
91
+ <div id="log-header">
92
  <?php if ( ! empty( $handle ) ) : ?>
93
+ <a style="display:inline-block" class="mc-woocommerce-copy-log-button" href="#">
94
+ <?php esc_html_e('Copy log', 'mailchimp-for-woocommerce'); ?>
95
+ </a>
96
+ <a class="mc-woocommerce-delete-log-button" href="<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'handle' => sanitize_title($viewed_log) ), admin_url( 'admin.php?page=mailchimp-woocommerce&tab=logs&mc_action=remove_log' ) ), 'remove_log' ) ); ?>">
97
  <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
98
  <path d="M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z" fill="#3C3C3C"/>
99
  </svg>
100
  <?php esc_html_e('Delete log', 'mailchimp-for-woocommerce'); ?>
101
 
102
  </a>
 
 
 
103
  <?php endif; ?>
104
  </div>
105
+ <textarea id="log-content" readonly><?php echo esc_html( file_get_contents( WC_LOG_DIR . $viewed_log ) ); ?></textarea>
106
+
 
107
  </div>
108
  <?php else : ?>
109
  <div class="updated woocommerce-message inline"><p><?php _e( 'There are currently no logs to view.', 'woocommerce' ); ?></p></div>
admin/partials/tabs/newsletter_settings.php CHANGED
@@ -83,13 +83,13 @@ $list_is_configured = isset($options['mailchimp_list']) && (!empty($options['mai
83
 
84
  <div class="optional-settings-content">
85
  <div class="box fieldset-header" >
86
- <h2><?php esc_html_e('Opt-in Settings', 'mailchimp-for-woocommerce');?></h2>
87
  </div>
88
 
89
  <div class="box box-half">
90
  <label for="<?php echo $this->plugin_name; ?>-newsletter-checkbox-label">
91
  <h4><?php esc_html_e('Message for the opt-in checkbox', 'mailchimp-for-woocommerce'); ?></h4>
92
- <p><?php _e('Add text to go along with the other opt-in checkboxes. <br/>Customers can click a box at checkout to opt in to your newsletter.', 'mailchimp-for-woocommerce');?> </p>
93
  </label>
94
  </div>
95
 
@@ -101,7 +101,7 @@ $list_is_configured = isset($options['mailchimp_list']) && (!empty($options['mai
101
  <div class="box box-half margin-large">
102
  <label>
103
  <h4><?php esc_html_e('Checkbox Display Options', 'mailchimp-for-woocommerce');?></h4>
104
- <p><?php _e('Add text to go along with the other opt-in checkboxes. <br/>Customers can click a box at checkout to opt in to your newsletter.', 'mailchimp-for-woocommerce');?> </p>
105
  </label>
106
  </div>
107
 
@@ -133,22 +133,22 @@ $list_is_configured = isset($options['mailchimp_list']) && (!empty($options['mai
133
  </div>
134
 
135
  <div class="box fieldset-header" >
136
- <h2><?php esc_html_e('Subscriber Tags', 'mailchimp-for-woocommerce');?></h2>
137
  </div>
138
 
139
  <div class="box box-half" >
140
  <label for="<?php echo $this->plugin_name; ?>-user-tags">
141
- <h4><?php esc_html_e('Subscriber Tags', 'mailchimp-for-woocommerce');?></h4>
 
142
  </label>
143
  </div>
144
 
145
  <div class="box box-half" >
146
- <input type="text" id="<?php echo $this->plugin_name; ?>-user-tags" name="<?php echo $this->plugin_name; ?>[mailchimp_user_tags]" value="<?php echo isset($options['mailchimp_user_tags']) ? str_replace(',',', ',$options['mailchimp_user_tags']) : '' ?>" />
147
- <p class="description"><?= __( 'Add a comma separated list of tags to add to the subscriber at Mailchimp', 'mailchimp-for-woocommerce' ); ?></p>
148
  </div>
149
 
150
  <div class="box fieldset-header" >
151
- <h2><?php esc_html_e('Product Settings', 'mailchimp-for-woocommerce');?></h2>
152
  </div>
153
 
154
 
@@ -160,9 +160,6 @@ $list_is_configured = isset($options['mailchimp_list']) && (!empty($options['mai
160
  </div>
161
 
162
  <div class="box box-half" >
163
- <label for="<?php echo $this->plugin_name; ?>-mailchimp-product_image_key">
164
- <span><?php esc_html_e('Size', 'mailchimp-for-woocommerce'); ?></span>
165
- </label>
166
  <div class="mailchimp-select-wrapper">
167
  <select name="<?php echo $this->plugin_name; ?>[mailchimp_product_image_key]">
168
  <?php
83
 
84
  <div class="optional-settings-content">
85
  <div class="box fieldset-header" >
86
+ <h3><?php esc_html_e('Opt-in Settings', 'mailchimp-for-woocommerce');?></h3>
87
  </div>
88
 
89
  <div class="box box-half">
90
  <label for="<?php echo $this->plugin_name; ?>-newsletter-checkbox-label">
91
  <h4><?php esc_html_e('Message for the opt-in checkbox', 'mailchimp-for-woocommerce'); ?></h4>
92
+ <p><?php _e('The call-to-action text that prompts customers to subscribe to your newsletter at checkout.', 'mailchimp-for-woocommerce');?> </p>
93
  </label>
94
  </div>
95
 
101
  <div class="box box-half margin-large">
102
  <label>
103
  <h4><?php esc_html_e('Checkbox Display Options', 'mailchimp-for-woocommerce');?></h4>
104
+ <p><?php _e('Choose how you want the opt-in to your newsletter checkbox to render at checkout', 'mailchimp-for-woocommerce');?> </p>
105
  </label>
106
  </div>
107
 
133
  </div>
134
 
135
  <div class="box fieldset-header" >
136
+ <h3><?php esc_html_e('Subscriber Settings', 'mailchimp-for-woocommerce');?></h3>
137
  </div>
138
 
139
  <div class="box box-half" >
140
  <label for="<?php echo $this->plugin_name; ?>-user-tags">
141
+ <h4><?php esc_html_e('Tags', 'mailchimp-for-woocommerce');?></h4>
142
+ <p><?= __( 'Add a comma-separated list of tags to apply to a subscriber in Mailchimp after a transaction occurs', 'mailchimp-for-woocommerce' ); ?></p>
143
  </label>
144
  </div>
145
 
146
  <div class="box box-half" >
147
+ <input type="text" id="<?php echo $this->plugin_name; ?>-user-tags" name="<?php echo $this->plugin_name; ?>[mailchimp_user_tags]" value="<?php echo isset($options['mailchimp_user_tags']) ? str_replace(',',', ',$options['mailchimp_user_tags']) : '' ?>" />
 
148
  </div>
149
 
150
  <div class="box fieldset-header" >
151
+ <h3><?php esc_html_e('Product Settings', 'mailchimp-for-woocommerce');?></h3>
152
  </div>
153
 
154
 
160
  </div>
161
 
162
  <div class="box box-half" >
 
 
 
163
  <div class="mailchimp-select-wrapper">
164
  <select name="<?php echo $this->plugin_name; ?>[mailchimp_product_image_key]">
165
  <?php
admin/partials/tabs/store_info.php CHANGED
@@ -90,7 +90,7 @@ if (!$handler->hasValidApiKey()) {
90
  </div>
91
 
92
  <div class="box fieldset-header" >
93
- <h2 style="padding-top: 1em;"><?= __('Locale Settings', 'mailchimp-for-woocommerce');?></h2>
94
  <br/>
95
  <p><?= __('Please apply your locale settings. If you\'re unsure about these, use the defaults.', 'mailchimp-for-woocommerce');?></p>
96
  </div>
90
  </div>
91
 
92
  <div class="box fieldset-header" >
93
+ <h3 style="padding-top: 1em;"><?= __('Locale Settings', 'mailchimp-for-woocommerce');?></h3>
94
  <br/>
95
  <p><?= __('Please apply your locale settings. If you\'re unsure about these, use the defaults.', 'mailchimp-for-woocommerce');?></p>
96
  </div>
admin/partials/tabs/store_sync.php CHANGED
@@ -33,7 +33,7 @@ if (!empty($last_updated_time)) {
33
 
34
  // if we have a transient set to start the sync on this page view, initiate it now that the values have been saved.
35
  if ((bool) get_site_transient('mailchimp_woocommerce_start_sync', false)) {
36
- MailChimp_WooCommerce_Admin::startSync();
37
  }
38
 
39
  if (($mailchimp_api = mailchimp_get_api()) && ($store = $mailchimp_api->getStore($store_id))) {
@@ -205,14 +205,14 @@ $comm_enabled = $opt != null ? $opt : '0';
205
  </div>
206
 
207
  <?php if($mailchimp_api && (!$store_syncing || isset($_GET['resync']) && $_GET['resync'] === '1')): ?>
208
- <h2 style="padding-top: 1em;"><?php esc_html_e('Advanced', 'mailchimp-for-woocommerce');?></h2>
209
  <p id="resync_data_help_text">
210
  <?php esc_html_e('You can resync your audience at any time without losing any of your e-commerce data.', 'mailchimp-for-woocommerce');?>
211
  </p>
212
  <?php submit_button(__('Force Resync', 'mailchimp-for-woocommerce'), 'primary mc-woocommerce-resync-button','submit', TRUE); ?>
213
  <?php endif; ?>
214
 
215
- <h2 style="padding-top: 1em;"><?php esc_html_e('More Information', 'mailchimp-for-woocommerce'); ?></h2>
216
  <ul>
217
  <li><?= sprintf(/* translators: %s - Plugin review URL. */wp_kses( __( 'Is this plugin helping your e-commerce business? <a href=%s target=_blank>Please leave us a ★★★★★ review!</a>.', 'mailchimp-for-woocommerce' ), array( 'a' => array( 'href' => array(), 'target'=> '_blank' ) ) ), esc_url( 'https://wordpress.org/support/plugin/mailchimp-for-woocommerce/reviews/' ) );?></li>
218
  <li><?= sprintf(/* translators: %s - WP-CLI URL. */wp_kses( __( 'Have a larger store or having issues syncing? Consider using <a href=%s target=_blank>WP-CLI</a>.', 'mailchimp-for-woocommerce' ), array( 'a' => array( 'href' => array(), 'target'=> '_blank' ) ) ), esc_url( 'https://github.com/mailchimp/mc-woocommerce/wiki/Advanced-Queue-Setup-In-CLI-mode' ) );?></li>
33
 
34
  // if we have a transient set to start the sync on this page view, initiate it now that the values have been saved.
35
  if ((bool) get_site_transient('mailchimp_woocommerce_start_sync', false)) {
36
+ MailChimp_WooCommerce_Admin::connect()->startSync();
37
  }
38
 
39
  if (($mailchimp_api = mailchimp_get_api()) && ($store = $mailchimp_api->getStore($store_id))) {
205
  </div>
206
 
207
  <?php if($mailchimp_api && (!$store_syncing || isset($_GET['resync']) && $_GET['resync'] === '1')): ?>
208
+ <h3 style="padding-top: 1em;"><?php esc_html_e('Advanced', 'mailchimp-for-woocommerce');?></h3>
209
  <p id="resync_data_help_text">
210
  <?php esc_html_e('You can resync your audience at any time without losing any of your e-commerce data.', 'mailchimp-for-woocommerce');?>
211
  </p>
212
  <?php submit_button(__('Force Resync', 'mailchimp-for-woocommerce'), 'primary mc-woocommerce-resync-button','submit', TRUE); ?>
213
  <?php endif; ?>
214
 
215
+ <h3 style="padding-top: 1em;"><?php esc_html_e('More Information', 'mailchimp-for-woocommerce'); ?></h3>
216
  <ul>
217
  <li><?= sprintf(/* translators: %s - Plugin review URL. */wp_kses( __( 'Is this plugin helping your e-commerce business? <a href=%s target=_blank>Please leave us a ★★★★★ review!</a>.', 'mailchimp-for-woocommerce' ), array( 'a' => array( 'href' => array(), 'target'=> '_blank' ) ) ), esc_url( 'https://wordpress.org/support/plugin/mailchimp-for-woocommerce/reviews/' ) );?></li>
218
  <li><?= sprintf(/* translators: %s - WP-CLI URL. */wp_kses( __( 'Have a larger store or having issues syncing? Consider using <a href=%s target=_blank>WP-CLI</a>.', 'mailchimp-for-woocommerce' ), array( 'a' => array( 'href' => array(), 'target'=> '_blank' ) ) ), esc_url( 'https://github.com/mailchimp/mc-woocommerce/wiki/Advanced-Queue-Setup-In-CLI-mode' ) );?></li>
bootstrap.php CHANGED
@@ -87,7 +87,7 @@ function mailchimp_environment_variables() {
87
  return (object) array(
88
  'repo' => 'master',
89
  'environment' => 'production', // staging or production
90
- 'version' => '2.4.0',
91
  'php_version' => phpversion(),
92
  'wp_version' => (empty($wp_version) ? 'Unknown' : $wp_version),
93
  'wc_version' => function_exists('WC') ? WC()->version : null,
@@ -223,9 +223,9 @@ function mailchimp_list_has_double_optin($force = false) {
223
  return false;
224
  }
225
 
226
- $key = 'mailchimp_double_optin';
227
 
228
- $double_optin = get_site_transient($key);
229
 
230
  if (!$force && ($double_optin === 'yes' || $double_optin === 'no')) {
231
  return $double_optin === 'yes';
@@ -234,10 +234,11 @@ function mailchimp_list_has_double_optin($force = false) {
234
  try {
235
  $data = mailchimp_get_api()->getList(mailchimp_get_list_id());
236
  $double_optin = array_key_exists('double_optin', $data) ? ($data['double_optin'] ? 'yes' : 'no') : 'no';
237
- set_site_transient($key, $double_optin, 600);
238
  return $double_optin === 'yes';
239
  } catch (\Exception $e) {
240
- set_site_transient($key, 'no', 600);
 
241
  }
242
 
243
  return $double_optin === 'yes';
@@ -318,22 +319,25 @@ function mailchimp_get_store_id() {
318
  /**
319
  * @return array
320
  */
321
- function mailchimp_get_user_tags_to_update() {
322
  $tags = mailchimp_get_option('mailchimp_user_tags');
 
 
 
 
323
 
324
- if (empty($tags)) {
325
- return false;
326
- }
327
-
328
- $tags = explode(',', $tags);
329
-
330
- foreach ($tags as $tag) {
331
- $formatted_tags[] = array("name" => $tag, "status" => 'active');
332
  }
333
 
334
  // apply filter to user custom tags addition/removal
335
- $formatted_tags = apply_filters('mailchimp_user_tags', $formatted_tags);
336
 
 
 
 
 
337
  return $formatted_tags;
338
  }
339
 
@@ -688,11 +692,6 @@ function mailchimp_update_connected_site_script() {
688
  if ($store_id && ($api = mailchimp_get_api())) {
689
  // if we have a store
690
  if (($store = $api->getStore($store_id))) {
691
- // handle the coupon sync if we don't have a flag that says otherwise.
692
- $job = new MailChimp_WooCommerce_Process_Coupons();
693
- if ($job->getData('sync.coupons.completed_at', false) === false) {
694
- mailchimp_handle_or_queue($job);
695
- }
696
  return mailchimpi_refresh_connected_site_script($store);
697
  }
698
  }
@@ -902,7 +901,11 @@ function mailchimp_tell_system_about_user_submit($email, $status_meta, $seconds
902
  * @return array
903
  */
904
  function mailchimp_get_subscriber_status_options($subscribed) {
905
- $requires = mailchimp_list_has_double_optin();
 
 
 
 
906
 
907
  // if it's true - we set this value to NULL so that we do a 'pending' association on the member.
908
  $status_if_new = $requires ? null : $subscribed;
@@ -910,6 +913,7 @@ function mailchimp_get_subscriber_status_options($subscribed) {
910
 
911
  // set an array of status meta that we will use for comparison below to the transient data
912
  return array(
 
913
  'created' => $status_if_new,
914
  'updated' => $status_if_update
915
  );
@@ -1093,20 +1097,21 @@ function mailchimp_update_member_with_double_opt_in(MailChimp_WooCommerce_Order
1093
  function mailchimp_update_communication_status() {
1094
  $plugin_admin = MailChimp_WooCommerce_Admin::instance();
1095
  $original_opt = $plugin_admin->getData('comm.opt',0);
1096
- $admin_email = $plugin_admin->getOptions()['admin_email'];
1097
-
1098
- $plugin_admin->mailchimp_set_communications_status_on_server($original_opt, $admin_email);
1099
-
1100
  }
1101
 
1102
  // call server to update comm status
1103
  function mailchimp_remove_communication_status() {
1104
  $plugin_admin = MailChimp_WooCommerce_Admin::instance();
1105
  $original_opt = $plugin_admin->getData('comm.opt',0);
1106
- $admin_email = $plugin_admin->getOptions()['admin_email'];
1107
- $remove = true;
1108
-
1109
- $plugin_admin->mailchimp_set_communications_status_on_server($original_opt, $admin_email, $remove);
 
1110
  }
1111
 
1112
  // Print notices outside woocommerce admin bar
@@ -1119,30 +1124,47 @@ function mailchimp_settings_errors() {
1119
  return $notices_html;
1120
  }
1121
 
1122
- function mailchimp_member_language_update($user_email = null, $language = null, $caller = '') {
1123
- if (!$user_email || !$language) return;
1124
-
 
 
 
 
 
 
 
 
 
 
 
 
 
1125
  $hash = md5(strtolower(trim($user_email)));
1126
- if (!mailchimp_get_transient($caller . ".member.{$hash}")) {
1127
  $list_id = mailchimp_get_list_id();
1128
  try {
1129
  // try to get the member to update if already synced
1130
  $member = mailchimp_get_api()->member($list_id, $user_email);
1131
  // update member with new language
 
 
 
 
 
1132
  mailchimp_get_api()->update($list_id, $user_email, $member['status'], null, null, $language);
1133
  // set transient to prevent too many calls to update language
1134
  mailchimp_set_transient($caller . ".member.{$hash}", true, 3600);
1135
- mailchimp_log($caller . '.member.updated', "Updated {$user_email} language to {$language}");
1136
  } catch (\Exception $e) {
1137
  if ($e->getCode() == 404) {
1138
- // member doesn't exist yet, create
1139
- mailchimp_get_api()->subscribe($list_id, $user_email, false, array(), array(), $language);
1140
  // set transient to prevent too many calls to update language
1141
  mailchimp_set_transient($caller . ".member.{$hash}", true, 3600);
1142
- mailchimp_log($caller . '.member.created', "Subscribed {$user_email}, setting language to [{$language}]");
1143
  } else {
1144
  mailchimp_error($caller . '.member.sync.error', $e->getMessage(), $user_email);
1145
-
1146
  }
1147
  }
1148
  }
87
  return (object) array(
88
  'repo' => 'master',
89
  'environment' => 'production', // staging or production
90
+ 'version' => '2.4.1',
91
  'php_version' => phpversion(),
92
  'wp_version' => (empty($wp_version) ? 'Unknown' : $wp_version),
93
  'wc_version' => function_exists('WC') ? WC()->version : null,
223
  return false;
224
  }
225
 
226
+ $key = 'double_optin';
227
 
228
+ $double_optin = mailchimp_get_transient($key);
229
 
230
  if (!$force && ($double_optin === 'yes' || $double_optin === 'no')) {
231
  return $double_optin === 'yes';
234
  try {
235
  $data = mailchimp_get_api()->getList(mailchimp_get_list_id());
236
  $double_optin = array_key_exists('double_optin', $data) ? ($data['double_optin'] ? 'yes' : 'no') : 'no';
237
+ mailchimp_set_transient($key, $double_optin, 600);
238
  return $double_optin === 'yes';
239
  } catch (\Exception $e) {
240
+ mailchimp_error('api.list', __('Error retrieving list for double_optin check', 'mailchimp-for-woocommerce'));
241
+ throw $e;
242
  }
243
 
244
  return $double_optin === 'yes';
319
  /**
320
  * @return array
321
  */
322
+ function mailchimp_get_user_tags_to_update($email = null) {
323
  $tags = mailchimp_get_option('mailchimp_user_tags');
324
+ $formatted_tags = array();
325
+
326
+ if (!empty($tags)) {
327
+ $tags = explode(',', $tags);
328
 
329
+ foreach ($tags as $tag) {
330
+ $formatted_tags[] = array("name" => $tag, "status" => 'active');
331
+ }
 
 
 
 
 
332
  }
333
 
334
  // apply filter to user custom tags addition/removal
335
+ $formatted_tags = apply_filters('mailchimp_user_tags', $formatted_tags, $email);
336
 
337
+ if (empty($formatted_tags)){
338
+ return false;
339
+ }
340
+
341
  return $formatted_tags;
342
  }
343
 
692
  if ($store_id && ($api = mailchimp_get_api())) {
693
  // if we have a store
694
  if (($store = $api->getStore($store_id))) {
 
 
 
 
 
695
  return mailchimpi_refresh_connected_site_script($store);
696
  }
697
  }
901
  * @return array
902
  */
903
  function mailchimp_get_subscriber_status_options($subscribed) {
904
+ try {
905
+ $requires = mailchimp_list_has_double_optin();
906
+ } catch (\Exception $e) {
907
+ return false;
908
+ }
909
 
910
  // if it's true - we set this value to NULL so that we do a 'pending' association on the member.
911
  $status_if_new = $requires ? null : $subscribed;
913
 
914
  // set an array of status meta that we will use for comparison below to the transient data
915
  return array(
916
+ 'requires_double_optin' => $requires,
917
  'created' => $status_if_new,
918
  'updated' => $status_if_update
919
  );
1097
  function mailchimp_update_communication_status() {
1098
  $plugin_admin = MailChimp_WooCommerce_Admin::instance();
1099
  $original_opt = $plugin_admin->getData('comm.opt',0);
1100
+ $options = $plugin_admin->getOptions();
1101
+ if (is_array($options) && array_key_exists('admin_email', $options)) {
1102
+ $plugin_admin->mailchimp_set_communications_status_on_server($original_opt, $options['admin_email']);
1103
+ }
1104
  }
1105
 
1106
  // call server to update comm status
1107
  function mailchimp_remove_communication_status() {
1108
  $plugin_admin = MailChimp_WooCommerce_Admin::instance();
1109
  $original_opt = $plugin_admin->getData('comm.opt',0);
1110
+ $options = $plugin_admin->getOptions();
1111
+ if (is_array($options) && array_key_exists('admin_email', $options)) {
1112
+ $remove = true;
1113
+ $plugin_admin->mailchimp_set_communications_status_on_server($original_opt, $options['admin_email'], $remove);
1114
+ }
1115
  }
1116
 
1117
  // Print notices outside woocommerce admin bar
1124
  return $notices_html;
1125
  }
1126
 
1127
+ /**
1128
+ * @param null $user_email
1129
+ * @param null $language
1130
+ * @param string $caller
1131
+ * @param string $status_if_new
1132
+ * @throws MailChimp_WooCommerce_Error
1133
+ * @throws MailChimp_WooCommerce_ServerError
1134
+ */
1135
+ function mailchimp_member_language_update($user_email = null, $language = null, $caller = '', $status_if_new = 'transactional') {
1136
+ mailchimp_debug('debug', "mailchimp_member_language_update", array(
1137
+ 'user_email' => $user_email,
1138
+ 'user_language' => $language,
1139
+ 'caller' => $caller,
1140
+ 'status_if_new' => $status_if_new,
1141
+ ));
1142
+ if (!$user_email) return;
1143
  $hash = md5(strtolower(trim($user_email)));
1144
+ if ($caller !== 'cart' || !mailchimp_get_transient($caller . ".member.{$hash}")) {
1145
  $list_id = mailchimp_get_list_id();
1146
  try {
1147
  // try to get the member to update if already synced
1148
  $member = mailchimp_get_api()->member($list_id, $user_email);
1149
  // update member with new language
1150
+ // if the member's subscriber status was transactional - and if we're passing in either one of these options below,
1151
+ // we can attach the new status to the member.
1152
+ if ($member['status'] === 'transactional' && in_array($status_if_new, array('subscribed', 'pending'))) {
1153
+ $member['status'] = $status_if_new;
1154
+ }
1155
  mailchimp_get_api()->update($list_id, $user_email, $member['status'], null, null, $language);
1156
  // set transient to prevent too many calls to update language
1157
  mailchimp_set_transient($caller . ".member.{$hash}", true, 3600);
1158
+ mailchimp_log($caller . '.member.updated', "Updated {$user_email} subscriber status to {$member['status']} and language to {$language}");
1159
  } catch (\Exception $e) {
1160
  if ($e->getCode() == 404) {
1161
+ // member doesn't exist yet, create as transactional ( or what was passed in the function args )
1162
+ mailchimp_get_api()->subscribe($list_id, $user_email, $status_if_new, array(), array(), $language);
1163
  // set transient to prevent too many calls to update language
1164
  mailchimp_set_transient($caller . ".member.{$hash}", true, 3600);
1165
+ mailchimp_log($caller . '.member.created', "Added {$user_email} as transactional, setting language to [{$language}]");
1166
  } else {
1167
  mailchimp_error($caller . '.member.sync.error', $e->getMessage(), $user_email);
 
1168
  }
1169
  }
1170
  }
includes/api/assets/class-mailchimp-cart.php CHANGED
@@ -87,18 +87,29 @@ class MailChimp_WooCommerce_Cart
87
 
88
  /**
89
  * @param $id
 
90
  * @return $this
 
91
  */
92
- public function setCampaignID($id)
93
  {
94
  $api = MailChimp_WooCommerce_MailChimpApi::getInstance();
95
  $cid = trim($id);
96
- if (($campaign = $api->getCampaign($cid, false))) {
97
  $this->campaign_id = $campaign['id'];
98
  }
99
  return $this;
100
  }
101
 
 
 
 
 
 
 
 
 
 
102
  /**
103
  * @return mixed
104
  */
87
 
88
  /**
89
  * @param $id
90
+ * @param bool $throw_if_invalid
91
  * @return $this
92
+ * @throws Exception
93
  */
94
+ public function setCampaignID($id, $throw_if_invalid = false)
95
  {
96
  $api = MailChimp_WooCommerce_MailChimpApi::getInstance();
97
  $cid = trim($id);
98
+ if (!empty($cid) && ($campaign = $api->getCampaign($cid, $throw_if_invalid))) {
99
  $this->campaign_id = $campaign['id'];
100
  }
101
  return $this;
102
  }
103
 
104
+ /**
105
+ * @return $this
106
+ */
107
+ public function removeCampaignID()
108
+ {
109
+ $this->campaign_id = null;
110
+ return $this;
111
+ }
112
+
113
  /**
114
  * @return mixed
115
  */
includes/api/assets/class-mailchimp-customer.php CHANGED
@@ -231,6 +231,9 @@ class MailChimp_WooCommerce_Customer
231
  $this->requires_double_optin = (bool) $bool;
232
 
233
  if ($this->requires_double_optin) {
 
 
 
234
  $this->opt_in_status = false;
235
  }
236
 
231
  $this->requires_double_optin = (bool) $bool;
232
 
233
  if ($this->requires_double_optin) {
234
+ if (is_null($this->original_subscriber_status)) {
235
+ $this->original_subscriber_status = $this->opt_in_status;
236
+ }
237
  $this->opt_in_status = false;
238
  }
239
 
includes/api/class-mailchimp-api.php CHANGED
@@ -198,10 +198,21 @@ class MailChimp_WooCommerce_MailChimpApi
198
  */
199
  public function subscribe($list_id, $email, $subscribed = true, $merge_fields = array(), $list_interests = array(), $language = null)
200
  {
 
 
 
 
 
 
 
 
 
 
 
201
  $data = array(
202
  'email_type' => 'html',
203
  'email_address' => $email,
204
- 'status' => ($subscribed === true ? 'subscribed' : 'pending'),
205
  'merge_fields' => $merge_fields,
206
  'interests' => $list_interests,
207
  'language' => $language
@@ -323,7 +334,7 @@ class MailChimp_WooCommerce_MailChimpApi
323
  public function updateMemberTags($list_id, $email, $fail_silently = false)
324
  {
325
  $hash = md5(strtolower(trim($email)));
326
- $tags = mailchimp_get_user_tags_to_update();
327
 
328
  if (empty($tags)) return false;
329
 
@@ -642,8 +653,11 @@ class MailChimp_WooCommerce_MailChimpApi
642
  */
643
  public function getCampaign($campaign_id, $throw_if_invalid = true)
644
  {
 
 
 
645
  // if we found the campaign ID already and it's been stored in the cache, return it from the cache instead.
646
- if (($data = get_site_transient('mailchimp-woocommerce-has-campaign-id-'.$campaign_id))) {
647
  return $data;
648
  }
649
  if (get_site_transient('mailchimp-woocommerce-no-campaign-id-'.$campaign_id)) {
198
  */
199
  public function subscribe($list_id, $email, $subscribed = true, $merge_fields = array(), $list_interests = array(), $language = null)
200
  {
201
+ if (is_string($subscribed)) {
202
+ $status = $subscribed;
203
+ } else {
204
+ if ($subscribed === true) {
205
+ $status = 'subscribed';
206
+ } elseif ($subscribed === false) {
207
+ $status = 'pending';
208
+ } else {
209
+ $status = 'transactional';
210
+ }
211
+ }
212
  $data = array(
213
  'email_type' => 'html',
214
  'email_address' => $email,
215
+ 'status' => $status,
216
  'merge_fields' => $merge_fields,
217
  'interests' => $list_interests,
218
  'language' => $language
334
  public function updateMemberTags($list_id, $email, $fail_silently = false)
335
  {
336
  $hash = md5(strtolower(trim($email)));
337
+ $tags = mailchimp_get_user_tags_to_update($email);
338
 
339
  if (empty($tags)) return false;
340
 
653
  */
654
  public function getCampaign($campaign_id, $throw_if_invalid = true)
655
  {
656
+ // don't let an empty campaign ID do anything
657
+ if (empty($campaign_id)) return false;
658
+
659
  // if we found the campaign ID already and it's been stored in the cache, return it from the cache instead.
660
+ if (($data = get_site_transient('mailchimp-woocommerce-has-campaign-id-'.$campaign_id)) && !empty($data)) {
661
  return $data;
662
  }
663
  if (get_site_transient('mailchimp-woocommerce-no-campaign-id-'.$campaign_id)) {
includes/api/class-mailchimp-woocommerce-create-list-submission.php CHANGED
@@ -92,6 +92,17 @@ class MailChimp_WooCommerce_CreateListSubmission
92
  return $this;
93
  }
94
 
 
 
 
 
 
 
 
 
 
 
 
95
  /**
96
  * @param $name
97
  * @param $email
92
  return $this;
93
  }
94
 
95
+ /**
96
+ * @param bool $public
97
+ * @return $this
98
+ */
99
+ public function setDoi($doi = false)
100
+ {
101
+ $this->props['double_optin'] = (bool) $doi;
102
+
103
+ return $this;
104
+ }
105
+
106
  /**
107
  * @param $name
108
  * @param $email
includes/api/class-mailchimp-woocommerce-transform-orders-wc3.php CHANGED
@@ -251,7 +251,12 @@ class MailChimp_WooCommerce_Transform_Orders
251
 
252
  $customer->setOptInStatus($subscribed_on_order);
253
 
254
- $doi = mailchimp_list_has_double_optin();
 
 
 
 
 
255
  $status_if_new = $doi ? false : $subscribed_on_order;
256
 
257
  $customer->setOptInStatus($status_if_new);
251
 
252
  $customer->setOptInStatus($subscribed_on_order);
253
 
254
+ try {
255
+ $doi = mailchimp_list_has_double_optin();
256
+ } catch (\Exception $e) {
257
+ $doi = false;
258
+ }
259
+
260
  $status_if_new = $doi ? false : $subscribed_on_order;
261
 
262
  $customer->setOptInStatus($status_if_new);
includes/api/class-mailchimp-woocommerce-transform-products.php CHANGED
@@ -326,7 +326,14 @@ class MailChimp_WooCommerce_Transform_Products
326
  $store_id = mailchimp_get_store_id();
327
  $api = mailchimp_get_api();
328
 
329
- $id = $item->get_product_id();
 
 
 
 
 
 
 
330
  $title = $item->get_name();
331
 
332
  // only do this if we haven't pushed this product ID up yet to Mailchimp
326
  $store_id = mailchimp_get_store_id();
327
  $api = mailchimp_get_api();
328
 
329
+ // If the $item->get_product_id() is null or 0, we can try to retrieve the id directly from "wc_order_product_lookup" table
330
+ if (!$id = $item->get_product_id()) {
331
+ global $wpdb;
332
+ $query = "SELECT product_id FROM {$wpdb->prefix}wc_order_product_lookup WHERE order_item_id = %s";
333
+ $query_result = $wpdb->get_results( $wpdb->prepare($query, $item->get_id()));
334
+ $id = $query_result[0]->product_id ?: 0;
335
+ }
336
+
337
  $title = $item->get_name();
338
 
339
  // only do this if we haven't pushed this product ID up yet to Mailchimp
includes/class-mailchimp-woocommerce-queue.php ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class MailChimp_WooCommerce_Queue
4
+ {
5
+ /**
6
+ * @var string
7
+ */
8
+ public $table;
9
+
10
+ /**
11
+ * @var string
12
+ */
13
+ public $failed_table;
14
+
15
+ /**
16
+ * @var int
17
+ */
18
+ public $release_time = 60;
19
+
20
+ public $max_tries = 3;
21
+
22
+ protected static $_instance = null;
23
+
24
+ /**
25
+ * @return MailChimp_WooCommerce_Queue
26
+ */
27
+ public static function instance()
28
+ {
29
+ if (!empty(static::$_instance)) return static::$_instance;
30
+ return static::$_instance = new MailChimp_WooCommerce_Queue();
31
+ }
32
+
33
+ /**
34
+ * WP_Queue constructor
35
+ */
36
+ public function __construct() {
37
+ global $wpdb;
38
+ $this->table = $wpdb->prefix . 'queue';
39
+ $this->failed_table = $wpdb->prefix . 'failed_jobs';
40
+ }
41
+
42
+ /**
43
+ * Push a job onto the queue.
44
+ *
45
+ * @param WP_Job $job
46
+ * @param int $delay
47
+ *
48
+ * @return $this
49
+ */
50
+ public function push(WP_Job $job, $delay = 0)
51
+ {
52
+ global $wpdb;
53
+
54
+ $data = array(
55
+ 'job' => maybe_serialize($job),
56
+ 'available_at' => $this->datetime($delay),
57
+ 'created_at' => $this->datetime(),
58
+ );
59
+
60
+ if (!$wpdb->insert($this->table, $data) && $this->create_tables_if_required()) {
61
+ if (!$wpdb->insert($this->table, $data)) {
62
+ mailchimp_debug('Queue Job '.get_class($job), $wpdb->last_error);
63
+ }
64
+ }
65
+
66
+ return $this;
67
+ }
68
+
69
+ /**
70
+ * Release.
71
+ *
72
+ * @param object $job
73
+ * @param int $delay
74
+ */
75
+ public function release( $job, $delay = 0 )
76
+ {
77
+ if ($job->attempts >= $this->max_tries) {
78
+ return $this->failed($job);
79
+ }
80
+
81
+ global $wpdb;
82
+
83
+ $wpdb->update($this->table, array(
84
+ 'attempts' => $job->attempts + 1,
85
+ 'locked' => 0,
86
+ 'locked_at' => null,
87
+ 'available_at' => $this->datetime( $delay ),
88
+ ), array('id' => $job->id));
89
+ }
90
+
91
+ /**
92
+ * Failed
93
+ *
94
+ * @param stdClass $job
95
+ */
96
+ protected function failed($job)
97
+ {
98
+ global $wpdb;
99
+
100
+ $wpdb->insert($this->failed_table, array(
101
+ 'job' => $job->job,
102
+ 'failed_at' => $this->datetime(),
103
+ ));
104
+
105
+ $payload = unserialize($job->job);
106
+
107
+ if (method_exists($payload, 'failed')) {
108
+ $payload->failed();
109
+ }
110
+
111
+ $this->delete($job);
112
+ }
113
+
114
+ /**
115
+ * Delete.
116
+ *
117
+ * @param object $job
118
+ */
119
+ public function delete( $job )
120
+ {
121
+ global $wpdb;
122
+ $wpdb->delete($this->table, array('id' => $job->id));
123
+ }
124
+
125
+ /**
126
+ * Get MySQL datetime.
127
+ *
128
+ * @param int $offset Seconds, can pass negative int.
129
+ *
130
+ * @return string
131
+ */
132
+ protected function datetime($offset = 0)
133
+ {
134
+ return gmdate( 'Y-m-d H:i:s', time() + $offset);
135
+ }
136
+
137
+ /**
138
+ * Available jobs.
139
+ */
140
+ public function available_jobs()
141
+ {
142
+ global $wpdb;
143
+ $now = $this->datetime();
144
+ $sql = $wpdb->prepare("SELECT COUNT(*) FROM {$this->table} WHERE available_at <= %s", $now);
145
+ return $wpdb->get_var($sql);
146
+ }
147
+
148
+ /**
149
+ * Available jobs.
150
+ */
151
+ public function failed_jobs()
152
+ {
153
+ global $wpdb;
154
+ return $wpdb->get_var("SELECT COUNT(*) FROM {$this->failed_table}");
155
+ }
156
+
157
+ /**
158
+ * Restart failed jobs.
159
+ */
160
+ public function restart_failed_jobs()
161
+ {
162
+ global $wpdb;
163
+ $count = 0;
164
+ $jobs = $wpdb->get_results("SELECT * FROM {$this->failed_table}");
165
+
166
+ foreach ($jobs as $job) {
167
+ $this->push(maybe_unserialize($job->job));
168
+ $wpdb->delete($this->failed_table, array('id' => $job->id));
169
+ $count++;
170
+ }
171
+
172
+ return $count;
173
+ }
174
+
175
+ /**
176
+ * Get next job.
177
+ */
178
+ public function get_next_job()
179
+ {
180
+ global $wpdb;
181
+ $this->maybe_release_locked_jobs();
182
+ $now = $this->datetime();
183
+ $sql = $wpdb->prepare("SELECT * FROM {$this->table} WHERE locked = 0 AND available_at <= %s", $now);
184
+ return $wpdb->get_row($sql);
185
+ }
186
+
187
+ /**
188
+ * Maybe release locked jobs.
189
+ */
190
+ protected function maybe_release_locked_jobs()
191
+ {
192
+ global $wpdb;
193
+ $expired = $this->datetime(-$this->release_time);
194
+ $sql = $wpdb->prepare("UPDATE {$this->table} SET attempts = attempts + 1, locked = 0, locked_at = NULL WHERE locked = 1 AND locked_at <= %s", $expired);
195
+ $wpdb->query($sql);
196
+ }
197
+
198
+ /**
199
+ * Lock job.
200
+ *
201
+ * @param object $job
202
+ */
203
+ public function lock_job( $job )
204
+ {
205
+ global $wpdb;
206
+ $wpdb->update( $this->table, array('locked' => 1, 'locked_at' => $this->datetime()), array('id' => $job->id));
207
+ }
208
+
209
+ /**
210
+ * @return bool
211
+ */
212
+ public function create_tables_if_required()
213
+ {
214
+ global $wpdb;
215
+ try {
216
+ if (mailchimp_string_contains($wpdb->last_error, 'Table')) {
217
+ mailchimp_debug('Queue Table Was Not Found!', 'Creating Tables');
218
+ MailChimp_WooCommerce_Activator::create_queue_tables();
219
+ return true;
220
+ }
221
+ } catch (\Exception $e) {
222
+ mailchimp_error_trace($e, 'trying to create queue tables');
223
+ }
224
+ return false;
225
+ }
226
+ }
includes/class-mailchimp-woocommerce-service.php CHANGED
@@ -278,6 +278,22 @@ class MailChimp_Service extends MailChimp_WooCommerce_Options
278
  $this->handleCouponSaved($post_id, new WC_Coupon($post_id));
279
  }
280
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
  /**
282
  * Save post metadata when a post is saved.
283
  *
278
  $this->handleCouponSaved($post_id, new WC_Coupon($post_id));
279
  }
280
 
281
+ /**
282
+ * @param WC_Data $object The deleted or trashed object.
283
+ * @param WP_REST_Response $response The response data.
284
+ * @param WP_REST_Request $request The request sent to the API.
285
+ */
286
+ public function handleAPICouponTrashed($object, $response, $request)
287
+ {
288
+ try {
289
+ $deleted = mailchimp_get_api()->deletePromoRule(mailchimp_get_store_id(), $request['id']);
290
+ if ($deleted) mailchimp_log('api.promo_code.deleted', "deleted promo code {$request['id']}");
291
+ else mailchimp_log('api.promo_code.delete_fail', "Unable to delete promo code {$request['id']}");
292
+ } catch (\Exception $e) {
293
+ mailchimp_error('delete promo code', $e->getMessage());
294
+ }
295
+ }
296
+
297
  /**
298
  * Save post metadata when a post is saved.
299
  *
includes/class-mailchimp-woocommerce.php CHANGED
@@ -141,7 +141,12 @@ class MailChimp_WooCommerce
141
  {
142
  // if we need to refresh the double opt in for any reason - just do it here.
143
  if ($this->queryStringEquals('mc_doi_refresh', '1')) {
144
- $enabled_doi = mailchimp_list_has_double_optin(true);
 
 
 
 
 
145
  mailchimp_log('mc.utils.doi_refresh', ($enabled_doi ? 'turned ON' : 'turned OFF'));
146
  }
147
  }
@@ -278,9 +283,7 @@ class MailChimp_WooCommerce
278
 
279
  $plugin_public = new MailChimp_WooCommerce_Public( $this->get_plugin_name(), $this->get_version() );
280
  $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_scripts');
281
- if ( apply_filters( 'mailchimp_add_inline_footer_script', true ) ) {
282
- $this->loader->add_action('wp_footer', $plugin_public, 'add_inline_footer_script');
283
- }
284
  }
285
 
286
  /**
@@ -344,20 +347,21 @@ class MailChimp_WooCommerce
344
 
345
  // save post hooks
346
  $this->loader->add_action('save_post', $service, 'handlePostSaved', 10, 3);
347
- $this->loader->add_action('wp_trash_post', $service, 'handlePostTrashed', 10);
348
- $this->loader->add_action('untrashed_post', $service, 'handlePostRestored', 10);
349
 
350
  //coupons
351
- $this->loader->add_action('woocommerce_new_coupon', $service, 'handleNewCoupon', 10);
352
  $this->loader->add_action('woocommerce_coupon_options_save', $service, 'handleCouponSaved', 10, 2);
353
  $this->loader->add_action('woocommerce_api_create_coupon', $service, 'handleCouponSaved', 9, 2);
354
 
355
- $this->loader->add_action('woocommerce_delete_coupon', $service, 'handleCouponTrashed', 10);
356
- $this->loader->add_action('woocommerce_trash_coupon', $service, 'handleCouponTrashed', 10);
357
- $this->loader->add_action('woocommerce_api_delete_coupon', $service, 'handleCouponTrashed', 9);
 
358
 
359
  // handle the user registration hook
360
- $this->loader->add_action('user_register', $service, 'handleUserRegistration');
361
  // handle the user updated profile hook
362
  $this->loader->add_action('profile_update', $service, 'handleUserUpdated', 10, 2);
363
 
141
  {
142
  // if we need to refresh the double opt in for any reason - just do it here.
143
  if ($this->queryStringEquals('mc_doi_refresh', '1')) {
144
+ try {
145
+ $enabled_doi = mailchimp_list_has_double_optin(true);
146
+ } catch (\Exception $e) {
147
+ mailchimp_error('mc.utils.doi_refresh', 'failed updating doi transient');
148
+ return false;
149
+ }
150
  mailchimp_log('mc.utils.doi_refresh', ($enabled_doi ? 'turned ON' : 'turned OFF'));
151
  }
152
  }
283
 
284
  $plugin_public = new MailChimp_WooCommerce_Public( $this->get_plugin_name(), $this->get_version() );
285
  $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_scripts');
286
+ $this->loader->add_action('wp_footer', $plugin_public, 'add_inline_footer_script');
 
 
287
  }
288
 
289
  /**
347
 
348
  // save post hooks
349
  $this->loader->add_action('save_post', $service, 'handlePostSaved', 10, 3);
350
+ $this->loader->add_action('wp_trash_post', $service, 'handlePostTrashed', 10, 1);
351
+ $this->loader->add_action('untrashed_post', $service, 'handlePostRestored', 10, 1);
352
 
353
  //coupons
354
+ $this->loader->add_action('woocommerce_new_coupon', $service, 'handleNewCoupon', 10, 1);
355
  $this->loader->add_action('woocommerce_coupon_options_save', $service, 'handleCouponSaved', 10, 2);
356
  $this->loader->add_action('woocommerce_api_create_coupon', $service, 'handleCouponSaved', 9, 2);
357
 
358
+ $this->loader->add_action('woocommerce_delete_coupon', $service, 'handlePostTrashed', 10, 1);
359
+ $this->loader->add_action('woocommerce_trash_coupon', $service, 'handlePostTrashed', 10, 1);
360
+
361
+ $this->loader->add_action('woocommerce_rest_delete_shop_coupon_object', $service, 'handleAPICouponTrashed', 10, 3);
362
 
363
  // handle the user registration hook
364
+ $this->loader->add_action('user_register', $service, 'handleUserRegistration', 10, 1);
365
  // handle the user updated profile hook
366
  $this->loader->add_action('profile_update', $service, 'handleUserUpdated', 10, 2);
367
 
includes/processes/class-mailchimp-woocommerce-cart-update.php CHANGED
@@ -120,9 +120,8 @@ class MailChimp_WooCommerce_Cart_Update extends Mailchimp_Woocommerce_Job
120
  // if we have a campaign id let's set it now.
121
  if (!empty($this->campaign_id)) {
122
  try {
123
- $cart->setCampaignID($this->campaign_id);
124
- }
125
- catch (\Exception $e) {
126
  mailchimp_log('cart_set_campaign_id.error', 'No campaign added to abandoned cart, with provided ID: '. $this->campaign_id. ' :: '. $e->getMessage(). ' :: in '.$e->getFile().' :: on '.$e->getLine());
127
  }
128
  }
@@ -151,9 +150,23 @@ class MailChimp_WooCommerce_Cart_Update extends Mailchimp_Woocommerce_Job
151
  $cart->setOrderTotal($order_total);
152
 
153
  try {
154
- // if the post is successful we're all good.
155
- if ($api->addCart($store_id, $cart, false) !== false) {
156
- mailchimp_log('abandoned_cart.success', "email: {$customer->getEmailAddress()} :: checkout_url: $checkout_url");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  }
158
  } catch (\Exception $e) {
159
 
120
  // if we have a campaign id let's set it now.
121
  if (!empty($this->campaign_id)) {
122
  try {
123
+ $cart->setCampaignID($this->campaign_id, true);
124
+ } catch (\Exception $e) {
 
125
  mailchimp_log('cart_set_campaign_id.error', 'No campaign added to abandoned cart, with provided ID: '. $this->campaign_id. ' :: '. $e->getMessage(). ' :: in '.$e->getFile().' :: on '.$e->getLine());
126
  }
127
  }
150
  $cart->setOrderTotal($order_total);
151
 
152
  try {
153
+ try {
154
+ // if the post is successful we're all good.
155
+ if ($api->addCart($store_id, $cart, false) !== false) {
156
+ mailchimp_log('abandoned_cart.success', "email: {$customer->getEmailAddress()} :: checkout_url: $checkout_url");
157
+ }
158
+ } catch (\Exception $e) {
159
+ // for some reason this happens on carts and we need to make sure that this doesn't prevent
160
+ // the submission from going through.
161
+ if (mailchimp_string_contains($e->getMessage(), 'campaign with the')) {
162
+ // remove the campaign ID and re-submit
163
+ $cart->removeCampaignID();
164
+ if ($api->addCart($store_id, $cart, false) !== false) {
165
+ mailchimp_log('abandoned_cart.success', "email: {$customer->getEmailAddress()} :: checkout_url: $checkout_url");
166
+ }
167
+ } else {
168
+ throw $e;
169
+ }
170
  }
171
  } catch (\Exception $e) {
172
 
includes/processes/class-mailchimp-woocommerce-single-order.php CHANGED
@@ -158,8 +158,15 @@ class MailChimp_WooCommerce_Single_Order extends Mailchimp_Woocommerce_Job
158
  mailchimp_error('order_sync.error', mailchimp_error_trace($e, "GET subscriber :: {$order->getId()}"));
159
  throw $e;
160
  }
 
161
  // if they are using double opt in, we need to pass this in as false here so it doesn't auto subscribe.
162
- $status = mailchimp_list_has_double_optin() ? false : $should_auto_subscribe;
 
 
 
 
 
 
163
  $order->getCustomer()->setOptInStatus($status);
164
  }
165
  }
@@ -302,8 +309,17 @@ class MailChimp_WooCommerce_Single_Order extends Mailchimp_Woocommerce_Job
302
  $log .= " :: abandoned cart deleted [{$this->cart_session_id}]";
303
  }
304
 
 
 
 
 
 
 
 
 
 
305
  // Maybe sync subscriber to set correct member.language
306
- mailchimp_member_language_update($email, $this->user_language, 'order');
307
 
308
  mailchimp_log('order_submit.success', $log);
309
 
158
  mailchimp_error('order_sync.error', mailchimp_error_trace($e, "GET subscriber :: {$order->getId()}"));
159
  throw $e;
160
  }
161
+
162
  // if they are using double opt in, we need to pass this in as false here so it doesn't auto subscribe.
163
+ try {
164
+ $doi = mailchimp_list_has_double_optin(true);
165
+ } catch (\Exception $e_doi) {
166
+ throw $e_doi;
167
+ }
168
+
169
+ $status = $doi ? false : $should_auto_subscribe;
170
  $order->getCustomer()->setOptInStatus($status);
171
  }
172
  }
309
  $log .= " :: abandoned cart deleted [{$this->cart_session_id}]";
310
  }
311
 
312
+ // if we require double opt in on the list, and the customer requires double opt in,
313
+ // we should mark them as pending so they get the opt in email now.
314
+ if (mailchimp_list_has_double_optin()) {
315
+ $status_if_new = $order->getCustomer()->getOriginalSubscriberStatus() ? 'pending' : 'transactional';
316
+ } else {
317
+ // if true, subscribed - otherwise transactional
318
+ $status_if_new = $order->getCustomer()->getOptInStatus() ? 'subscribed' : 'transactional';
319
+ }
320
+
321
  // Maybe sync subscriber to set correct member.language
322
+ mailchimp_member_language_update($email, $this->user_language, 'order', $status_if_new);
323
 
324
  mailchimp_log('order_submit.success', $log);
325
 
includes/processes/class-mailchimp-woocommerce-user-submit.php CHANGED
@@ -172,6 +172,10 @@ class MailChimp_WooCommerce_User_Submit extends Mailchimp_Woocommerce_Job
172
  $api->deleteMember($list_id, $this->updated_data['user_email']);
173
  // subscribe the new
174
  $api->subscribe($list_id, $email, $status_meta['created'], $merge_fields, null, $language);
 
 
 
 
175
  mailchimp_tell_system_about_user_submit($email, $status_meta, 60);
176
 
177
  if ($status_meta['created']) {
@@ -201,6 +205,10 @@ class MailChimp_WooCommerce_User_Submit extends Mailchimp_Woocommerce_Job
201
  if (isset($member_data['status']) && $member_data['status'] === 'transactional' || $member_data['status'] === 'cleaned') {
202
  // ok let's update this member
203
  $api->update($list_id, $email, $status_meta['updated'], $merge_fields, null, $language);
 
 
 
 
204
  mailchimp_tell_system_about_user_submit($email, $status_meta, 60);
205
  mailchimp_log('member.sync', "Updated Member {$email}", array(
206
  'previous_status' => $member_data['status'],
@@ -214,6 +222,10 @@ class MailChimp_WooCommerce_User_Submit extends Mailchimp_Woocommerce_Job
214
  if (isset($member_data['status'])) {
215
  // ok let's update this member
216
  $api->update($list_id, $email, $member_data['status'], $merge_fields, null, $language);
 
 
 
 
217
  mailchimp_tell_system_about_user_submit($email, $status_meta, 60);
218
  mailchimp_log('member.sync', "Updated Member {$email} ( merge fields only )", array(
219
  'merge_fields' => $merge_fields
@@ -232,10 +244,17 @@ class MailChimp_WooCommerce_User_Submit extends Mailchimp_Woocommerce_Job
232
  if ($e->getCode() == 404) {
233
 
234
  try {
235
- $api->subscribe($list_id, $user->user_email, $status_meta['created'], $merge_fields, null, $language);
 
 
 
 
 
 
 
236
  mailchimp_tell_system_about_user_submit($email, $status_meta, 60);
237
  if ($status_meta['created']) {
238
- mailchimp_log('member.sync', "Subscribed Member {$user->user_email}", array('status_if_new' => $status_meta['created'], 'merge_fields' => $merge_fields));
239
  } else {
240
  mailchimp_log('member.sync', "{$user->user_email} is Pending Double OptIn");
241
  }
172
  $api->deleteMember($list_id, $this->updated_data['user_email']);
173
  // subscribe the new
174
  $api->subscribe($list_id, $email, $status_meta['created'], $merge_fields, null, $language);
175
+
176
+ // update the member tags but fail silently just in case.
177
+ $api->updateMemberTags(mailchimp_get_list_id(), $email, true);
178
+
179
  mailchimp_tell_system_about_user_submit($email, $status_meta, 60);
180
 
181
  if ($status_meta['created']) {
205
  if (isset($member_data['status']) && $member_data['status'] === 'transactional' || $member_data['status'] === 'cleaned') {
206
  // ok let's update this member
207
  $api->update($list_id, $email, $status_meta['updated'], $merge_fields, null, $language);
208
+
209
+ // update the member tags but fail silently just in case.
210
+ $api->updateMemberTags(mailchimp_get_list_id(), $email, true);
211
+
212
  mailchimp_tell_system_about_user_submit($email, $status_meta, 60);
213
  mailchimp_log('member.sync', "Updated Member {$email}", array(
214
  'previous_status' => $member_data['status'],
222
  if (isset($member_data['status'])) {
223
  // ok let's update this member
224
  $api->update($list_id, $email, $member_data['status'], $merge_fields, null, $language);
225
+
226
+ // update the member tags but fail silently just in case.
227
+ $api->updateMemberTags(mailchimp_get_list_id(), $email, true);
228
+
229
  mailchimp_tell_system_about_user_submit($email, $status_meta, 60);
230
  mailchimp_log('member.sync', "Updated Member {$email} ( merge fields only )", array(
231
  'merge_fields' => $merge_fields
244
  if ($e->getCode() == 404) {
245
 
246
  try {
247
+ $uses_doi = isset($status_meta['requires_double_optin']) && $status_meta['requires_double_optin'];
248
+ $status_if_new = $uses_doi ? 'pending' : true;
249
+
250
+ $api->subscribe($list_id, $user->user_email, $status_if_new, $merge_fields, null, $language);
251
+
252
+ // update the member tags but fail silently just in case.
253
+ $api->updateMemberTags(mailchimp_get_list_id(), $email, true);
254
+
255
  mailchimp_tell_system_about_user_submit($email, $status_meta, 60);
256
  if ($status_meta['created']) {
257
+ mailchimp_log('member.sync', "Subscribed Member {$user->user_email}", array('status_if_new' => $status_if_new, 'merge_fields' => $merge_fields));
258
  } else {
259
  mailchimp_log('member.sync', "{$user->user_email} is Pending Double OptIn");
260
  }
includes/vendor/action-scheduler/.editorconfig ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file is for unifying the coding style for different editors and IDEs
2
+ # editorconfig.org
3
+
4
+ # WordPress Coding Standards
5
+ # https://make.wordpress.org/core/handbook/coding-standards/
6
+
7
+ root = true
8
+
9
+ [*]
10
+ charset = utf-8
11
+ end_of_line = lf
12
+ indent_size = 4
13
+ tab_width = 4
14
+ indent_style = tab
15
+ insert_final_newline = true
16
+ trim_trailing_whitespace = true
17
+
18
+ [*.txt]
19
+ trim_trailing_whitespace = false
20
+
21
+ [*.{md,json,yml}]
22
+ trim_trailing_whitespace = false
23
+ indent_style = space
24
+ indent_size = 2
includes/vendor/action-scheduler/.gitattributes ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ docs export-ignore
2
+ tests export-ignore
3
+ codecov.yml export-ignore
4
+ .editorconfig export-ignore
5
+ .github export-ignore
6
+ .travis.yml export-ignore
7
+ .gitattributes export-ignore
8
+ .gitignore export-ignore
9
+ composer.* export-ignore
10
+ Gruntfile.js export-ignore
11
+ package.json export-ignore
12
+ package-lock.json export-ignore
13
+ phpcs.xml export-ignore
14
+ phpunit.* export-ignore
includes/vendor/action-scheduler/.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ phpunit.xml
2
+ vendor
3
+ .idea
4
+ node_modules
includes/vendor/action-scheduler/.travis.yml ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Travis CI Configuration File
2
+
3
+ # Tell Travis CI we're using PHP
4
+ language: php
5
+
6
+ # We nee to use Precise, not Trusty, to test against PHP 5.3, see https://github.com/travis-ci/travis-ci/issues/8219
7
+ dist: precise
8
+
9
+ # Versions of PHP to test against
10
+ php:
11
+ - "5.3"
12
+ - "5.6"
13
+ - "7.0"
14
+ - "7.1"
15
+ - "7.2"
16
+ - "7.3"
17
+
18
+ # Specify versions of WordPress to test against
19
+ # WP_VERSION = WordPress version number (use "master" for SVN trunk)
20
+ # WP_MULTISITE = whether to test multisite (use either "0" or "1")
21
+ env:
22
+ - WP_VERSION=5.3 WP_MULTISITE=0
23
+ - WP_VERSION=5.2 WP_MULTISITE=0
24
+ - WP_VERSION=5.1 WP_MULTISITE=0
25
+ - WP_VERSION=5.3 WP_MULTISITE=1
26
+ - WP_VERSION=5.2 WP_MULTISITE=1
27
+ - WP_VERSION=5.1 WP_MULTISITE=1
28
+
29
+ # WordPress 5.3 requires PHP 5.6. Exclude WP 5.3 + PHP 5.3
30
+ jobs:
31
+ exclude:
32
+ - php: "5.3"
33
+ env: WP_VERSION=5.3 WP_MULTISITE=0
34
+ - php: "5.3"
35
+ env: WP_VERSION=5.3 WP_MULTISITE=1
36
+
37
+ # Grab the setup script and execute
38
+ before_script:
39
+ - source tests/travis/setup.sh $TRAVIS_PHP_VERSION
40
+
41
+ script:
42
+ - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]] && [[ "$WP_VERSION" == "5.3" ]] && [[ "$WP_MULTISITE" == "0" ]] && [[ "$TRAVIS_BRANCH" == "master" ]]; then phpunit --configuration tests/phpunit.xml.dist --coverage-clover clover.xml; else phpunit --configuration tests/phpunit.xml.dist; fi
43
+
44
+ after_script:
45
+ - bash <(curl -s https://codecov.io/bash)
includes/vendor/action-scheduler/Gruntfile.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ module.exports = function( grunt ) {
2
+ 'use strict';
3
+
4
+ grunt.initConfig({
5
+ // Check textdomain errors.
6
+ checktextdomain: {
7
+ options:{
8
+ text_domain: 'action-scheduler',
9
+ keywords: [
10
+ '__:1,2d',
11
+ '_e:1,2d',
12
+ '_x:1,2c,3d',
13
+ 'esc_html__:1,2d',
14
+ 'esc_html_e:1,2d',
15
+ 'esc_html_x:1,2c,3d',
16
+ 'esc_attr__:1,2d',
17
+ 'esc_attr_e:1,2d',
18
+ 'esc_attr_x:1,2c,3d',
19
+ '_ex:1,2c,3d',
20
+ '_n:1,2,4d',
21
+ '_nx:1,2,4c,5d',
22
+ '_n_noop:1,2,3d',
23
+ '_nx_noop:1,2,3c,4d'
24
+ ]
25
+ },
26
+ files: {
27
+ src: [
28
+ '**/*.php',
29
+ '!node_modules/**',
30
+ '!tests/**',
31
+ '!vendor/**',
32
+ '!tmp/**'
33
+ ],
34
+ expand: true
35
+ }
36
+ },
37
+
38
+ // PHP Code Sniffer.
39
+ phpcs: {
40
+ options: {
41
+ bin: 'vendor/bin/phpcs'
42
+ },
43
+ dist: {
44
+ src: [
45
+ '**/*.php', // Include all php files.
46
+ '!deprecated/**',
47
+ '!node_modules/**',
48
+ '!vendor/**'
49
+ ]
50
+ }
51
+ }
52
+ });
53
+
54
+ // Load NPM tasks to be used here.
55
+ grunt.loadNpmTasks( 'grunt-phpcs' );
56
+ grunt.loadNpmTasks( 'grunt-checktextdomain' );
57
+ };
includes/vendor/action-scheduler/classes/ActionScheduler_ActionFactory.php CHANGED
@@ -22,7 +22,7 @@ class ActionScheduler_ActionFactory {
22
  break;
23
  case ActionScheduler_Store::STATUS_CANCELED :
24
  $action_class = 'ActionScheduler_CanceledAction';
25
- if ( ! is_null( $schedule ) && ! is_a( $schedule, 'ActionScheduler_CanceledSchedule' ) ) {
26
  $schedule = new ActionScheduler_CanceledSchedule( $schedule->get_date() );
27
  }
28
  break;
@@ -61,7 +61,7 @@ class ActionScheduler_ActionFactory {
61
  * @param array $args Args to pass when the hook is triggered
62
  * @param string $group A group to put the action in
63
  *
64
- * @return string The ID of the stored action
65
  */
66
  public function async( $hook, $args = array(), $group = '' ) {
67
  $schedule = new ActionScheduler_NullSchedule();
@@ -75,7 +75,7 @@ class ActionScheduler_ActionFactory {
75
  * @param int $when Unix timestamp when the action will run
76
  * @param string $group A group to put the action in
77
  *
78
- * @return string The ID of the stored action
79
  */
80
  public function single( $hook, $args = array(), $when = null, $group = '' ) {
81
  $date = as_get_datetime_object( $when );
@@ -93,7 +93,7 @@ class ActionScheduler_ActionFactory {
93
  * @param int $interval Seconds between runs
94
  * @param string $group A group to put the action in
95
  *
96
- * @return string The ID of the stored action
97
  */
98
  public function recurring( $hook, $args = array(), $first = null, $interval = null, $group = '' ) {
99
  if ( empty($interval) ) {
@@ -116,7 +116,7 @@ class ActionScheduler_ActionFactory {
116
  * @param int $schedule A cron definition string
117
  * @param string $group A group to put the action in
118
  *
119
- * @return string The ID of the stored action
120
  */
121
  public function cron( $hook, $args = array(), $base_timestamp = null, $schedule = null, $group = '' ) {
122
  if ( empty($schedule) ) {
@@ -170,7 +170,7 @@ class ActionScheduler_ActionFactory {
170
  /**
171
  * @param ActionScheduler_Action $action
172
  *
173
- * @return string The ID of the stored action
174
  */
175
  protected function store( ActionScheduler_Action $action ) {
176
  $store = ActionScheduler_Store::instance();
22
  break;
23
  case ActionScheduler_Store::STATUS_CANCELED :
24
  $action_class = 'ActionScheduler_CanceledAction';
25
+ if ( ! is_null( $schedule ) && ! is_a( $schedule, 'ActionScheduler_CanceledSchedule' ) && ! is_a( $schedule, 'ActionScheduler_NullSchedule' ) ) {
26
  $schedule = new ActionScheduler_CanceledSchedule( $schedule->get_date() );
27
  }
28
  break;
61
  * @param array $args Args to pass when the hook is triggered
62
  * @param string $group A group to put the action in
63
  *
64
+ * @return int The ID of the stored action
65
  */
66
  public function async( $hook, $args = array(), $group = '' ) {
67
  $schedule = new ActionScheduler_NullSchedule();
75
  * @param int $when Unix timestamp when the action will run
76
  * @param string $group A group to put the action in
77
  *
78
+ * @return int The ID of the stored action
79
  */
80
  public function single( $hook, $args = array(), $when = null, $group = '' ) {
81
  $date = as_get_datetime_object( $when );
93
  * @param int $interval Seconds between runs
94
  * @param string $group A group to put the action in
95
  *
96
+ * @return int The ID of the stored action
97
  */
98
  public function recurring( $hook, $args = array(), $first = null, $interval = null, $group = '' ) {
99
  if ( empty($interval) ) {
116
  * @param int $schedule A cron definition string
117
  * @param string $group A group to put the action in
118
  *
119
+ * @return int The ID of the stored action
120
  */
121
  public function cron( $hook, $args = array(), $base_timestamp = null, $schedule = null, $group = '' ) {
122
  if ( empty($schedule) ) {
170
  /**
171
  * @param ActionScheduler_Action $action
172
  *
173
+ * @return int The ID of the stored action
174
  */
175
  protected function store( ActionScheduler_Action $action ) {
176
  $store = ActionScheduler_Store::instance();
includes/vendor/action-scheduler/classes/ActionScheduler_DataController.php CHANGED
@@ -101,7 +101,7 @@ class ActionScheduler_DataController {
101
  * @param integer $sleep_time The number of seconds to pause before resuming operation.
102
  */
103
  public static function set_sleep_time( $sleep_time ) {
104
- self::$sleep_time = $sleep_time;
105
  }
106
 
107
  /**
@@ -110,7 +110,7 @@ class ActionScheduler_DataController {
110
  * @param integer $free_ticks The number of ticks to free memory on.
111
  */
112
  public static function set_free_ticks( $free_ticks ) {
113
- self::$free_ticks = $free_ticks;
114
  }
115
 
116
  /**
101
  * @param integer $sleep_time The number of seconds to pause before resuming operation.
102
  */
103
  public static function set_sleep_time( $sleep_time ) {
104
+ self::$sleep_time = (int) $sleep_time;
105
  }
106
 
107
  /**
110
  * @param integer $free_ticks The number of ticks to free memory on.
111
  */
112
  public static function set_free_ticks( $free_ticks ) {
113
+ self::$free_ticks = (int) $free_ticks;
114
  }
115
 
116
  /**
includes/vendor/action-scheduler/classes/ActionScheduler_ListTable.php CHANGED
@@ -307,7 +307,7 @@ class ActionScheduler_ListTable extends ActionScheduler_Abstract_ListTable {
307
  * @return string
308
  */
309
  protected function maybe_render_actions( $row, $column_name ) {
310
- if ( 'pending' === strtolower( $row['status'] ) ) {
311
  return parent::maybe_render_actions( $row, $column_name );
312
  }
313
 
@@ -577,6 +577,7 @@ class ActionScheduler_ListTable extends ActionScheduler_Abstract_ListTable {
577
  $this->items[ $action_id ] = array(
578
  'ID' => $action_id,
579
  'hook' => $action->get_hook(),
 
580
  'status' => $status_labels[ $this->store->get_status( $action_id ) ],
581
  'args' => $action->get_args(),
582
  'group' => $action->get_group(),
307
  * @return string
308
  */
309
  protected function maybe_render_actions( $row, $column_name ) {
310
+ if ( 'pending' === strtolower( $row[ 'status_name' ] ) ) {
311
  return parent::maybe_render_actions( $row, $column_name );
312
  }
313
 
577
  $this->items[ $action_id ] = array(
578
  'ID' => $action_id,
579
  'hook' => $action->get_hook(),
580
+ 'status_name' => $this->store->get_status( $action_id ),
581
  'status' => $status_labels[ $this->store->get_status( $action_id ) ],
582
  'args' => $action->get_args(),
583
  'group' => $action->get_group(),
includes/vendor/action-scheduler/classes/ActionScheduler_QueueRunner.php CHANGED
@@ -50,16 +50,15 @@ class ActionScheduler_QueueRunner extends ActionScheduler_Abstract_QueueRunner {
50
 
51
  add_filter( 'cron_schedules', array( self::instance(), 'add_wp_cron_schedule' ) );
52
 
 
 
 
 
 
 
53
  $cron_context = array( 'WP Cron' );
54
 
55
  if ( ! wp_next_scheduled( self::WP_CRON_HOOK, $cron_context ) ) {
56
-
57
- // Check for and remove any WP Cron hook scheduled by Action Scheduler < 3.0.0, which didn't include the $context param
58
- $next_timestamp = wp_next_scheduled( self::WP_CRON_HOOK );
59
- if ( $next_timestamp ) {
60
- wp_unschedule_event( $next_timestamp, self::WP_CRON_HOOK );
61
- }
62
-
63
  $schedule = apply_filters( 'action_scheduler_run_schedule', self::WP_CRON_SCHEDULE );
64
  wp_schedule_event( time(), $schedule, self::WP_CRON_HOOK, $cron_context );
65
  }
50
 
51
  add_filter( 'cron_schedules', array( self::instance(), 'add_wp_cron_schedule' ) );
52
 
53
+ // Check for and remove any WP Cron hook scheduled by Action Scheduler < 3.0.0, which didn't include the $context param
54
+ $next_timestamp = wp_next_scheduled( self::WP_CRON_HOOK );
55
+ if ( $next_timestamp ) {
56
+ wp_unschedule_event( $next_timestamp, self::WP_CRON_HOOK );
57
+ }
58
+
59
  $cron_context = array( 'WP Cron' );
60
 
61
  if ( ! wp_next_scheduled( self::WP_CRON_HOOK, $cron_context ) ) {
 
 
 
 
 
 
 
62
  $schedule = apply_filters( 'action_scheduler_run_schedule', self::WP_CRON_SCHEDULE );
63
  wp_schedule_event( time(), $schedule, self::WP_CRON_HOOK, $cron_context );
64
  }
includes/vendor/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php CHANGED
@@ -48,8 +48,8 @@ class ActionScheduler_WPCLI_Scheduler_command extends WP_CLI_Command {
48
  $hooks = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'hooks', '' ) );
49
  $hooks = array_filter( array_map( 'trim', $hooks ) );
50
  $group = \WP_CLI\Utils\get_flag_value( $assoc_args, 'group', '' );
51
- $free_on = \WP_CLI\Utils\get_flag_value( $assoc_args, 'free-memory-on', '' );
52
- $sleep = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', '' );
53
  $force = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false );
54
 
55
  ActionScheduler_DataController::set_free_ticks( $free_on );
48
  $hooks = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'hooks', '' ) );
49
  $hooks = array_filter( array_map( 'trim', $hooks ) );
50
  $group = \WP_CLI\Utils\get_flag_value( $assoc_args, 'group', '' );
51
+ $free_on = \WP_CLI\Utils\get_flag_value( $assoc_args, 'free-memory-on', 50 );
52
+ $sleep = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', 0 );
53
  $force = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false );
54
 
55
  ActionScheduler_DataController::set_free_ticks( $free_on );
includes/vendor/action-scheduler/classes/abstracts/ActionScheduler.php CHANGED
@@ -180,6 +180,24 @@ abstract class ActionScheduler {
180
  add_action( 'action_scheduler/migration_complete', 'ActionScheduler_WPCommentCleaner::maybe_schedule_cleanup' );
181
  }
182
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  /**
184
  * Determine if the class is one of our abstract classes.
185
  *
180
  add_action( 'action_scheduler/migration_complete', 'ActionScheduler_WPCommentCleaner::maybe_schedule_cleanup' );
181
  }
182
 
183
+ /**
184
+ * Issue deprecated warning if an Action Scheduler function is called in the shutdown hook.
185
+ *
186
+ * @param string $function_name The name of the function being called.
187
+ */
188
+ public static function check_shutdown_hook( $function_name ) {
189
+ if ( 'shutdown' === current_filter() ) {
190
+ $message = sprintf(
191
+ /* translators: $1: open code tag, $2: function name, $3: close code tag. */
192
+ __( 'Action Scheduler function %1$s%2$s%3$s should not be used within the WordPress %1$sshutdown%3$s hook.', 'action-scheduler' ),
193
+ '<code>',
194
+ esc_attr( $function_name ) . '()',
195
+ '</code>'
196
+ );
197
+ _deprecated_hook( 'shutdown', 'Action Scheduler 3.0', 'init', $message );
198
+ }
199
+ }
200
+
201
  /**
202
  * Determine if the class is one of our abstract classes.
203
  *
includes/vendor/action-scheduler/classes/abstracts/ActionScheduler_Store.php CHANGED
@@ -24,7 +24,7 @@ abstract class ActionScheduler_Store extends ActionScheduler_Store_Deprecated {
24
  * to store. Otherwise uses the first date of the action's
25
  * schedule.
26
  *
27
- * @return string The action ID
28
  */
29
  abstract public function save_action( ActionScheduler_Action $action, DateTime $scheduled_date = NULL );
30
 
24
  * to store. Otherwise uses the first date of the action's
25
  * schedule.
26
  *
27
+ * @return int The action ID
28
  */
29
  abstract public function save_action( ActionScheduler_Action $action, DateTime $scheduled_date = NULL );
30
 
includes/vendor/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php CHANGED
@@ -77,18 +77,33 @@ class ActionScheduler_HybridStore extends Store {
77
  }
78
  /** @var \wpdb $wpdb */
79
  global $wpdb;
80
- $wpdb->insert(
 
 
 
 
 
 
 
 
 
81
  $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE},
82
  [
83
- 'action_id' => $this->demarkation_id,
84
- 'hook' => '',
85
- 'status' => '',
 
 
 
 
86
  ]
87
  );
88
- $wpdb->delete(
89
- $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE},
90
- [ 'action_id' => $this->demarkation_id ]
91
- );
 
 
92
  }
93
  }
94
 
@@ -220,6 +235,8 @@ class ActionScheduler_HybridStore extends Store {
220
  *
221
  * @param ActionScheduler_Action $action Action object to be saved.
222
  * @param DateTime $date Optional. Schedule date. Default null.
 
 
223
  */
224
  public function save_action( ActionScheduler_Action $action, DateTime $date = null ) {
225
  return $this->primary_store->save_action( $action, $date );
@@ -231,10 +248,11 @@ class ActionScheduler_HybridStore extends Store {
231
  * @param int $action_id Action ID.
232
  */
233
  public function fetch_action( $action_id ) {
234
- if ( $action_id < $this->demarkation_id ) {
235
- return $this->secondary_store->fetch_action( $action_id );
 
236
  } else {
237
- return $this->primary_store->fetch_action( $action_id );
238
  }
239
  }
240
 
@@ -244,10 +262,9 @@ class ActionScheduler_HybridStore extends Store {
244
  * @param int $action_id Action ID.
245
  */
246
  public function cancel_action( $action_id ) {
247
- if ( $action_id < $this->demarkation_id ) {
248
- $this->secondary_store->cancel_action( $action_id );
249
- } else {
250
- $this->primary_store->cancel_action( $action_id );
251
  }
252
  }
253
 
@@ -257,10 +274,9 @@ class ActionScheduler_HybridStore extends Store {
257
  * @param int $action_id Action ID.
258
  */
259
  public function delete_action( $action_id ) {
260
- if ( $action_id < $this->demarkation_id ) {
261
- $this->secondary_store->delete_action( $action_id );
262
- } else {
263
- $this->primary_store->delete_action( $action_id );
264
  }
265
  }
266
 
@@ -270,10 +286,11 @@ class ActionScheduler_HybridStore extends Store {
270
  * @param int $action_id Action ID.
271
  */
272
  public function get_date( $action_id ) {
273
- if ( $action_id < $this->demarkation_id ) {
274
- return $this->secondary_store->get_date( $action_id );
 
275
  } else {
276
- return $this->primary_store->get_date( $action_id );
277
  }
278
  }
279
 
@@ -283,10 +300,9 @@ class ActionScheduler_HybridStore extends Store {
283
  * @param int $action_id Action ID.
284
  */
285
  public function mark_failure( $action_id ) {
286
- if ( $action_id < $this->demarkation_id ) {
287
- $this->secondary_store->mark_failure( $action_id );
288
- } else {
289
- $this->primary_store->mark_failure( $action_id );
290
  }
291
  }
292
 
@@ -296,10 +312,9 @@ class ActionScheduler_HybridStore extends Store {
296
  * @param int $action_id Action ID.
297
  */
298
  public function log_execution( $action_id ) {
299
- if ( $action_id < $this->demarkation_id ) {
300
- $this->secondary_store->log_execution( $action_id );
301
- } else {
302
- $this->primary_store->log_execution( $action_id );
303
  }
304
  }
305
 
@@ -309,10 +324,9 @@ class ActionScheduler_HybridStore extends Store {
309
  * @param int $action_id Action ID.
310
  */
311
  public function mark_complete( $action_id ) {
312
- if ( $action_id < $this->demarkation_id ) {
313
- $this->secondary_store->mark_complete( $action_id );
314
- } else {
315
- $this->primary_store->mark_complete( $action_id );
316
  }
317
  }
318
 
@@ -322,13 +336,45 @@ class ActionScheduler_HybridStore extends Store {
322
  * @param int $action_id Action ID.
323
  */
324
  public function get_status( $action_id ) {
325
- if ( $action_id < $this->demarkation_id ) {
326
- return $this->secondary_store->get_status( $action_id );
327
- } else {
328
- return $this->primary_store->get_status( $action_id );
329
  }
 
330
  }
331
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
 
333
  /* * * * * * * * * * * * * * * * * * * * * * * * * * *
334
  * All claim-related functions should operate solely
77
  }
78
  /** @var \wpdb $wpdb */
79
  global $wpdb;
80
+ /**
81
+ * A default date of '0000-00-00 00:00:00' is invalid in MySQL 5.7 when configured with
82
+ * sql_mode including both STRICT_TRANS_TABLES and NO_ZERO_DATE.
83
+ */
84
+ $default_date = new DateTime( 'tomorrow' );
85
+ $null_action = new ActionScheduler_NullAction();
86
+ $date_gmt = $this->get_scheduled_date_string( $null_action, $default_date );
87
+ $date_local = $this->get_scheduled_date_string_local( $null_action, $default_date );
88
+
89
+ $row_count = $wpdb->insert(
90
  $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE},
91
  [
92
+ 'action_id' => $this->demarkation_id,
93
+ 'hook' => '',
94
+ 'status' => '',
95
+ 'scheduled_date_gmt' => $date_gmt,
96
+ 'scheduled_date_local' => $date_local,
97
+ 'last_attempt_gmt' => $date_gmt,
98
+ 'last_attempt_local' => $date_local,
99
  ]
100
  );
101
+ if ( $row_count > 0 ) {
102
+ $wpdb->delete(
103
+ $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE},
104
+ [ 'action_id' => $this->demarkation_id ]
105
+ );
106
+ }
107
  }
108
  }
109
 
235
  *
236
  * @param ActionScheduler_Action $action Action object to be saved.
237
  * @param DateTime $date Optional. Schedule date. Default null.
238
+ *
239
+ * @return int The action ID
240
  */
241
  public function save_action( ActionScheduler_Action $action, DateTime $date = null ) {
242
  return $this->primary_store->save_action( $action, $date );
248
  * @param int $action_id Action ID.
249
  */
250
  public function fetch_action( $action_id ) {
251
+ $store = $this->get_store_from_action_id( $action_id, true );
252
+ if ( $store ) {
253
+ return $store->fetch_action( $action_id );
254
  } else {
255
+ return new ActionScheduler_NullAction();
256
  }
257
  }
258
 
262
  * @param int $action_id Action ID.
263
  */
264
  public function cancel_action( $action_id ) {
265
+ $store = $this->get_store_from_action_id( $action_id );
266
+ if ( $store ) {
267
+ $store->cancel_action( $action_id );
 
268
  }
269
  }
270
 
274
  * @param int $action_id Action ID.
275
  */
276
  public function delete_action( $action_id ) {
277
+ $store = $this->get_store_from_action_id( $action_id );
278
+ if ( $store ) {
279
+ $store->delete_action( $action_id );
 
280
  }
281
  }
282
 
286
  * @param int $action_id Action ID.
287
  */
288
  public function get_date( $action_id ) {
289
+ $store = $this->get_store_from_action_id( $action_id );
290
+ if ( $store ) {
291
+ return $store->get_date( $action_id );
292
  } else {
293
+ return null;
294
  }
295
  }
296
 
300
  * @param int $action_id Action ID.
301
  */
302
  public function mark_failure( $action_id ) {
303
+ $store = $this->get_store_from_action_id( $action_id );
304
+ if ( $store ) {
305
+ $store->mark_failure( $action_id );
 
306
  }
307
  }
308
 
312
  * @param int $action_id Action ID.
313
  */
314
  public function log_execution( $action_id ) {
315
+ $store = $this->get_store_from_action_id( $action_id );
316
+ if ( $store ) {
317
+ $store->log_execution( $action_id );
 
318
  }
319
  }
320
 
324
  * @param int $action_id Action ID.
325
  */
326
  public function mark_complete( $action_id ) {
327
+ $store = $this->get_store_from_action_id( $action_id );
328
+ if ( $store ) {
329
+ $store->mark_complete( $action_id );
 
330
  }
331
  }
332
 
336
  * @param int $action_id Action ID.
337
  */
338
  public function get_status( $action_id ) {
339
+ $store = $this->get_store_from_action_id( $action_id );
340
+ if ( $store ) {
341
+ return $store->get_status( $action_id );
 
342
  }
343
+ return null;
344
  }
345
 
346
+ /**
347
+ * Return which store an action is stored in.
348
+ *
349
+ * @param int $action_id ID of the action.
350
+ * @param bool $primary_first Optional flag indicating search the primary store first.
351
+ * @return ActionScheduler_Store
352
+ */
353
+ protected function get_store_from_action_id( $action_id, $primary_first = false ) {
354
+ if ( $primary_first ) {
355
+ $stores = [
356
+ $this->primary_store,
357
+ $this->secondary_store,
358
+ ];
359
+ } elseif ( $action_id < $this->demarkation_id ) {
360
+ $stores = [
361
+ $this->secondary_store,
362
+ $this->primary_store,
363
+ ];
364
+ } else {
365
+ $stores = [
366
+ $this->primary_store,
367
+ ];
368
+ }
369
+
370
+ foreach ( $stores as $store ) {
371
+ $action = $store->fetch_action( $action_id );
372
+ if ( ! is_a( $action, 'ActionScheduler_NullAction' ) ) {
373
+ return $store;
374
+ }
375
+ }
376
+ return null;
377
+ }
378
 
379
  /* * * * * * * * * * * * * * * * * * * * * * * * * * *
380
  * All claim-related functions should operate solely
includes/vendor/action-scheduler/classes/migration/Controller.php CHANGED
@@ -149,7 +149,7 @@ class Controller {
149
  add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 );
150
  add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 );
151
  add_action( 'init', array( $this, 'maybe_hook_migration' ) );
152
- add_action( 'shutdown', array( $this, 'schedule_migration' ), 0, 0 );
153
 
154
  // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen
155
  add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 );
149
  add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 );
150
  add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 );
151
  add_action( 'init', array( $this, 'maybe_hook_migration' ) );
152
+ add_action( 'wp_loaded', array( $this, 'schedule_migration' ) );
153
 
154
  // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen
155
  add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 );
includes/vendor/action-scheduler/classes/migration/Scheduler.php CHANGED
@@ -83,7 +83,7 @@ class Scheduler {
83
  }
84
 
85
  if ( empty( $when ) ) {
86
- $when = time();
87
  }
88
 
89
  return as_schedule_single_action( $when, self::HOOK, array(), self::GROUP );
83
  }
84
 
85
  if ( empty( $when ) ) {
86
+ $when = time() + MINUTE_IN_SECONDS;
87
  }
88
 
89
  return as_schedule_single_action( $when, self::HOOK, array(), self::GROUP );
includes/vendor/action-scheduler/codecov.yml ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ codecov:
2
+ branch: master
3
+
4
+ coverage:
5
+ ignore:
6
+ - tests/.*
7
+ - lib/.*
8
+ status:
9
+ project: false
10
+ patch: false
11
+ changes: false
12
+
13
+ comment: false
includes/vendor/action-scheduler/composer.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "woocommerce/action-scheduler",
3
+ "description": "Action Scheduler for WordPress and WooCommerce",
4
+ "homepage": "https://actionscheduler.org/",
5
+ "type": "wordpress-plugin",
6
+ "license": "GPL-3.0-or-later",
7
+ "prefer-stable": true,
8
+ "minimum-stability": "dev",
9
+ "require": {},
10
+ "require-dev": {
11
+ "phpunit/phpunit": "^5.6",
12
+ "wp-cli/wp-cli": "~1.5.1",
13
+ "woocommerce/woocommerce-sniffs": "0.0.8"
14
+ },
15
+ "scripts": {
16
+ "test": [
17
+ "phpunit"
18
+ ],
19
+ "phpcs": [
20
+ "phpcs -s -p"
21
+ ],
22
+ "phpcs-pre-commit": [
23
+ "phpcs -s -p -n"
24
+ ],
25
+ "phpcbf": [
26
+ "phpcbf -p"
27
+ ]
28
+ },
29
+ "extra": {
30
+ "scripts-description": {
31
+ "test": "Run unit tests",
32
+ "phpcs": "Analyze code against the WordPress coding standards with PHP_CodeSniffer",
33
+ "phpcbf": "Fix coding standards warnings/errors automatically with PHP Code Beautifier"
34
+ }
35
+ }
36
+ }
includes/vendor/action-scheduler/composer.lock ADDED
@@ -0,0 +1,4878 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "fe700435a00b5cdde47170ab9811f5ae",
8
+ "packages": [],
9
+ "packages-dev": [
10
+ {
11
+ "name": "composer/ca-bundle",
12
+ "version": "1.2.6",
13
+ "source": {
14
+ "type": "git",
15
+ "url": "https://github.com/composer/ca-bundle.git",
16
+ "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e"
17
+ },
18
+ "dist": {
19
+ "type": "zip",
20
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/47fe531de31fca4a1b997f87308e7d7804348f7e",
21
+ "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e",
22
+ "shasum": ""
23
+ },
24
+ "require": {
25
+ "ext-openssl": "*",
26
+ "ext-pcre": "*",
27
+ "php": "^5.3.2 || ^7.0 || ^8.0"
28
+ },
29
+ "require-dev": {
30
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
31
+ "psr/log": "^1.0",
32
+ "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
33
+ },
34
+ "type": "library",
35
+ "extra": {
36
+ "branch-alias": {
37
+ "dev-master": "1.x-dev"
38
+ }
39
+ },
40
+ "autoload": {
41
+ "psr-4": {
42
+ "Composer\\CaBundle\\": "src"
43
+ }
44
+ },
45
+ "notification-url": "https://packagist.org/downloads/",
46
+ "license": [
47
+ "MIT"
48
+ ],
49
+ "authors": [
50
+ {
51
+ "name": "Jordi Boggiano",
52
+ "email": "j.boggiano@seld.be",
53
+ "homepage": "http://seld.be"
54
+ }
55
+ ],
56
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
57
+ "keywords": [
58
+ "cabundle",
59
+ "cacert",
60
+ "certificate",
61
+ "ssl",
62
+ "tls"
63
+ ],
64
+ "time": "2020-01-13T10:02:55+00:00"
65
+ },
66
+ {
67
+ "name": "composer/composer",
68
+ "version": "1.9.3",
69
+ "source": {
70
+ "type": "git",
71
+ "url": "https://github.com/composer/composer.git",
72
+ "reference": "1291a16ce3f48bfdeca39d64fca4875098af4d7b"
73
+ },
74
+ "dist": {
75
+ "type": "zip",
76
+ "url": "https://api.github.com/repos/composer/composer/zipball/1291a16ce3f48bfdeca39d64fca4875098af4d7b",
77
+ "reference": "1291a16ce3f48bfdeca39d64fca4875098af4d7b",
78
+ "shasum": ""
79
+ },
80
+ "require": {
81
+ "composer/ca-bundle": "^1.0",
82
+ "composer/semver": "^1.0",
83
+ "composer/spdx-licenses": "^1.2",
84
+ "composer/xdebug-handler": "^1.1",
85
+ "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0",
86
+ "php": "^5.3.2 || ^7.0",
87
+ "psr/log": "^1.0",
88
+ "seld/jsonlint": "^1.4",
89
+ "seld/phar-utils": "^1.0",
90
+ "symfony/console": "^2.7 || ^3.0 || ^4.0",
91
+ "symfony/filesystem": "^2.7 || ^3.0 || ^4.0",
92
+ "symfony/finder": "^2.7 || ^3.0 || ^4.0",
93
+ "symfony/process": "^2.7 || ^3.0 || ^4.0"
94
+ },
95
+ "conflict": {
96
+ "symfony/console": "2.8.38"
97
+ },
98
+ "require-dev": {
99
+ "phpunit/phpunit": "^4.8.35 || ^5.7",
100
+ "phpunit/phpunit-mock-objects": "^2.3 || ^3.0"
101
+ },
102
+ "suggest": {
103
+ "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
104
+ "ext-zip": "Enabling the zip extension allows you to unzip archives",
105
+ "ext-zlib": "Allow gzip compression of HTTP requests"
106
+ },
107
+ "bin": [
108
+ "bin/composer"
109
+ ],
110
+ "type": "library",
111
+ "extra": {
112
+ "branch-alias": {
113
+ "dev-master": "1.9-dev"
114
+ }
115
+ },
116
+ "autoload": {
117
+ "psr-4": {
118
+ "Composer\\": "src/Composer"
119
+ }
120
+ },
121
+ "notification-url": "https://packagist.org/downloads/",
122
+ "license": [
123
+ "MIT"
124
+ ],
125
+ "authors": [
126
+ {
127
+ "name": "Nils Adermann",
128
+ "email": "naderman@naderman.de",
129
+ "homepage": "http://www.naderman.de"
130
+ },
131
+ {
132
+ "name": "Jordi Boggiano",
133
+ "email": "j.boggiano@seld.be",
134
+ "homepage": "http://seld.be"
135
+ }
136
+ ],
137
+ "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
138
+ "homepage": "https://getcomposer.org/",
139
+ "keywords": [
140
+ "autoload",
141
+ "dependency",
142
+ "package"
143
+ ],
144
+ "time": "2020-02-04T11:58:49+00:00"
145
+ },
146
+ {
147
+ "name": "composer/semver",
148
+ "version": "1.5.1",
149
+ "source": {
150
+ "type": "git",
151
+ "url": "https://github.com/composer/semver.git",
152
+ "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de"
153
+ },
154
+ "dist": {
155
+ "type": "zip",
156
+ "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de",
157
+ "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de",
158
+ "shasum": ""
159
+ },
160
+ "require": {
161
+ "php": "^5.3.2 || ^7.0"
162
+ },
163
+ "require-dev": {
164
+ "phpunit/phpunit": "^4.5 || ^5.0.5"
165
+ },
166
+ "type": "library",
167
+ "extra": {
168
+ "branch-alias": {
169
+ "dev-master": "1.x-dev"
170
+ }
171
+ },
172
+ "autoload": {
173
+ "psr-4": {
174
+ "Composer\\Semver\\": "src"
175
+ }
176
+ },
177
+ "notification-url": "https://packagist.org/downloads/",
178
+ "license": [
179
+ "MIT"
180
+ ],
181
+ "authors": [
182
+ {
183
+ "name": "Nils Adermann",
184
+ "email": "naderman@naderman.de",
185
+ "homepage": "http://www.naderman.de"
186
+ },
187
+ {
188
+ "name": "Jordi Boggiano",
189
+ "email": "j.boggiano@seld.be",
190
+ "homepage": "http://seld.be"
191
+ },
192
+ {
193
+ "name": "Rob Bast",
194
+ "email": "rob.bast@gmail.com",
195
+ "homepage": "http://robbast.nl"
196
+ }
197
+ ],
198
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
199
+ "keywords": [
200
+ "semantic",
201
+ "semver",
202
+ "validation",
203
+ "versioning"
204
+ ],
205
+ "time": "2020-01-13T12:06:48+00:00"
206
+ },
207
+ {
208
+ "name": "composer/spdx-licenses",
209
+ "version": "1.5.3",
210
+ "source": {
211
+ "type": "git",
212
+ "url": "https://github.com/composer/spdx-licenses.git",
213
+ "reference": "0c3e51e1880ca149682332770e25977c70cf9dae"
214
+ },
215
+ "dist": {
216
+ "type": "zip",
217
+ "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae",
218
+ "reference": "0c3e51e1880ca149682332770e25977c70cf9dae",
219
+ "shasum": ""
220
+ },
221
+ "require": {
222
+ "php": "^5.3.2 || ^7.0 || ^8.0"
223
+ },
224
+ "require-dev": {
225
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7"
226
+ },
227
+ "type": "library",
228
+ "extra": {
229
+ "branch-alias": {
230
+ "dev-master": "1.x-dev"
231
+ }
232
+ },
233
+ "autoload": {
234
+ "psr-4": {
235
+ "Composer\\Spdx\\": "src"
236
+ }
237
+ },
238
+ "notification-url": "https://packagist.org/downloads/",
239
+ "license": [
240
+ "MIT"
241
+ ],
242
+ "authors": [
243
+ {
244
+ "name": "Nils Adermann",
245
+ "email": "naderman@naderman.de",
246
+ "homepage": "http://www.naderman.de"
247
+ },
248
+ {
249
+ "name": "Jordi Boggiano",
250
+ "email": "j.boggiano@seld.be",
251
+ "homepage": "http://seld.be"
252
+ },
253
+ {
254
+ "name": "Rob Bast",
255
+ "email": "rob.bast@gmail.com",
256
+ "homepage": "http://robbast.nl"
257
+ }
258
+ ],
259
+ "description": "SPDX licenses list and validation library.",
260
+ "keywords": [
261
+ "license",
262
+ "spdx",
263
+ "validator"
264
+ ],
265
+ "time": "2020-02-14T07:44:31+00:00"
266
+ },
267
+ {
268
+ "name": "composer/xdebug-handler",
269
+ "version": "1.4.0",
270
+ "source": {
271
+ "type": "git",
272
+ "url": "https://github.com/composer/xdebug-handler.git",
273
+ "reference": "cbe23383749496fe0f373345208b79568e4bc248"
274
+ },
275
+ "dist": {
276
+ "type": "zip",
277
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248",
278
+ "reference": "cbe23383749496fe0f373345208b79568e4bc248",
279
+ "shasum": ""
280
+ },
281
+ "require": {
282
+ "php": "^5.3.2 || ^7.0 || ^8.0",
283
+ "psr/log": "^1.0"
284
+ },
285
+ "require-dev": {
286
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
287
+ },
288
+ "type": "library",
289
+ "autoload": {
290
+ "psr-4": {
291
+ "Composer\\XdebugHandler\\": "src"
292
+ }
293
+ },
294
+ "notification-url": "https://packagist.org/downloads/",
295
+ "license": [
296
+ "MIT"
297
+ ],
298
+ "authors": [
299
+ {
300
+ "name": "John Stevenson",
301
+ "email": "john-stevenson@blueyonder.co.uk"
302
+ }
303
+ ],
304
+ "description": "Restarts a process without Xdebug.",
305
+ "keywords": [
306
+ "Xdebug",
307
+ "performance"
308
+ ],
309
+ "time": "2019-11-06T16:40:04+00:00"
310
+ },
311
+ {
312
+ "name": "dealerdirect/phpcodesniffer-composer-installer",
313
+ "version": "v0.5.0",
314
+ "source": {
315
+ "type": "git",
316
+ "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
317
+ "reference": "e749410375ff6fb7a040a68878c656c2e610b132"
318
+ },
319
+ "dist": {
320
+ "type": "zip",
321
+ "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/e749410375ff6fb7a040a68878c656c2e610b132",
322
+ "reference": "e749410375ff6fb7a040a68878c656c2e610b132",
323
+ "shasum": ""
324
+ },
325
+ "require": {
326
+ "composer-plugin-api": "^1.0",
327
+ "php": "^5.3|^7",
328
+ "squizlabs/php_codesniffer": "^2|^3"
329
+ },
330
+ "require-dev": {
331
+ "composer/composer": "*",
332
+ "phpcompatibility/php-compatibility": "^9.0",
333
+ "sensiolabs/security-checker": "^4.1.0"
334
+ },
335
+ "type": "composer-plugin",
336
+ "extra": {
337
+ "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
338
+ },
339
+ "autoload": {
340
+ "psr-4": {
341
+ "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
342
+ }
343
+ },
344
+ "notification-url": "https://packagist.org/downloads/",
345
+ "license": [
346
+ "MIT"
347
+ ],
348
+ "authors": [
349
+ {
350
+ "name": "Franck Nijhof",
351
+ "email": "franck.nijhof@dealerdirect.com",
352
+ "homepage": "http://www.frenck.nl",
353
+ "role": "Developer / IT Manager"
354
+ }
355
+ ],
356
+ "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
357
+ "homepage": "http://www.dealerdirect.com",
358
+ "keywords": [
359
+ "PHPCodeSniffer",
360
+ "PHP_CodeSniffer",
361
+ "code quality",
362
+ "codesniffer",
363
+ "composer",
364
+ "installer",
365
+ "phpcs",
366
+ "plugin",
367
+ "qa",
368
+ "quality",
369
+ "standard",
370
+ "standards",
371
+ "style guide",
372
+ "stylecheck",
373
+ "tests"
374
+ ],
375
+ "time": "2018-10-26T13:21:45+00:00"
376
+ },
377
+ {
378
+ "name": "doctrine/instantiator",
379
+ "version": "1.3.0",
380
+ "source": {
381
+ "type": "git",
382
+ "url": "https://github.com/doctrine/instantiator.git",
383
+ "reference": "ae466f726242e637cebdd526a7d991b9433bacf1"
384
+ },
385
+ "dist": {
386
+ "type": "zip",
387
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1",
388
+ "reference": "ae466f726242e637cebdd526a7d991b9433bacf1",
389
+ "shasum": ""
390
+ },
391
+ "require": {
392
+ "php": "^7.1"
393
+ },
394
+ "require-dev": {
395
+ "doctrine/coding-standard": "^6.0",
396
+ "ext-pdo": "*",
397
+ "ext-phar": "*",
398
+ "phpbench/phpbench": "^0.13",
399
+ "phpstan/phpstan-phpunit": "^0.11",
400
+ "phpstan/phpstan-shim": "^0.11",
401
+ "phpunit/phpunit": "^7.0"
402
+ },
403
+ "type": "library",
404
+ "extra": {
405
+ "branch-alias": {
406
+ "dev-master": "1.2.x-dev"
407
+ }
408
+ },
409
+ "autoload": {
410
+ "psr-4": {
411
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
412
+ }
413
+ },
414
+ "notification-url": "https://packagist.org/downloads/",
415
+ "license": [
416
+ "MIT"
417
+ ],
418
+ "authors": [
419
+ {
420
+ "name": "Marco Pivetta",
421
+ "email": "ocramius@gmail.com",
422
+ "homepage": "http://ocramius.github.com/"
423
+ }
424
+ ],
425
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
426
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
427
+ "keywords": [
428
+ "constructor",
429
+ "instantiate"
430
+ ],
431
+ "time": "2019-10-21T16:45:58+00:00"
432
+ },
433
+ {
434
+ "name": "justinrainbow/json-schema",
435
+ "version": "5.2.9",
436
+ "source": {
437
+ "type": "git",
438
+ "url": "https://github.com/justinrainbow/json-schema.git",
439
+ "reference": "44c6787311242a979fa15c704327c20e7221a0e4"
440
+ },
441
+ "dist": {
442
+ "type": "zip",
443
+ "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4",
444
+ "reference": "44c6787311242a979fa15c704327c20e7221a0e4",
445
+ "shasum": ""
446
+ },
447
+ "require": {
448
+ "php": ">=5.3.3"
449
+ },
450
+ "require-dev": {
451
+ "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
452
+ "json-schema/json-schema-test-suite": "1.2.0",
453
+ "phpunit/phpunit": "^4.8.35"
454
+ },
455
+ "bin": [
456
+ "bin/validate-json"
457
+ ],
458
+ "type": "library",
459
+ "extra": {
460
+ "branch-alias": {
461
+ "dev-master": "5.0.x-dev"
462
+ }
463
+ },
464
+ "autoload": {
465
+ "psr-4": {
466
+ "JsonSchema\\": "src/JsonSchema/"
467
+ }
468
+ },
469
+ "notification-url": "https://packagist.org/downloads/",
470
+ "license": [
471
+ "MIT"
472
+ ],
473
+ "authors": [
474
+ {
475
+ "name": "Bruno Prieto Reis",
476
+ "email": "bruno.p.reis@gmail.com"
477
+ },
478
+ {
479
+ "name": "Justin Rainbow",
480
+ "email": "justin.rainbow@gmail.com"
481
+ },
482
+ {
483
+ "name": "Igor Wiedler",
484
+ "email": "igor@wiedler.ch"
485
+ },
486
+ {
487
+ "name": "Robert Schönthal",
488
+ "email": "seroscho@googlemail.com"
489
+ }
490
+ ],
491
+ "description": "A library to validate a json schema.",
492
+ "homepage": "https://github.com/justinrainbow/json-schema",
493
+ "keywords": [
494
+ "json",
495
+ "schema"
496
+ ],
497
+ "time": "2019-09-25T14:49:45+00:00"
498
+ },
499
+ {
500
+ "name": "mustache/mustache",
501
+ "version": "v2.13.0",
502
+ "source": {
503
+ "type": "git",
504
+ "url": "https://github.com/bobthecow/mustache.php.git",
505
+ "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4"
506
+ },
507
+ "dist": {
508
+ "type": "zip",
509
+ "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e95c5a008c23d3151d59ea72484d4f72049ab7f4",
510
+ "reference": "e95c5a008c23d3151d59ea72484d4f72049ab7f4",
511
+ "shasum": ""
512
+ },
513
+ "require": {
514
+ "php": ">=5.2.4"
515
+ },
516
+ "require-dev": {
517
+ "friendsofphp/php-cs-fixer": "~1.11",
518
+ "phpunit/phpunit": "~3.7|~4.0|~5.0"
519
+ },
520
+ "type": "library",
521
+ "autoload": {
522
+ "psr-0": {
523
+ "Mustache": "src/"
524
+ }
525
+ },
526
+ "notification-url": "https://packagist.org/downloads/",
527
+ "license": [
528
+ "MIT"
529
+ ],
530
+ "authors": [
531
+ {
532
+ "name": "Justin Hileman",
533
+ "email": "justin@justinhileman.info",
534
+ "homepage": "http://justinhileman.com"
535
+ }
536
+ ],
537
+ "description": "A Mustache implementation in PHP.",
538
+ "homepage": "https://github.com/bobthecow/mustache.php",
539
+ "keywords": [
540
+ "mustache",
541
+ "templating"
542
+ ],
543
+ "time": "2019-11-23T21:40:31+00:00"
544
+ },
545
+ {
546
+ "name": "myclabs/deep-copy",
547
+ "version": "1.9.5",
548
+ "source": {
549
+ "type": "git",
550
+ "url": "https://github.com/myclabs/DeepCopy.git",
551
+ "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef"
552
+ },
553
+ "dist": {
554
+ "type": "zip",
555
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef",
556
+ "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef",
557
+ "shasum": ""
558
+ },
559
+ "require": {
560
+ "php": "^7.1"
561
+ },
562
+ "replace": {
563
+ "myclabs/deep-copy": "self.version"
564
+ },
565
+ "require-dev": {
566
+ "doctrine/collections": "^1.0",
567
+ "doctrine/common": "^2.6",
568
+ "phpunit/phpunit": "^7.1"
569
+ },
570
+ "type": "library",
571
+ "autoload": {
572
+ "psr-4": {
573
+ "DeepCopy\\": "src/DeepCopy/"
574
+ },
575
+ "files": [
576
+ "src/DeepCopy/deep_copy.php"
577
+ ]
578
+ },
579
+ "notification-url": "https://packagist.org/downloads/",
580
+ "license": [
581
+ "MIT"
582
+ ],
583
+ "description": "Create deep copies (clones) of your objects",
584
+ "keywords": [
585
+ "clone",
586
+ "copy",
587
+ "duplicate",
588
+ "object",
589
+ "object graph"
590
+ ],
591
+ "time": "2020-01-17T21:11:47+00:00"
592
+ },
593
+ {
594
+ "name": "nb/oxymel",
595
+ "version": "v0.1.0",
596
+ "source": {
597
+ "type": "git",
598
+ "url": "https://github.com/nb/oxymel.git",
599
+ "reference": "cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c"
600
+ },
601
+ "dist": {
602
+ "type": "zip",
603
+ "url": "https://api.github.com/repos/nb/oxymel/zipball/cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c",
604
+ "reference": "cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c",
605
+ "shasum": ""
606
+ },
607
+ "require": {
608
+ "php": ">=5.2.4"
609
+ },
610
+ "type": "library",
611
+ "autoload": {
612
+ "psr-0": {
613
+ "Oxymel": ""
614
+ }
615
+ },
616
+ "notification-url": "https://packagist.org/downloads/",
617
+ "license": [
618
+ "MIT"
619
+ ],
620
+ "authors": [
621
+ {
622
+ "name": "Nikolay Bachiyski",
623
+ "email": "nb@nikolay.bg",
624
+ "homepage": "http://extrapolate.me/"
625
+ }
626
+ ],
627
+ "description": "A sweet XML builder",
628
+ "homepage": "https://github.com/nb/oxymel",
629
+ "keywords": [
630
+ "xml"
631
+ ],
632
+ "time": "2013-02-24T15:01:54+00:00"
633
+ },
634
+ {
635
+ "name": "phpcompatibility/php-compatibility",
636
+ "version": "9.3.5",
637
+ "source": {
638
+ "type": "git",
639
+ "url": "https://github.com/PHPCompatibility/PHPCompatibility.git",
640
+ "reference": "9fb324479acf6f39452e0655d2429cc0d3914243"
641
+ },
642
+ "dist": {
643
+ "type": "zip",
644
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243",
645
+ "reference": "9fb324479acf6f39452e0655d2429cc0d3914243",
646
+ "shasum": ""
647
+ },
648
+ "require": {
649
+ "php": ">=5.3",
650
+ "squizlabs/php_codesniffer": "^2.3 || ^3.0.2"
651
+ },
652
+ "conflict": {
653
+ "squizlabs/php_codesniffer": "2.6.2"
654
+ },
655
+ "require-dev": {
656
+ "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0"
657
+ },
658
+ "suggest": {
659
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.",
660
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
661
+ },
662
+ "type": "phpcodesniffer-standard",
663
+ "notification-url": "https://packagist.org/downloads/",
664
+ "license": [
665
+ "LGPL-3.0-or-later"
666
+ ],
667
+ "authors": [
668
+ {
669
+ "name": "Wim Godden",
670
+ "homepage": "https://github.com/wimg",
671
+ "role": "lead"
672
+ },
673
+ {
674
+ "name": "Juliette Reinders Folmer",
675
+ "homepage": "https://github.com/jrfnl",
676
+ "role": "lead"
677
+ },
678
+ {
679
+ "name": "Contributors",
680
+ "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors"
681
+ }
682
+ ],
683
+ "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.",
684
+ "homepage": "http://techblog.wimgodden.be/tag/codesniffer/",
685
+ "keywords": [
686
+ "compatibility",
687
+ "phpcs",
688
+ "standards"
689
+ ],
690
+ "time": "2019-12-27T09:44:58+00:00"
691
+ },
692
+ {
693
+ "name": "phpcompatibility/phpcompatibility-paragonie",
694
+ "version": "1.3.0",
695
+ "source": {
696
+ "type": "git",
697
+ "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git",
698
+ "reference": "b862bc32f7e860d0b164b199bd995e690b4b191c"
699
+ },
700
+ "dist": {
701
+ "type": "zip",
702
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/b862bc32f7e860d0b164b199bd995e690b4b191c",
703
+ "reference": "b862bc32f7e860d0b164b199bd995e690b4b191c",
704
+ "shasum": ""
705
+ },
706
+ "require": {
707
+ "phpcompatibility/php-compatibility": "^9.0"
708
+ },
709
+ "require-dev": {
710
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5",
711
+ "paragonie/random_compat": "dev-master",
712
+ "paragonie/sodium_compat": "dev-master"
713
+ },
714
+ "suggest": {
715
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.",
716
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
717
+ },
718
+ "type": "phpcodesniffer-standard",
719
+ "notification-url": "https://packagist.org/downloads/",
720
+ "license": [
721
+ "LGPL-3.0-or-later"
722
+ ],
723
+ "authors": [
724
+ {
725
+ "name": "Wim Godden",
726
+ "role": "lead"
727
+ },
728
+ {
729
+ "name": "Juliette Reinders Folmer",
730
+ "role": "lead"
731
+ }
732
+ ],
733
+ "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.",
734
+ "homepage": "http://phpcompatibility.com/",
735
+ "keywords": [
736
+ "compatibility",
737
+ "paragonie",
738
+ "phpcs",
739
+ "polyfill",
740
+ "standards"
741
+ ],
742
+ "time": "2019-11-04T15:17:54+00:00"
743
+ },
744
+ {
745
+ "name": "phpcompatibility/phpcompatibility-wp",
746
+ "version": "2.1.0",
747
+ "source": {
748
+ "type": "git",
749
+ "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git",
750
+ "reference": "41bef18ba688af638b7310666db28e1ea9158b2f"
751
+ },
752
+ "dist": {
753
+ "type": "zip",
754
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/41bef18ba688af638b7310666db28e1ea9158b2f",
755
+ "reference": "41bef18ba688af638b7310666db28e1ea9158b2f",
756
+ "shasum": ""
757
+ },
758
+ "require": {
759
+ "phpcompatibility/php-compatibility": "^9.0",
760
+ "phpcompatibility/phpcompatibility-paragonie": "^1.0"
761
+ },
762
+ "require-dev": {
763
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5"
764
+ },
765
+ "suggest": {
766
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.",
767
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
768
+ },
769
+ "type": "phpcodesniffer-standard",
770
+ "notification-url": "https://packagist.org/downloads/",
771
+ "license": [
772
+ "LGPL-3.0-or-later"
773
+ ],
774
+ "authors": [
775
+ {
776
+ "name": "Wim Godden",
777
+ "role": "lead"
778
+ },
779
+ {
780
+ "name": "Juliette Reinders Folmer",
781
+ "role": "lead"
782
+ }
783
+ ],
784
+ "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.",
785
+ "homepage": "http://phpcompatibility.com/",
786
+ "keywords": [
787
+ "compatibility",
788
+ "phpcs",
789
+ "standards",
790
+ "wordpress"
791
+ ],
792
+ "time": "2019-08-28T14:22:28+00:00"
793
+ },
794
+ {
795
+ "name": "phpdocumentor/reflection-common",
796
+ "version": "2.0.0",
797
+ "source": {
798
+ "type": "git",
799
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
800
+ "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a"
801
+ },
802
+ "dist": {
803
+ "type": "zip",
804
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a",
805
+ "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a",
806
+ "shasum": ""
807
+ },
808
+ "require": {
809
+ "php": ">=7.1"
810
+ },
811
+ "require-dev": {
812
+ "phpunit/phpunit": "~6"
813
+ },
814
+ "type": "library",
815
+ "extra": {
816
+ "branch-alias": {
817
+ "dev-master": "2.x-dev"
818
+ }
819
+ },
820
+ "autoload": {
821
+ "psr-4": {
822
+ "phpDocumentor\\Reflection\\": "src/"
823
+ }
824
+ },
825
+ "notification-url": "https://packagist.org/downloads/",
826
+ "license": [
827
+ "MIT"
828
+ ],
829
+ "authors": [
830
+ {
831
+ "name": "Jaap van Otterdijk",
832
+ "email": "opensource@ijaap.nl"
833
+ }
834
+ ],
835
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
836
+ "homepage": "http://www.phpdoc.org",
837
+ "keywords": [
838
+ "FQSEN",
839
+ "phpDocumentor",
840
+ "phpdoc",
841
+ "reflection",
842
+ "static analysis"
843
+ ],
844
+ "time": "2018-08-07T13:53:10+00:00"
845
+ },
846
+ {
847
+ "name": "phpdocumentor/reflection-docblock",
848
+ "version": "4.3.4",
849
+ "source": {
850
+ "type": "git",
851
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
852
+ "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c"
853
+ },
854
+ "dist": {
855
+ "type": "zip",
856
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c",
857
+ "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c",
858
+ "shasum": ""
859
+ },
860
+ "require": {
861
+ "php": "^7.0",
862
+ "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
863
+ "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
864
+ "webmozart/assert": "^1.0"
865
+ },
866
+ "require-dev": {
867
+ "doctrine/instantiator": "^1.0.5",
868
+ "mockery/mockery": "^1.0",
869
+ "phpdocumentor/type-resolver": "0.4.*",
870
+ "phpunit/phpunit": "^6.4"
871
+ },
872
+ "type": "library",
873
+ "extra": {
874
+ "branch-alias": {
875
+ "dev-master": "4.x-dev"
876
+ }
877
+ },
878
+ "autoload": {
879
+ "psr-4": {
880
+ "phpDocumentor\\Reflection\\": [
881
+ "src/"
882
+ ]
883
+ }
884
+ },
885
+ "notification-url": "https://packagist.org/downloads/",
886
+ "license": [
887
+ "MIT"
888
+ ],
889
+ "authors": [
890
+ {
891
+ "name": "Mike van Riel",
892
+ "email": "me@mikevanriel.com"
893
+ }
894
+ ],
895
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
896
+ "time": "2019-12-28T18:55:12+00:00"
897
+ },
898
+ {
899
+ "name": "phpdocumentor/type-resolver",
900
+ "version": "1.0.1",
901
+ "source": {
902
+ "type": "git",
903
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
904
+ "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
905
+ },
906
+ "dist": {
907
+ "type": "zip",
908
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
909
+ "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
910
+ "shasum": ""
911
+ },
912
+ "require": {
913
+ "php": "^7.1",
914
+ "phpdocumentor/reflection-common": "^2.0"
915
+ },
916
+ "require-dev": {
917
+ "ext-tokenizer": "^7.1",
918
+ "mockery/mockery": "~1",
919
+ "phpunit/phpunit": "^7.0"
920
+ },
921
+ "type": "library",
922
+ "extra": {
923
+ "branch-alias": {
924
+ "dev-master": "1.x-dev"
925
+ }
926
+ },
927
+ "autoload": {
928
+ "psr-4": {
929
+ "phpDocumentor\\Reflection\\": "src"
930
+ }
931
+ },
932
+ "notification-url": "https://packagist.org/downloads/",
933
+ "license": [
934
+ "MIT"
935
+ ],
936
+ "authors": [
937
+ {
938
+ "name": "Mike van Riel",
939
+ "email": "me@mikevanriel.com"
940
+ }
941
+ ],
942
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
943
+ "time": "2019-08-22T18:11:29+00:00"
944
+ },
945
+ {
946
+ "name": "phpspec/prophecy",
947
+ "version": "v1.10.2",
948
+ "source": {
949
+ "type": "git",
950
+ "url": "https://github.com/phpspec/prophecy.git",
951
+ "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9"
952
+ },
953
+ "dist": {
954
+ "type": "zip",
955
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9",
956
+ "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9",
957
+ "shasum": ""
958
+ },
959
+ "require": {
960
+ "doctrine/instantiator": "^1.0.2",
961
+ "php": "^5.3|^7.0",
962
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
963
+ "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
964
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
965
+ },
966
+ "require-dev": {
967
+ "phpspec/phpspec": "^2.5 || ^3.2",
968
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
969
+ },
970
+ "type": "library",
971
+ "extra": {
972
+ "branch-alias": {
973
+ "dev-master": "1.10.x-dev"
974
+ }
975
+ },
976
+ "autoload": {
977
+ "psr-4": {
978
+ "Prophecy\\": "src/Prophecy"
979
+ }
980
+ },
981
+ "notification-url": "https://packagist.org/downloads/",
982
+ "license": [
983
+ "MIT"
984
+ ],
985
+ "authors": [
986
+ {
987
+ "name": "Konstantin Kudryashov",
988
+ "email": "ever.zet@gmail.com",
989
+ "homepage": "http://everzet.com"
990
+ },
991
+ {
992
+ "name": "Marcello Duarte",
993
+ "email": "marcello.duarte@gmail.com"
994
+ }
995
+ ],
996
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
997
+ "homepage": "https://github.com/phpspec/prophecy",
998
+ "keywords": [
999
+ "Double",
1000
+ "Dummy",
1001
+ "fake",
1002
+ "mock",
1003
+ "spy",
1004
+ "stub"
1005
+ ],
1006
+ "time": "2020-01-20T15:57:02+00:00"
1007
+ },
1008
+ {
1009
+ "name": "phpunit/php-code-coverage",
1010
+ "version": "4.0.8",
1011
+ "source": {
1012
+ "type": "git",
1013
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
1014
+ "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
1015
+ },
1016
+ "dist": {
1017
+ "type": "zip",
1018
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
1019
+ "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
1020
+ "shasum": ""
1021
+ },
1022
+ "require": {
1023
+ "ext-dom": "*",
1024
+ "ext-xmlwriter": "*",
1025
+ "php": "^5.6 || ^7.0",
1026
+ "phpunit/php-file-iterator": "^1.3",
1027
+ "phpunit/php-text-template": "^1.2",
1028
+ "phpunit/php-token-stream": "^1.4.2 || ^2.0",
1029
+ "sebastian/code-unit-reverse-lookup": "^1.0",
1030
+ "sebastian/environment": "^1.3.2 || ^2.0",
1031
+ "sebastian/version": "^1.0 || ^2.0"
1032
+ },
1033
+ "require-dev": {
1034
+ "ext-xdebug": "^2.1.4",
1035
+ "phpunit/phpunit": "^5.7"
1036
+ },
1037
+ "suggest": {
1038
+ "ext-xdebug": "^2.5.1"
1039
+ },
1040
+ "type": "library",
1041
+ "extra": {
1042
+ "branch-alias": {
1043
+ "dev-master": "4.0.x-dev"
1044
+ }
1045
+ },
1046
+ "autoload": {
1047
+ "classmap": [
1048
+ "src/"
1049
+ ]
1050
+ },
1051
+ "notification-url": "https://packagist.org/downloads/",
1052
+ "license": [
1053
+ "BSD-3-Clause"
1054
+ ],
1055
+ "authors": [
1056
+ {
1057
+ "name": "Sebastian Bergmann",
1058
+ "email": "sb@sebastian-bergmann.de",
1059
+ "role": "lead"
1060
+ }
1061
+ ],
1062
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
1063
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
1064
+ "keywords": [
1065
+ "coverage",
1066
+ "testing",
1067
+ "xunit"
1068
+ ],
1069
+ "time": "2017-04-02T07:44:40+00:00"
1070
+ },
1071
+ {
1072
+ "name": "phpunit/php-file-iterator",
1073
+ "version": "1.4.5",
1074
+ "source": {
1075
+ "type": "git",
1076
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
1077
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
1078
+ },
1079
+ "dist": {
1080
+ "type": "zip",
1081
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
1082
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
1083
+ "shasum": ""
1084
+ },
1085
+ "require": {
1086
+ "php": ">=5.3.3"
1087
+ },
1088
+ "type": "library",
1089
+ "extra": {
1090
+ "branch-alias": {
1091
+ "dev-master": "1.4.x-dev"
1092
+ }
1093
+ },
1094
+ "autoload": {
1095
+ "classmap": [
1096
+ "src/"
1097
+ ]
1098
+ },
1099
+ "notification-url": "https://packagist.org/downloads/",
1100
+ "license": [
1101
+ "BSD-3-Clause"
1102
+ ],
1103
+ "authors": [
1104
+ {
1105
+ "name": "Sebastian Bergmann",
1106
+ "email": "sb@sebastian-bergmann.de",
1107
+ "role": "lead"
1108
+ }
1109
+ ],
1110
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
1111
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
1112
+ "keywords": [
1113
+ "filesystem",
1114
+ "iterator"
1115
+ ],
1116
+ "time": "2017-11-27T13:52:08+00:00"
1117
+ },
1118
+ {
1119
+ "name": "phpunit/php-text-template",
1120
+ "version": "1.2.1",
1121
+ "source": {
1122
+ "type": "git",
1123
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
1124
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
1125
+ },
1126
+ "dist": {
1127
+ "type": "zip",
1128
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
1129
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
1130
+ "shasum": ""
1131
+ },
1132
+ "require": {
1133
+ "php": ">=5.3.3"
1134
+ },
1135
+ "type": "library",
1136
+ "autoload": {
1137
+ "classmap": [
1138
+ "src/"
1139
+ ]
1140
+ },
1141
+ "notification-url": "https://packagist.org/downloads/",
1142
+ "license": [
1143
+ "BSD-3-Clause"
1144
+ ],
1145
+ "authors": [
1146
+ {
1147
+ "name": "Sebastian Bergmann",
1148
+ "email": "sebastian@phpunit.de",
1149
+ "role": "lead"
1150
+ }
1151
+ ],
1152
+ "description": "Simple template engine.",
1153
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
1154
+ "keywords": [
1155
+ "template"
1156
+ ],
1157
+ "time": "2015-06-21T13:50:34+00:00"
1158
+ },
1159
+ {
1160
+ "name": "phpunit/php-timer",
1161
+ "version": "1.0.9",
1162
+ "source": {
1163
+ "type": "git",
1164
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
1165
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
1166
+ },
1167
+ "dist": {
1168
+ "type": "zip",
1169
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
1170
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
1171
+ "shasum": ""
1172
+ },
1173
+ "require": {
1174
+ "php": "^5.3.3 || ^7.0"
1175
+ },
1176
+ "require-dev": {
1177
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
1178
+ },
1179
+ "type": "library",
1180
+ "extra": {
1181
+ "branch-alias": {
1182
+ "dev-master": "1.0-dev"
1183
+ }
1184
+ },
1185
+ "autoload": {
1186
+ "classmap": [
1187
+ "src/"
1188
+ ]
1189
+ },
1190
+ "notification-url": "https://packagist.org/downloads/",
1191
+ "license": [
1192
+ "BSD-3-Clause"
1193
+ ],
1194
+ "authors": [
1195
+ {
1196
+ "name": "Sebastian Bergmann",
1197
+ "email": "sb@sebastian-bergmann.de",
1198
+ "role": "lead"
1199
+ }
1200
+ ],
1201
+ "description": "Utility class for timing",
1202
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
1203
+ "keywords": [
1204
+ "timer"
1205
+ ],
1206
+ "time": "2017-02-26T11:10:40+00:00"
1207
+ },
1208
+ {
1209
+ "name": "phpunit/php-token-stream",
1210
+ "version": "2.0.2",
1211
+ "source": {
1212
+ "type": "git",
1213
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
1214
+ "reference": "791198a2c6254db10131eecfe8c06670700904db"
1215
+ },
1216
+ "dist": {
1217
+ "type": "zip",
1218
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
1219
+ "reference": "791198a2c6254db10131eecfe8c06670700904db",
1220
+ "shasum": ""
1221
+ },
1222
+ "require": {
1223
+ "ext-tokenizer": "*",
1224
+ "php": "^7.0"
1225
+ },
1226
+ "require-dev": {
1227
+ "phpunit/phpunit": "^6.2.4"
1228
+ },
1229
+ "type": "library",
1230
+ "extra": {
1231
+ "branch-alias": {
1232
+ "dev-master": "2.0-dev"
1233
+ }
1234
+ },
1235
+ "autoload": {
1236
+ "classmap": [
1237
+ "src/"
1238
+ ]
1239
+ },
1240
+ "notification-url": "https://packagist.org/downloads/",
1241
+ "license": [
1242
+ "BSD-3-Clause"
1243
+ ],
1244
+ "authors": [
1245
+ {
1246
+ "name": "Sebastian Bergmann",
1247
+ "email": "sebastian@phpunit.de"
1248
+ }
1249
+ ],
1250
+ "description": "Wrapper around PHP's tokenizer extension.",
1251
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
1252
+ "keywords": [
1253
+ "tokenizer"
1254
+ ],
1255
+ "time": "2017-11-27T05:48:46+00:00"
1256
+ },
1257
+ {
1258
+ "name": "phpunit/phpunit",
1259
+ "version": "5.7.27",
1260
+ "source": {
1261
+ "type": "git",
1262
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
1263
+ "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c"
1264
+ },
1265
+ "dist": {
1266
+ "type": "zip",
1267
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
1268
+ "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
1269
+ "shasum": ""
1270
+ },
1271
+ "require": {
1272
+ "ext-dom": "*",
1273
+ "ext-json": "*",
1274
+ "ext-libxml": "*",
1275
+ "ext-mbstring": "*",
1276
+ "ext-xml": "*",
1277
+ "myclabs/deep-copy": "~1.3",
1278
+ "php": "^5.6 || ^7.0",
1279
+ "phpspec/prophecy": "^1.6.2",
1280
+ "phpunit/php-code-coverage": "^4.0.4",
1281
+ "phpunit/php-file-iterator": "~1.4",
1282
+ "phpunit/php-text-template": "~1.2",
1283
+ "phpunit/php-timer": "^1.0.6",
1284
+ "phpunit/phpunit-mock-objects": "^3.2",
1285
+ "sebastian/comparator": "^1.2.4",
1286
+ "sebastian/diff": "^1.4.3",
1287
+ "sebastian/environment": "^1.3.4 || ^2.0",
1288
+ "sebastian/exporter": "~2.0",
1289
+ "sebastian/global-state": "^1.1",
1290
+ "sebastian/object-enumerator": "~2.0",
1291
+ "sebastian/resource-operations": "~1.0",
1292
+ "sebastian/version": "^1.0.6|^2.0.1",
1293
+ "symfony/yaml": "~2.1|~3.0|~4.0"
1294
+ },
1295
+ "conflict": {
1296
+ "phpdocumentor/reflection-docblock": "3.0.2"
1297
+ },
1298
+ "require-dev": {
1299
+ "ext-pdo": "*"
1300
+ },
1301
+ "suggest": {
1302
+ "ext-xdebug": "*",
1303
+ "phpunit/php-invoker": "~1.1"
1304
+ },
1305
+ "bin": [
1306
+ "phpunit"
1307
+ ],
1308
+ "type": "library",
1309
+ "extra": {
1310
+ "branch-alias": {
1311
+ "dev-master": "5.7.x-dev"
1312
+ }
1313
+ },
1314
+ "autoload": {
1315
+ "classmap": [
1316
+ "src/"
1317
+ ]
1318
+ },
1319
+ "notification-url": "https://packagist.org/downloads/",
1320
+ "license": [
1321
+ "BSD-3-Clause"
1322
+ ],
1323
+ "authors": [
1324
+ {
1325
+ "name": "Sebastian Bergmann",
1326
+ "email": "sebastian@phpunit.de",
1327
+ "role": "lead"
1328
+ }
1329
+ ],
1330
+ "description": "The PHP Unit Testing framework.",
1331
+ "homepage": "https://phpunit.de/",
1332
+ "keywords": [
1333
+ "phpunit",
1334
+ "testing",
1335
+ "xunit"
1336
+ ],
1337
+ "time": "2018-02-01T05:50:59+00:00"
1338
+ },
1339
+ {
1340
+ "name": "phpunit/phpunit-mock-objects",
1341
+ "version": "3.4.4",
1342
+ "source": {
1343
+ "type": "git",
1344
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
1345
+ "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
1346
+ },
1347
+ "dist": {
1348
+ "type": "zip",
1349
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
1350
+ "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
1351
+ "shasum": ""
1352
+ },
1353
+ "require": {
1354
+ "doctrine/instantiator": "^1.0.2",
1355
+ "php": "^5.6 || ^7.0",
1356
+ "phpunit/php-text-template": "^1.2",
1357
+ "sebastian/exporter": "^1.2 || ^2.0"
1358
+ },
1359
+ "conflict": {
1360
+ "phpunit/phpunit": "<5.4.0"
1361
+ },
1362
+ "require-dev": {
1363
+ "phpunit/phpunit": "^5.4"
1364
+ },
1365
+ "suggest": {
1366
+ "ext-soap": "*"
1367
+ },
1368
+ "type": "library",
1369
+ "extra": {
1370
+ "branch-alias": {
1371
+ "dev-master": "3.2.x-dev"
1372
+ }
1373
+ },
1374
+ "autoload": {
1375
+ "classmap": [
1376
+ "src/"
1377
+ ]
1378
+ },
1379
+ "notification-url": "https://packagist.org/downloads/",
1380
+ "license": [
1381
+ "BSD-3-Clause"
1382
+ ],
1383
+ "authors": [
1384
+ {
1385
+ "name": "Sebastian Bergmann",
1386
+ "email": "sb@sebastian-bergmann.de",
1387
+ "role": "lead"
1388
+ }
1389
+ ],
1390
+ "description": "Mock Object library for PHPUnit",
1391
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
1392
+ "keywords": [
1393
+ "mock",
1394
+ "xunit"
1395
+ ],
1396
+ "abandoned": true,
1397
+ "time": "2017-06-30T09:13:00+00:00"
1398
+ },
1399
+ {
1400
+ "name": "psr/container",
1401
+ "version": "1.0.0",
1402
+ "source": {
1403
+ "type": "git",
1404
+ "url": "https://github.com/php-fig/container.git",
1405
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
1406
+ },
1407
+ "dist": {
1408
+ "type": "zip",
1409
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
1410
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
1411
+ "shasum": ""
1412
+ },
1413
+ "require": {
1414
+ "php": ">=5.3.0"
1415
+ },
1416
+ "type": "library",
1417
+ "extra": {
1418
+ "branch-alias": {
1419
+ "dev-master": "1.0.x-dev"
1420
+ }
1421
+ },
1422
+ "autoload": {
1423
+ "psr-4": {
1424
+ "Psr\\Container\\": "src/"
1425
+ }
1426
+ },
1427
+ "notification-url": "https://packagist.org/downloads/",
1428
+ "license": [
1429
+ "MIT"
1430
+ ],
1431
+ "authors": [
1432
+ {
1433
+ "name": "PHP-FIG",
1434
+ "homepage": "http://www.php-fig.org/"
1435
+ }
1436
+ ],
1437
+ "description": "Common Container Interface (PHP FIG PSR-11)",
1438
+ "homepage": "https://github.com/php-fig/container",
1439
+ "keywords": [
1440
+ "PSR-11",
1441
+ "container",
1442
+ "container-interface",
1443
+ "container-interop",
1444
+ "psr"
1445
+ ],
1446
+ "time": "2017-02-14T16:28:37+00:00"
1447
+ },
1448
+ {
1449
+ "name": "psr/log",
1450
+ "version": "1.1.2",
1451
+ "source": {
1452
+ "type": "git",
1453
+ "url": "https://github.com/php-fig/log.git",
1454
+ "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
1455
+ },
1456
+ "dist": {
1457
+ "type": "zip",
1458
+ "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
1459
+ "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
1460
+ "shasum": ""
1461
+ },
1462
+ "require": {
1463
+ "php": ">=5.3.0"
1464
+ },
1465
+ "type": "library",
1466
+ "extra": {
1467
+ "branch-alias": {
1468
+ "dev-master": "1.1.x-dev"
1469
+ }
1470
+ },
1471
+ "autoload": {
1472
+ "psr-4": {
1473
+ "Psr\\Log\\": "Psr/Log/"
1474
+ }
1475
+ },
1476
+ "notification-url": "https://packagist.org/downloads/",
1477
+ "license": [
1478
+ "MIT"
1479
+ ],
1480
+ "authors": [
1481
+ {
1482
+ "name": "PHP-FIG",
1483
+ "homepage": "http://www.php-fig.org/"
1484
+ }
1485
+ ],
1486
+ "description": "Common interface for logging libraries",
1487
+ "homepage": "https://github.com/php-fig/log",
1488
+ "keywords": [
1489
+ "log",
1490
+ "psr",
1491
+ "psr-3"
1492
+ ],
1493
+ "time": "2019-11-01T11:05:21+00:00"
1494
+ },
1495
+ {
1496
+ "name": "ramsey/array_column",
1497
+ "version": "1.1.3",
1498
+ "source": {
1499
+ "type": "git",
1500
+ "url": "https://github.com/ramsey/array_column.git",
1501
+ "reference": "f8e52eb28e67eb50e613b451dd916abcf783c1db"
1502
+ },
1503
+ "dist": {
1504
+ "type": "zip",
1505
+ "url": "https://api.github.com/repos/ramsey/array_column/zipball/f8e52eb28e67eb50e613b451dd916abcf783c1db",
1506
+ "reference": "f8e52eb28e67eb50e613b451dd916abcf783c1db",
1507
+ "shasum": ""
1508
+ },
1509
+ "require-dev": {
1510
+ "jakub-onderka/php-parallel-lint": "0.8.*",
1511
+ "phpunit/phpunit": "~4.5",
1512
+ "satooshi/php-coveralls": "0.6.*",
1513
+ "squizlabs/php_codesniffer": "~2.2"
1514
+ },
1515
+ "type": "library",
1516
+ "autoload": {
1517
+ "files": [
1518
+ "src/array_column.php"
1519
+ ]
1520
+ },
1521
+ "notification-url": "https://packagist.org/downloads/",
1522
+ "license": [
1523
+ "MIT"
1524
+ ],
1525
+ "authors": [
1526
+ {
1527
+ "name": "Ben Ramsey",
1528
+ "homepage": "http://benramsey.com"
1529
+ }
1530
+ ],
1531
+ "description": "Provides functionality for array_column() to projects using PHP earlier than version 5.5.",
1532
+ "homepage": "https://github.com/ramsey/array_column",
1533
+ "keywords": [
1534
+ "array",
1535
+ "array_column",
1536
+ "column"
1537
+ ],
1538
+ "abandoned": true,
1539
+ "time": "2015-03-20T22:07:39+00:00"
1540
+ },
1541
+ {
1542
+ "name": "rmccue/requests",
1543
+ "version": "v1.7.0",
1544
+ "source": {
1545
+ "type": "git",
1546
+ "url": "https://github.com/rmccue/Requests.git",
1547
+ "reference": "87932f52ffad70504d93f04f15690cf16a089546"
1548
+ },
1549
+ "dist": {
1550
+ "type": "zip",
1551
+ "url": "https://api.github.com/repos/rmccue/Requests/zipball/87932f52ffad70504d93f04f15690cf16a089546",
1552
+ "reference": "87932f52ffad70504d93f04f15690cf16a089546",
1553
+ "shasum": ""
1554
+ },
1555
+ "require": {
1556
+ "php": ">=5.2"
1557
+ },
1558
+ "require-dev": {
1559
+ "requests/test-server": "dev-master"
1560
+ },
1561
+ "type": "library",
1562
+ "autoload": {
1563
+ "psr-0": {
1564
+ "Requests": "library/"
1565
+ }
1566
+ },
1567
+ "notification-url": "https://packagist.org/downloads/",
1568
+ "license": [
1569
+ "ISC"
1570
+ ],
1571
+ "authors": [
1572
+ {
1573
+ "name": "Ryan McCue",
1574
+ "homepage": "http://ryanmccue.info"
1575
+ }
1576
+ ],
1577
+ "description": "A HTTP library written in PHP, for human beings.",
1578
+ "homepage": "http://github.com/rmccue/Requests",
1579
+ "keywords": [
1580
+ "curl",
1581
+ "fsockopen",
1582
+ "http",
1583
+ "idna",
1584
+ "ipv6",
1585
+ "iri",
1586
+ "sockets"
1587
+ ],
1588
+ "time": "2016-10-13T00:11:37+00:00"
1589
+ },
1590
+ {
1591
+ "name": "sebastian/code-unit-reverse-lookup",
1592
+ "version": "1.0.1",
1593
+ "source": {
1594
+ "type": "git",
1595
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1596
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
1597
+ },
1598
+ "dist": {
1599
+ "type": "zip",
1600
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
1601
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
1602
+ "shasum": ""
1603
+ },
1604
+ "require": {
1605
+ "php": "^5.6 || ^7.0"
1606
+ },
1607
+ "require-dev": {
1608
+ "phpunit/phpunit": "^5.7 || ^6.0"
1609
+ },
1610
+ "type": "library",
1611
+ "extra": {
1612
+ "branch-alias": {
1613
+ "dev-master": "1.0.x-dev"
1614
+ }
1615
+ },
1616
+ "autoload": {
1617
+ "classmap": [
1618
+ "src/"
1619
+ ]
1620
+ },
1621
+ "notification-url": "https://packagist.org/downloads/",
1622
+ "license": [
1623
+ "BSD-3-Clause"
1624
+ ],
1625
+ "authors": [
1626
+ {
1627
+ "name": "Sebastian Bergmann",
1628
+ "email": "sebastian@phpunit.de"
1629
+ }
1630
+ ],
1631
+ "description": "Looks up which function or method a line of code belongs to",
1632
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1633
+ "time": "2017-03-04T06:30:41+00:00"
1634
+ },
1635
+ {
1636
+ "name": "sebastian/comparator",
1637
+ "version": "1.2.4",
1638
+ "source": {
1639
+ "type": "git",
1640
+ "url": "https://github.com/sebastianbergmann/comparator.git",
1641
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
1642
+ },
1643
+ "dist": {
1644
+ "type": "zip",
1645
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
1646
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
1647
+ "shasum": ""
1648
+ },
1649
+ "require": {
1650
+ "php": ">=5.3.3",
1651
+ "sebastian/diff": "~1.2",
1652
+ "sebastian/exporter": "~1.2 || ~2.0"
1653
+ },
1654
+ "require-dev": {
1655
+ "phpunit/phpunit": "~4.4"
1656
+ },
1657
+ "type": "library",
1658
+ "extra": {
1659
+ "branch-alias": {
1660
+ "dev-master": "1.2.x-dev"
1661
+ }
1662
+ },
1663
+ "autoload": {
1664
+ "classmap": [
1665
+ "src/"
1666
+ ]
1667
+ },
1668
+ "notification-url": "https://packagist.org/downloads/",
1669
+ "license": [
1670
+ "BSD-3-Clause"
1671
+ ],
1672
+ "authors": [
1673
+ {
1674
+ "name": "Jeff Welch",
1675
+ "email": "whatthejeff@gmail.com"
1676
+ },
1677
+ {
1678
+ "name": "Volker Dusch",
1679
+ "email": "github@wallbash.com"
1680
+ },
1681
+ {
1682
+ "name": "Bernhard Schussek",
1683
+ "email": "bschussek@2bepublished.at"
1684
+ },
1685
+ {
1686
+ "name": "Sebastian Bergmann",
1687
+ "email": "sebastian@phpunit.de"
1688
+ }
1689
+ ],
1690
+ "description": "Provides the functionality to compare PHP values for equality",
1691
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
1692
+ "keywords": [
1693
+ "comparator",
1694
+ "compare",
1695
+ "equality"
1696
+ ],
1697
+ "time": "2017-01-29T09:50:25+00:00"
1698
+ },
1699
+ {
1700
+ "name": "sebastian/diff",
1701
+ "version": "1.4.3",
1702
+ "source": {
1703
+ "type": "git",
1704
+ "url": "https://github.com/sebastianbergmann/diff.git",
1705
+ "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
1706
+ },
1707
+ "dist": {
1708
+ "type": "zip",
1709
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
1710
+ "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
1711
+ "shasum": ""
1712
+ },
1713
+ "require": {
1714
+ "php": "^5.3.3 || ^7.0"
1715
+ },
1716
+ "require-dev": {
1717
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
1718
+ },
1719
+ "type": "library",
1720
+ "extra": {
1721
+ "branch-alias": {
1722
+ "dev-master": "1.4-dev"
1723
+ }
1724
+ },
1725
+ "autoload": {
1726
+ "classmap": [
1727
+ "src/"
1728
+ ]
1729
+ },
1730
+ "notification-url": "https://packagist.org/downloads/",
1731
+ "license": [
1732
+ "BSD-3-Clause"
1733
+ ],
1734
+ "authors": [
1735
+ {
1736
+ "name": "Kore Nordmann",
1737
+ "email": "mail@kore-nordmann.de"
1738
+ },
1739
+ {
1740
+ "name": "Sebastian Bergmann",
1741
+ "email": "sebastian@phpunit.de"
1742
+ }
1743
+ ],
1744
+ "description": "Diff implementation",
1745
+ "homepage": "https://github.com/sebastianbergmann/diff",
1746
+ "keywords": [
1747
+ "diff"
1748
+ ],
1749
+ "time": "2017-05-22T07:24:03+00:00"
1750
+ },
1751
+ {
1752
+ "name": "sebastian/environment",
1753
+ "version": "2.0.0",
1754
+ "source": {
1755
+ "type": "git",
1756
+ "url": "https://github.com/sebastianbergmann/environment.git",
1757
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
1758
+ },
1759
+ "dist": {
1760
+ "type": "zip",
1761
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
1762
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
1763
+ "shasum": ""
1764
+ },
1765
+ "require": {
1766
+ "php": "^5.6 || ^7.0"
1767
+ },
1768
+ "require-dev": {
1769
+ "phpunit/phpunit": "^5.0"
1770
+ },
1771
+ "type": "library",
1772
+ "extra": {
1773
+ "branch-alias": {
1774
+ "dev-master": "2.0.x-dev"
1775
+ }
1776
+ },
1777
+ "autoload": {
1778
+ "classmap": [
1779
+ "src/"
1780
+ ]
1781
+ },
1782
+ "notification-url": "https://packagist.org/downloads/",
1783
+ "license": [
1784
+ "BSD-3-Clause"
1785
+ ],
1786
+ "authors": [
1787
+ {
1788
+ "name": "Sebastian Bergmann",
1789
+ "email": "sebastian@phpunit.de"
1790
+ }
1791
+ ],
1792
+ "description": "Provides functionality to handle HHVM/PHP environments",
1793
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
1794
+ "keywords": [
1795
+ "Xdebug",
1796
+ "environment",
1797
+ "hhvm"
1798
+ ],
1799
+ "time": "2016-11-26T07:53:53+00:00"
1800
+ },
1801
+ {
1802
+ "name": "sebastian/exporter",
1803
+ "version": "2.0.0",
1804
+ "source": {
1805
+ "type": "git",
1806
+ "url": "https://github.com/sebastianbergmann/exporter.git",
1807
+ "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
1808
+ },
1809
+ "dist": {
1810
+ "type": "zip",
1811
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
1812
+ "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
1813
+ "shasum": ""
1814
+ },
1815
+ "require": {
1816
+ "php": ">=5.3.3",
1817
+ "sebastian/recursion-context": "~2.0"
1818
+ },
1819
+ "require-dev": {
1820
+ "ext-mbstring": "*",
1821
+ "phpunit/phpunit": "~4.4"
1822
+ },
1823
+ "type": "library",
1824
+ "extra": {
1825
+ "branch-alias": {
1826
+ "dev-master": "2.0.x-dev"
1827
+ }
1828
+ },
1829
+ "autoload": {
1830
+ "classmap": [
1831
+ "src/"
1832
+ ]
1833
+ },
1834
+ "notification-url": "https://packagist.org/downloads/",
1835
+ "license": [
1836
+ "BSD-3-Clause"
1837
+ ],
1838
+ "authors": [
1839
+ {
1840
+ "name": "Jeff Welch",
1841
+ "email": "whatthejeff@gmail.com"
1842
+ },
1843
+ {
1844
+ "name": "Volker Dusch",
1845
+ "email": "github@wallbash.com"
1846
+ },
1847
+ {
1848
+ "name": "Bernhard Schussek",
1849
+ "email": "bschussek@2bepublished.at"
1850
+ },
1851
+ {
1852
+ "name": "Sebastian Bergmann",
1853
+ "email": "sebastian@phpunit.de"
1854
+ },
1855
+ {
1856
+ "name": "Adam Harvey",
1857
+ "email": "aharvey@php.net"
1858
+ }
1859
+ ],
1860
+ "description": "Provides the functionality to export PHP variables for visualization",
1861
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
1862
+ "keywords": [
1863
+ "export",
1864
+ "exporter"
1865
+ ],
1866
+ "time": "2016-11-19T08:54:04+00:00"
1867
+ },
1868
+ {
1869
+ "name": "sebastian/global-state",
1870
+ "version": "1.1.1",
1871
+ "source": {
1872
+ "type": "git",
1873
+ "url": "https://github.com/sebastianbergmann/global-state.git",
1874
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
1875
+ },
1876
+ "dist": {
1877
+ "type": "zip",
1878
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
1879
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
1880
+ "shasum": ""
1881
+ },
1882
+ "require": {
1883
+ "php": ">=5.3.3"
1884
+ },
1885
+ "require-dev": {
1886
+ "phpunit/phpunit": "~4.2"
1887
+ },
1888
+ "suggest": {
1889
+ "ext-uopz": "*"
1890
+ },
1891
+ "type": "library",
1892
+ "extra": {
1893
+ "branch-alias": {
1894
+ "dev-master": "1.0-dev"
1895
+ }
1896
+ },
1897
+ "autoload": {
1898
+ "classmap": [
1899
+ "src/"
1900
+ ]
1901
+ },
1902
+ "notification-url": "https://packagist.org/downloads/",
1903
+ "license": [
1904
+ "BSD-3-Clause"
1905
+ ],
1906
+ "authors": [
1907
+ {
1908
+ "name": "Sebastian Bergmann",
1909
+ "email": "sebastian@phpunit.de"
1910
+ }
1911
+ ],
1912
+ "description": "Snapshotting of global state",
1913
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
1914
+ "keywords": [
1915
+ "global state"
1916
+ ],
1917
+ "time": "2015-10-12T03:26:01+00:00"
1918
+ },
1919
+ {
1920
+ "name": "sebastian/object-enumerator",
1921
+ "version": "2.0.1",
1922
+ "source": {
1923
+ "type": "git",
1924
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
1925
+ "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
1926
+ },
1927
+ "dist": {
1928
+ "type": "zip",
1929
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
1930
+ "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
1931
+ "shasum": ""
1932
+ },
1933
+ "require": {
1934
+ "php": ">=5.6",
1935
+ "sebastian/recursion-context": "~2.0"
1936
+ },
1937
+ "require-dev": {
1938
+ "phpunit/phpunit": "~5"
1939
+ },
1940
+ "type": "library",
1941
+ "extra": {
1942
+ "branch-alias": {
1943
+ "dev-master": "2.0.x-dev"
1944
+ }
1945
+ },
1946
+ "autoload": {
1947
+ "classmap": [
1948
+ "src/"
1949
+ ]
1950
+ },
1951
+ "notification-url": "https://packagist.org/downloads/",
1952
+ "license": [
1953
+ "BSD-3-Clause"
1954
+ ],
1955
+ "authors": [
1956
+ {
1957
+ "name": "Sebastian Bergmann",
1958
+ "email": "sebastian@phpunit.de"
1959
+ }
1960
+ ],
1961
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
1962
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
1963
+ "time": "2017-02-18T15:18:39+00:00"
1964
+ },
1965
+ {
1966
+ "name": "sebastian/recursion-context",
1967
+ "version": "2.0.0",
1968
+ "source": {
1969
+ "type": "git",
1970
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
1971
+ "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
1972
+ },
1973
+ "dist": {
1974
+ "type": "zip",
1975
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
1976
+ "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
1977
+ "shasum": ""
1978
+ },
1979
+ "require": {
1980
+ "php": ">=5.3.3"
1981
+ },
1982
+ "require-dev": {
1983
+ "phpunit/phpunit": "~4.4"
1984
+ },
1985
+ "type": "library",
1986
+ "extra": {
1987
+ "branch-alias": {
1988
+ "dev-master": "2.0.x-dev"
1989
+ }
1990
+ },
1991
+ "autoload": {
1992
+ "classmap": [
1993
+ "src/"
1994
+ ]
1995
+ },
1996
+ "notification-url": "https://packagist.org/downloads/",
1997
+ "license": [
1998
+ "BSD-3-Clause"
1999
+ ],
2000
+ "authors": [
2001
+ {
2002
+ "name": "Jeff Welch",
2003
+ "email": "whatthejeff@gmail.com"
2004
+ },
2005
+ {
2006
+ "name": "Sebastian Bergmann",
2007
+ "email": "sebastian@phpunit.de"
2008
+ },
2009
+ {
2010
+ "name": "Adam Harvey",
2011
+ "email": "aharvey@php.net"
2012
+ }
2013
+ ],
2014
+ "description": "Provides functionality to recursively process PHP variables",
2015
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
2016
+ "time": "2016-11-19T07:33:16+00:00"
2017
+ },
2018
+ {
2019
+ "name": "sebastian/resource-operations",
2020
+ "version": "1.0.0",
2021
+ "source": {
2022
+ "type": "git",
2023
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
2024
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
2025
+ },
2026
+ "dist": {
2027
+ "type": "zip",
2028
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
2029
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
2030
+ "shasum": ""
2031
+ },
2032
+ "require": {
2033
+ "php": ">=5.6.0"
2034
+ },
2035
+ "type": "library",
2036
+ "extra": {
2037
+ "branch-alias": {
2038
+ "dev-master": "1.0.x-dev"
2039
+ }
2040
+ },
2041
+ "autoload": {
2042
+ "classmap": [
2043
+ "src/"
2044
+ ]
2045
+ },
2046
+ "notification-url": "https://packagist.org/downloads/",
2047
+ "license": [
2048
+ "BSD-3-Clause"
2049
+ ],
2050
+ "authors": [
2051
+ {
2052
+ "name": "Sebastian Bergmann",
2053
+ "email": "sebastian@phpunit.de"
2054
+ }
2055
+ ],
2056
+ "description": "Provides a list of PHP built-in functions that operate on resources",
2057
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
2058
+ "time": "2015-07-28T20:34:47+00:00"
2059
+ },
2060
+ {
2061
+ "name": "sebastian/version",
2062
+ "version": "2.0.1",
2063
+ "source": {
2064
+ "type": "git",
2065
+ "url": "https://github.com/sebastianbergmann/version.git",
2066
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
2067
+ },
2068
+ "dist": {
2069
+ "type": "zip",
2070
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
2071
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
2072
+ "shasum": ""
2073
+ },
2074
+ "require": {
2075
+ "php": ">=5.6"
2076
+ },
2077
+ "type": "library",
2078
+ "extra": {
2079
+ "branch-alias": {
2080
+ "dev-master": "2.0.x-dev"
2081
+ }
2082
+ },
2083
+ "autoload": {
2084
+ "classmap": [
2085
+ "src/"
2086
+ ]
2087
+ },
2088
+ "notification-url": "https://packagist.org/downloads/",
2089
+ "license": [
2090
+ "BSD-3-Clause"
2091
+ ],
2092
+ "authors": [
2093
+ {
2094
+ "name": "Sebastian Bergmann",
2095
+ "email": "sebastian@phpunit.de",
2096
+ "role": "lead"
2097
+ }
2098
+ ],
2099
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
2100
+ "homepage": "https://github.com/sebastianbergmann/version",
2101
+ "time": "2016-10-03T07:35:21+00:00"
2102
+ },
2103
+ {
2104
+ "name": "seld/jsonlint",
2105
+ "version": "1.7.2",
2106
+ "source": {
2107
+ "type": "git",
2108
+ "url": "https://github.com/Seldaek/jsonlint.git",
2109
+ "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19"
2110
+ },
2111
+ "dist": {
2112
+ "type": "zip",
2113
+ "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19",
2114
+ "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19",
2115
+ "shasum": ""
2116
+ },
2117
+ "require": {
2118
+ "php": "^5.3 || ^7.0"
2119
+ },
2120
+ "require-dev": {
2121
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
2122
+ },
2123
+ "bin": [
2124
+ "bin/jsonlint"
2125
+ ],
2126
+ "type": "library",
2127
+ "autoload": {
2128
+ "psr-4": {
2129
+ "Seld\\JsonLint\\": "src/Seld/JsonLint/"
2130
+ }
2131
+ },
2132
+ "notification-url": "https://packagist.org/downloads/",
2133
+ "license": [
2134
+ "MIT"
2135
+ ],
2136
+ "authors": [
2137
+ {
2138
+ "name": "Jordi Boggiano",
2139
+ "email": "j.boggiano@seld.be",
2140
+ "homepage": "http://seld.be"
2141
+ }
2142
+ ],
2143
+ "description": "JSON Linter",
2144
+ "keywords": [
2145
+ "json",
2146
+ "linter",
2147
+ "parser",
2148
+ "validator"
2149
+ ],
2150
+ "time": "2019-10-24T14:27:39+00:00"
2151
+ },
2152
+ {
2153
+ "name": "seld/phar-utils",
2154
+ "version": "1.1.0",
2155
+ "source": {
2156
+ "type": "git",
2157
+ "url": "https://github.com/Seldaek/phar-utils.git",
2158
+ "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0"
2159
+ },
2160
+ "dist": {
2161
+ "type": "zip",
2162
+ "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0",
2163
+ "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0",
2164
+ "shasum": ""
2165
+ },
2166
+ "require": {
2167
+ "php": ">=5.3"
2168
+ },
2169
+ "type": "library",
2170
+ "extra": {
2171
+ "branch-alias": {
2172
+ "dev-master": "1.x-dev"
2173
+ }
2174
+ },
2175
+ "autoload": {
2176
+ "psr-4": {
2177
+ "Seld\\PharUtils\\": "src/"
2178
+ }
2179
+ },
2180
+ "notification-url": "https://packagist.org/downloads/",
2181
+ "license": [
2182
+ "MIT"
2183
+ ],
2184
+ "authors": [
2185
+ {
2186
+ "name": "Jordi Boggiano",
2187
+ "email": "j.boggiano@seld.be"
2188
+ }
2189
+ ],
2190
+ "description": "PHAR file format utilities, for when PHP phars you up",
2191
+ "keywords": [
2192
+ "phar"
2193
+ ],
2194
+ "time": "2020-02-14T15:25:33+00:00"
2195
+ },
2196
+ {
2197
+ "name": "squizlabs/php_codesniffer",
2198
+ "version": "3.5.4",
2199
+ "source": {
2200
+ "type": "git",
2201
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
2202
+ "reference": "dceec07328401de6211037abbb18bda423677e26"
2203
+ },
2204
+ "dist": {
2205
+ "type": "zip",
2206
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dceec07328401de6211037abbb18bda423677e26",
2207
+ "reference": "dceec07328401de6211037abbb18bda423677e26",
2208
+ "shasum": ""
2209
+ },
2210
+ "require": {
2211
+ "ext-simplexml": "*",
2212
+ "ext-tokenizer": "*",
2213
+ "ext-xmlwriter": "*",
2214
+ "php": ">=5.4.0"
2215
+ },
2216
+ "require-dev": {
2217
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
2218
+ },
2219
+ "bin": [
2220
+ "bin/phpcs",
2221
+ "bin/phpcbf"
2222
+ ],
2223
+ "type": "library",
2224
+ "extra": {
2225
+ "branch-alias": {
2226
+ "dev-master": "3.x-dev"
2227
+ }
2228
+ },
2229
+ "notification-url": "https://packagist.org/downloads/",
2230
+ "license": [
2231
+ "BSD-3-Clause"
2232
+ ],
2233
+ "authors": [
2234
+ {
2235
+ "name": "Greg Sherwood",
2236
+ "role": "lead"
2237
+ }
2238
+ ],
2239
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
2240
+ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
2241
+ "keywords": [
2242
+ "phpcs",
2243
+ "standards"
2244
+ ],
2245
+ "time": "2020-01-30T22:20:29+00:00"
2246
+ },
2247
+ {
2248
+ "name": "symfony/config",
2249
+ "version": "v3.4.37",
2250
+ "source": {
2251
+ "type": "git",
2252
+ "url": "https://github.com/symfony/config.git",
2253
+ "reference": "6abc18b2a97f63508d23929bbb2ae65aaa07bace"
2254
+ },
2255
+ "dist": {
2256
+ "type": "zip",
2257
+ "url": "https://api.github.com/repos/symfony/config/zipball/6abc18b2a97f63508d23929bbb2ae65aaa07bace",
2258
+ "reference": "6abc18b2a97f63508d23929bbb2ae65aaa07bace",
2259
+ "shasum": ""
2260
+ },
2261
+ "require": {
2262
+ "php": "^5.5.9|>=7.0.8",
2263
+ "symfony/filesystem": "~2.8|~3.0|~4.0",
2264
+ "symfony/polyfill-ctype": "~1.8"
2265
+ },
2266
+ "conflict": {
2267
+ "symfony/dependency-injection": "<3.3",
2268
+ "symfony/finder": "<3.3"
2269
+ },
2270
+ "require-dev": {
2271
+ "symfony/dependency-injection": "~3.3|~4.0",
2272
+ "symfony/event-dispatcher": "~3.3|~4.0",
2273
+ "symfony/finder": "~3.3|~4.0",
2274
+ "symfony/yaml": "~3.0|~4.0"
2275
+ },
2276
+ "suggest": {
2277
+ "symfony/yaml": "To use the yaml reference dumper"
2278
+ },
2279
+ "type": "library",
2280
+ "extra": {
2281
+ "branch-alias": {
2282
+ "dev-master": "3.4-dev"
2283
+ }
2284
+ },
2285
+ "autoload": {
2286
+ "psr-4": {
2287
+ "Symfony\\Component\\Config\\": ""
2288
+ },
2289
+ "exclude-from-classmap": [
2290
+ "/Tests/"
2291
+ ]
2292
+ },
2293
+ "notification-url": "https://packagist.org/downloads/",
2294
+ "license": [
2295
+ "MIT"
2296
+ ],
2297
+ "authors": [
2298
+ {
2299
+ "name": "Fabien Potencier",
2300
+ "email": "fabien@symfony.com"
2301
+ },
2302
+ {
2303
+ "name": "Symfony Community",
2304
+ "homepage": "https://symfony.com/contributors"
2305
+ }
2306
+ ],
2307
+ "description": "Symfony Config Component",
2308
+ "homepage": "https://symfony.com",
2309
+ "time": "2020-01-04T12:05:51+00:00"
2310
+ },
2311
+ {
2312
+ "name": "symfony/console",
2313
+ "version": "v3.4.37",
2314
+ "source": {
2315
+ "type": "git",
2316
+ "url": "https://github.com/symfony/console.git",
2317
+ "reference": "7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12"
2318
+ },
2319
+ "dist": {
2320
+ "type": "zip",
2321
+ "url": "https://api.github.com/repos/symfony/console/zipball/7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12",
2322
+ "reference": "7c5bdd346f9d90a2d22d4e1fe61e02dc19b98f12",
2323
+ "shasum": ""
2324
+ },
2325
+ "require": {
2326
+ "php": "^5.5.9|>=7.0.8",
2327
+ "symfony/debug": "~2.8|~3.0|~4.0",
2328
+ "symfony/polyfill-mbstring": "~1.0"
2329
+ },
2330
+ "conflict": {
2331
+ "symfony/dependency-injection": "<3.4",
2332
+ "symfony/process": "<3.3"
2333
+ },
2334
+ "provide": {
2335
+ "psr/log-implementation": "1.0"
2336
+ },
2337
+ "require-dev": {
2338
+ "psr/log": "~1.0",
2339
+ "symfony/config": "~3.3|~4.0",
2340
+ "symfony/dependency-injection": "~3.4|~4.0",
2341
+ "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
2342
+ "symfony/lock": "~3.4|~4.0",
2343
+ "symfony/process": "~3.3|~4.0"
2344
+ },
2345
+ "suggest": {
2346
+ "psr/log": "For using the console logger",
2347
+ "symfony/event-dispatcher": "",
2348
+ "symfony/lock": "",
2349
+ "symfony/process": ""
2350
+ },
2351
+ "type": "library",
2352
+ "extra": {
2353
+ "branch-alias": {
2354
+ "dev-master": "3.4-dev"
2355
+ }
2356
+ },
2357
+ "autoload": {
2358
+ "psr-4": {
2359
+ "Symfony\\Component\\Console\\": ""
2360
+ },
2361
+ "exclude-from-classmap": [
2362
+ "/Tests/"
2363
+ ]
2364
+ },
2365
+ "notification-url": "https://packagist.org/downloads/",
2366
+ "license": [
2367
+ "MIT"
2368
+ ],
2369
+ "authors": [
2370
+ {
2371
+ "name": "Fabien Potencier",
2372
+ "email": "fabien@symfony.com"
2373
+ },
2374
+ {
2375
+ "name": "Symfony Community",
2376
+ "homepage": "https://symfony.com/contributors"
2377
+ }
2378
+ ],
2379
+ "description": "Symfony Console Component",
2380
+ "homepage": "https://symfony.com",
2381
+ "time": "2020-01-10T07:52:48+00:00"
2382
+ },
2383
+ {
2384
+ "name": "symfony/debug",
2385
+ "version": "v3.4.37",
2386
+ "source": {
2387
+ "type": "git",
2388
+ "url": "https://github.com/symfony/debug.git",
2389
+ "reference": "70dd18e93bb8bdf3c4db7fde832619fef9828cf8"
2390
+ },
2391
+ "dist": {
2392
+ "type": "zip",
2393
+ "url": "https://api.github.com/repos/symfony/debug/zipball/70dd18e93bb8bdf3c4db7fde832619fef9828cf8",
2394
+ "reference": "70dd18e93bb8bdf3c4db7fde832619fef9828cf8",
2395
+ "shasum": ""
2396
+ },
2397
+ "require": {
2398
+ "php": "^5.5.9|>=7.0.8",
2399
+ "psr/log": "~1.0"
2400
+ },
2401
+ "conflict": {
2402
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
2403
+ },
2404
+ "require-dev": {
2405
+ "symfony/http-kernel": "~2.8|~3.0|~4.0"
2406
+ },
2407
+ "type": "library",
2408
+ "extra": {
2409
+ "branch-alias": {
2410
+ "dev-master": "3.4-dev"
2411
+ }
2412
+ },
2413
+ "autoload": {
2414
+ "psr-4": {
2415
+ "Symfony\\Component\\Debug\\": ""
2416
+ },
2417
+ "exclude-from-classmap": [
2418
+ "/Tests/"
2419
+ ]
2420
+ },
2421
+ "notification-url": "https://packagist.org/downloads/",
2422
+ "license": [
2423
+ "MIT"
2424
+ ],
2425
+ "authors": [
2426
+ {
2427
+ "name": "Fabien Potencier",
2428
+ "email": "fabien@symfony.com"
2429
+ },
2430
+ {
2431
+ "name": "Symfony Community",
2432
+ "homepage": "https://symfony.com/contributors"
2433
+ }
2434
+ ],
2435
+ "description": "Symfony Debug Component",
2436
+ "homepage": "https://symfony.com",
2437
+ "time": "2020-01-08T16:36:15+00:00"
2438
+ },
2439
+ {
2440
+ "name": "symfony/dependency-injection",
2441
+ "version": "v3.4.37",
2442
+ "source": {
2443
+ "type": "git",
2444
+ "url": "https://github.com/symfony/dependency-injection.git",
2445
+ "reference": "22000f10c9e1cfef051e8b4de46815b41a0223fc"
2446
+ },
2447
+ "dist": {
2448
+ "type": "zip",
2449
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/22000f10c9e1cfef051e8b4de46815b41a0223fc",
2450
+ "reference": "22000f10c9e1cfef051e8b4de46815b41a0223fc",
2451
+ "shasum": ""
2452
+ },
2453
+ "require": {
2454
+ "php": "^5.5.9|>=7.0.8",
2455
+ "psr/container": "^1.0"
2456
+ },
2457
+ "conflict": {
2458
+ "symfony/config": "<3.3.7",
2459
+ "symfony/finder": "<3.3",
2460
+ "symfony/proxy-manager-bridge": "<3.4",
2461
+ "symfony/yaml": "<3.4"
2462
+ },
2463
+ "provide": {
2464
+ "psr/container-implementation": "1.0"
2465
+ },
2466
+ "require-dev": {
2467
+ "symfony/config": "~3.3|~4.0",
2468
+ "symfony/expression-language": "~2.8|~3.0|~4.0",
2469
+ "symfony/yaml": "~3.4|~4.0"
2470
+ },
2471
+ "suggest": {
2472
+ "symfony/config": "",
2473
+ "symfony/expression-language": "For using expressions in service container configuration",
2474
+ "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
2475
+ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
2476
+ "symfony/yaml": ""
2477
+ },
2478
+ "type": "library",
2479
+ "extra": {
2480
+ "branch-alias": {
2481
+ "dev-master": "3.4-dev"
2482
+ }
2483
+ },
2484
+ "autoload": {
2485
+ "psr-4": {
2486
+ "Symfony\\Component\\DependencyInjection\\": ""
2487
+ },
2488
+ "exclude-from-classmap": [
2489
+ "/Tests/"
2490
+ ]
2491
+ },
2492
+ "notification-url": "https://packagist.org/downloads/",
2493
+ "license": [
2494
+ "MIT"
2495
+ ],
2496
+ "authors": [
2497
+ {
2498
+ "name": "Fabien Potencier",
2499
+ "email": "fabien@symfony.com"
2500
+ },
2501
+ {
2502
+ "name": "Symfony Community",
2503
+ "homepage": "https://symfony.com/contributors"
2504
+ }
2505
+ ],
2506
+ "description": "Symfony DependencyInjection Component",
2507
+ "homepage": "https://symfony.com",
2508
+ "time": "2020-01-08T11:20:51+00:00"
2509
+ },
2510
+ {
2511
+ "name": "symfony/event-dispatcher",
2512
+ "version": "v3.4.37",
2513
+ "source": {
2514
+ "type": "git",
2515
+ "url": "https://github.com/symfony/event-dispatcher.git",
2516
+ "reference": "79ede8f2836e5ec910ebb325bde40f987244baa8"
2517
+ },
2518
+ "dist": {
2519
+ "type": "zip",
2520
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/79ede8f2836e5ec910ebb325bde40f987244baa8",
2521
+ "reference": "79ede8f2836e5ec910ebb325bde40f987244baa8",
2522
+ "shasum": ""
2523
+ },
2524
+ "require": {
2525
+ "php": "^5.5.9|>=7.0.8"
2526
+ },
2527
+ "conflict": {
2528
+ "symfony/dependency-injection": "<3.3"
2529
+ },
2530
+ "require-dev": {
2531
+ "psr/log": "~1.0",
2532
+ "symfony/config": "~2.8|~3.0|~4.0",
2533
+ "symfony/dependency-injection": "~3.3|~4.0",
2534
+ "symfony/expression-language": "~2.8|~3.0|~4.0",
2535
+ "symfony/stopwatch": "~2.8|~3.0|~4.0"
2536
+ },
2537
+ "suggest": {
2538
+ "symfony/dependency-injection": "",
2539
+ "symfony/http-kernel": ""
2540
+ },
2541
+ "type": "library",
2542
+ "extra": {
2543
+ "branch-alias": {
2544
+ "dev-master": "3.4-dev"
2545
+ }
2546
+ },
2547
+ "autoload": {
2548
+ "psr-4": {
2549
+ "Symfony\\Component\\EventDispatcher\\": ""
2550
+ },
2551
+ "exclude-from-classmap": [
2552
+ "/Tests/"
2553
+ ]
2554
+ },
2555
+ "notification-url": "https://packagist.org/downloads/",
2556
+ "license": [
2557
+ "MIT"
2558
+ ],
2559
+ "authors": [
2560
+ {
2561
+ "name": "Fabien Potencier",
2562
+ "email": "fabien@symfony.com"
2563
+ },
2564
+ {
2565
+ "name": "Symfony Community",
2566
+ "homepage": "https://symfony.com/contributors"
2567
+ }
2568
+ ],
2569
+ "description": "Symfony EventDispatcher Component",
2570
+ "homepage": "https://symfony.com",
2571
+ "time": "2020-01-04T12:05:51+00:00"
2572
+ },
2573
+ {
2574
+ "name": "symfony/filesystem",
2575
+ "version": "v3.4.37",
2576
+ "source": {
2577
+ "type": "git",
2578
+ "url": "https://github.com/symfony/filesystem.git",
2579
+ "reference": "0a0d3b4bda11aa3a0464531c40e681e184e75628"
2580
+ },
2581
+ "dist": {
2582
+ "type": "zip",
2583
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/0a0d3b4bda11aa3a0464531c40e681e184e75628",
2584
+ "reference": "0a0d3b4bda11aa3a0464531c40e681e184e75628",
2585
+ "shasum": ""
2586
+ },
2587
+ "require": {
2588
+ "php": "^5.5.9|>=7.0.8",
2589
+ "symfony/polyfill-ctype": "~1.8"
2590
+ },
2591
+ "type": "library",
2592
+ "extra": {
2593
+ "branch-alias": {
2594
+ "dev-master": "3.4-dev"
2595
+ }
2596
+ },
2597
+ "autoload": {
2598
+ "psr-4": {
2599
+ "Symfony\\Component\\Filesystem\\": ""
2600
+ },
2601
+ "exclude-from-classmap": [
2602
+ "/Tests/"
2603
+ ]
2604
+ },
2605
+ "notification-url": "https://packagist.org/downloads/",
2606
+ "license": [
2607
+ "MIT"
2608
+ ],
2609
+ "authors": [
2610
+ {
2611
+ "name": "Fabien Potencier",
2612
+ "email": "fabien@symfony.com"
2613
+ },
2614
+ {
2615
+ "name": "Symfony Community",
2616
+ "homepage": "https://symfony.com/contributors"
2617
+ }
2618
+ ],
2619
+ "description": "Symfony Filesystem Component",
2620
+ "homepage": "https://symfony.com",
2621
+ "time": "2020-01-17T08:50:08+00:00"
2622
+ },
2623
+ {
2624
+ "name": "symfony/finder",
2625
+ "version": "v3.4.37",
2626
+ "source": {
2627
+ "type": "git",
2628
+ "url": "https://github.com/symfony/finder.git",
2629
+ "reference": "a90a9d3b9f458a5cdeabfa4090b20c000ca3962f"
2630
+ },
2631
+ "dist": {
2632
+ "type": "zip",
2633
+ "url": "https://api.github.com/repos/symfony/finder/zipball/a90a9d3b9f458a5cdeabfa4090b20c000ca3962f",
2634
+ "reference": "a90a9d3b9f458a5cdeabfa4090b20c000ca3962f",
2635
+ "shasum": ""
2636
+ },
2637
+ "require": {
2638
+ "php": "^5.5.9|>=7.0.8"
2639
+ },
2640
+ "type": "library",
2641
+ "extra": {
2642
+ "branch-alias": {
2643
+ "dev-master": "3.4-dev"
2644
+ }
2645
+ },
2646
+ "autoload": {
2647
+ "psr-4": {
2648
+ "Symfony\\Component\\Finder\\": ""
2649
+ },
2650
+ "exclude-from-classmap": [
2651
+ "/Tests/"
2652
+ ]
2653
+ },
2654
+ "notification-url": "https://packagist.org/downloads/",
2655
+ "license": [
2656
+ "MIT"
2657
+ ],
2658
+ "authors": [
2659
+ {
2660
+ "name": "Fabien Potencier",
2661
+ "email": "fabien@symfony.com"
2662
+ },
2663
+ {
2664
+ "name": "Symfony Community",
2665
+ "homepage": "https://symfony.com/contributors"
2666
+ }
2667
+ ],
2668
+ "description": "Symfony Finder Component",
2669
+ "homepage": "https://symfony.com",
2670
+ "time": "2020-01-01T11:03:25+00:00"
2671
+ },
2672
+ {
2673
+ "name": "symfony/polyfill-ctype",
2674
+ "version": "v1.14.0",
2675
+ "source": {
2676
+ "type": "git",
2677
+ "url": "https://github.com/symfony/polyfill-ctype.git",
2678
+ "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38"
2679
+ },
2680
+ "dist": {
2681
+ "type": "zip",
2682
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/fbdeaec0df06cf3d51c93de80c7eb76e271f5a38",
2683
+ "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38",
2684
+ "shasum": ""
2685
+ },
2686
+ "require": {
2687
+ "php": ">=5.3.3"
2688
+ },
2689
+ "suggest": {
2690
+ "ext-ctype": "For best performance"
2691
+ },
2692
+ "type": "library",
2693
+ "extra": {
2694
+ "branch-alias": {
2695
+ "dev-master": "1.14-dev"
2696
+ }
2697
+ },
2698
+ "autoload": {
2699
+ "psr-4": {
2700
+ "Symfony\\Polyfill\\Ctype\\": ""
2701
+ },
2702
+ "files": [
2703
+ "bootstrap.php"
2704
+ ]
2705
+ },
2706
+ "notification-url": "https://packagist.org/downloads/",
2707
+ "license": [
2708
+ "MIT"
2709
+ ],
2710
+ "authors": [
2711
+ {
2712
+ "name": "Gert de Pagter",
2713
+ "email": "BackEndTea@gmail.com"
2714
+ },
2715
+ {
2716
+ "name": "Symfony Community",
2717
+ "homepage": "https://symfony.com/contributors"
2718
+ }
2719
+ ],
2720
+ "description": "Symfony polyfill for ctype functions",
2721
+ "homepage": "https://symfony.com",
2722
+ "keywords": [
2723
+ "compatibility",
2724
+ "ctype",
2725
+ "polyfill",
2726
+ "portable"
2727
+ ],
2728
+ "time": "2020-01-13T11:15:53+00:00"
2729
+ },
2730
+ {
2731
+ "name": "symfony/polyfill-mbstring",
2732
+ "version": "v1.14.0",
2733
+ "source": {
2734
+ "type": "git",
2735
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
2736
+ "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2"
2737
+ },
2738
+ "dist": {
2739
+ "type": "zip",
2740
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2",
2741
+ "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2",
2742
+ "shasum": ""
2743
+ },
2744
+ "require": {
2745
+ "php": ">=5.3.3"
2746
+ },
2747
+ "suggest": {
2748
+ "ext-mbstring": "For best performance"
2749
+ },
2750
+ "type": "library",
2751
+ "extra": {
2752
+ "branch-alias": {
2753
+ "dev-master": "1.14-dev"
2754
+ }
2755
+ },
2756
+ "autoload": {
2757
+ "psr-4": {
2758
+ "Symfony\\Polyfill\\Mbstring\\": ""
2759
+ },
2760
+ "files": [
2761
+ "bootstrap.php"
2762
+ ]
2763
+ },
2764
+ "notification-url": "https://packagist.org/downloads/",
2765
+ "license": [
2766
+ "MIT"
2767
+ ],
2768
+ "authors": [
2769
+ {
2770
+ "name": "Nicolas Grekas",
2771
+ "email": "p@tchwork.com"
2772
+ },
2773
+ {
2774
+ "name": "Symfony Community",
2775
+ "homepage": "https://symfony.com/contributors"
2776
+ }
2777
+ ],
2778
+ "description": "Symfony polyfill for the Mbstring extension",
2779
+ "homepage": "https://symfony.com",
2780
+ "keywords": [
2781
+ "compatibility",
2782
+ "mbstring",
2783
+ "polyfill",
2784
+ "portable",
2785
+ "shim"
2786
+ ],
2787
+ "time": "2020-01-13T11:15:53+00:00"
2788
+ },
2789
+ {
2790
+ "name": "symfony/process",
2791
+ "version": "v3.4.37",
2792
+ "source": {
2793
+ "type": "git",
2794
+ "url": "https://github.com/symfony/process.git",
2795
+ "reference": "5b9d2bcffe4678911a4c941c00b7c161252cf09a"
2796
+ },
2797
+ "dist": {
2798
+ "type": "zip",
2799
+ "url": "https://api.github.com/repos/symfony/process/zipball/5b9d2bcffe4678911a4c941c00b7c161252cf09a",
2800
+ "reference": "5b9d2bcffe4678911a4c941c00b7c161252cf09a",
2801
+ "shasum": ""
2802
+ },
2803
+ "require": {
2804
+ "php": "^5.5.9|>=7.0.8"
2805
+ },
2806
+ "type": "library",
2807
+ "extra": {
2808
+ "branch-alias": {
2809
+ "dev-master": "3.4-dev"
2810
+ }
2811
+ },
2812
+ "autoload": {
2813
+ "psr-4": {
2814
+ "Symfony\\Component\\Process\\": ""
2815
+ },
2816
+ "exclude-from-classmap": [
2817
+ "/Tests/"
2818
+ ]
2819
+ },
2820
+ "notification-url": "https://packagist.org/downloads/",
2821
+ "license": [
2822
+ "MIT"
2823
+ ],
2824
+ "authors": [
2825
+ {
2826
+ "name": "Fabien Potencier",
2827
+ "email": "fabien@symfony.com"
2828
+ },
2829
+ {
2830
+ "name": "Symfony Community",
2831
+ "homepage": "https://symfony.com/contributors"
2832
+ }
2833
+ ],
2834
+ "description": "Symfony Process Component",
2835
+ "homepage": "https://symfony.com",
2836
+ "time": "2020-01-01T11:03:25+00:00"
2837
+ },
2838
+ {
2839
+ "name": "symfony/translation",
2840
+ "version": "v3.4.37",
2841
+ "source": {
2842
+ "type": "git",
2843
+ "url": "https://github.com/symfony/translation.git",
2844
+ "reference": "577ec9ba1d6443947c48058acc3de298ad25e2bf"
2845
+ },
2846
+ "dist": {
2847
+ "type": "zip",
2848
+ "url": "https://api.github.com/repos/symfony/translation/zipball/577ec9ba1d6443947c48058acc3de298ad25e2bf",
2849
+ "reference": "577ec9ba1d6443947c48058acc3de298ad25e2bf",
2850
+ "shasum": ""
2851
+ },
2852
+ "require": {
2853
+ "php": "^5.5.9|>=7.0.8",
2854
+ "symfony/polyfill-mbstring": "~1.0"
2855
+ },
2856
+ "conflict": {
2857
+ "symfony/config": "<2.8",
2858
+ "symfony/dependency-injection": "<3.4",
2859
+ "symfony/yaml": "<3.4"
2860
+ },
2861
+ "require-dev": {
2862
+ "psr/log": "~1.0",
2863
+ "symfony/config": "~2.8|~3.0|~4.0",
2864
+ "symfony/dependency-injection": "~3.4|~4.0",
2865
+ "symfony/finder": "~2.8|~3.0|~4.0",
2866
+ "symfony/http-kernel": "~3.4|~4.0",
2867
+ "symfony/intl": "^2.8.18|^3.2.5|~4.0",
2868
+ "symfony/var-dumper": "~3.4|~4.0",
2869
+ "symfony/yaml": "~3.4|~4.0"
2870
+ },
2871
+ "suggest": {
2872
+ "psr/log-implementation": "To use logging capability in translator",
2873
+ "symfony/config": "",
2874
+ "symfony/yaml": ""
2875
+ },
2876
+ "type": "library",
2877
+ "extra": {
2878
+ "branch-alias": {
2879
+ "dev-master": "3.4-dev"
2880
+ }
2881
+ },
2882
+ "autoload": {
2883
+ "psr-4": {
2884
+ "Symfony\\Component\\Translation\\": ""
2885
+ },
2886
+ "exclude-from-classmap": [
2887
+ "/Tests/"
2888
+ ]
2889
+ },
2890
+ "notification-url": "https://packagist.org/downloads/",
2891
+ "license": [
2892
+ "MIT"
2893
+ ],
2894
+ "authors": [
2895
+ {
2896
+ "name": "Fabien Potencier",
2897
+ "email": "fabien@symfony.com"
2898
+ },
2899
+ {
2900
+ "name": "Symfony Community",
2901
+ "homepage": "https://symfony.com/contributors"
2902
+ }
2903
+ ],
2904
+ "description": "Symfony Translation Component",
2905
+ "homepage": "https://symfony.com",
2906
+ "time": "2020-01-04T12:05:51+00:00"
2907
+ },
2908
+ {
2909
+ "name": "symfony/yaml",
2910
+ "version": "v3.4.37",
2911
+ "source": {
2912
+ "type": "git",
2913
+ "url": "https://github.com/symfony/yaml.git",
2914
+ "reference": "aa46bc2233097d5212332c907f9911533acfbf80"
2915
+ },
2916
+ "dist": {
2917
+ "type": "zip",
2918
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/aa46bc2233097d5212332c907f9911533acfbf80",
2919
+ "reference": "aa46bc2233097d5212332c907f9911533acfbf80",
2920
+ "shasum": ""
2921
+ },
2922
+ "require": {
2923
+ "php": "^5.5.9|>=7.0.8",
2924
+ "symfony/polyfill-ctype": "~1.8"
2925
+ },
2926
+ "conflict": {
2927
+ "symfony/console": "<3.4"
2928
+ },
2929
+ "require-dev": {
2930
+ "symfony/console": "~3.4|~4.0"
2931
+ },
2932
+ "suggest": {
2933
+ "symfony/console": "For validating YAML files using the lint command"
2934
+ },
2935
+ "type": "library",
2936
+ "extra": {
2937
+ "branch-alias": {
2938
+ "dev-master": "3.4-dev"
2939
+ }
2940
+ },
2941
+ "autoload": {
2942
+ "psr-4": {
2943
+ "Symfony\\Component\\Yaml\\": ""
2944
+ },
2945
+ "exclude-from-classmap": [
2946
+ "/Tests/"
2947
+ ]
2948
+ },
2949
+ "notification-url": "https://packagist.org/downloads/",
2950
+ "license": [
2951
+ "MIT"
2952
+ ],
2953
+ "authors": [
2954
+ {
2955
+ "name": "Fabien Potencier",
2956
+ "email": "fabien@symfony.com"
2957
+ },
2958
+ {
2959
+ "name": "Symfony Community",
2960
+ "homepage": "https://symfony.com/contributors"
2961
+ }
2962
+ ],
2963
+ "description": "Symfony Yaml Component",
2964
+ "homepage": "https://symfony.com",
2965
+ "time": "2020-01-13T08:00:59+00:00"
2966
+ },
2967
+ {
2968
+ "name": "webmozart/assert",
2969
+ "version": "1.7.0",
2970
+ "source": {
2971
+ "type": "git",
2972
+ "url": "https://github.com/webmozart/assert.git",
2973
+ "reference": "aed98a490f9a8f78468232db345ab9cf606cf598"
2974
+ },
2975
+ "dist": {
2976
+ "type": "zip",
2977
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598",
2978
+ "reference": "aed98a490f9a8f78468232db345ab9cf606cf598",
2979
+ "shasum": ""
2980
+ },
2981
+ "require": {
2982
+ "php": "^5.3.3 || ^7.0",
2983
+ "symfony/polyfill-ctype": "^1.8"
2984
+ },
2985
+ "conflict": {
2986
+ "vimeo/psalm": "<3.6.0"
2987
+ },
2988
+ "require-dev": {
2989
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
2990
+ },
2991
+ "type": "library",
2992
+ "autoload": {
2993
+ "psr-4": {
2994
+ "Webmozart\\Assert\\": "src/"
2995
+ }
2996
+ },
2997
+ "notification-url": "https://packagist.org/downloads/",
2998
+ "license": [
2999
+ "MIT"
3000
+ ],
3001
+ "authors": [
3002
+ {
3003
+ "name": "Bernhard Schussek",
3004
+ "email": "bschussek@gmail.com"
3005
+ }
3006
+ ],
3007
+ "description": "Assertions to validate method input/output with nice error messages.",
3008
+ "keywords": [
3009
+ "assert",
3010
+ "check",
3011
+ "validate"
3012
+ ],
3013
+ "time": "2020-02-14T12:15:55+00:00"
3014
+ },
3015
+ {
3016
+ "name": "woocommerce/woocommerce-sniffs",
3017
+ "version": "0.0.8",
3018
+ "source": {
3019
+ "type": "git",
3020
+ "url": "https://github.com/woocommerce/woocommerce-sniffs.git",
3021
+ "reference": "ccdae93ba678d59cd9741bec077d0c63c0a82958"
3022
+ },
3023
+ "dist": {
3024
+ "type": "zip",
3025
+ "url": "https://api.github.com/repos/woocommerce/woocommerce-sniffs/zipball/ccdae93ba678d59cd9741bec077d0c63c0a82958",
3026
+ "reference": "ccdae93ba678d59cd9741bec077d0c63c0a82958",
3027
+ "shasum": ""
3028
+ },
3029
+ "require": {
3030
+ "dealerdirect/phpcodesniffer-composer-installer": "0.5.0",
3031
+ "php": ">=7.0",
3032
+ "phpcompatibility/phpcompatibility-wp": "2.1.0",
3033
+ "wp-coding-standards/wpcs": "2.1.1"
3034
+ },
3035
+ "type": "phpcodesniffer-standard",
3036
+ "notification-url": "https://packagist.org/downloads/",
3037
+ "license": [
3038
+ "MIT"
3039
+ ],
3040
+ "authors": [
3041
+ {
3042
+ "name": "Claudio Sanches",
3043
+ "email": "claudio@automattic.com"
3044
+ }
3045
+ ],
3046
+ "description": "WooCommerce sniffs",
3047
+ "keywords": [
3048
+ "phpcs",
3049
+ "standards",
3050
+ "woocommerce",
3051
+ "wordpress"
3052
+ ],
3053
+ "time": "2019-10-16T18:25:21+00:00"
3054
+ },
3055
+ {
3056
+ "name": "wp-cli/autoload-splitter",
3057
+ "version": "v0.1.5",
3058
+ "source": {
3059
+ "type": "git",
3060
+ "url": "https://github.com/wp-cli/autoload-splitter.git",
3061
+ "reference": "fb4302da26390811d2631c62b42b75976d224bb8"
3062
+ },
3063
+ "dist": {
3064
+ "type": "zip",
3065
+ "url": "https://api.github.com/repos/wp-cli/autoload-splitter/zipball/fb4302da26390811d2631c62b42b75976d224bb8",
3066
+ "reference": "fb4302da26390811d2631c62b42b75976d224bb8",
3067
+ "shasum": ""
3068
+ },
3069
+ "require": {
3070
+ "composer-plugin-api": "^1.1"
3071
+ },
3072
+ "type": "composer-plugin",
3073
+ "extra": {
3074
+ "class": "WP_CLI\\AutoloadSplitter\\ComposerPlugin"
3075
+ },
3076
+ "autoload": {
3077
+ "psr-4": {
3078
+ "WP_CLI\\AutoloadSplitter\\": "src"
3079
+ }
3080
+ },
3081
+ "notification-url": "https://packagist.org/downloads/",
3082
+ "license": [
3083
+ "MIT"
3084
+ ],
3085
+ "authors": [
3086
+ {
3087
+ "name": "Alain Schlesser",
3088
+ "email": "alain.schlesser@gmail.com",
3089
+ "homepage": "https://www.alainschlesser.com"
3090
+ }
3091
+ ],
3092
+ "description": "Composer plugin for splitting a generated autoloader into two distinct parts.",
3093
+ "homepage": "https://wp-cli.org",
3094
+ "time": "2017-08-03T08:40:16+00:00"
3095
+ },
3096
+ {
3097
+ "name": "wp-cli/cache-command",
3098
+ "version": "v1.0.6",
3099
+ "source": {
3100
+ "type": "git",
3101
+ "url": "https://github.com/wp-cli/cache-command.git",
3102
+ "reference": "d82cba9effa198f17847dce5771c8fb20c443ffa"
3103
+ },
3104
+ "dist": {
3105
+ "type": "zip",
3106
+ "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/d82cba9effa198f17847dce5771c8fb20c443ffa",
3107
+ "reference": "d82cba9effa198f17847dce5771c8fb20c443ffa",
3108
+ "shasum": ""
3109
+ },
3110
+ "require-dev": {
3111
+ "behat/behat": "~2.5",
3112
+ "wp-cli/wp-cli": "*"
3113
+ },
3114
+ "type": "wp-cli-package",
3115
+ "extra": {
3116
+ "branch-alias": {
3117
+ "dev-master": "1.x-dev"
3118
+ },
3119
+ "bundled": true,
3120
+ "commands": [
3121
+ "cache",
3122
+ "cache add",
3123
+ "cache decr",
3124
+ "cache delete",
3125
+ "cache flush",
3126
+ "cache get",
3127
+ "cache incr",
3128
+ "cache replace",
3129
+ "cache set",
3130
+ "cache type",
3131
+ "transient",
3132
+ "transient delete",
3133
+ "transient get",
3134
+ "transient set",
3135
+ "transient type"
3136
+ ]
3137
+ },
3138
+ "autoload": {
3139
+ "psr-4": {
3140
+ "": "src/"
3141
+ },
3142
+ "files": [
3143
+ "cache-command.php"
3144
+ ]
3145
+ },
3146
+ "notification-url": "https://packagist.org/downloads/",
3147
+ "license": [
3148
+ "MIT"
3149
+ ],
3150
+ "authors": [
3151
+ {
3152
+ "name": "Daniel Bachhuber",
3153
+ "email": "daniel@runcommand.io",
3154
+ "homepage": "https://runcommand.io"
3155
+ }
3156
+ ],
3157
+ "description": "Manages object and transient caches.",
3158
+ "homepage": "https://github.com/wp-cli/cache-command",
3159
+ "time": "2017-12-14T19:21:19+00:00"
3160
+ },
3161
+ {
3162
+ "name": "wp-cli/checksum-command",
3163
+ "version": "v1.0.9",
3164
+ "source": {
3165
+ "type": "git",
3166
+ "url": "https://github.com/wp-cli/checksum-command.git",
3167
+ "reference": "89a319440651f2867f282339c2223cfe5e9cc3fb"
3168
+ },
3169
+ "dist": {
3170
+ "type": "zip",
3171
+ "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/89a319440651f2867f282339c2223cfe5e9cc3fb",
3172
+ "reference": "89a319440651f2867f282339c2223cfe5e9cc3fb",
3173
+ "shasum": ""
3174
+ },
3175
+ "require-dev": {
3176
+ "behat/behat": "~2.5",
3177
+ "wp-cli/wp-cli": "^1.5"
3178
+ },
3179
+ "type": "wp-cli-package",
3180
+ "extra": {
3181
+ "branch-alias": {
3182
+ "dev-master": "1.x-dev"
3183
+ },
3184
+ "bundled": true,
3185
+ "commands": [
3186
+ "core verify-checksums",
3187
+ "plugin verify-checksums"
3188
+ ]
3189
+ },
3190
+ "autoload": {
3191
+ "psr-4": {
3192
+ "": "src/"
3193
+ },
3194
+ "files": [
3195
+ "checksum-command.php"
3196
+ ]
3197
+ },
3198
+ "notification-url": "https://packagist.org/downloads/",
3199
+ "license": [
3200
+ "MIT"
3201
+ ],
3202
+ "authors": [
3203
+ {
3204
+ "name": "Daniel Bachhuber",
3205
+ "email": "daniel@runcommand.io",
3206
+ "homepage": "https://runcommand.io"
3207
+ }
3208
+ ],
3209
+ "description": "Verifies file integrity by comparing to published checksums.",
3210
+ "homepage": "https://github.com/wp-cli/checksum-command",
3211
+ "time": "2018-04-20T07:47:27+00:00"
3212
+ },
3213
+ {
3214
+ "name": "wp-cli/config-command",
3215
+ "version": "v1.2.0",
3216
+ "source": {
3217
+ "type": "git",
3218
+ "url": "https://github.com/wp-cli/config-command.git",
3219
+ "reference": "7bec9b4685b4022ab511630422dd6acccadfca9b"
3220
+ },
3221
+ "dist": {
3222
+ "type": "zip",
3223
+ "url": "https://api.github.com/repos/wp-cli/config-command/zipball/7bec9b4685b4022ab511630422dd6acccadfca9b",
3224
+ "reference": "7bec9b4685b4022ab511630422dd6acccadfca9b",
3225
+ "shasum": ""
3226
+ },
3227
+ "require": {
3228
+ "wp-cli/wp-config-transformer": "^1.2.1"
3229
+ },
3230
+ "require-dev": {
3231
+ "behat/behat": "~2.5",
3232
+ "wp-cli/wp-cli": "*"
3233
+ },
3234
+ "type": "wp-cli-package",
3235
+ "extra": {
3236
+ "branch-alias": {
3237
+ "dev-master": "1.x-dev"
3238
+ },
3239
+ "bundled": true,
3240
+ "commands": [
3241
+ "config",
3242
+ "config edit",
3243
+ "config delete",
3244
+ "config create",
3245
+ "config get",
3246
+ "config has",
3247
+ "config list",
3248
+ "config path",
3249
+ "config set"
3250
+ ]
3251
+ },
3252
+ "autoload": {
3253
+ "psr-4": {
3254
+ "": "src/"
3255
+ },
3256
+ "files": [
3257
+ "config-command.php"
3258
+ ]
3259
+ },
3260
+ "notification-url": "https://packagist.org/downloads/",
3261
+ "license": [
3262
+ "MIT"
3263
+ ],
3264
+ "authors": [
3265
+ {
3266
+ "name": "Daniel Bachhuber",
3267
+ "email": "daniel@runcommand.io",
3268
+ "homepage": "https://runcommand.io"
3269
+ },
3270
+ {
3271
+ "name": "Alain Schlesser",
3272
+ "email": "alain.schlesser@gmail.com",
3273
+ "homepage": "https://www.alainschlesser.com"
3274
+ }
3275
+ ],
3276
+ "description": "Generates and reads the wp-config.php file.",
3277
+ "homepage": "https://github.com/wp-cli/config-command",
3278
+ "time": "2018-04-20T08:03:51+00:00"
3279
+ },
3280
+ {
3281
+ "name": "wp-cli/core-command",
3282
+ "version": "v1.0.12",
3283
+ "source": {
3284
+ "type": "git",
3285
+ "url": "https://github.com/wp-cli/core-command.git",
3286
+ "reference": "b41913707029c5147b38810700e424ed5f5fe8e0"
3287
+ },
3288
+ "dist": {
3289
+ "type": "zip",
3290
+ "url": "https://api.github.com/repos/wp-cli/core-command/zipball/b41913707029c5147b38810700e424ed5f5fe8e0",
3291
+ "reference": "b41913707029c5147b38810700e424ed5f5fe8e0",
3292
+ "shasum": ""
3293
+ },
3294
+ "require-dev": {
3295
+ "behat/behat": "~2.5",
3296
+ "wp-cli/wp-cli": "*"
3297
+ },
3298
+ "type": "wp-cli-package",
3299
+ "extra": {
3300
+ "branch-alias": {
3301
+ "dev-master": "1.x-dev"
3302
+ },
3303
+ "bundled": true,
3304
+ "commands": [
3305
+ "core",
3306
+ "core check-update",
3307
+ "core download",
3308
+ "core install",
3309
+ "core is-installed",
3310
+ "core multisite-convert",
3311
+ "core multisite-install",
3312
+ "core update",
3313
+ "core update-db",
3314
+ "core version"
3315
+ ]
3316
+ },
3317
+ "autoload": {
3318
+ "psr-4": {
3319
+ "": "src/"
3320
+ },
3321
+ "files": [
3322
+ "core-command.php"
3323
+ ]
3324
+ },
3325
+ "notification-url": "https://packagist.org/downloads/",
3326
+ "license": [
3327
+ "MIT"
3328
+ ],
3329
+ "authors": [
3330
+ {
3331
+ "name": "Daniel Bachhuber",
3332
+ "email": "daniel@runcommand.io",
3333
+ "homepage": "https://runcommand.io"
3334
+ }
3335
+ ],
3336
+ "description": "Downloads, installs, updates, and manages a WordPress installation.",
3337
+ "homepage": "https://github.com/wp-cli/core-command",
3338
+ "time": "2018-07-25T15:55:02+00:00"
3339
+ },
3340
+ {
3341
+ "name": "wp-cli/cron-command",
3342
+ "version": "v1.0.5",
3343
+ "source": {
3344
+ "type": "git",
3345
+ "url": "https://github.com/wp-cli/cron-command.git",
3346
+ "reference": "9da7e36e8f9c14cb171a3c5204cba2865e0ed7ef"
3347
+ },
3348
+ "dist": {
3349
+ "type": "zip",
3350
+ "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/9da7e36e8f9c14cb171a3c5204cba2865e0ed7ef",
3351
+ "reference": "9da7e36e8f9c14cb171a3c5204cba2865e0ed7ef",
3352
+ "shasum": ""
3353
+ },
3354
+ "require-dev": {
3355
+ "behat/behat": "~2.5",
3356
+ "wp-cli/wp-cli": "*"
3357
+ },
3358
+ "type": "wp-cli-package",
3359
+ "extra": {
3360
+ "branch-alias": {
3361
+ "dev-master": "1.x-dev"
3362
+ },
3363
+ "bundled": true,
3364
+ "commands": [
3365
+ "cron",
3366
+ "cron test",
3367
+ "cron event",
3368
+ "cron event delete",
3369
+ "cron event list",
3370
+ "cron event run",
3371
+ "cron event schedule",
3372
+ "cron schedule",
3373
+ "cron schedule list"
3374
+ ]
3375
+ },
3376
+ "autoload": {
3377
+ "psr-4": {
3378
+ "": "src/"
3379
+ },
3380
+ "files": [
3381
+ "cron-command.php"
3382
+ ]
3383
+ },
3384
+ "notification-url": "https://packagist.org/downloads/",
3385
+ "license": [
3386
+ "MIT"
3387
+ ],
3388
+ "authors": [
3389
+ {
3390
+ "name": "Daniel Bachhuber",
3391
+ "email": "daniel@runcommand.io",
3392
+ "homepage": "https://runcommand.io"
3393
+ }
3394
+ ],
3395
+ "description": "Tests, runs, and deletes WP-Cron events; manages WP-Cron schedules.",
3396
+ "homepage": "https://github.com/wp-cli/cron-command",
3397
+ "time": "2017-12-08T15:09:54+00:00"
3398
+ },
3399
+ {
3400
+ "name": "wp-cli/db-command",
3401
+ "version": "v1.3.5",
3402
+ "source": {
3403
+ "type": "git",
3404
+ "url": "https://github.com/wp-cli/db-command.git",
3405
+ "reference": "c260be59d9ac4c0012b016405e17d0251137fb89"
3406
+ },
3407
+ "dist": {
3408
+ "type": "zip",
3409
+ "url": "https://api.github.com/repos/wp-cli/db-command/zipball/c260be59d9ac4c0012b016405e17d0251137fb89",
3410
+ "reference": "c260be59d9ac4c0012b016405e17d0251137fb89",
3411
+ "shasum": ""
3412
+ },
3413
+ "require-dev": {
3414
+ "behat/behat": "~2.5",
3415
+ "wp-cli/wp-cli": "^1.5"
3416
+ },
3417
+ "type": "wp-cli-package",
3418
+ "extra": {
3419
+ "branch-alias": {
3420
+ "dev-master": "1.x-dev"
3421
+ },
3422
+ "bundled": true,
3423
+ "commands": [
3424
+ "db",
3425
+ "db create",
3426
+ "db drop",
3427
+ "db reset",
3428
+ "db check",
3429
+ "db optimize",
3430
+ "db prefix",
3431
+ "db repair",
3432
+ "db cli",
3433
+ "db query",
3434
+ "db export",
3435
+ "db import",
3436
+ "db search",
3437
+ "db tables",
3438
+ "db size",
3439
+ "db columns"
3440
+ ]
3441
+ },
3442
+ "autoload": {
3443
+ "psr-4": {
3444
+ "": "src/"
3445
+ },
3446
+ "files": [
3447
+ "db-command.php"
3448
+ ]
3449
+ },
3450
+ "notification-url": "https://packagist.org/downloads/",
3451
+ "license": [
3452
+ "MIT"
3453
+ ],
3454
+ "authors": [
3455
+ {
3456
+ "name": "Daniel Bachhuber",
3457
+ "email": "daniel@runcommand.io",
3458
+ "homepage": "https://runcommand.io"
3459
+ }
3460
+ ],
3461
+ "description": "Performs basic database operations using credentials stored in wp-config.php.",
3462
+ "homepage": "https://github.com/wp-cli/db-command",
3463
+ "time": "2018-07-31T02:06:59+00:00"
3464
+ },
3465
+ {
3466
+ "name": "wp-cli/embed-command",
3467
+ "version": "v1.0.0",
3468
+ "source": {
3469
+ "type": "git",
3470
+ "url": "https://github.com/wp-cli/embed-command.git",
3471
+ "reference": "81319d4243a8dfe096389bf54cdc4fc3dec53497"
3472
+ },
3473
+ "dist": {
3474
+ "type": "zip",
3475
+ "url": "https://api.github.com/repos/wp-cli/embed-command/zipball/81319d4243a8dfe096389bf54cdc4fc3dec53497",
3476
+ "reference": "81319d4243a8dfe096389bf54cdc4fc3dec53497",
3477
+ "shasum": ""
3478
+ },
3479
+ "require-dev": {
3480
+ "behat/behat": "~2.5",
3481
+ "wp-cli/wp-cli": "^1.5"
3482
+ },
3483
+ "type": "wp-cli-package",
3484
+ "extra": {
3485
+ "branch-alias": {
3486
+ "dev-master": "1.x-dev"
3487
+ },
3488
+ "bundled": true,
3489
+ "commands": [
3490
+ "embed",
3491
+ "embed fetch",
3492
+ "embed provider list",
3493
+ "embed provider match",
3494
+ "embed handler list",
3495
+ "embed cache clear",
3496
+ "embed cache find",
3497
+ "embed cache trigger"
3498
+ ]
3499
+ },
3500
+ "autoload": {
3501
+ "psr-4": {
3502
+ "WP_CLI\\Embeds\\": "src/"
3503
+ },
3504
+ "files": [
3505
+ "embed-command.php"
3506
+ ]
3507
+ },
3508
+ "notification-url": "https://packagist.org/downloads/",
3509
+ "license": [
3510
+ "MIT"
3511
+ ],
3512
+ "authors": [
3513
+ {
3514
+ "name": "Pascal Birchler",
3515
+ "homepage": "https://pascalbirchler.com/"
3516
+ }
3517
+ ],
3518
+ "description": "Inspects oEmbed providers, clears embed cache, and more.",
3519
+ "homepage": "https://github.com/wp-cli/embed-command",
3520
+ "time": "2018-01-22T21:26:48+00:00"
3521
+ },
3522
+ {
3523
+ "name": "wp-cli/entity-command",
3524
+ "version": "v1.3.1",
3525
+ "source": {
3526
+ "type": "git",
3527
+ "url": "https://github.com/wp-cli/entity-command.git",
3528
+ "reference": "7b000645684b6acbb1d55ab47b77eb08f35cd229"
3529
+ },
3530
+ "dist": {
3531
+ "type": "zip",
3532
+ "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/7b000645684b6acbb1d55ab47b77eb08f35cd229",
3533
+ "reference": "7b000645684b6acbb1d55ab47b77eb08f35cd229",
3534
+ "shasum": ""
3535
+ },
3536
+ "require-dev": {
3537
+ "behat/behat": "~2.5",
3538
+ "phpunit/phpunit": "^4.8",
3539
+ "wp-cli/wp-cli": "^1.5"
3540
+ },
3541
+ "type": "wp-cli-package",
3542
+ "extra": {
3543
+ "branch-alias": {
3544
+ "dev-master": "1.x-dev"
3545
+ },
3546
+ "bundled": true,
3547
+ "commands": [
3548
+ "comment",
3549
+ "comment approve",
3550
+ "comment count",
3551
+ "comment create",
3552
+ "comment delete",
3553
+ "comment exists",
3554
+ "comment generate",
3555
+ "comment get",
3556
+ "comment list",
3557
+ "comment meta",
3558
+ "comment meta add",
3559
+ "comment meta delete",
3560
+ "comment meta get",
3561
+ "comment meta list",
3562
+ "comment meta patch",
3563
+ "comment meta pluck",
3564
+ "comment meta update",
3565
+ "comment recount",
3566
+ "comment spam",
3567
+ "comment status",
3568
+ "comment trash",
3569
+ "comment unapprove",
3570
+ "comment unspam",
3571
+ "comment untrash",
3572
+ "comment update",
3573
+ "menu",
3574
+ "menu create",
3575
+ "menu delete",
3576
+ "menu item",
3577
+ "menu item add-custom",
3578
+ "menu item add-post",
3579
+ "menu item add-term",
3580
+ "menu item delete",
3581
+ "menu item list",
3582
+ "menu item update",
3583
+ "menu list",
3584
+ "menu location",
3585
+ "menu location assign",
3586
+ "menu location list",
3587
+ "menu location remove",
3588
+ "network meta",
3589
+ "network meta add",
3590
+ "network meta delete",
3591
+ "network meta get",
3592
+ "network meta list",
3593
+ "network meta patch",
3594
+ "network meta pluck",
3595
+ "network meta update",
3596
+ "option",
3597
+ "option add",
3598
+ "option delete",
3599
+ "option get",
3600
+ "option list",
3601
+ "option patch",
3602
+ "option pluck",
3603
+ "option update",
3604
+ "post",
3605
+ "post create",
3606
+ "post delete",
3607
+ "post edit",
3608
+ "post generate",
3609
+ "post get",
3610
+ "post list",
3611
+ "post meta",
3612
+ "post meta add",
3613
+ "post meta delete",
3614
+ "post meta get",
3615
+ "post meta list",
3616
+ "post meta patch",
3617
+ "post meta pluck",
3618
+ "post meta update",
3619
+ "post term",
3620
+ "post term add",
3621
+ "post term list",
3622
+ "post term remove",
3623
+ "post term set",
3624
+ "post update",
3625
+ "post-type",
3626
+ "post-type get",
3627
+ "post-type list",
3628
+ "site",
3629
+ "site activate",
3630
+ "site archive",
3631
+ "site create",
3632
+ "site deactivate",
3633
+ "site delete",
3634
+ "site empty",
3635
+ "site list",
3636
+ "site mature",
3637
+ "site option",
3638
+ "site private",
3639
+ "site public",
3640
+ "site spam",
3641
+ "site unarchive",
3642
+ "site unmature",
3643
+ "site unspam",
3644
+ "taxonomy",
3645
+ "taxonomy get",
3646
+ "taxonomy list",
3647
+ "term",
3648
+ "term create",
3649
+ "term delete",
3650
+ "term generate",
3651
+ "term get",
3652
+ "term list",
3653
+ "term meta",
3654
+ "term meta add",
3655
+ "term meta delete",
3656
+ "term meta get",
3657
+ "term meta list",
3658
+ "term meta patch",
3659
+ "term meta pluck",
3660
+ "term meta update",
3661
+ "term recount",
3662
+ "term update",
3663
+ "user",
3664
+ "user add-cap",
3665
+ "user add-role",
3666
+ "user create",
3667
+ "user delete",
3668
+ "user generate",
3669
+ "user get",
3670
+ "user import-csv",
3671
+ "user list",
3672
+ "user list-caps",
3673
+ "user meta",
3674
+ "user meta add",
3675
+ "user meta delete",
3676
+ "user meta get",
3677
+ "user meta list",
3678
+ "user meta patch",
3679
+ "user meta pluck",
3680
+ "user meta update",
3681
+ "user remove-cap",
3682
+ "user remove-role",
3683
+ "user reset-password",
3684
+ "user session",
3685
+ "user session destroy",
3686
+ "user session list",
3687
+ "user set-role",
3688
+ "user spam",
3689
+ "user term",
3690
+ "user term add",
3691
+ "user term list",
3692
+ "user term remove",
3693
+ "user term set",
3694
+ "user unspam",
3695
+ "user update"
3696
+ ]
3697
+ },
3698
+ "autoload": {
3699
+ "psr-4": {
3700
+ "": "src/",
3701
+ "WP_CLI\\": "src/WP_CLI"
3702
+ },
3703
+ "files": [
3704
+ "entity-command.php"
3705
+ ]
3706
+ },
3707
+ "notification-url": "https://packagist.org/downloads/",
3708
+ "license": [
3709
+ "MIT"
3710
+ ],
3711
+ "authors": [
3712
+ {
3713
+ "name": "Daniel Bachhuber",
3714
+ "email": "daniel@runcommand.io",
3715
+ "homepage": "https://runcommand.io"
3716
+ }
3717
+ ],
3718
+ "description": "Manage WordPress core entities.",
3719
+ "homepage": "https://github.com/wp-cli/entity-command",
3720
+ "time": "2018-07-13T12:21:06+00:00"
3721
+ },
3722
+ {
3723
+ "name": "wp-cli/eval-command",
3724
+ "version": "v1.0.5",
3725
+ "source": {
3726
+ "type": "git",
3727
+ "url": "https://github.com/wp-cli/eval-command.git",
3728
+ "reference": "9640d40ab28cd86590396f08f8c382e659f57321"
3729
+ },
3730
+ "dist": {
3731
+ "type": "zip",
3732
+ "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/9640d40ab28cd86590396f08f8c382e659f57321",
3733
+ "reference": "9640d40ab28cd86590396f08f8c382e659f57321",
3734
+ "shasum": ""
3735
+ },
3736
+ "require": {
3737
+ "wp-cli/wp-cli": "*"
3738
+ },
3739
+ "require-dev": {
3740
+ "behat/behat": "~2.5"
3741
+ },
3742
+ "type": "wp-cli-package",
3743
+ "extra": {
3744
+ "branch-alias": {
3745
+ "dev-master": "1.x-dev"
3746
+ },
3747
+ "bundled": true,
3748
+ "commands": [
3749
+ "eval",
3750
+ "eval-file"
3751
+ ]
3752
+ },
3753
+ "autoload": {
3754
+ "psr-4": {
3755
+ "": "src/"
3756
+ },
3757
+ "files": [
3758
+ "eval-command.php"
3759
+ ]
3760
+ },
3761
+ "notification-url": "https://packagist.org/downloads/",
3762
+ "license": [
3763
+ "MIT"
3764
+ ],
3765
+ "authors": [
3766
+ {
3767
+ "name": "Daniel Bachhuber",
3768
+ "email": "daniel@runcommand.io",
3769
+ "homepage": "https://runcommand.io"
3770
+ }
3771
+ ],
3772
+ "description": "Executes arbitrary PHP code or files.",
3773
+ "homepage": "https://github.com/wp-cli/eval-command",
3774
+ "time": "2017-12-08T14:33:34+00:00"
3775
+ },
3776
+ {
3777
+ "name": "wp-cli/export-command",
3778
+ "version": "v1.0.7",
3779
+ "source": {
3780
+ "type": "git",
3781
+ "url": "https://github.com/wp-cli/export-command.git",
3782
+ "reference": "776d33ad6b2ac93c00fded27402ca8e188e7bff0"
3783
+ },
3784
+ "dist": {
3785
+ "type": "zip",
3786
+ "url": "https://api.github.com/repos/wp-cli/export-command/zipball/776d33ad6b2ac93c00fded27402ca8e188e7bff0",
3787
+ "reference": "776d33ad6b2ac93c00fded27402ca8e188e7bff0",
3788
+ "shasum": ""
3789
+ },
3790
+ "require": {
3791
+ "nb/oxymel": "~0.1.0"
3792
+ },
3793
+ "require-dev": {
3794
+ "behat/behat": "~2.5",
3795
+ "wp-cli/wp-cli": "^1.5"
3796
+ },
3797
+ "type": "wp-cli-package",
3798
+ "extra": {
3799
+ "branch-alias": {
3800
+ "dev-master": "1.x-dev"
3801
+ },
3802
+ "bundled": true,
3803
+ "commands": [
3804
+ "export"
3805
+ ]
3806
+ },
3807
+ "autoload": {
3808
+ "psr-4": {
3809
+ "": "src/"
3810
+ },
3811
+ "files": [
3812
+ "export-command.php"
3813
+ ]
3814
+ },
3815
+ "notification-url": "https://packagist.org/downloads/",
3816
+ "license": [
3817
+ "MIT"
3818
+ ],
3819
+ "authors": [
3820
+ {
3821
+ "name": "Daniel Bachhuber",
3822
+ "email": "daniel@runcommand.io",
3823
+ "homepage": "https://runcommand.io"
3824
+ }
3825
+ ],
3826
+ "description": "Exports WordPress content to a WXR file.",
3827
+ "homepage": "https://github.com/wp-cli/export-command",
3828
+ "time": "2018-04-20T08:10:47+00:00"
3829
+ },
3830
+ {
3831
+ "name": "wp-cli/extension-command",
3832
+ "version": "v1.2.2",
3833
+ "source": {
3834
+ "type": "git",
3835
+ "url": "https://github.com/wp-cli/extension-command.git",
3836
+ "reference": "18f1036bad42f481f178c2f4139039e9424b6e14"
3837
+ },
3838
+ "dist": {
3839
+ "type": "zip",
3840
+ "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/18f1036bad42f481f178c2f4139039e9424b6e14",
3841
+ "reference": "18f1036bad42f481f178c2f4139039e9424b6e14",
3842
+ "shasum": ""
3843
+ },
3844
+ "require-dev": {
3845
+ "behat/behat": "~2.5",
3846
+ "wp-cli/wp-cli": "*"
3847
+ },
3848
+ "type": "wp-cli-package",
3849
+ "extra": {
3850
+ "branch-alias": {
3851
+ "dev-master": "1.x-dev"
3852
+ },
3853
+ "bundled": true,
3854
+ "commands": [
3855
+ "plugin",
3856
+ "plugin activate",
3857
+ "plugin deactivate",
3858
+ "plugin delete",
3859
+ "plugin get",
3860
+ "plugin install",
3861
+ "plugin is-installed",
3862
+ "plugin list",
3863
+ "plugin path",
3864
+ "plugin search",
3865
+ "plugin status",
3866
+ "plugin toggle",
3867
+ "plugin uninstall",
3868
+ "plugin update",
3869
+ "theme",
3870
+ "theme activate",
3871
+ "theme delete",
3872
+ "theme disable",
3873
+ "theme enable",
3874
+ "theme get",
3875
+ "theme install",
3876
+ "theme is-installed",
3877
+ "theme list",
3878
+ "theme mod",
3879
+ "theme mod get",
3880
+ "theme mod set",
3881
+ "theme mod remove",
3882
+ "theme path",
3883
+ "theme search",
3884
+ "theme status",
3885
+ "theme update",
3886
+ "theme mod list"
3887
+ ]
3888
+ },
3889
+ "autoload": {
3890
+ "psr-4": {
3891
+ "": "src/"
3892
+ },
3893
+ "files": [
3894
+ "extension-command.php"
3895
+ ]
3896
+ },
3897
+ "notification-url": "https://packagist.org/downloads/",
3898
+ "license": [
3899
+ "MIT"
3900
+ ],
3901
+ "authors": [
3902
+ {
3903
+ "name": "Daniel Bachhuber",
3904
+ "email": "daniel@runcommand.io",
3905
+ "homepage": "https://runcommand.io"
3906
+ }
3907
+ ],
3908
+ "description": "Manages plugins and themes, including installs, activations, and updates.",
3909
+ "homepage": "https://github.com/wp-cli/extension-command",
3910
+ "time": "2018-07-31T17:46:49+00:00"
3911
+ },
3912
+ {
3913
+ "name": "wp-cli/import-command",
3914
+ "version": "v1.0.7",
3915
+ "source": {
3916
+ "type": "git",
3917
+ "url": "https://github.com/wp-cli/import-command.git",
3918
+ "reference": "421fec5bd96671931f2119a89d28bae2f9edeb6b"
3919
+ },
3920
+ "dist": {
3921
+ "type": "zip",
3922
+ "url": "https://api.github.com/repos/wp-cli/import-command/zipball/421fec5bd96671931f2119a89d28bae2f9edeb6b",
3923
+ "reference": "421fec5bd96671931f2119a89d28bae2f9edeb6b",
3924
+ "shasum": ""
3925
+ },
3926
+ "require": {
3927
+ "wp-cli/wp-cli": "*"
3928
+ },
3929
+ "require-dev": {
3930
+ "behat/behat": "~2.5"
3931
+ },
3932
+ "type": "wp-cli-package",
3933
+ "extra": {
3934
+ "branch-alias": {
3935
+ "dev-master": "1.x-dev"
3936
+ },
3937
+ "bundled": true,
3938
+ "commands": [
3939
+ "import"
3940
+ ]
3941
+ },
3942
+ "autoload": {
3943
+ "psr-4": {
3944
+ "": "src/"
3945
+ },
3946
+ "files": [
3947
+ "import-command.php"
3948
+ ]
3949
+ },
3950
+ "notification-url": "https://packagist.org/downloads/",
3951
+ "license": [
3952
+ "MIT"
3953
+ ],
3954
+ "authors": [
3955
+ {
3956
+ "name": "Daniel Bachhuber",
3957
+ "email": "daniel@runcommand.io",
3958
+ "homepage": "https://runcommand.io"
3959
+ }
3960
+ ],
3961
+ "description": "Imports content from a given WXR file.",
3962
+ "homepage": "https://github.com/wp-cli/import-command",
3963
+ "time": "2018-04-20T08:07:05+00:00"
3964
+ },
3965
+ {
3966
+ "name": "wp-cli/language-command",
3967
+ "version": "v1.0.6",
3968
+ "source": {
3969
+ "type": "git",
3970
+ "url": "https://github.com/wp-cli/language-command.git",
3971
+ "reference": "2a3d1ce5a722a4d70809619a065087aa933f6209"
3972
+ },
3973
+ "dist": {
3974
+ "type": "zip",
3975
+ "url": "https://api.github.com/repos/wp-cli/language-command/zipball/2a3d1ce5a722a4d70809619a065087aa933f6209",
3976
+ "reference": "2a3d1ce5a722a4d70809619a065087aa933f6209",
3977
+ "shasum": ""
3978
+ },
3979
+ "require-dev": {
3980
+ "behat/behat": "~2.5",
3981
+ "wp-cli/wp-cli": "*"
3982
+ },
3983
+ "type": "wp-cli-package",
3984
+ "extra": {
3985
+ "branch-alias": {
3986
+ "dev-master": "1.x-dev"
3987
+ },
3988
+ "commands": [
3989
+ "language",
3990
+ "language core",
3991
+ "language core activate",
3992
+ "language core install",
3993
+ "language core list",
3994
+ "language core uninstall",
3995
+ "language core update"
3996
+ ],
3997
+ "bundled": true
3998
+ },
3999
+ "autoload": {
4000
+ "psr-4": {
4001
+ "": "src/"
4002
+ },
4003
+ "files": [
4004
+ "language-command.php"
4005
+ ]
4006
+ },
4007
+ "notification-url": "https://packagist.org/downloads/",
4008
+ "license": [
4009
+ "MIT"
4010
+ ],
4011
+ "authors": [
4012
+ {
4013
+ "name": "Daniel Bachhuber",
4014
+ "email": "daniel@runcommand.io",
4015
+ "homepage": "https://runcommand.io"
4016
+ }
4017
+ ],
4018
+ "description": "Installs, activates, and manages language packs.",
4019
+ "homepage": "https://github.com/wp-cli/language-command",
4020
+ "time": "2017-12-08T17:50:26+00:00"
4021
+ },
4022
+ {
4023
+ "name": "wp-cli/media-command",
4024
+ "version": "v1.1.4",
4025
+ "source": {
4026
+ "type": "git",
4027
+ "url": "https://github.com/wp-cli/media-command.git",
4028
+ "reference": "7f8664ba722505446b3ef3dbc6717e8e7f20265c"
4029
+ },
4030
+ "dist": {
4031
+ "type": "zip",
4032
+ "url": "https://api.github.com/repos/wp-cli/media-command/zipball/7f8664ba722505446b3ef3dbc6717e8e7f20265c",
4033
+ "reference": "7f8664ba722505446b3ef3dbc6717e8e7f20265c",
4034
+ "shasum": ""
4035
+ },
4036
+ "require-dev": {
4037
+ "behat/behat": "~2.5",
4038
+ "wp-cli/wp-cli": "^1.5"
4039
+ },
4040
+ "type": "wp-cli-package",
4041
+ "extra": {
4042
+ "branch-alias": {
4043
+ "dev-master": "1.x-dev"
4044
+ },
4045
+ "bundled": true,
4046
+ "commands": [
4047
+ "media",
4048
+ "media import",
4049
+ "media regenerate",
4050
+ "media image-size"
4051
+ ]
4052
+ },
4053
+ "autoload": {
4054
+ "psr-4": {
4055
+ "": "src/"
4056
+ },
4057
+ "files": [
4058
+ "media-command.php"
4059
+ ]
4060
+ },
4061
+ "notification-url": "https://packagist.org/downloads/",
4062
+ "license": [
4063
+ "MIT"
4064
+ ],
4065
+ "authors": [
4066
+ {
4067
+ "name": "Daniel Bachhuber",
4068
+ "email": "daniel@runcommand.io",
4069
+ "homepage": "https://runcommand.io"
4070
+ }
4071
+ ],
4072
+ "description": "Imports files as attachments, regenerates thumbnails, or lists registered image sizes.",
4073
+ "homepage": "https://github.com/wp-cli/media-command",
4074
+ "time": "2018-01-29T02:17:56+00:00"
4075
+ },
4076
+ {
4077
+ "name": "wp-cli/mustangostang-spyc",
4078
+ "version": "0.6.3",
4079
+ "source": {
4080
+ "type": "git",
4081
+ "url": "https://github.com/wp-cli/spyc.git",
4082
+ "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7"
4083
+ },
4084
+ "dist": {
4085
+ "type": "zip",
4086
+ "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7",
4087
+ "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7",
4088
+ "shasum": ""
4089
+ },
4090
+ "require": {
4091
+ "php": ">=5.3.1"
4092
+ },
4093
+ "require-dev": {
4094
+ "phpunit/phpunit": "4.3.*@dev"
4095
+ },
4096
+ "type": "library",
4097
+ "extra": {
4098
+ "branch-alias": {
4099
+ "dev-master": "0.5.x-dev"
4100
+ }
4101
+ },
4102
+ "autoload": {
4103
+ "psr-4": {
4104
+ "Mustangostang\\": "src/"
4105
+ },
4106
+ "files": [
4107
+ "includes/functions.php"
4108
+ ]
4109
+ },
4110
+ "notification-url": "https://packagist.org/downloads/",
4111
+ "license": [
4112
+ "MIT"
4113
+ ],
4114
+ "authors": [
4115
+ {
4116
+ "name": "mustangostang",
4117
+ "email": "vlad.andersen@gmail.com"
4118
+ }
4119
+ ],
4120
+ "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)",
4121
+ "homepage": "https://github.com/mustangostang/spyc/",
4122
+ "time": "2017-04-25T11:26:20+00:00"
4123
+ },
4124
+ {
4125
+ "name": "wp-cli/package-command",
4126
+ "version": "v1.0.14",
4127
+ "source": {
4128
+ "type": "git",
4129
+ "url": "https://github.com/wp-cli/package-command.git",
4130
+ "reference": "a7ce916de5e1d0c3d910d4fc8ca31928ee3775d3"
4131
+ },
4132
+ "dist": {
4133
+ "type": "zip",
4134
+ "url": "https://api.github.com/repos/wp-cli/package-command/zipball/a7ce916de5e1d0c3d910d4fc8ca31928ee3775d3",
4135
+ "reference": "a7ce916de5e1d0c3d910d4fc8ca31928ee3775d3",
4136
+ "shasum": ""
4137
+ },
4138
+ "require": {
4139
+ "composer/composer": "^1.2.0"
4140
+ },
4141
+ "require-dev": {
4142
+ "behat/behat": "~2.5",
4143
+ "wp-cli/wp-cli": "^1.5"
4144
+ },
4145
+ "type": "wp-cli-package",
4146
+ "extra": {
4147
+ "branch-alias": {
4148
+ "dev-master": "1.x-dev"
4149
+ },
4150
+ "bundled": true,
4151
+ "commands": [
4152
+ "package",
4153
+ "package browse",
4154
+ "package install",
4155
+ "package list",
4156
+ "package update",
4157
+ "package uninstall"
4158
+ ]
4159
+ },
4160
+ "autoload": {
4161
+ "psr-4": {
4162
+ "": "src/"
4163
+ },
4164
+ "files": [
4165
+ "package-command.php"
4166
+ ]
4167
+ },
4168
+ "notification-url": "https://packagist.org/downloads/",
4169
+ "license": [
4170
+ "MIT"
4171
+ ],
4172
+ "authors": [
4173
+ {
4174
+ "name": "Daniel Bachhuber",
4175
+ "email": "daniel@runcommand.io",
4176
+ "homepage": "https://runcommand.io"
4177
+ }
4178
+ ],
4179
+ "description": "Lists, installs, and removes WP-CLI packages.",
4180
+ "homepage": "https://github.com/wp-cli/package-command",
4181
+ "time": "2018-05-28T11:40:24+00:00"
4182
+ },
4183
+ {
4184
+ "name": "wp-cli/php-cli-tools",
4185
+ "version": "v0.11.11",
4186
+ "source": {
4187
+ "type": "git",
4188
+ "url": "https://github.com/wp-cli/php-cli-tools.git",
4189
+ "reference": "fe9c7c44a9e1bf2196ec51dc38da0593dbf2993f"
4190
+ },
4191
+ "dist": {
4192
+ "type": "zip",
4193
+ "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/fe9c7c44a9e1bf2196ec51dc38da0593dbf2993f",
4194
+ "reference": "fe9c7c44a9e1bf2196ec51dc38da0593dbf2993f",
4195
+ "shasum": ""
4196
+ },
4197
+ "require": {
4198
+ "php": ">= 5.3.0"
4199
+ },
4200
+ "type": "library",
4201
+ "autoload": {
4202
+ "psr-0": {
4203
+ "cli": "lib/"
4204
+ },
4205
+ "files": [
4206
+ "lib/cli/cli.php"
4207
+ ]
4208
+ },
4209
+ "notification-url": "https://packagist.org/downloads/",
4210
+ "license": [
4211
+ "MIT"
4212
+ ],
4213
+ "authors": [
4214
+ {
4215
+ "name": "James Logsdon",
4216
+ "email": "jlogsdon@php.net",
4217
+ "role": "Developer"
4218
+ },
4219
+ {
4220
+ "name": "Daniel Bachhuber",
4221
+ "email": "daniel@handbuilt.co",
4222
+ "role": "Maintainer"
4223
+ }
4224
+ ],
4225
+ "description": "Console utilities for PHP",
4226
+ "homepage": "http://github.com/wp-cli/php-cli-tools",
4227
+ "keywords": [
4228
+ "cli",
4229
+ "console"
4230
+ ],
4231
+ "time": "2018-09-04T13:28:00+00:00"
4232
+ },
4233
+ {
4234
+ "name": "wp-cli/rewrite-command",
4235
+ "version": "v1.0.5",
4236
+ "source": {
4237
+ "type": "git",
4238
+ "url": "https://github.com/wp-cli/rewrite-command.git",
4239
+ "reference": "6b1695887e289ffad14c8f4ea86b5f1d92757408"
4240
+ },
4241
+ "dist": {
4242
+ "type": "zip",
4243
+ "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/6b1695887e289ffad14c8f4ea86b5f1d92757408",
4244
+ "reference": "6b1695887e289ffad14c8f4ea86b5f1d92757408",
4245
+ "shasum": ""
4246
+ },
4247
+ "require-dev": {
4248
+ "behat/behat": "~2.5",
4249
+ "wp-cli/wp-cli": "*"
4250
+ },
4251
+ "type": "wp-cli-package",
4252
+ "extra": {
4253
+ "branch-alias": {
4254
+ "dev-master": "1.x-dev"
4255
+ },
4256
+ "commands": [
4257
+ "rewrite",
4258
+ "rewrite flush",
4259
+ "rewrite list",
4260
+ "rewrite structure"
4261
+ ],
4262
+ "bundled": true
4263
+ },
4264
+ "autoload": {
4265
+ "psr-4": {
4266
+ "": "src/"
4267
+ },
4268
+ "files": [
4269
+ "rewrite-command.php"
4270
+ ]
4271
+ },
4272
+ "notification-url": "https://packagist.org/downloads/",
4273
+ "license": [
4274
+ "MIT"
4275
+ ],
4276
+ "authors": [
4277
+ {
4278
+ "name": "Daniel Bachhuber",
4279
+ "email": "daniel@runcommand.io",
4280
+ "homepage": "https://runcommand.io"
4281
+ }
4282
+ ],
4283
+ "description": "Lists or flushes the site's rewrite rules, updates the permalink structure.",
4284
+ "homepage": "https://github.com/wp-cli/rewrite-command",
4285
+ "time": "2017-12-08T17:51:04+00:00"
4286
+ },
4287
+ {
4288
+ "name": "wp-cli/role-command",
4289
+ "version": "v1.1.0",
4290
+ "source": {
4291
+ "type": "git",
4292
+ "url": "https://github.com/wp-cli/role-command.git",
4293
+ "reference": "f50134ea9c27c108b1069cf044f7395c8f9bf716"
4294
+ },
4295
+ "dist": {
4296
+ "type": "zip",
4297
+ "url": "https://api.github.com/repos/wp-cli/role-command/zipball/f50134ea9c27c108b1069cf044f7395c8f9bf716",
4298
+ "reference": "f50134ea9c27c108b1069cf044f7395c8f9bf716",
4299
+ "shasum": ""
4300
+ },
4301
+ "require-dev": {
4302
+ "behat/behat": "~2.5",
4303
+ "wp-cli/wp-cli": "*"
4304
+ },
4305
+ "type": "wp-cli-package",
4306
+ "extra": {
4307
+ "branch-alias": {
4308
+ "dev-master": "1.x-dev"
4309
+ },
4310
+ "commands": [
4311
+ "role",
4312
+ "role create",
4313
+ "role delete",
4314
+ "role exists",
4315
+ "role list",
4316
+ "role reset",
4317
+ "cap",
4318
+ "cap add",
4319
+ "cap list",
4320
+ "cap remove"
4321
+ ],
4322
+ "bundled": true
4323
+ },
4324
+ "autoload": {
4325
+ "psr-4": {
4326
+ "": "src/"
4327
+ },
4328
+ "files": [
4329
+ "role-command.php"
4330
+ ]
4331
+ },
4332
+ "notification-url": "https://packagist.org/downloads/",
4333
+ "license": [
4334
+ "MIT"
4335
+ ],
4336
+ "authors": [
4337
+ {
4338
+ "name": "Daniel Bachhuber",
4339
+ "email": "daniel@runcommand.io",
4340
+ "homepage": "https://runcommand.io"
4341
+ }
4342
+ ],
4343
+ "description": "Adds, removes, lists, and resets roles and capabilities.",
4344
+ "homepage": "https://github.com/wp-cli/role-command",
4345
+ "time": "2018-04-20T08:05:51+00:00"
4346
+ },
4347
+ {
4348
+ "name": "wp-cli/scaffold-command",
4349
+ "version": "v1.2.0",
4350
+ "source": {
4351
+ "type": "git",
4352
+ "url": "https://github.com/wp-cli/scaffold-command.git",
4353
+ "reference": "a897a54ba0a8199743d90204ff773b302fc77572"
4354
+ },
4355
+ "dist": {
4356
+ "type": "zip",
4357
+ "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/a897a54ba0a8199743d90204ff773b302fc77572",
4358
+ "reference": "a897a54ba0a8199743d90204ff773b302fc77572",
4359
+ "shasum": ""
4360
+ },
4361
+ "require-dev": {
4362
+ "behat/behat": "~2.5",
4363
+ "wp-cli/wp-cli": "^1.5"
4364
+ },
4365
+ "type": "wp-cli-package",
4366
+ "extra": {
4367
+ "branch-alias": {
4368
+ "dev-master": "1.x-dev"
4369
+ },
4370
+ "bundled": true,
4371
+ "commands": [
4372
+ "scaffold",
4373
+ "scaffold _s",
4374
+ "scaffold block",
4375
+ "scaffold child-theme",
4376
+ "scaffold plugin",
4377
+ "scaffold plugin-tests",
4378
+ "scaffold post-type",
4379
+ "scaffold taxonomy",
4380
+ "scaffold theme-tests"
4381
+ ]
4382
+ },
4383
+ "autoload": {
4384
+ "psr-4": {
4385
+ "": "src/"
4386
+ },
4387
+ "files": [
4388
+ "scaffold-command.php"
4389
+ ]
4390
+ },
4391
+ "notification-url": "https://packagist.org/downloads/",
4392
+ "license": [
4393
+ "MIT"
4394
+ ],
4395
+ "authors": [
4396
+ {
4397
+ "name": "Daniel Bachhuber",
4398
+ "email": "daniel@runcommand.io",
4399
+ "homepage": "https://runcommand.io"
4400
+ }
4401
+ ],
4402
+ "description": "Generates code for post types, taxonomies, blocks, plugins, child themes, etc.",
4403
+ "homepage": "https://github.com/wp-cli/scaffold-command",
4404
+ "time": "2018-07-29T15:02:24+00:00"
4405
+ },
4406
+ {
4407
+ "name": "wp-cli/search-replace-command",
4408
+ "version": "v1.3.1",
4409
+ "source": {
4410
+ "type": "git",
4411
+ "url": "https://github.com/wp-cli/search-replace-command.git",
4412
+ "reference": "be21639dc530ad6506664baa813862d39b6d78ba"
4413
+ },
4414
+ "dist": {
4415
+ "type": "zip",
4416
+ "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/be21639dc530ad6506664baa813862d39b6d78ba",
4417
+ "reference": "be21639dc530ad6506664baa813862d39b6d78ba",
4418
+ "shasum": ""
4419
+ },
4420
+ "require-dev": {
4421
+ "behat/behat": "~2.5",
4422
+ "wp-cli/wp-cli": "^1.5"
4423
+ },
4424
+ "type": "wp-cli-package",
4425
+ "extra": {
4426
+ "branch-alias": {
4427
+ "dev-master": "1.x-dev"
4428
+ },
4429
+ "bundled": true,
4430
+ "commands": [
4431
+ "search-replace"
4432
+ ]
4433
+ },
4434
+ "autoload": {
4435
+ "psr-4": {
4436
+ "": "src/"
4437
+ },
4438
+ "files": [
4439
+ "search-replace-command.php"
4440
+ ]
4441
+ },
4442
+ "notification-url": "https://packagist.org/downloads/",
4443
+ "license": [
4444
+ "MIT"
4445
+ ],
4446
+ "authors": [
4447
+ {
4448
+ "name": "Daniel Bachhuber",
4449
+ "email": "daniel@runcommand.io",
4450
+ "homepage": "https://runcommand.io"
4451
+ }
4452
+ ],
4453
+ "description": "Searches/replaces strings in the database.",
4454
+ "homepage": "https://github.com/wp-cli/search-replace-command",
4455
+ "time": "2018-05-29T10:21:19+00:00"
4456
+ },
4457
+ {
4458
+ "name": "wp-cli/server-command",
4459
+ "version": "v1.0.9",
4460
+ "source": {
4461
+ "type": "git",
4462
+ "url": "https://github.com/wp-cli/server-command.git",
4463
+ "reference": "6192e6d7becd07e4c11a8f1560655c73a3b3526a"
4464
+ },
4465
+ "dist": {
4466
+ "type": "zip",
4467
+ "url": "https://api.github.com/repos/wp-cli/server-command/zipball/6192e6d7becd07e4c11a8f1560655c73a3b3526a",
4468
+ "reference": "6192e6d7becd07e4c11a8f1560655c73a3b3526a",
4469
+ "shasum": ""
4470
+ },
4471
+ "require": {
4472
+ "wp-cli/wp-cli": "*"
4473
+ },
4474
+ "require-dev": {
4475
+ "behat/behat": "~2.5"
4476
+ },
4477
+ "type": "wp-cli-package",
4478
+ "extra": {
4479
+ "branch-alias": {
4480
+ "dev-master": "1.x-dev"
4481
+ },
4482
+ "commands": [
4483
+ "server"
4484
+ ],
4485
+ "bundled": true
4486
+ },
4487
+ "autoload": {
4488
+ "psr-4": {
4489
+ "": "src/"
4490
+ },
4491
+ "files": [
4492
+ "server-command.php"
4493
+ ]
4494
+ },
4495
+ "notification-url": "https://packagist.org/downloads/",
4496
+ "license": [
4497
+ "MIT"
4498
+ ],
4499
+ "authors": [
4500
+ {
4501
+ "name": "Daniel Bachhuber",
4502
+ "email": "daniel@runcommand.io",
4503
+ "homepage": "https://runcommand.io"
4504
+ }
4505
+ ],
4506
+ "description": "Launches PHP's built-in web server for a specific WordPress installation.",
4507
+ "homepage": "https://github.com/wp-cli/server-command",
4508
+ "time": "2017-12-14T20:06:24+00:00"
4509
+ },
4510
+ {
4511
+ "name": "wp-cli/shell-command",
4512
+ "version": "v1.0.5",
4513
+ "source": {
4514
+ "type": "git",
4515
+ "url": "https://github.com/wp-cli/shell-command.git",
4516
+ "reference": "507603a8994d984b6c4d5bd26e31ede6d9cce37e"
4517
+ },
4518
+ "dist": {
4519
+ "type": "zip",
4520
+ "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/507603a8994d984b6c4d5bd26e31ede6d9cce37e",
4521
+ "reference": "507603a8994d984b6c4d5bd26e31ede6d9cce37e",
4522
+ "shasum": ""
4523
+ },
4524
+ "require": {
4525
+ "wp-cli/wp-cli": "*"
4526
+ },
4527
+ "require-dev": {
4528
+ "behat/behat": "~2.5"
4529
+ },
4530
+ "type": "wp-cli-package",
4531
+ "extra": {
4532
+ "branch-alias": {
4533
+ "dev-master": "1.x-dev"
4534
+ },
4535
+ "commands": [
4536
+ "shell"
4537
+ ],
4538
+ "bundled": true
4539
+ },
4540
+ "autoload": {
4541
+ "psr-4": {
4542
+ "": "src/",
4543
+ "WP_CLI\\": "src/WP_CLI"
4544
+ },
4545
+ "files": [
4546
+ "shell-command.php"
4547
+ ]
4548
+ },
4549
+ "notification-url": "https://packagist.org/downloads/",
4550
+ "license": [
4551
+ "MIT"
4552
+ ],
4553
+ "authors": [
4554
+ {
4555
+ "name": "Daniel Bachhuber",
4556
+ "email": "daniel@runcommand.io",
4557
+ "homepage": "https://runcommand.io"
4558
+ }
4559
+ ],
4560
+ "description": "Opens an interactive PHP console for running and testing PHP code.",
4561
+ "homepage": "https://github.com/wp-cli/shell-command",
4562
+ "time": "2017-12-08T16:03:53+00:00"
4563
+ },
4564
+ {
4565
+ "name": "wp-cli/super-admin-command",
4566
+ "version": "v1.0.6",
4567
+ "source": {
4568
+ "type": "git",
4569
+ "url": "https://github.com/wp-cli/super-admin-command.git",
4570
+ "reference": "2982d2e6514dbb318561d72d0577746a3a37181e"
4571
+ },
4572
+ "dist": {
4573
+ "type": "zip",
4574
+ "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/2982d2e6514dbb318561d72d0577746a3a37181e",
4575
+ "reference": "2982d2e6514dbb318561d72d0577746a3a37181e",
4576
+ "shasum": ""
4577
+ },
4578
+ "require-dev": {
4579
+ "behat/behat": "~2.5",
4580
+ "wp-cli/wp-cli": "*"
4581
+ },
4582
+ "type": "wp-cli-package",
4583
+ "extra": {
4584
+ "branch-alias": {
4585
+ "dev-master": "1.x-dev"
4586
+ },
4587
+ "commands": [
4588
+ "super-admin",
4589
+ "super-admin add",
4590
+ "super-admin list",
4591
+ "super-admin remove"
4592
+ ],
4593
+ "bundled": true
4594
+ },
4595
+ "autoload": {
4596
+ "psr-4": {
4597
+ "": "src/"
4598
+ },
4599
+ "files": [
4600
+ "super-admin-command.php"
4601
+ ]
4602
+ },
4603
+ "notification-url": "https://packagist.org/downloads/",
4604
+ "license": [
4605
+ "MIT"
4606
+ ],
4607
+ "authors": [
4608
+ {
4609
+ "name": "Daniel Bachhuber",
4610
+ "email": "daniel@runcommand.io",
4611
+ "homepage": "https://runcommand.io"
4612
+ }
4613
+ ],
4614
+ "description": "Lists, adds, or removes super admin users on a multisite installation.",
4615
+ "homepage": "https://github.com/wp-cli/super-admin-command",
4616
+ "time": "2017-12-08T17:43:53+00:00"
4617
+ },
4618
+ {
4619
+ "name": "wp-cli/widget-command",
4620
+ "version": "v1.0.5",
4621
+ "source": {
4622
+ "type": "git",
4623
+ "url": "https://github.com/wp-cli/widget-command.git",
4624
+ "reference": "657e0f77d80c892f8f72f90a3a25112c254386df"
4625
+ },
4626
+ "dist": {
4627
+ "type": "zip",
4628
+ "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/657e0f77d80c892f8f72f90a3a25112c254386df",
4629
+ "reference": "657e0f77d80c892f8f72f90a3a25112c254386df",
4630
+ "shasum": ""
4631
+ },
4632
+ "require-dev": {
4633
+ "behat/behat": "~2.5",
4634
+ "wp-cli/wp-cli": "*"
4635
+ },
4636
+ "type": "wp-cli-package",
4637
+ "extra": {
4638
+ "branch-alias": {
4639
+ "dev-master": "1.x-dev"
4640
+ },
4641
+ "commands": [
4642
+ "widget",
4643
+ "widget add",
4644
+ "widget deactivate",
4645
+ "widget delete",
4646
+ "widget list",
4647
+ "widget move",
4648
+ "widget reset",
4649
+ "widget update",
4650
+ "sidebar",
4651
+ "sidebar list"
4652
+ ],
4653
+ "bundled": true
4654
+ },
4655
+ "autoload": {
4656
+ "psr-4": {
4657
+ "": "src/"
4658
+ },
4659
+ "files": [
4660
+ "widget-command.php"
4661
+ ]
4662
+ },
4663
+ "notification-url": "https://packagist.org/downloads/",
4664
+ "license": [
4665
+ "MIT"
4666
+ ],
4667
+ "authors": [
4668
+ {
4669
+ "name": "Daniel Bachhuber",
4670
+ "email": "daniel@runcommand.io",
4671
+ "homepage": "https://runcommand.io"
4672
+ }
4673
+ ],
4674
+ "description": "Adds, moves, and removes widgets; lists sidebars.",
4675
+ "homepage": "https://github.com/wp-cli/widget-command",
4676
+ "time": "2017-12-08T17:45:57+00:00"
4677
+ },
4678
+ {
4679
+ "name": "wp-cli/wp-cli",
4680
+ "version": "v1.5.1",
4681
+ "source": {
4682
+ "type": "git",
4683
+ "url": "https://github.com/wp-cli/wp-cli.git",
4684
+ "reference": "3aac73bc4d629372531f3e15bbb67945d19b5d5a"
4685
+ },
4686
+ "dist": {
4687
+ "type": "zip",
4688
+ "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/3aac73bc4d629372531f3e15bbb67945d19b5d5a",
4689
+ "reference": "3aac73bc4d629372531f3e15bbb67945d19b5d5a",
4690
+ "shasum": ""
4691
+ },
4692
+ "require": {
4693
+ "composer/composer": "^1.2.0",
4694
+ "composer/semver": "~1.0",
4695
+ "justinrainbow/json-schema": "~5.2.5",
4696
+ "mustache/mustache": "~2.4",
4697
+ "php": ">=5.3.29",
4698
+ "ramsey/array_column": "~1.1",
4699
+ "rmccue/requests": "~1.6",
4700
+ "symfony/config": "^2.7|^3.0",
4701
+ "symfony/console": "^2.7|^3.0",
4702
+ "symfony/debug": "^2.7|^3.0",
4703
+ "symfony/dependency-injection": "^2.7|^3.0",
4704
+ "symfony/event-dispatcher": "^2.7|^3.0",
4705
+ "symfony/filesystem": "^2.7|^3.0",
4706
+ "symfony/finder": "^2.7|^3.0",
4707
+ "symfony/process": "^2.1|^3.0",
4708
+ "symfony/translation": "^2.7|^3.0",
4709
+ "symfony/yaml": "^2.7|^3.0",
4710
+ "wp-cli/autoload-splitter": "^0.1.5",
4711
+ "wp-cli/cache-command": "^1.0",
4712
+ "wp-cli/checksum-command": "^1.0",
4713
+ "wp-cli/config-command": "^1.0",
4714
+ "wp-cli/core-command": "^1.0",
4715
+ "wp-cli/cron-command": "^1.0",
4716
+ "wp-cli/db-command": "^1.0",
4717
+ "wp-cli/embed-command": "^1.0",
4718
+ "wp-cli/entity-command": "^1.0",
4719
+ "wp-cli/eval-command": "^1.0",
4720
+ "wp-cli/export-command": "^1.0",
4721
+ "wp-cli/extension-command": "^1.0",
4722
+ "wp-cli/import-command": "^1.0",
4723
+ "wp-cli/language-command": "^1.0",
4724
+ "wp-cli/media-command": "^1.0",
4725
+ "wp-cli/mustangostang-spyc": "^0.6.3",
4726
+ "wp-cli/package-command": "^1.0",
4727
+ "wp-cli/php-cli-tools": "~0.11.2",
4728
+ "wp-cli/rewrite-command": "^1.0",
4729
+ "wp-cli/role-command": "^1.0",
4730
+ "wp-cli/scaffold-command": "^1.0",
4731
+ "wp-cli/search-replace-command": "^1.0",
4732
+ "wp-cli/server-command": "^1.0",
4733
+ "wp-cli/shell-command": "^1.0",
4734
+ "wp-cli/super-admin-command": "^1.0",
4735
+ "wp-cli/widget-command": "^1.0"
4736
+ },
4737
+ "require-dev": {
4738
+ "behat/behat": "2.5.*",
4739
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3",
4740
+ "phpunit/phpunit": "3.7.*",
4741
+ "roave/security-advisories": "dev-master",
4742
+ "wimg/php-compatibility": "^8.0",
4743
+ "wp-coding-standards/wpcs": "^0.13.1"
4744
+ },
4745
+ "suggest": {
4746
+ "psy/psysh": "Enhanced `wp shell` functionality"
4747
+ },
4748
+ "bin": [
4749
+ "bin/wp.bat",
4750
+ "bin/wp"
4751
+ ],
4752
+ "type": "library",
4753
+ "extra": {
4754
+ "branch-alias": {
4755
+ "dev-master": "1.5.x-dev"
4756
+ },
4757
+ "autoload-splitter": {
4758
+ "splitter-logic": "WP_CLI\\AutoloadSplitter",
4759
+ "splitter-location": "php/WP_CLI/AutoloadSplitter.php",
4760
+ "split-target-prefix-true": "autoload_commands",
4761
+ "split-target-prefix-false": "autoload_framework"
4762
+ }
4763
+ },
4764
+ "autoload": {
4765
+ "psr-0": {
4766
+ "WP_CLI": "php"
4767
+ },
4768
+ "psr-4": {
4769
+ "": "php/commands/src"
4770
+ }
4771
+ },
4772
+ "notification-url": "https://packagist.org/downloads/",
4773
+ "license": [
4774
+ "MIT"
4775
+ ],
4776
+ "description": "The command line interface for WordPress",
4777
+ "homepage": "https://wp-cli.org",
4778
+ "keywords": [
4779
+ "cli",
4780
+ "wordpress"
4781
+ ],
4782
+ "time": "2018-05-31T11:04:05+00:00"
4783
+ },
4784
+ {
4785
+ "name": "wp-cli/wp-config-transformer",
4786
+ "version": "v1.2.6",
4787
+ "source": {
4788
+ "type": "git",
4789
+ "url": "https://github.com/wp-cli/wp-config-transformer.git",
4790
+ "reference": "1ca98343443a8e4585865db5f50e8e6121fee70b"
4791
+ },
4792
+ "dist": {
4793
+ "type": "zip",
4794
+ "url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/1ca98343443a8e4585865db5f50e8e6121fee70b",
4795
+ "reference": "1ca98343443a8e4585865db5f50e8e6121fee70b",
4796
+ "shasum": ""
4797
+ },
4798
+ "require": {
4799
+ "php": ">=5.3.29"
4800
+ },
4801
+ "require-dev": {
4802
+ "composer/composer": "^1.5.6",
4803
+ "phpunit/phpunit": "^6.5.5",
4804
+ "wp-coding-standards/wpcs": "^0.14.0 || ^1.0.0 || ^2.0.0"
4805
+ },
4806
+ "type": "library",
4807
+ "autoload": {
4808
+ "files": [
4809
+ "src/WPConfigTransformer.php"
4810
+ ]
4811
+ },
4812
+ "notification-url": "https://packagist.org/downloads/",
4813
+ "license": [
4814
+ "MIT"
4815
+ ],
4816
+ "authors": [
4817
+ {
4818
+ "name": "Frankie Jarrett",
4819
+ "email": "fjarrett@gmail.com"
4820
+ }
4821
+ ],
4822
+ "description": "Programmatically edit a wp-config.php file.",
4823
+ "time": "2019-07-23T17:24:43+00:00"
4824
+ },
4825
+ {
4826
+ "name": "wp-coding-standards/wpcs",
4827
+ "version": "2.1.1",
4828
+ "source": {
4829
+ "type": "git",
4830
+ "url": "https://github.com/WordPress/WordPress-Coding-Standards.git",
4831
+ "reference": "bd9c33152115e6741e3510ff7189605b35167908"
4832
+ },
4833
+ "dist": {
4834
+ "type": "zip",
4835
+ "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/bd9c33152115e6741e3510ff7189605b35167908",
4836
+ "reference": "bd9c33152115e6741e3510ff7189605b35167908",
4837
+ "shasum": ""
4838
+ },
4839
+ "require": {
4840
+ "php": ">=5.4",
4841
+ "squizlabs/php_codesniffer": "^3.3.1"
4842
+ },
4843
+ "require-dev": {
4844
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0",
4845
+ "phpcompatibility/php-compatibility": "^9.0",
4846
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
4847
+ },
4848
+ "suggest": {
4849
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically."
4850
+ },
4851
+ "type": "phpcodesniffer-standard",
4852
+ "notification-url": "https://packagist.org/downloads/",
4853
+ "license": [
4854
+ "MIT"
4855
+ ],
4856
+ "authors": [
4857
+ {
4858
+ "name": "Contributors",
4859
+ "homepage": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/graphs/contributors"
4860
+ }
4861
+ ],
4862
+ "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions",
4863
+ "keywords": [
4864
+ "phpcs",
4865
+ "standards",
4866
+ "wordpress"
4867
+ ],
4868
+ "time": "2019-05-21T02:50:00+00:00"
4869
+ }
4870
+ ],
4871
+ "aliases": [],
4872
+ "minimum-stability": "dev",
4873
+ "stability-flags": [],
4874
+ "prefer-stable": true,
4875
+ "prefer-lowest": false,
4876
+ "platform": [],
4877
+ "platform-dev": []
4878
+ }
includes/vendor/action-scheduler/docs/_layouts/default.html CHANGED
@@ -21,13 +21,13 @@
21
  <body>
22
 
23
  <header>
24
- <a class="github-corner" href="https://github.com/Prospress/action-scheduler/" aria-label="View on GitHub">
25
  <svg width="80" height="80" viewBox="0 0 250 250" style="fill:#b5e853; color:#151513; position: fixed; top: 0; border: 0; right: 0;" aria-hidden="true">
26
  <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>
27
  </svg>
28
  </a>
29
  <div class="container">
30
- <p><a href="/usage/">Usage</a> | <a href="/admin/">Admin</a> | <a href="/wp-cli/">WP-CLI</a> | <a href="/perf/">Background Processing at Scale</a> | <a href="/api/">API</a> | <a href="/faq/">FAQ</a>
31
  <h1><a href="/">action-scheduler</a></h1>
32
  <h2>A scalable, traceable job queue for background processing large queues of tasks in WordPress. Designed for distribution in WordPress plugins - no server access required.</h2>
33
  </div>
@@ -42,9 +42,6 @@
42
  <footer>
43
  <div class="container">
44
  <p><a href="/usage/">Usage</a> | <a href="/admin/">Admin</a> | <a href="/wp-cli/">WP-CLI</a> | <a href="/perf/">Background Processing at Scale</a> | <a href="/api/">API</a> | <a href="/faq/">FAQ</a>
45
- <p class="footer-image">
46
- <a href="https://prospress.com"><img src="http://pic.pros.pr/eb8dcec9bd54/prospress-hacker-green-logo.png" width="120"></a>
47
- </p>
48
  </div>
49
  </footer>
50
 
21
  <body>
22
 
23
  <header>
24
+ <a class="github-corner" href="https://github.com/woocommerce/action-scheduler/" aria-label="View on GitHub">
25
  <svg width="80" height="80" viewBox="0 0 250 250" style="fill:#b5e853; color:#151513; position: fixed; top: 0; border: 0; right: 0;" aria-hidden="true">
26
  <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>
27
  </svg>
28
  </a>
29
  <div class="container">
30
+ <p><a href="/usage/">Usage</a> | <a href="/admin/">Admin</a> | <a href="/wp-cli/">WP-CLI</a> | <a href="/perf/">Background Processing at Scale</a> | <a href="/api/">API</a> | <a href="/faq/">FAQ</a> | <a href="/version3-0/">Version 3.0</a>
31
  <h1><a href="/">action-scheduler</a></h1>
32
  <h2>A scalable, traceable job queue for background processing large queues of tasks in WordPress. Designed for distribution in WordPress plugins - no server access required.</h2>
33
  </div>
42
  <footer>
43
  <div class="container">
44
  <p><a href="/usage/">Usage</a> | <a href="/admin/">Admin</a> | <a href="/wp-cli/">WP-CLI</a> | <a href="/perf/">Background Processing at Scale</a> | <a href="/api/">API</a> | <a href="/faq/">FAQ</a>
 
 
 
45
  </div>
46
  </footer>
47
 
includes/vendor/action-scheduler/docs/android-chrome-192x192.png CHANGED
Binary file
includes/vendor/action-scheduler/docs/android-chrome-256x256.png CHANGED
Binary file
includes/vendor/action-scheduler/docs/api.md CHANGED
@@ -5,7 +5,7 @@ description: Reference guide for background processing functions provided by the
5
 
6
  Action Scheduler provides a range of functions for scheduling hooks to run at some time in the future on one or more occassions.
7
 
8
- To understand the scheduling functoins, it can help to think of them as extensions to WordPress' `do_action()` function that add the ability to delay and repeat when the hook will be triggered.
9
 
10
  ## WP-Cron APIs vs. Action Scheduler APIs
11
 
@@ -13,39 +13,62 @@ The Action Scheduler API functions are designed to mirror the WordPress [WP-Cron
13
 
14
  Functions return similar values and accept similar arguments to their WP-Cron counterparts. The notable differences are:
15
 
16
- * `as_schedule_single_action()` & `as_schedule_recurring_action()` will return the post ID of the scheduled action rather than boolean indicating whether the event was scheduled
17
  * `as_schedule_recurring_action()` takes an interval in seconds as the recurring interval rather than an arbitrary string
18
  * `as_schedule_single_action()` & `as_schedule_recurring_action()` can accept a `$group` parameter to group different actions for the one plugin together.
19
  * the `wp_` prefix is substituted with `as_` and the term `event` is replaced with `action`
20
 
21
  ## API Function Availability
22
 
23
- As mentioned in the [Usage - Load Order](/usage/#load-order) section, Action Scheduler will initialize itself on the `'init'` hook with priority `1`. While API functions are loaded prior to this and call be called, they should not be called until after `'init'` with priority `1`, because each component, like the data store, has not yet been initialized.
24
 
25
  Do not use Action Scheduler API functions prior to `'init'` hook with priority `1`. Doing so could lead to unexpected results, like data being stored in the incorrect location.
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  ## Function Reference / `as_schedule_single_action()`
28
 
29
  ### Description
30
 
31
- Schedule an action to run one time.
32
 
33
  ### Usage
34
 
35
  ```php
36
- as_schedule_single_action( $timestamp, $hook, $args, $group )
37
- ````
38
 
39
  ### Parameters
40
 
41
- - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_.
42
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
43
  - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
44
- - **$group** (array) The group to assign this job to. Default: _''_.
45
 
46
  ### Return value
47
 
48
- (integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
49
 
50
 
51
  ## Function Reference / `as_schedule_recurring_action()`
@@ -57,20 +80,20 @@ Schedule an action to run repeatedly with a specified interval in seconds.
57
  ### Usage
58
 
59
  ```php
60
- as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args, $group )
61
- ````
62
 
63
  ### Parameters
64
 
65
- - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_.
66
- - **$interval_in_seconds** (integer)(required) How long to wait between runs. Default: _none_.
67
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
68
  - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
69
- - **$group** (array) The group to assign this job to. Default: _''_.
70
 
71
  ### Return value
72
 
73
- (integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
74
 
75
 
76
  ## Function Reference / `as_schedule_cron_action()`
@@ -82,44 +105,66 @@ Schedule an action that recurs on a cron-like schedule.
82
  ### Usage
83
 
84
  ```php
85
- as_schedule_cron_action( $timestamp, $schedule, $hook, $args, $group )
86
- ````
87
 
88
  ### Parameters
89
 
90
- - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_.
91
- - **$schedule** (string)(required) $schedule A cron-link schedule string, see http://en.wikipedia.org/wiki/Cron. Default: _none_.
92
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
93
  - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
94
- - **$group** (array) The group to assign this job to. Default: _''_.
95
 
96
  ### Return value
97
 
98
- (integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
99
 
100
 
101
  ## Function Reference / `as_unschedule_action()`
102
 
103
  ### Description
104
 
105
- Cancel the next occurrence of a job.
106
 
107
  ### Usage
108
 
109
  ```php
110
- as_unschedule_action( $hook, $args, $group )
111
- ````
112
 
113
  ### Parameters
114
 
115
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
116
- - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
117
- - **$group** (array) The group to assign this job to. Default: _''_.
118
 
119
  ### Return value
120
 
121
  (null)
122
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
 
124
  ## Function Reference / `as_next_scheduled_action()`
125
 
@@ -130,14 +175,14 @@ Returns the next timestamp for a scheduled action.
130
  ### Usage
131
 
132
  ```php
133
- as_next_scheduled_action( $hook, $args, $group )
134
- ````
135
 
136
  ### Parameters
137
 
138
  - **$hook** (string)(required) Name of the action hook. Default: _none_.
139
- - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
140
- - **$group** (array) The group to assign this job to. Default: _''_.
141
 
142
  ### Return value
143
 
@@ -153,8 +198,8 @@ Find scheduled actions.
153
  ### Usage
154
 
155
  ```php
156
- as_get_scheduled_actions( $args, $return_format )
157
- ````
158
 
159
  ### Parameters
160
 
@@ -176,4 +221,4 @@ as_get_scheduled_actions( $args, $return_format )
176
 
177
  ### Return value
178
 
179
- (array) Array of the actions matching the criteria specified with `$args`.
5
 
6
  Action Scheduler provides a range of functions for scheduling hooks to run at some time in the future on one or more occassions.
7
 
8
+ To understand the scheduling functions, it can help to think of them as extensions to WordPress' `do_action()` function that add the ability to delay and repeat when the hook will be triggered.
9
 
10
  ## WP-Cron APIs vs. Action Scheduler APIs
11
 
13
 
14
  Functions return similar values and accept similar arguments to their WP-Cron counterparts. The notable differences are:
15
 
16
+ * `as_schedule_single_action()` & `as_schedule_recurring_action()` will return the ID of the scheduled action rather than boolean indicating whether the event was scheduled
17
  * `as_schedule_recurring_action()` takes an interval in seconds as the recurring interval rather than an arbitrary string
18
  * `as_schedule_single_action()` & `as_schedule_recurring_action()` can accept a `$group` parameter to group different actions for the one plugin together.
19
  * the `wp_` prefix is substituted with `as_` and the term `event` is replaced with `action`
20
 
21
  ## API Function Availability
22
 
23
+ As mentioned in the [Usage - Load Order](/usage/#load-order) section, Action Scheduler will initialize itself on the `'init'` hook with priority `1`. While API functions are loaded prior to this and can be called, they should not be called until after `'init'` with priority `1`, because each component, like the data store, has not yet been initialized.
24
 
25
  Do not use Action Scheduler API functions prior to `'init'` hook with priority `1`. Doing so could lead to unexpected results, like data being stored in the incorrect location.
26
 
27
+ ## Function Reference / `as_enqueue_async_action()`
28
+
29
+ ### Description
30
+
31
+ Enqueue an action to run one time, as soon as possible.
32
+
33
+ ### Usage
34
+
35
+ ```php
36
+ as_enqueue_async_action( $hook, $args, $group );
37
+ ```
38
+
39
+ ### Parameters
40
+
41
+ - **$hook** (string)(required) Name of the action hook.
42
+ - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
43
+ - **$group** (string) The group to assign this job to. Default: _''_.
44
+
45
+ ### Return value
46
+
47
+ (integer) the action's ID.
48
+
49
+
50
  ## Function Reference / `as_schedule_single_action()`
51
 
52
  ### Description
53
 
54
+ Schedule an action to run one time at some defined point in the future.
55
 
56
  ### Usage
57
 
58
  ```php
59
+ as_schedule_single_action( $timestamp, $hook, $args, $group );
60
+ ```
61
 
62
  ### Parameters
63
 
64
+ - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run.
65
+ - **$hook** (string)(required) Name of the action hook.
66
  - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
67
+ - **$group** (string) The group to assign this job to. Default: _''_.
68
 
69
  ### Return value
70
 
71
+ (integer) the action's ID.
72
 
73
 
74
  ## Function Reference / `as_schedule_recurring_action()`
80
  ### Usage
81
 
82
  ```php
83
+ as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args, $group );
84
+ ```
85
 
86
  ### Parameters
87
 
88
+ - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run.
89
+ - **$interval_in_seconds** (integer)(required) How long to wait between runs.
90
+ - **$hook** (string)(required) Name of the action hook.
91
  - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
92
+ - **$group** (string) The group to assign this job to. Default: _''_.
93
 
94
  ### Return value
95
 
96
+ (integer) the action's ID.
97
 
98
 
99
  ## Function Reference / `as_schedule_cron_action()`
105
  ### Usage
106
 
107
  ```php
108
+ as_schedule_cron_action( $timestamp, $schedule, $hook, $args, $group );
109
+ ```
110
 
111
  ### Parameters
112
 
113
+ - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run.
114
+ - **$schedule** (string)(required) $schedule A cron-like schedule string, see http://en.wikipedia.org/wiki/Cron.
115
+ - **$hook** (string)(required) Name of the action hook.
116
  - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
117
+ - **$group** (string) The group to assign this job to. Default: _''_.
118
 
119
  ### Return value
120
 
121
+ (integer) the action's ID.
122
 
123
 
124
  ## Function Reference / `as_unschedule_action()`
125
 
126
  ### Description
127
 
128
+ Cancel the next occurrence of a scheduled action.
129
 
130
  ### Usage
131
 
132
  ```php
133
+ as_unschedule_action( $hook, $args, $group );
134
+ ```
135
 
136
  ### Parameters
137
 
138
+ - **$hook** (string)(required) Name of the action hook.
139
+ - **$args** (array) Arguments passed to callbacks when the hook triggers. Default: _`array()`_.
140
+ - **$group** (string) The group the job is assigned to. Default: _''_.
141
 
142
  ### Return value
143
 
144
  (null)
145
 
146
+ ## Function Reference / `as_unschedule_all_actions()`
147
+
148
+ ### Description
149
+
150
+ Cancel all occurrences of a scheduled action.
151
+
152
+ ### Usage
153
+
154
+ ```php
155
+ as_unschedule_all_actions( $hook, $args, $group )
156
+ ```
157
+
158
+ ### Parameters
159
+
160
+ - **$hook** (string)(required) Name of the action hook.
161
+ - **$args** (array) Arguments passed to callbacks when the hook triggers. Default: _`array()`_.
162
+ - **$group** (string) The group the job is assigned to. Default: _''_.
163
+
164
+ ### Return value
165
+
166
+ (string|null) The scheduled action ID if a scheduled action was found, or null if no matching action found.
167
+
168
 
169
  ## Function Reference / `as_next_scheduled_action()`
170
 
175
  ### Usage
176
 
177
  ```php
178
+ as_next_scheduled_action( $hook, $args, $group );
179
+ ```
180
 
181
  ### Parameters
182
 
183
  - **$hook** (string)(required) Name of the action hook. Default: _none_.
184
+ - **$args** (array) Arguments passed to callbacks when the hook triggers. Default: _`array()`_.
185
+ - **$group** (string) The group the job is assigned to. Default: _''_.
186
 
187
  ### Return value
188
 
198
  ### Usage
199
 
200
  ```php
201
+ as_get_scheduled_actions( $args, $return_format );
202
+ ```
203
 
204
  ### Parameters
205
 
221
 
222
  ### Return value
223
 
224
+ (array) Array of action rows matching the criteria specified with `$args`.
includes/vendor/action-scheduler/docs/apple-touch-icon.png CHANGED
Binary file
includes/vendor/action-scheduler/docs/assets/css/style.scss CHANGED
@@ -35,7 +35,7 @@ footer {
35
  animation:octocat-wave 560ms ease-in-out
36
  }
37
 
38
- @keyframes octocat-wave{
39
  0%,100%{
40
  transform:rotate(0)
41
  }
@@ -51,7 +51,7 @@ footer {
51
  .github-corner:hover .octo-arm {
52
  animation:none
53
  }
54
- .github-corner .octo-arm{
55
  animation:octocat-wave 560ms ease-in-out
56
  }
57
  }
35
  animation:octocat-wave 560ms ease-in-out
36
  }
37
 
38
+ @keyframes octocat-wave {
39
  0%,100%{
40
  transform:rotate(0)
41
  }
51
  .github-corner:hover .octo-arm {
52
  animation:none
53
  }
54
+ .github-corner .octo-arm {
55
  animation:octocat-wave 560ms ease-in-out
56
  }
57
  }
includes/vendor/action-scheduler/docs/faq.md CHANGED
@@ -4,11 +4,11 @@
4
 
5
  Action Scheduler is designed to be used and released in plugins. It avoids redeclaring public API functions when more than one copy of the library is being loaded by different plugins. It will also load only the most recent version of itself (by checking registered versions after all plugins are loaded on the `'plugins_loaded'` hook).
6
 
7
- To use it in your plugin, simply require the `action-scheduler/action-scheduler.php` file. Action Scheduler will take care of the rest.
8
 
9
  ### I don't want to use WP-Cron. Does Action Scheduler depend on WP-Cron?
10
 
11
- By default, Action Scheduler is initiated by WP-Cron. However, it has no dependency on the WP-Cron system. You can initiate the Action Scheduler queue in other ways with just one or two lines of code.
12
 
13
  For example, you can start a queue directly by calling:
14
 
@@ -19,30 +19,38 @@ ActionScheduler::runner()->run();
19
  Or trigger the `'action_scheduler_run_queue'` hook and let Action Scheduler do it for you:
20
 
21
  ```php
22
- do_action( 'action_scheduler_run_queue' );
23
  ```
24
 
25
- Further customization can be done by extending the `ActionScheduler_Abstract_QueueRunner` class to create a custom Queue Runner. For an example of a customized queue runner, see the [`ActionScheduler_WPCLI_QueueRunner`](https://github.com/Prospress/action-scheduler/blob/master/classes/ActionScheduler_WPCLI_QueueRunner.php), which is used when running WP CLI.
26
 
27
- Want to create some other method for initiating Action Scheduler? [Open a new issue](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it.
28
 
29
  ### I don't want to use WP-Cron, ever. Does Action Scheduler replace WP-Cron?
30
 
31
  By default, Action Scheduler is designed to work alongside WP-Cron and not change any of its behaviour. This helps avoid unexpectedly overriding WP-Cron on sites installing your plugin, which may have nothing to do with WP-Cron.
32
 
33
- However, we can understand why you might want to replace WP-Cron completely in environments within you control, especially as it gets you the advantages of Action Scheduler. This should be possible without too much code.
34
 
35
  You could use the `'schedule_event'` hook in WordPress to use Action Scheduler for only newly scheduled WP-Cron jobs and map the `$event` param to Action Scheduler API functions.
36
 
37
  Alternatively, you can use a combination of the `'pre_update_option_cron'` and `'pre_option_cron'` hooks to override all new and previously scheduled WP-Cron jobs (similar to the way [Cavalcade](https://github.com/humanmade/Cavalcade) does it).
38
 
39
- If you'd like to create a plugin to do this automatically and want to share your work with others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it.
40
 
41
- ### Eww gross, Custom Post Types! That's _so_ 2010. Can I use a different storage scheme?
 
 
 
 
 
 
 
 
42
 
43
  Of course! Action Scheduler data storage is completely swappable, and always has been.
44
 
45
- You can store scheduled actions in custom tables in the WordPress site's database. Some sites using it already are. You can actually store them anywhere for that matter, like in a remote storage service from Amazon Web Services.
46
 
47
  To implement a custom store:
48
 
@@ -56,11 +64,9 @@ function eg_define_custom_store( $existing_storage_class ) {
56
  add_filter( 'action_scheduler_store_class', 'eg_define_custom_store', 10, 1 );
57
  ```
58
 
59
- Take a look at the `ActionScheduler_wpPostStore` class for an example implementation of `ActionScheduler_Store`.
60
-
61
- If you'd like to create a plugin to do this automatically and release it publicly to help others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it.
62
 
63
- > Note: we're also moving Action Scheduler itself to use [custom tables for better scalability](https://github.com/Prospress/action-scheduler/issues/77).
64
 
65
  ### Can I use a different storage scheme just for logging?
66
 
@@ -78,7 +84,7 @@ function eg_define_custom_logger( $existing_storage_class ) {
78
  add_filter( 'action_scheduler_logger_class', 'eg_define_custom_logger', 10, 1 );
79
  ```
80
 
81
- Take a look at the `ActionScheduler_wpCommentLogger` class for an example implementation of `ActionScheduler_Logger`.
82
 
83
  ### I want to run Action Scheduler only on a dedicated application server in my cluster. Can I do that?
84
 
@@ -96,6 +102,6 @@ It requires no setup, and won't override any WordPress APIs (unless you want it
96
 
97
  ### How does Action Scheduler work on WordPress Multisite?
98
 
99
- Action Scheduler is designed to manage the scheduled actions on a single site. It has no special handling for running queues across multiple sites in a multisite network. That said, because it's storage and Queue Runner are completely swappable, it would be possible to write multisite handling classes to use with it.
100
 
101
- If you'd like to create a multisite plugin to do this and release it publicly to help others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it.
4
 
5
  Action Scheduler is designed to be used and released in plugins. It avoids redeclaring public API functions when more than one copy of the library is being loaded by different plugins. It will also load only the most recent version of itself (by checking registered versions after all plugins are loaded on the `'plugins_loaded'` hook).
6
 
7
+ To use it in your plugin (or theme), simply require the `action-scheduler/action-scheduler.php` file. Action Scheduler will take care of the rest. __Note:__ Action Scheduler is only loaded from a theme if it is not included in any active plugins.
8
 
9
  ### I don't want to use WP-Cron. Does Action Scheduler depend on WP-Cron?
10
 
11
+ By default, Action Scheduler is initiated by WP-Cron (and the `'shutdown'` hook on admin requests). However, it has no dependency on the WP-Cron system. You can initiate the Action Scheduler queue in other ways with just one or two lines of code.
12
 
13
  For example, you can start a queue directly by calling:
14
 
19
  Or trigger the `'action_scheduler_run_queue'` hook and let Action Scheduler do it for you:
20
 
21
  ```php
22
+ do_action( 'action_scheduler_run_queue', $context_identifier );
23
  ```
24
 
25
+ Further customization can be done by extending the `ActionScheduler_Abstract_QueueRunner` class to create a custom Queue Runner. For an example of a customized queue runner, see the [`ActionScheduler_WPCLI_QueueRunner`](https://github.com/woocommerce/action-scheduler/blob/master/classes/ActionScheduler_WPCLI_QueueRunner.php), which is used when running WP CLI.
26
 
27
+ Want to create some other method for initiating Action Scheduler? [Open a new issue](https://github.com/woocommerce/action-scheduler/issues/new), we'd love to help you with it.
28
 
29
  ### I don't want to use WP-Cron, ever. Does Action Scheduler replace WP-Cron?
30
 
31
  By default, Action Scheduler is designed to work alongside WP-Cron and not change any of its behaviour. This helps avoid unexpectedly overriding WP-Cron on sites installing your plugin, which may have nothing to do with WP-Cron.
32
 
33
+ However, we can understand why you might want to replace WP-Cron completely in environments within your control, especially as it gets you the advantages of Action Scheduler. This should be possible without too much code.
34
 
35
  You could use the `'schedule_event'` hook in WordPress to use Action Scheduler for only newly scheduled WP-Cron jobs and map the `$event` param to Action Scheduler API functions.
36
 
37
  Alternatively, you can use a combination of the `'pre_update_option_cron'` and `'pre_option_cron'` hooks to override all new and previously scheduled WP-Cron jobs (similar to the way [Cavalcade](https://github.com/humanmade/Cavalcade) does it).
38
 
39
+ If you'd like to create a plugin to do this automatically and want to share your work with others, [open a new issue to let us know](https://github.com/woocommerce/action-scheduler/issues/new), we'd love to help you with it.
40
 
41
+ ### How does Action Scheduler store its data?
42
+
43
+ Action Scheduler 3.0 and newer stores data in custom tables prefixed with `actionscheduler_`. For the list of all tables and their schemas, refer to the `ActionScheduler_StoreSchema` class.
44
+
45
+ Prior to Action 3.0, actions were a custom post type, and data was stored in `wp_posts`, `wp_postmeta` and related tables.
46
+
47
+ Action Scheduler 3+ migrates data from the custom post type to custom tables.
48
+
49
+ ### Can I use a different storage scheme?
50
 
51
  Of course! Action Scheduler data storage is completely swappable, and always has been.
52
 
53
+ If you choose to, you can actually store them anywhere, like in a remote storage service from Amazon Web Services.
54
 
55
  To implement a custom store:
56
 
64
  add_filter( 'action_scheduler_store_class', 'eg_define_custom_store', 10, 1 );
65
  ```
66
 
67
+ Take a look at the `classes/data-stores/ActionScheduler_DBStore.php` class for an example implementation of `ActionScheduler_Store`.
 
 
68
 
69
+ If you'd like to create a plugin to do this automatically and release it publicly to help others, [open a new issue to let us know](https://github.com/woocommerce/action-scheduler/issues/new), we'd love to help you with it.
70
 
71
  ### Can I use a different storage scheme just for logging?
72
 
84
  add_filter( 'action_scheduler_logger_class', 'eg_define_custom_logger', 10, 1 );
85
  ```
86
 
87
+ Take a look at the `classes/data-stores/ActionScheduler_DBLogger.php` class for an example implementation of `ActionScheduler_Logger`.
88
 
89
  ### I want to run Action Scheduler only on a dedicated application server in my cluster. Can I do that?
90
 
102
 
103
  ### How does Action Scheduler work on WordPress Multisite?
104
 
105
+ Action Scheduler is designed to manage the scheduled actions on a single site. It has no special handling for running queues across multiple sites in a multisite network. That said, because its storage and Queue Runner are completely swappable, it would be possible to write multisite handling classes to use with it.
106
 
107
+ If you'd like to create a multisite plugin to do this and release it publicly to help others, [open a new issue to let us know](https://github.com/woocommerce/action-scheduler/issues/new), we'd love to help you with it.
includes/vendor/action-scheduler/docs/favicon-16x16.png CHANGED
Binary file
includes/vendor/action-scheduler/docs/favicon-32x32.png CHANGED
Binary file
includes/vendor/action-scheduler/docs/favicon.ico CHANGED
Binary file
includes/vendor/action-scheduler/docs/index.md CHANGED
@@ -3,11 +3,11 @@ title: Action Scheduler - Background Processing Job Queue for WordPress
3
  ---
4
  ## WordPress Job Queue with Background Processing
5
 
6
- Action Scheduler is a library for triggering a WordPress hook to run at some time in the future. Each hook can be scheduled with unique data, to allow callbacks to perform operations on that data. The hook can also be scheduled to run on one or more occassions.
7
 
8
  Think of it like an extension to `do_action()` which adds the ability to delay and repeat a hook.
9
 
10
- It just so happens, this functionality also creates a robust job queue for background processing large queues of tasks in WordPress. With the additional of logging and an [administration interface](/admin/), that also provide tracability on your tasks processed in the background.
11
 
12
  ### Battle-Tested Background Processing
13
 
@@ -21,25 +21,25 @@ Action Scheduler is specifically designed for distribution in WordPress plugins
21
 
22
  ### How it Works
23
 
24
- Action Scheduler uses a WordPress [custom post type](http://codex.wordpress.org/Post_Types), creatively named `scheduled-action`, to store the hook name, arguments and scheduled date for an action that should be triggered at some time in the future.
25
 
26
- The scheduler will attempt to run every minute by attaching itself as a callback to the `'action_scheduler_run_schedule'` hook, which is scheduled using WordPress's built-in [WP-Cron](http://codex.wordpress.org/Function_Reference/wp_cron) system.
27
 
28
- When triggered, Action Scheduler will check for posts of the `scheduled-action` type that have a `post_date` at or before this point in time i.e. actions scheduled to run now or at sometime in the past.
29
 
30
  ### Batch Processing Background Jobs
31
 
32
- If there are actions to be processed, Action Scheduler will stake a unique claim for a batch of 20 actions and begin processing that batch. The PHP process spawned to run the batch will then continue processing batches of 20 actions until it times out or exhausts available memory.
33
 
34
- If your site has a large number of actions scheduled to run at the same time, Action Scheduler will process more than one batch at a time. Specifically, when the `'action_scheduler_run_schedule'` hook is triggered approximately one minute after the first batch began processing, a new PHP process will stake a new claim to a batch of actions which were not claimed by the previous process. It will then begin to process that batch.
35
 
36
- This will continue until all actions are processed using a maximum of 5 concurrent queues.
37
 
38
  ### Housekeeping
39
 
40
- Before processing a batch, the scheduler will remove any existing claims on actions which have been sitting in a queue for more than five minutes.
41
 
42
- Action Scheduler will also trash any actions which were completed more than a month ago.
43
 
44
  If an action runs for more than 5 minutes, Action Scheduler will assume the action has timed out and will mark it as failed. However, if all callbacks attached to the action were to successfully complete sometime after that 5 minute timeout, its status would later be updated to completed.
45
 
@@ -49,20 +49,18 @@ Did your background job run?
49
 
50
  Never be left wondering with Action Scheduler's built-in record keeping.
51
 
52
- All events for each action are logged in the [comments table](http://codex.wordpress.org/Database_Description#Table_Overview) and displayed in the [administration interface](/admin/).
53
 
54
  The events logged by default include when an action:
55
  * is created
56
- * starts
57
  * completes
58
  * fails
59
 
60
  If it fails with an error that can be recorded, that error will be recorded in the log and visible in administration interface, making it possible to trace what went wrong at some point in the past on a site you didn't have access to in the past.
61
 
62
- Actions can also be grouped together using a custom taxonomy named `action-group`.
63
-
64
  ## Credits
65
 
66
- Developed and maintained by [Prospress](http://prospress.com/) in collaboration with [Flightless](https://flightless.us/).
67
 
68
- Collaboration is cool. We'd love to work with you to improve Action Scheduler. [Pull Requests](https://github.com/prospress/action-scheduler/pulls) welcome.
3
  ---
4
  ## WordPress Job Queue with Background Processing
5
 
6
+ Action Scheduler is a library for triggering a WordPress hook to run at some time in the future (or as soon as possible, in the case of an async action). Each hook can be scheduled with unique data, to allow callbacks to perform operations on that data. The hook can also be scheduled to run on one or more occassions.
7
 
8
  Think of it like an extension to `do_action()` which adds the ability to delay and repeat a hook.
9
 
10
+ It just so happens, this functionality also creates a robust job queue for background processing large queues of tasks in WordPress. With the addition of logging and an [administration interface](/admin/), it also provide tracability on your tasks processed in the background.
11
 
12
  ### Battle-Tested Background Processing
13
 
21
 
22
  ### How it Works
23
 
24
+ Action Scheduler stores the hook name, arguments and scheduled date for an action that should be triggered at some time in the future.
25
 
26
+ The scheduler will attempt to run every minute by attaching itself as a callback to the `'action_scheduler_run_schedule'` hook, which is scheduled using WordPress's built-in [WP-Cron](http://codex.wordpress.org/Function_Reference/wp_cron) system. Once per minute on, it will also check on the `'shutdown'` hook of WP Admin requests whether there are pending actions, and if there are, it will initiate a queue via an async loopback request.
27
 
28
+ When triggered, Action Scheduler will check for scheduled actions that have a due date at or before this point in time i.e. actions scheduled to run now or at sometime in the past. Action scheduled to run asynchronously, i.e. not scheduled, have a zero date, meaning they will always be due no matter when the check occurs.
29
 
30
  ### Batch Processing Background Jobs
31
 
32
+ If there are actions to be processed, Action Scheduler will stake a unique claim for a batch of 25 actions and begin processing that batch. The PHP process spawned to run the batch will then continue processing batches of 25 actions until it uses 90% of available memory or has been processing for 30 seconds.
33
 
34
+ At that point, if there are additional actions to process, an asynchronous loopback request will be made to the site to continue processing actions in a new request.
35
 
36
+ This process and the loopback requests will continue until all actions are processed.
37
 
38
  ### Housekeeping
39
 
40
+ Before processing a batch, the scheduler will remove any existing claims on actions which have been sitting in a queue for more than five minutes (or more specifically, 10 times the allowed time limit, which defaults to 30 seconds).
41
 
42
+ Action Scheduler will also delete any actions which were completed or canceled more than a month ago.
43
 
44
  If an action runs for more than 5 minutes, Action Scheduler will assume the action has timed out and will mark it as failed. However, if all callbacks attached to the action were to successfully complete sometime after that 5 minute timeout, its status would later be updated to completed.
45
 
49
 
50
  Never be left wondering with Action Scheduler's built-in record keeping.
51
 
52
+ All events for each action are logged in the `actionscheduler_logs` table and displayed in the [administration interface](/admin/).
53
 
54
  The events logged by default include when an action:
55
  * is created
56
+ * starts (including details of how it was run, e.g. via [WP CLI](/wp-cli/) or WP Cron)
57
  * completes
58
  * fails
59
 
60
  If it fails with an error that can be recorded, that error will be recorded in the log and visible in administration interface, making it possible to trace what went wrong at some point in the past on a site you didn't have access to in the past.
61
 
 
 
62
  ## Credits
63
 
64
+ Action Scheduler is developed and maintained by folks at [Automattic](http://automattic.com/) with significant early development completed by [Flightless](https://flightless.us/).
65
 
66
+ Collaboration is cool. We'd love to work with you to improve Action Scheduler. [Pull Requests](https://github.com/woocommerce/action-scheduler/pulls) welcome.
includes/vendor/action-scheduler/docs/perf.md CHANGED
@@ -4,24 +4,25 @@ description: Learn how to do WordPress background processing at scale by tuning
4
  ---
5
  # Background Processing at Scale
6
 
7
- Action Scheduler's default processing is designed to work reliably across all different hosting environments. In order to achieve that, the default processing thresholds are very conservative.
8
 
9
- Specifically, Action Scheduler will only process actions until:
10
 
11
  * 90% of available memory is used
12
  * processing another 3 actions would exceed 30 seconds of total request time, based on the average processing time for the current batch
 
13
 
14
- On sites with large queues, this can result in very slow processing time.
15
 
16
- While using [WP CLI to process queues](/wp-cli/) is the best approach to increasing processing speed, on occasion, that is not a viable option. In these cases, it's also possible to increase the processing thresholds in Action Scheduler to increase the rate at which actions are processed by the default WP Cron queue runner.
17
 
18
  ## Increasing Time Limit
19
 
20
- By default, Action Scheduler will only process actions for a maximum of 30 seconds. This time limit minimises the risk of a script timeout on unknown hosting environments, some of which enforce 30 second timeouts.
21
 
22
- If you know your host supports longer than this time limit for web requests, you can increase this time limit. This allows more actions to be processed in each request and reduces the lag between processing each queue, greating speeding up the processing rate of scheduled actions.
23
 
24
- For example, the following snippet will increase the timelimit to 2 minutes (120 seconds):
25
 
26
  ```php
27
  function eg_increase_time_limit( $time_limit ) {
@@ -38,7 +39,7 @@ Some of the known host time limits are:
38
 
39
  ## Increasing Batch Size
40
 
41
- By default, Action Scheduler will claim a batch of 25 actions. This small batch size is because the default time limit is only 30 seconds; however, if you know your actions are processing very quickly, e.g. taking microseconds not seconds, or that you have more than 30 second available to process each batch, increasing the batch size can improve performance.
42
 
43
  This is because claiming a batch has some overhead, so the less often a batch needs to be claimed, the faster actions can be processed.
44
 
@@ -53,11 +54,11 @@ add_filter( 'action_scheduler_queue_runner_batch_size', 'eg_increase_action_sche
53
 
54
  ## Increasing Concurrent Batches
55
 
56
- By default, Action Scheduler will run up to 5 concurrent batches of actions. This is to prevent consuming all the available connections or processes on your webserver.
57
 
58
- However, your server may allow a large number of connection, for example, because it has a high value for Apache's `MaxClients` setting or PHP-FPM's `pm.max_children` setting.
59
 
60
- If this is the case, you can use the `'action_scheduler_queue_runner_concurrent_batches'` filter to increase the number of conncurrent batches allowed, and therefore speed up processing large numbers of actions scheduled to be processed simultaneously.
61
 
62
  For example, to increase the allowed number of concurrent queues to 10, we can use the following code:
63
 
@@ -68,17 +69,19 @@ function eg_increase_action_scheduler_concurrent_batches( $concurrent_batches )
68
  add_filter( 'action_scheduler_queue_runner_concurrent_batches', 'eg_increase_action_scheduler_concurrent_batches' );
69
  ```
70
 
 
 
71
  ## Increasing Initialisation Rate of Runners
72
 
73
- By default, Action scheduler initiates at most, one queue runner every time the `'action_scheduler_run_queue'` action is triggered by WP Cron.
74
 
75
- Because this action is only triggered at most once every minute, if a queue is only allowed to process for one minute, then there will never be more than one queue processing actions, greatly reducing the processing rate.
76
 
77
- To handle larger queues on more powerful servers, it's a good idea to initiate additional queue runners whenever the `'action_scheduler_run_queue'` action is run.
78
 
79
  That can be done by initiated additional secure requests to our server via loopback requests.
80
 
81
- The code below demonstrates how to create 5 loopback requests each time a queue begins
82
 
83
  ```php
84
  /**
@@ -122,6 +125,8 @@ function eg_create_additional_runners() {
122
  add_action( 'wp_ajax_nopriv_eg_create_additional_runners', 'eg_create_additional_runners', 0 );
123
  ```
124
 
 
 
125
  ## High Volume Plugin
126
 
127
- It's not necessary to add all of this code yourself, the folks at [Prospress](https://prospress.com) have created a handy plugin to get access to each of these increases - the [Action Scheduler - High Volume](https://github.com/prospress/action-scheduler-high-volume) plugin.
4
  ---
5
  # Background Processing at Scale
6
 
7
+ Action Scheduler's default processing is designed to work reliably across all different hosting environments. In order to achieve that, the default processing thresholds are more conservative than many servers could support.
8
 
9
+ Specifically, Action Scheduler will only process actions in a request until:
10
 
11
  * 90% of available memory is used
12
  * processing another 3 actions would exceed 30 seconds of total request time, based on the average processing time for the current batch
13
+ * in a single concurrent queue
14
 
15
+ While Action Scheduler will initiate an asychronous loopback request to process additional actions, on sites with very large queues, this can result in slow processing times.
16
 
17
+ While using [WP CLI to process queues](/wp-cli/) is the best approach to increasing processing speed, on occasion, that is not a viable option. In these cases, it's also possible to increase the processing thresholds in Action Scheduler to increase the rate at which actions are processed by the default queue runner.
18
 
19
  ## Increasing Time Limit
20
 
21
+ By default, Action Scheduler will only process actions for a maximum of 30 seconds in each request. This time limit minimises the risk of a script timeout on unknown hosting environments, some of which enforce 30 second timeouts.
22
 
23
+ If you know your host supports longer than this time limit for web requests, you can increase this time limit. This allows more actions to be processed in each request and reduces the lag between processing each queue, greatly speeding up the processing rate of scheduled actions.
24
 
25
+ For example, the following snippet will increase the time limit to 2 minutes (120 seconds):
26
 
27
  ```php
28
  function eg_increase_time_limit( $time_limit ) {
39
 
40
  ## Increasing Batch Size
41
 
42
+ By default, Action Scheduler will claim a batch of 25 actions. This small batch size is because the default time limit is only 30 seconds; however, if you know your actions are processing very quickly, e.g. taking microseconds not seconds, or that you have more than 30 second available to process each batch, increasing the batch size can slightly improve performance.
43
 
44
  This is because claiming a batch has some overhead, so the less often a batch needs to be claimed, the faster actions can be processed.
45
 
54
 
55
  ## Increasing Concurrent Batches
56
 
57
+ By default, Action Scheduler will run only one concurrent batches of actions. This is to prevent consuming a lot of available connections or processes on your webserver.
58
 
59
+ However, your server may allow a large number of connections, for example, because it has a high value for Apache's `MaxClients` setting or PHP-FPM's `pm.max_children` setting.
60
 
61
+ If this is the case, you can use the `'action_scheduler_queue_runner_concurrent_batches'` filter to increase the number of concurrent batches allowed, and therefore speed up processing large numbers of actions scheduled to be processed simultaneously.
62
 
63
  For example, to increase the allowed number of concurrent queues to 10, we can use the following code:
64
 
69
  add_filter( 'action_scheduler_queue_runner_concurrent_batches', 'eg_increase_action_scheduler_concurrent_batches' );
70
  ```
71
 
72
+ > WARNING: because of the async queue runner introduced in Action Scheduler 3.0 will continue asynchronous loopback requests to process actions, increasing the number of concurrent batches can substantially increase server load and take down a site. [WP CLI](/wp-cli/) is a better method to achieve higher throughput.
73
+
74
  ## Increasing Initialisation Rate of Runners
75
 
76
+ By default, Action scheduler initiates at most one queue runner every time the `'action_scheduler_run_queue'` action is triggered by WP Cron.
77
 
78
+ Because this action is only triggered at most once every minute, then there will rarely be more than one queue processing actions even if the concurrent runners is increased.
79
 
80
+ To handle larger queues on more powerful servers, it's possible to initiate additional queue runners whenever the `'action_scheduler_run_queue'` action is run.
81
 
82
  That can be done by initiated additional secure requests to our server via loopback requests.
83
 
84
+ The code below demonstrates how to create 5 loopback requests each time a queue begins:
85
 
86
  ```php
87
  /**
125
  add_action( 'wp_ajax_nopriv_eg_create_additional_runners', 'eg_create_additional_runners', 0 );
126
  ```
127
 
128
+ > WARNING: because of the processing rate of scheduled actions, this kind of increase can very easily take down a site. Use only on high powered servers and be sure to test before attempting to use it in production.
129
+
130
  ## High Volume Plugin
131
 
132
+ It's not necessary to add all of this code yourself, there is a handy plugin to get access to each of these increases - the [Action Scheduler - High Volume](https://github.com/woocommerce/action-scheduler-high-volume) plugin.
includes/vendor/action-scheduler/docs/usage.md CHANGED
@@ -6,39 +6,7 @@ description: Learn how to use the Action Scheduler background processing job que
6
  Using Action Scheduler requires:
7
 
8
  1. installing the library
9
- 1. scheduling and action
10
- 1. attaching a callback to that action
11
-
12
- ## Scheduling an Action
13
-
14
- To schedule an action, call the [API function](/api/) for the desired schedule type passing in the required parameters.
15
-
16
- The example code below shows everything needed to schedule a function to run at midnight, if it's not already scheduled:
17
-
18
- ```php
19
- require_once( plugin_dir_path( __FILE__ ) . '/libraries/action-scheduler/action-scheduler.php' );
20
-
21
- /**
22
- * Schedule an action with the hook 'eg_midnight_log' to run at midnight each day
23
- * so that our callback is run then.
24
- */
25
- function eg_schedule_midnight_log() {
26
- if ( false === as_next_scheduled_action( 'eg_midnight_log' ) ) {
27
- as_schedule_recurring_action( strtotime( 'midnight tonight' ), DAY_IN_SECONDS, 'eg_midnight_log' );
28
- }
29
- }
30
- add_action( 'init', 'eg_schedule_midnight_log' );
31
-
32
- /**
33
- * A callback to run when the 'eg_midnight_log' scheduled action is run.
34
- */
35
- function eg_log_action_data() {
36
- error_log( 'It is just after midnight on ' . date( 'Y-m-d' ) );
37
- }
38
- add_action( 'eg_midnight_log', 'eg_log_action_data' );
39
- ```
40
-
41
- For more details on all available API functions, and the data they accept, refer to the [API Reference](/api/).
42
 
43
  ## Installation
44
 
@@ -53,7 +21,7 @@ Action Scheduler includes the necessary file headers to be used as a standard Wo
53
 
54
  To install it as a plugin:
55
 
56
- 1. Download the .zip archive of the latest [stable release](https://github.com/Prospress/action-scheduler/releases)
57
  1. Go to the **Plugins > Add New > Upload** administration screen on your WordPress site
58
  1. Select the archive file you just downloaded
59
  1. Click **Install Now**
@@ -77,7 +45,7 @@ To include Action Scheduler as a git subtree:
77
  #### Step 1. Add the Repository as a Remote
78
 
79
  ```
80
- git remote add -f subtree-action-scheduler https://github.com/Prospress/action-scheduler.git
81
  ```
82
 
83
  Adding the subtree as a remote allows us to refer to it in short from via the name `subtree-action-scheduler`, instead of the full GitHub URL.
@@ -112,7 +80,7 @@ require_once( plugin_dir_path( __FILE__ ) . '/libraries/action-scheduler/action-
112
 
113
  There is no need to call any functions or do else to initialize Action Scheduler.
114
 
115
- When the `action-scheduler.php` file is included, Action Scheduler will register the version in that file and then load the most recent version of itself on the site. It will also load the most recent version of [all API functions](https://github.com/prospress/action-scheduler#api-functions).
116
 
117
  ### Load Order
118
 
@@ -121,3 +89,38 @@ Action Scheduler will register its version on `'plugins_loaded'` with priority `
121
  It is recommended to load it _when the file including it is included_. However, if you need to load it on a hook, then the hook must occur before `'plugins_loaded'`, or you can use `'plugins_loaded'` with negative priority, like `-10`.
122
 
123
  Action Scheduler will later initialize itself on `'init'` with priority `1`. Action Scheduler APIs should not be used until after `'init'` with priority `1`.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  Using Action Scheduler requires:
7
 
8
  1. installing the library
9
+ 1. scheduling an action
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
  ## Installation
12
 
21
 
22
  To install it as a plugin:
23
 
24
+ 1. Download the .zip archive of the latest [stable release](https://github.com/woocommerce/action-scheduler/releases)
25
  1. Go to the **Plugins > Add New > Upload** administration screen on your WordPress site
26
  1. Select the archive file you just downloaded
27
  1. Click **Install Now**
45
  #### Step 1. Add the Repository as a Remote
46
 
47
  ```
48
+ git remote add -f subtree-action-scheduler https://github.com/woocommerce/action-scheduler.git
49
  ```
50
 
51
  Adding the subtree as a remote allows us to refer to it in short from via the name `subtree-action-scheduler`, instead of the full GitHub URL.
80
 
81
  There is no need to call any functions or do else to initialize Action Scheduler.
82
 
83
+ When the `action-scheduler.php` file is included, Action Scheduler will register the version in that file and then load the most recent version of itself on the site. It will also load the most recent version of [all API functions](https://actionscheduler.org/api/).
84
 
85
  ### Load Order
86
 
89
  It is recommended to load it _when the file including it is included_. However, if you need to load it on a hook, then the hook must occur before `'plugins_loaded'`, or you can use `'plugins_loaded'` with negative priority, like `-10`.
90
 
91
  Action Scheduler will later initialize itself on `'init'` with priority `1`. Action Scheduler APIs should not be used until after `'init'` with priority `1`.
92
+
93
+ ### Usage in Themes
94
+
95
+ When using Action Scheduler in themes, it's important to note that if Action Scheduler has been registered by a plugin, then the latest version registered by a plugin will be used, rather than the version included in the theme. This is because of the version dependency handling code using `'plugins_loaded'` since version 1.0.
96
+
97
+ ## Scheduling an Action
98
+
99
+ To schedule an action, call the [API function](/api/) for the desired schedule type passing in the required parameters.
100
+
101
+ The example code below shows everything needed to schedule a function to run at midnight, if it's not already scheduled:
102
+
103
+ ```php
104
+ require_once( plugin_dir_path( __FILE__ ) . '/libraries/action-scheduler/action-scheduler.php' );
105
+
106
+ /**
107
+ * Schedule an action with the hook 'eg_midnight_log' to run at midnight each day
108
+ * so that our callback is run then.
109
+ */
110
+ function eg_schedule_midnight_log() {
111
+ if ( false === as_next_scheduled_action( 'eg_midnight_log' ) ) {
112
+ as_schedule_recurring_action( strtotime( 'tomorrow' ), DAY_IN_SECONDS, 'eg_midnight_log' );
113
+ }
114
+ }
115
+ add_action( 'init', 'eg_schedule_midnight_log' );
116
+
117
+ /**
118
+ * A callback to run when the 'eg_midnight_log' scheduled action is run.
119
+ */
120
+ function eg_log_action_data() {
121
+ error_log( 'It is just after midnight on ' . date( 'Y-m-d' ) );
122
+ }
123
+ add_action( 'eg_midnight_log', 'eg_log_action_data' );
124
+ ```
125
+
126
+ For more details on all available API functions, and the data they accept, refer to the [API Reference](/api/).
includes/vendor/action-scheduler/docs/version3-0.md ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Version 3.0 FAQ
2
+
3
+ ### Do we need to wait for this to be bundled with WooCommerce?
4
+
5
+ No. Action Scheduler can be run as a standalone plugin. Action Scheduler 3.X is also part of WooCommerce 4.0 and WooCommerce Subscriptions 3.0, so when updating WooCommerce or WooCommerce Subscriptions, Action Scheduler will also be updated.
6
+
7
+ ### Can we safely switch to action scheduler version 3.0 and ditch the custom tables plugin?
8
+
9
+ Yes! The Action Scheduler Custom Tables plugin code is now part of Action Scheduler itself (with a few improvements). We recommend disabling the Custom Tables plugin immediately after activating Action Scheduler 3.0, or a plugin containing Action Scheduler 3.0, like WooCommerce Subscriptions 3.0 and newer.
10
+
11
+ ### How do we migrate from our own custom data store?
12
+
13
+ By default, Action Scheduler will only initiate a migration from the internal `WPPostStore` data store. To enable migration from any custom datastore add the following filter `add_filter( 'action_scheduler_migrate_data_store', '__return_true' );`.
14
+
15
+ ### I'm currently on PHP <5.5. When I update PHP will the migration start automatically?
16
+
17
+ Yes! The migration is initiated as soon as all dependencies are met.
18
+
19
+ ### I would like to update a plugin for testing that includes Action Scheduler 3.0 but would like to postpone the migration until that testing is complete. Is that possible?
20
+
21
+ Yes, while we recommend migrating to custom tables as soon as possible for performance reasons, you can use `add_filter( 'action_scheduler_migration_dependencies_met', '__return_false' );` to prevent the migration from initiating.
22
+
23
+ ### I updated to Action Scheduler 3.0+, the migration is running, and I'm seeing a lot of `admin-ajax.php?action=as_async_request_queue` requests. Is it possible to reduce this load?
24
+
25
+ You can increase the delay (in seconds) between these requests with
26
+
27
+ ```
28
+ add_filter( 'action_scheduler_async_request_sleep_seconds', function( $sleep ) {
29
+ return 10;
30
+ } );
31
+ ```
32
+
33
+ The default value for this filter is `1` in versions 3.0.X and `5` in versions 3.1.X.
34
+
35
+ Alternatively, the async queue runner can be disabled while your migration is in process with `add_filter( 'action_scheduler_allow_async_request_runner', '__return_false' );`.
36
+
37
+ Once the migration is complete, these filters should be removed.
38
+
39
+ ### Is it safe to use Action Scheduler function in the WordPress `shutdown` hook.
40
+
41
+ No, you should avoid calls to Action Scheduler functions in the `shutdown` hook because the `shutdown` hook is still triggered after a fatal error. If this occurs while WordPress is loading, Action Scheduler is in an unknown state.
42
+
43
+ ### Is there a strong likelihood of migration issues with any of the above?
44
+
45
+ There is always the possibilities of issues, but it is not a strong likelihood. We tested migrating from Action Scheduler 2.n with the custom data stores (including Action Scheduler Custom Tables plugin) active to Action Scheduler 3.0 on a number of test sites.
46
+
47
+ As with all major, and minor, upgrades, we still testing the update on a staging site before updating the live site. We also recommending taking a backup before updating the live site.
48
+
49
+ If you wish to undertake more comprehensive testing on a development or staging site before updating, or want to closely monitor the update on a live site, follow these steps:
50
+
51
+ #### Stage 1: Prepare your site:
52
+
53
+ 1. Take a backup of your database (AS 3.0 migrates data to custom tables, this can not be undone, you’ll need to restore a backup to downgrade).
54
+ 1. Go to Tools > Action Scheduler
55
+ 1. Take a screenshot of the action status counts at the top of the page. Example screenshot: https://cld.wthms.co/kwIqv7
56
+
57
+
58
+ #### Stage 2: Install & Activate Action Scheduler 3.0+ as a plugin
59
+
60
+ 1. The migration will start almost immediately
61
+ 1. Keep an eye on your error log
62
+ 1. Report any notices, errors or other issues on GitHub
63
+
64
+ #### Stage 3: Verify Migration
65
+
66
+ 1. Go to Tools > Action Scheduler
67
+ 1. Take a screenshot of the action status counts at the top of the page.
68
+ 1. Verify the counts match the status counts taken in Stage 1 (the Completed counts could be higher because actions will have been completed to run the migration).
includes/vendor/action-scheduler/docs/wp-cli.md CHANGED
@@ -13,12 +13,16 @@ For large sites, WP CLI is a much better choice for running queues of actions th
13
 
14
  With a regular web request, you may have to deal with script timeouts enforced by hosts, or other restraints that make it more challenging to run Action Scheduler tasks. Utilizing WP CLI to run commands directly on the server give you more freedom. This means that you typically don't have the same constraints of a normal web request.
15
 
16
- If you choose to utilize WP CLI exclusively, you can disable the normal WP CLI queue runner by installing the [Action Scheduler - Disable Default Queue Runner](https://github.com/Prospress/action-scheduler-disable-default-runner) plugin. Note that if you do this, you **must** run Action Scheduler via WP CLI or another method, otherwise no scheduled actions will be processed.
17
 
18
  ## Commands
19
 
20
  These are the commands available to use with Action Scheduler:
21
 
 
 
 
 
22
  * `action-scheduler run`
23
 
24
  Options:
13
 
14
  With a regular web request, you may have to deal with script timeouts enforced by hosts, or other restraints that make it more challenging to run Action Scheduler tasks. Utilizing WP CLI to run commands directly on the server give you more freedom. This means that you typically don't have the same constraints of a normal web request.
15
 
16
+ If you choose to utilize WP CLI exclusively, you can disable the normal WP CLI queue runner by installing the [Action Scheduler - Disable Default Queue Runner](https://github.com/woocommerce/action-scheduler-disable-default-runner) plugin. Note that if you do this, you **must** run Action Scheduler via WP CLI or another method, otherwise no scheduled actions will be processed.
17
 
18
  ## Commands
19
 
20
  These are the commands available to use with Action Scheduler:
21
 
22
+ * `action-scheduler migrate`
23
+
24
+ **Note**: This command is only available while the migration to custom tables is in progress.
25
+
26
  * `action-scheduler run`
27
 
28
  Options:
includes/vendor/action-scheduler/functions.php CHANGED
@@ -10,38 +10,41 @@
10
  * @param string $hook The hook to trigger.
11
  * @param array $args Arguments to pass when the hook triggers.
12
  * @param string $group The group to assign this job to.
13
- * @return string The action ID.
14
  */
15
  function as_enqueue_async_action( $hook, $args = array(), $group = '' ) {
 
16
  return ActionScheduler::factory()->async( $hook, $args, $group );
17
  }
18
 
19
  /**
20
  * Schedule an action to run one time
21
  *
22
- * @param int $timestamp When the job will run
23
- * @param string $hook The hook to trigger
24
- * @param array $args Arguments to pass when the hook triggers
25
- * @param string $group The group to assign this job to
26
  *
27
- * @return string The job ID
28
  */
29
  function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '' ) {
 
30
  return ActionScheduler::factory()->single( $hook, $args, $timestamp, $group );
31
  }
32
 
33
  /**
34
  * Schedule a recurring action
35
  *
36
- * @param int $timestamp When the first instance of the job will run
37
- * @param int $interval_in_seconds How long to wait between runs
38
- * @param string $hook The hook to trigger
39
- * @param array $args Arguments to pass when the hook triggers
40
- * @param string $group The group to assign this job to
41
  *
42
- * @return string The job ID
43
  */
44
  function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) {
 
45
  return ActionScheduler::factory()->recurring( $hook, $args, $timestamp, $interval_in_seconds, $group );
46
  }
47
 
@@ -62,13 +65,14 @@ function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook,
62
  * | | +--------------- day of month (1 - 31)
63
  * | +-------------------- hour (0 - 23)
64
  * +------------------------- min (0 - 59)
65
- * @param string $hook The hook to trigger
66
- * @param array $args Arguments to pass when the hook triggers
67
- * @param string $group The group to assign this job to
68
  *
69
- * @return string The job ID
70
  */
71
  function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) {
 
72
  return ActionScheduler::factory()->cron( $hook, $args, $timestamp, $schedule, $group );
73
  }
74
 
@@ -82,13 +86,14 @@ function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(),
82
  * then the following instance will never be scheduled (or exist), which is effectively the same as being unscheduled
83
  * by this method also.
84
  *
85
- * @param string $hook The hook that the job will trigger
86
- * @param array $args Args that would have been passed to the job
87
- * @param string $group
88
  *
89
- * @return string The scheduled action ID if a scheduled action was found, or empty string if no matching action found.
90
  */
91
  function as_unschedule_action( $hook, $args = array(), $group = '' ) {
 
92
  $params = array();
93
  if ( is_array($args) ) {
94
  $params['args'] = $args;
@@ -108,11 +113,12 @@ function as_unschedule_action( $hook, $args = array(), $group = '' ) {
108
  /**
109
  * Cancel all occurrences of a scheduled action.
110
  *
111
- * @param string $hook The hook that the job will trigger
112
- * @param array $args Args that would have been passed to the job
113
- * @param string $group
114
  */
115
  function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
 
116
  if ( empty( $args ) ) {
117
  if ( ! empty( $hook ) && empty( $group ) ) {
118
  ActionScheduler_Store::instance()->cancel_actions_by_hook( $hook );
@@ -131,7 +137,7 @@ function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
131
  /**
132
  * Check if there is an existing action in the queue with a given hook, args and group combination.
133
  *
134
- * An action in the queue could be pending, in-progress or aysnc. If the is pending for a time in
135
  * future, its scheduled date will be returned as a timestamp. If it is currently being run, or an
136
  * async action sitting in the queue waiting to be processed, in which case boolean true will be
137
  * returned. Or there may be no async, in-progress or pending action for this hook, in which case,
@@ -144,6 +150,7 @@ function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
144
  * @return int|bool The timestamp for the next occurrence of a pending scheduled action, true for an async or in-progress action or false if there is no matching action.
145
  */
146
  function as_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
 
147
  $params = array();
148
  if ( is_array($args) ) {
149
  $params['args'] = $args;
@@ -191,11 +198,12 @@ function as_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
191
  * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date'
192
  * 'order' => 'ASC'
193
  *
194
- * @param string $return_format OBJECT, ARRAY_A, or ids
195
  *
196
  * @return array
197
  */
198
  function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
 
199
  $store = ActionScheduler::store();
200
  foreach ( array('date', 'modified') as $key ) {
201
  if ( isset($args[$key]) ) {
@@ -234,8 +242,8 @@ function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
234
  * timezone when instantiating datetimes rather than leaving it up to
235
  * the PHP default.
236
  *
237
- * @param mixed $date_string A date/time string. Valid formats are explained in http://php.net/manual/en/datetime.formats.php
238
- * @param string $timezone A timezone identifier, like UTC or Europe/Lisbon. The list of valid identifiers is available http://php.net/manual/en/timezones.php
239
  *
240
  * @return ActionScheduler_DateTime
241
  */
10
  * @param string $hook The hook to trigger.
11
  * @param array $args Arguments to pass when the hook triggers.
12
  * @param string $group The group to assign this job to.
13
+ * @return int The action ID.
14
  */
15
  function as_enqueue_async_action( $hook, $args = array(), $group = '' ) {
16
+ ActionScheduler::check_shutdown_hook( __FUNCTION__ );
17
  return ActionScheduler::factory()->async( $hook, $args, $group );
18
  }
19
 
20
  /**
21
  * Schedule an action to run one time
22
  *
23
+ * @param int $timestamp When the job will run.
24
+ * @param string $hook The hook to trigger.
25
+ * @param array $args Arguments to pass when the hook triggers.
26
+ * @param string $group The group to assign this job to.
27
  *
28
+ * @return int The action ID.
29
  */
30
  function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '' ) {
31
+ ActionScheduler::check_shutdown_hook( __FUNCTION__ );
32
  return ActionScheduler::factory()->single( $hook, $args, $timestamp, $group );
33
  }
34
 
35
  /**
36
  * Schedule a recurring action
37
  *
38
+ * @param int $timestamp When the first instance of the job will run.
39
+ * @param int $interval_in_seconds How long to wait between runs.
40
+ * @param string $hook The hook to trigger.
41
+ * @param array $args Arguments to pass when the hook triggers.
42
+ * @param string $group The group to assign this job to.
43
  *
44
+ * @return int The action ID.
45
  */
46
  function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) {
47
+ ActionScheduler::check_shutdown_hook( __FUNCTION__ );
48
  return ActionScheduler::factory()->recurring( $hook, $args, $timestamp, $interval_in_seconds, $group );
49
  }
50
 
65
  * | | +--------------- day of month (1 - 31)
66
  * | +-------------------- hour (0 - 23)
67
  * +------------------------- min (0 - 59)
68
+ * @param string $hook The hook to trigger.
69
+ * @param array $args Arguments to pass when the hook triggers.
70
+ * @param string $group The group to assign this job to.
71
  *
72
+ * @return int The action ID.
73
  */
74
  function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) {
75
+ ActionScheduler::check_shutdown_hook( __FUNCTION__ );
76
  return ActionScheduler::factory()->cron( $hook, $args, $timestamp, $schedule, $group );
77
  }
78
 
86
  * then the following instance will never be scheduled (or exist), which is effectively the same as being unscheduled
87
  * by this method also.
88
  *
89
+ * @param string $hook The hook that the job will trigger.
90
+ * @param array $args Args that would have been passed to the job.
91
+ * @param string $group The group the job is assigned to.
92
  *
93
+ * @return string|null The scheduled action ID if a scheduled action was found, or null if no matching action found.
94
  */
95
  function as_unschedule_action( $hook, $args = array(), $group = '' ) {
96
+ ActionScheduler::check_shutdown_hook( __FUNCTION__ );
97
  $params = array();
98
  if ( is_array($args) ) {
99
  $params['args'] = $args;
113
  /**
114
  * Cancel all occurrences of a scheduled action.
115
  *
116
+ * @param string $hook The hook that the job will trigger.
117
+ * @param array $args Args that would have been passed to the job.
118
+ * @param string $group The group the job is assigned to.
119
  */
120
  function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
121
+ ActionScheduler::check_shutdown_hook( __FUNCTION__ );
122
  if ( empty( $args ) ) {
123
  if ( ! empty( $hook ) && empty( $group ) ) {
124
  ActionScheduler_Store::instance()->cancel_actions_by_hook( $hook );
137
  /**
138
  * Check if there is an existing action in the queue with a given hook, args and group combination.
139
  *
140
+ * An action in the queue could be pending, in-progress or async. If the is pending for a time in
141
  * future, its scheduled date will be returned as a timestamp. If it is currently being run, or an
142
  * async action sitting in the queue waiting to be processed, in which case boolean true will be
143
  * returned. Or there may be no async, in-progress or pending action for this hook, in which case,
150
  * @return int|bool The timestamp for the next occurrence of a pending scheduled action, true for an async or in-progress action or false if there is no matching action.
151
  */
152
  function as_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
153
+ ActionScheduler::check_shutdown_hook( __FUNCTION__ );
154
  $params = array();
155
  if ( is_array($args) ) {
156
  $params['args'] = $args;
198
  * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date'
199
  * 'order' => 'ASC'
200
  *
201
+ * @param string $return_format OBJECT, ARRAY_A, or ids.
202
  *
203
  * @return array
204
  */
205
  function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
206
+ ActionScheduler::check_shutdown_hook( __FUNCTION__ );
207
  $store = ActionScheduler::store();
208
  foreach ( array('date', 'modified') as $key ) {
209
  if ( isset($args[$key]) ) {
242
  * timezone when instantiating datetimes rather than leaving it up to
243
  * the PHP default.
244
  *
245
+ * @param mixed $date_string A date/time string. Valid formats are explained in http://php.net/manual/en/datetime.formats.php.
246
+ * @param string $timezone A timezone identifier, like UTC or Europe/Lisbon. The list of valid identifiers is available http://php.net/manual/en/timezones.php.
247
  *
248
  * @return ActionScheduler_DateTime
249
  */
includes/vendor/action-scheduler/package-lock.json ADDED
@@ -0,0 +1,2138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "action-scheduler",
3
+ "version": "3.0.0",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "@babel/code-frame": {
8
+ "version": "7.5.5",
9
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
10
+ "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
11
+ "dev": true,
12
+ "requires": {
13
+ "@babel/highlight": "^7.0.0"
14
+ }
15
+ },
16
+ "@babel/highlight": {
17
+ "version": "7.5.0",
18
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
19
+ "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
20
+ "dev": true,
21
+ "requires": {
22
+ "chalk": "^2.0.0",
23
+ "esutils": "^2.0.2",
24
+ "js-tokens": "^4.0.0"
25
+ }
26
+ },
27
+ "@nodelib/fs.scandir": {
28
+ "version": "2.1.3",
29
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
30
+ "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
31
+ "dev": true,
32
+ "requires": {
33
+ "@nodelib/fs.stat": "2.0.3",
34
+ "run-parallel": "^1.1.9"
35
+ }
36
+ },
37
+ "@nodelib/fs.stat": {
38
+ "version": "2.0.3",
39
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
40
+ "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
41
+ "dev": true
42
+ },
43
+ "@nodelib/fs.walk": {
44
+ "version": "1.2.4",
45
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
46
+ "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
47
+ "dev": true,
48
+ "requires": {
49
+ "@nodelib/fs.scandir": "2.1.3",
50
+ "fastq": "^1.6.0"
51
+ }
52
+ },
53
+ "@samverschueren/stream-to-observable": {
54
+ "version": "0.3.0",
55
+ "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz",
56
+ "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==",
57
+ "dev": true,
58
+ "requires": {
59
+ "any-observable": "^0.3.0"
60
+ }
61
+ },
62
+ "@types/events": {
63
+ "version": "3.0.0",
64
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
65
+ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
66
+ "dev": true
67
+ },
68
+ "@types/glob": {
69
+ "version": "7.1.1",
70
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
71
+ "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
72
+ "dev": true,
73
+ "requires": {
74
+ "@types/events": "*",
75
+ "@types/minimatch": "*",
76
+ "@types/node": "*"
77
+ }
78
+ },
79
+ "@types/minimatch": {
80
+ "version": "3.0.3",
81
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
82
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
83
+ "dev": true
84
+ },
85
+ "@types/node": {
86
+ "version": "12.11.7",
87
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz",
88
+ "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==",
89
+ "dev": true
90
+ },
91
+ "@types/normalize-package-data": {
92
+ "version": "2.4.0",
93
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
94
+ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
95
+ "dev": true
96
+ },
97
+ "abbrev": {
98
+ "version": "1.1.1",
99
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
100
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
101
+ "dev": true
102
+ },
103
+ "aggregate-error": {
104
+ "version": "3.0.1",
105
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
106
+ "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
107
+ "dev": true,
108
+ "requires": {
109
+ "clean-stack": "^2.0.0",
110
+ "indent-string": "^4.0.0"
111
+ },
112
+ "dependencies": {
113
+ "indent-string": {
114
+ "version": "4.0.0",
115
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
116
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
117
+ "dev": true
118
+ }
119
+ }
120
+ },
121
+ "ansi-escapes": {
122
+ "version": "3.2.0",
123
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
124
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
125
+ "dev": true
126
+ },
127
+ "ansi-regex": {
128
+ "version": "2.1.1",
129
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
130
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
131
+ "dev": true
132
+ },
133
+ "ansi-styles": {
134
+ "version": "3.2.1",
135
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
136
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
137
+ "dev": true,
138
+ "requires": {
139
+ "color-convert": "^1.9.0"
140
+ }
141
+ },
142
+ "any-observable": {
143
+ "version": "0.3.0",
144
+ "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz",
145
+ "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==",
146
+ "dev": true
147
+ },
148
+ "argparse": {
149
+ "version": "1.0.10",
150
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
151
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
152
+ "dev": true,
153
+ "requires": {
154
+ "sprintf-js": "~1.0.2"
155
+ },
156
+ "dependencies": {
157
+ "sprintf-js": {
158
+ "version": "1.0.3",
159
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
160
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
161
+ "dev": true
162
+ }
163
+ }
164
+ },
165
+ "array-find-index": {
166
+ "version": "1.0.2",
167
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
168
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
169
+ "dev": true
170
+ },
171
+ "array-union": {
172
+ "version": "2.1.0",
173
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
174
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
175
+ "dev": true
176
+ },
177
+ "async": {
178
+ "version": "1.5.2",
179
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
180
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
181
+ "dev": true
182
+ },
183
+ "balanced-match": {
184
+ "version": "1.0.0",
185
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
186
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
187
+ "dev": true
188
+ },
189
+ "brace-expansion": {
190
+ "version": "1.1.11",
191
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
192
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
193
+ "dev": true,
194
+ "requires": {
195
+ "balanced-match": "^1.0.0",
196
+ "concat-map": "0.0.1"
197
+ }
198
+ },
199
+ "braces": {
200
+ "version": "3.0.2",
201
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
202
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
203
+ "dev": true,
204
+ "requires": {
205
+ "fill-range": "^7.0.1"
206
+ }
207
+ },
208
+ "caller-callsite": {
209
+ "version": "2.0.0",
210
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
211
+ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
212
+ "dev": true,
213
+ "requires": {
214
+ "callsites": "^2.0.0"
215
+ }
216
+ },
217
+ "caller-path": {
218
+ "version": "2.0.0",
219
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
220
+ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
221
+ "dev": true,
222
+ "requires": {
223
+ "caller-callsite": "^2.0.0"
224
+ }
225
+ },
226
+ "callsites": {
227
+ "version": "2.0.0",
228
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
229
+ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
230
+ "dev": true
231
+ },
232
+ "camelcase": {
233
+ "version": "2.1.1",
234
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
235
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
236
+ "dev": true
237
+ },
238
+ "camelcase-keys": {
239
+ "version": "2.1.0",
240
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
241
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
242
+ "dev": true,
243
+ "requires": {
244
+ "camelcase": "^2.0.0",
245
+ "map-obj": "^1.0.0"
246
+ }
247
+ },
248
+ "chalk": {
249
+ "version": "2.4.2",
250
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
251
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
252
+ "dev": true,
253
+ "requires": {
254
+ "ansi-styles": "^3.2.1",
255
+ "escape-string-regexp": "^1.0.5",
256
+ "supports-color": "^5.3.0"
257
+ }
258
+ },
259
+ "ci-info": {
260
+ "version": "2.0.0",
261
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
262
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
263
+ "dev": true
264
+ },
265
+ "clean-stack": {
266
+ "version": "2.2.0",
267
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
268
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
269
+ "dev": true
270
+ },
271
+ "cli-cursor": {
272
+ "version": "2.1.0",
273
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
274
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
275
+ "dev": true,
276
+ "requires": {
277
+ "restore-cursor": "^2.0.0"
278
+ }
279
+ },
280
+ "cli-truncate": {
281
+ "version": "0.2.1",
282
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
283
+ "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
284
+ "dev": true,
285
+ "requires": {
286
+ "slice-ansi": "0.0.4",
287
+ "string-width": "^1.0.1"
288
+ }
289
+ },
290
+ "code-point-at": {
291
+ "version": "1.1.0",
292
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
293
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
294
+ "dev": true
295
+ },
296
+ "coffeescript": {
297
+ "version": "1.10.0",
298
+ "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz",
299
+ "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=",
300
+ "dev": true
301
+ },
302
+ "color-convert": {
303
+ "version": "1.9.3",
304
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
305
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
306
+ "dev": true,
307
+ "requires": {
308
+ "color-name": "1.1.3"
309
+ }
310
+ },
311
+ "color-name": {
312
+ "version": "1.1.3",
313
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
314
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
315
+ "dev": true
316
+ },
317
+ "colors": {
318
+ "version": "1.1.2",
319
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
320
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
321
+ "dev": true
322
+ },
323
+ "commander": {
324
+ "version": "2.20.3",
325
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
326
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
327
+ "dev": true
328
+ },
329
+ "concat-map": {
330
+ "version": "0.0.1",
331
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
332
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
333
+ "dev": true
334
+ },
335
+ "cosmiconfig": {
336
+ "version": "5.2.1",
337
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
338
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
339
+ "dev": true,
340
+ "requires": {
341
+ "import-fresh": "^2.0.0",
342
+ "is-directory": "^0.3.1",
343
+ "js-yaml": "^3.13.1",
344
+ "parse-json": "^4.0.0"
345
+ },
346
+ "dependencies": {
347
+ "parse-json": {
348
+ "version": "4.0.0",
349
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
350
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
351
+ "dev": true,
352
+ "requires": {
353
+ "error-ex": "^1.3.1",
354
+ "json-parse-better-errors": "^1.0.1"
355
+ }
356
+ }
357
+ }
358
+ },
359
+ "cross-spawn": {
360
+ "version": "6.0.5",
361
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
362
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
363
+ "dev": true,
364
+ "requires": {
365
+ "nice-try": "^1.0.4",
366
+ "path-key": "^2.0.1",
367
+ "semver": "^5.5.0",
368
+ "shebang-command": "^1.2.0",
369
+ "which": "^1.2.9"
370
+ }
371
+ },
372
+ "currently-unhandled": {
373
+ "version": "0.4.1",
374
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
375
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
376
+ "dev": true,
377
+ "requires": {
378
+ "array-find-index": "^1.0.1"
379
+ }
380
+ },
381
+ "date-fns": {
382
+ "version": "1.30.1",
383
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
384
+ "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==",
385
+ "dev": true
386
+ },
387
+ "dateformat": {
388
+ "version": "1.0.12",
389
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
390
+ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
391
+ "dev": true,
392
+ "requires": {
393
+ "get-stdin": "^4.0.1",
394
+ "meow": "^3.3.0"
395
+ }
396
+ },
397
+ "debug": {
398
+ "version": "4.1.1",
399
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
400
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
401
+ "dev": true,
402
+ "requires": {
403
+ "ms": "^2.1.1"
404
+ }
405
+ },
406
+ "decamelize": {
407
+ "version": "1.2.0",
408
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
409
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
410
+ "dev": true
411
+ },
412
+ "dedent": {
413
+ "version": "0.7.0",
414
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
415
+ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
416
+ "dev": true
417
+ },
418
+ "del": {
419
+ "version": "5.1.0",
420
+ "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz",
421
+ "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==",
422
+ "dev": true,
423
+ "requires": {
424
+ "globby": "^10.0.1",
425
+ "graceful-fs": "^4.2.2",
426
+ "is-glob": "^4.0.1",
427
+ "is-path-cwd": "^2.2.0",
428
+ "is-path-inside": "^3.0.1",
429
+ "p-map": "^3.0.0",
430
+ "rimraf": "^3.0.0",
431
+ "slash": "^3.0.0"
432
+ },
433
+ "dependencies": {
434
+ "glob": {
435
+ "version": "7.1.5",
436
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
437
+ "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
438
+ "dev": true,
439
+ "requires": {
440
+ "fs.realpath": "^1.0.0",
441
+ "inflight": "^1.0.4",
442
+ "inherits": "2",
443
+ "minimatch": "^3.0.4",
444
+ "once": "^1.3.0",
445
+ "path-is-absolute": "^1.0.0"
446
+ }
447
+ },
448
+ "rimraf": {
449
+ "version": "3.0.0",
450
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
451
+ "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
452
+ "dev": true,
453
+ "requires": {
454
+ "glob": "^7.1.3"
455
+ }
456
+ }
457
+ }
458
+ },
459
+ "dir-glob": {
460
+ "version": "3.0.1",
461
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
462
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
463
+ "dev": true,
464
+ "requires": {
465
+ "path-type": "^4.0.0"
466
+ },
467
+ "dependencies": {
468
+ "path-type": {
469
+ "version": "4.0.0",
470
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
471
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
472
+ "dev": true
473
+ }
474
+ }
475
+ },
476
+ "elegant-spinner": {
477
+ "version": "1.0.1",
478
+ "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
479
+ "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
480
+ "dev": true
481
+ },
482
+ "end-of-stream": {
483
+ "version": "1.4.4",
484
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
485
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
486
+ "dev": true,
487
+ "requires": {
488
+ "once": "^1.4.0"
489
+ }
490
+ },
491
+ "error-ex": {
492
+ "version": "1.3.2",
493
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
494
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
495
+ "dev": true,
496
+ "requires": {
497
+ "is-arrayish": "^0.2.1"
498
+ }
499
+ },
500
+ "escape-string-regexp": {
501
+ "version": "1.0.5",
502
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
503
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
504
+ "dev": true
505
+ },
506
+ "esprima": {
507
+ "version": "4.0.1",
508
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
509
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
510
+ "dev": true
511
+ },
512
+ "esutils": {
513
+ "version": "2.0.3",
514
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
515
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
516
+ "dev": true
517
+ },
518
+ "eventemitter2": {
519
+ "version": "0.4.14",
520
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
521
+ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
522
+ "dev": true
523
+ },
524
+ "execa": {
525
+ "version": "1.0.0",
526
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
527
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
528
+ "dev": true,
529
+ "requires": {
530
+ "cross-spawn": "^6.0.0",
531
+ "get-stream": "^4.0.0",
532
+ "is-stream": "^1.1.0",
533
+ "npm-run-path": "^2.0.0",
534
+ "p-finally": "^1.0.0",
535
+ "signal-exit": "^3.0.0",
536
+ "strip-eof": "^1.0.0"
537
+ }
538
+ },
539
+ "exit": {
540
+ "version": "0.1.2",
541
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
542
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
543
+ "dev": true
544
+ },
545
+ "fast-glob": {
546
+ "version": "3.1.0",
547
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.0.tgz",
548
+ "integrity": "sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==",
549
+ "dev": true,
550
+ "requires": {
551
+ "@nodelib/fs.stat": "^2.0.2",
552
+ "@nodelib/fs.walk": "^1.2.3",
553
+ "glob-parent": "^5.1.0",
554
+ "merge2": "^1.3.0",
555
+ "micromatch": "^4.0.2"
556
+ }
557
+ },
558
+ "fastq": {
559
+ "version": "1.6.0",
560
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz",
561
+ "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==",
562
+ "dev": true,
563
+ "requires": {
564
+ "reusify": "^1.0.0"
565
+ }
566
+ },
567
+ "figures": {
568
+ "version": "1.7.0",
569
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
570
+ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
571
+ "dev": true,
572
+ "requires": {
573
+ "escape-string-regexp": "^1.0.5",
574
+ "object-assign": "^4.1.0"
575
+ }
576
+ },
577
+ "fill-range": {
578
+ "version": "7.0.1",
579
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
580
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
581
+ "dev": true,
582
+ "requires": {
583
+ "to-regex-range": "^5.0.1"
584
+ }
585
+ },
586
+ "find-up": {
587
+ "version": "1.1.2",
588
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
589
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
590
+ "dev": true,
591
+ "requires": {
592
+ "path-exists": "^2.0.0",
593
+ "pinkie-promise": "^2.0.0"
594
+ }
595
+ },
596
+ "findup-sync": {
597
+ "version": "0.3.0",
598
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
599
+ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
600
+ "dev": true,
601
+ "requires": {
602
+ "glob": "~5.0.0"
603
+ },
604
+ "dependencies": {
605
+ "glob": {
606
+ "version": "5.0.15",
607
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
608
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
609
+ "dev": true,
610
+ "requires": {
611
+ "inflight": "^1.0.4",
612
+ "inherits": "2",
613
+ "minimatch": "2 || 3",
614
+ "once": "^1.3.0",
615
+ "path-is-absolute": "^1.0.0"
616
+ }
617
+ }
618
+ }
619
+ },
620
+ "fs.realpath": {
621
+ "version": "1.0.0",
622
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
623
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
624
+ "dev": true
625
+ },
626
+ "get-own-enumerable-property-symbols": {
627
+ "version": "3.0.1",
628
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz",
629
+ "integrity": "sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA==",
630
+ "dev": true
631
+ },
632
+ "get-stdin": {
633
+ "version": "4.0.1",
634
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
635
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
636
+ "dev": true
637
+ },
638
+ "get-stream": {
639
+ "version": "4.1.0",
640
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
641
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
642
+ "dev": true,
643
+ "requires": {
644
+ "pump": "^3.0.0"
645
+ }
646
+ },
647
+ "getobject": {
648
+ "version": "0.1.0",
649
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
650
+ "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
651
+ "dev": true
652
+ },
653
+ "glob": {
654
+ "version": "7.0.6",
655
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
656
+ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
657
+ "dev": true,
658
+ "requires": {
659
+ "fs.realpath": "^1.0.0",
660
+ "inflight": "^1.0.4",
661
+ "inherits": "2",
662
+ "minimatch": "^3.0.2",
663
+ "once": "^1.3.0",
664
+ "path-is-absolute": "^1.0.0"
665
+ }
666
+ },
667
+ "glob-parent": {
668
+ "version": "5.1.0",
669
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
670
+ "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
671
+ "dev": true,
672
+ "requires": {
673
+ "is-glob": "^4.0.1"
674
+ }
675
+ },
676
+ "globby": {
677
+ "version": "10.0.1",
678
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz",
679
+ "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==",
680
+ "dev": true,
681
+ "requires": {
682
+ "@types/glob": "^7.1.1",
683
+ "array-union": "^2.1.0",
684
+ "dir-glob": "^3.0.1",
685
+ "fast-glob": "^3.0.3",
686
+ "glob": "^7.1.3",
687
+ "ignore": "^5.1.1",
688
+ "merge2": "^1.2.3",
689
+ "slash": "^3.0.0"
690
+ },
691
+ "dependencies": {
692
+ "glob": {
693
+ "version": "7.1.5",
694
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
695
+ "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
696
+ "dev": true,
697
+ "requires": {
698
+ "fs.realpath": "^1.0.0",
699
+ "inflight": "^1.0.4",
700
+ "inherits": "2",
701
+ "minimatch": "^3.0.4",
702
+ "once": "^1.3.0",
703
+ "path-is-absolute": "^1.0.0"
704
+ }
705
+ }
706
+ }
707
+ },
708
+ "graceful-fs": {
709
+ "version": "4.2.3",
710
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
711
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
712
+ "dev": true
713
+ },
714
+ "grunt": {
715
+ "version": "1.0.4",
716
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz",
717
+ "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==",
718
+ "dev": true,
719
+ "requires": {
720
+ "coffeescript": "~1.10.0",
721
+ "dateformat": "~1.0.12",
722
+ "eventemitter2": "~0.4.13",
723
+ "exit": "~0.1.1",
724
+ "findup-sync": "~0.3.0",
725
+ "glob": "~7.0.0",
726
+ "grunt-cli": "~1.2.0",
727
+ "grunt-known-options": "~1.1.0",
728
+ "grunt-legacy-log": "~2.0.0",
729
+ "grunt-legacy-util": "~1.1.1",
730
+ "iconv-lite": "~0.4.13",
731
+ "js-yaml": "~3.13.0",
732
+ "minimatch": "~3.0.2",
733
+ "mkdirp": "~0.5.1",
734
+ "nopt": "~3.0.6",
735
+ "path-is-absolute": "~1.0.0",
736
+ "rimraf": "~2.6.2"
737
+ },
738
+ "dependencies": {
739
+ "grunt-cli": {
740
+ "version": "1.2.0",
741
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
742
+ "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
743
+ "dev": true,
744
+ "requires": {
745
+ "findup-sync": "~0.3.0",
746
+ "grunt-known-options": "~1.1.0",
747
+ "nopt": "~3.0.6",
748
+ "resolve": "~1.1.0"
749
+ }
750
+ },
751
+ "resolve": {
752
+ "version": "1.1.7",
753
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
754
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
755
+ "dev": true
756
+ }
757
+ }
758
+ },
759
+ "grunt-checktextdomain": {
760
+ "version": "1.0.1",
761
+ "resolved": "https://registry.npmjs.org/grunt-checktextdomain/-/grunt-checktextdomain-1.0.1.tgz",
762
+ "integrity": "sha1-slTQHh3pEwBdTbHFMD2QI7mD4Zs=",
763
+ "dev": true,
764
+ "requires": {
765
+ "chalk": "~0.2.1",
766
+ "text-table": "~0.2.0"
767
+ },
768
+ "dependencies": {
769
+ "ansi-styles": {
770
+ "version": "0.2.0",
771
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-0.2.0.tgz",
772
+ "integrity": "sha1-NZq0sV3NZLptdHNLcsNjYKmvLBk=",
773
+ "dev": true
774
+ },
775
+ "chalk": {
776
+ "version": "0.2.1",
777
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz",
778
+ "integrity": "sha1-dhPhV1FFshOGSD9/SFql/6jL0Qw=",
779
+ "dev": true,
780
+ "requires": {
781
+ "ansi-styles": "~0.2.0",
782
+ "has-color": "~0.1.0"
783
+ }
784
+ }
785
+ }
786
+ },
787
+ "grunt-known-options": {
788
+ "version": "1.1.1",
789
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
790
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
791
+ "dev": true
792
+ },
793
+ "grunt-legacy-log": {
794
+ "version": "2.0.0",
795
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
796
+ "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
797
+ "dev": true,
798
+ "requires": {
799
+ "colors": "~1.1.2",
800
+ "grunt-legacy-log-utils": "~2.0.0",
801
+ "hooker": "~0.2.3",
802
+ "lodash": "~4.17.5"
803
+ }
804
+ },
805
+ "grunt-legacy-log-utils": {
806
+ "version": "2.0.1",
807
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
808
+ "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
809
+ "dev": true,
810
+ "requires": {
811
+ "chalk": "~2.4.1",
812
+ "lodash": "~4.17.10"
813
+ }
814
+ },
815
+ "grunt-legacy-util": {
816
+ "version": "1.1.1",
817
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
818
+ "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
819
+ "dev": true,
820
+ "requires": {
821
+ "async": "~1.5.2",
822
+ "exit": "~0.1.1",
823
+ "getobject": "~0.1.0",
824
+ "hooker": "~0.2.3",
825
+ "lodash": "~4.17.10",
826
+ "underscore.string": "~3.3.4",
827
+ "which": "~1.3.0"
828
+ }
829
+ },
830
+ "grunt-phpcs": {
831
+ "version": "0.4.0",
832
+ "resolved": "https://registry.npmjs.org/grunt-phpcs/-/grunt-phpcs-0.4.0.tgz",
833
+ "integrity": "sha1-oI1iX8ZEZeRTsr2T+BCyqB6Uvao=",
834
+ "dev": true
835
+ },
836
+ "has-ansi": {
837
+ "version": "2.0.0",
838
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
839
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
840
+ "dev": true,
841
+ "requires": {
842
+ "ansi-regex": "^2.0.0"
843
+ }
844
+ },
845
+ "has-color": {
846
+ "version": "0.1.7",
847
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
848
+ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
849
+ "dev": true
850
+ },
851
+ "has-flag": {
852
+ "version": "3.0.0",
853
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
854
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
855
+ "dev": true
856
+ },
857
+ "hooker": {
858
+ "version": "0.2.3",
859
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
860
+ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
861
+ "dev": true
862
+ },
863
+ "hosted-git-info": {
864
+ "version": "2.8.5",
865
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
866
+ "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
867
+ "dev": true
868
+ },
869
+ "husky": {
870
+ "version": "3.0.9",
871
+ "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.9.tgz",
872
+ "integrity": "sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg==",
873
+ "dev": true,
874
+ "requires": {
875
+ "chalk": "^2.4.2",
876
+ "ci-info": "^2.0.0",
877
+ "cosmiconfig": "^5.2.1",
878
+ "execa": "^1.0.0",
879
+ "get-stdin": "^7.0.0",
880
+ "opencollective-postinstall": "^2.0.2",
881
+ "pkg-dir": "^4.2.0",
882
+ "please-upgrade-node": "^3.2.0",
883
+ "read-pkg": "^5.2.0",
884
+ "run-node": "^1.0.0",
885
+ "slash": "^3.0.0"
886
+ },
887
+ "dependencies": {
888
+ "get-stdin": {
889
+ "version": "7.0.0",
890
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
891
+ "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
892
+ "dev": true
893
+ },
894
+ "parse-json": {
895
+ "version": "5.0.0",
896
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
897
+ "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
898
+ "dev": true,
899
+ "requires": {
900
+ "@babel/code-frame": "^7.0.0",
901
+ "error-ex": "^1.3.1",
902
+ "json-parse-better-errors": "^1.0.1",
903
+ "lines-and-columns": "^1.1.6"
904
+ }
905
+ },
906
+ "read-pkg": {
907
+ "version": "5.2.0",
908
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
909
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
910
+ "dev": true,
911
+ "requires": {
912
+ "@types/normalize-package-data": "^2.4.0",
913
+ "normalize-package-data": "^2.5.0",
914
+ "parse-json": "^5.0.0",
915
+ "type-fest": "^0.6.0"
916
+ }
917
+ }
918
+ }
919
+ },
920
+ "iconv-lite": {
921
+ "version": "0.4.24",
922
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
923
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
924
+ "dev": true,
925
+ "requires": {
926
+ "safer-buffer": ">= 2.1.2 < 3"
927
+ }
928
+ },
929
+ "ignore": {
930
+ "version": "5.1.4",
931
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
932
+ "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
933
+ "dev": true
934
+ },
935
+ "import-fresh": {
936
+ "version": "2.0.0",
937
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
938
+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
939
+ "dev": true,
940
+ "requires": {
941
+ "caller-path": "^2.0.0",
942
+ "resolve-from": "^3.0.0"
943
+ }
944
+ },
945
+ "indent-string": {
946
+ "version": "2.1.0",
947
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
948
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
949
+ "dev": true,
950
+ "requires": {
951
+ "repeating": "^2.0.0"
952
+ }
953
+ },
954
+ "inflight": {
955
+ "version": "1.0.6",
956
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
957
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
958
+ "dev": true,
959
+ "requires": {
960
+ "once": "^1.3.0",
961
+ "wrappy": "1"
962
+ }
963
+ },
964
+ "inherits": {
965
+ "version": "2.0.4",
966
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
967
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
968
+ "dev": true
969
+ },
970
+ "is-arrayish": {
971
+ "version": "0.2.1",
972
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
973
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
974
+ "dev": true
975
+ },
976
+ "is-directory": {
977
+ "version": "0.3.1",
978
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
979
+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
980
+ "dev": true
981
+ },
982
+ "is-extglob": {
983
+ "version": "2.1.1",
984
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
985
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
986
+ "dev": true
987
+ },
988
+ "is-finite": {
989
+ "version": "1.0.2",
990
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
991
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
992
+ "dev": true,
993
+ "requires": {
994
+ "number-is-nan": "^1.0.0"
995
+ }
996
+ },
997
+ "is-fullwidth-code-point": {
998
+ "version": "1.0.0",
999
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1000
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1001
+ "dev": true,
1002
+ "requires": {
1003
+ "number-is-nan": "^1.0.0"
1004
+ }
1005
+ },
1006
+ "is-glob": {
1007
+ "version": "4.0.1",
1008
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1009
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1010
+ "dev": true,
1011
+ "requires": {
1012
+ "is-extglob": "^2.1.1"
1013
+ }
1014
+ },
1015
+ "is-number": {
1016
+ "version": "7.0.0",
1017
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1018
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1019
+ "dev": true
1020
+ },
1021
+ "is-obj": {
1022
+ "version": "1.0.1",
1023
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
1024
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
1025
+ "dev": true
1026
+ },
1027
+ "is-observable": {
1028
+ "version": "1.1.0",
1029
+ "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz",
1030
+ "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==",
1031
+ "dev": true,
1032
+ "requires": {
1033
+ "symbol-observable": "^1.1.0"
1034
+ }
1035
+ },
1036
+ "is-path-cwd": {
1037
+ "version": "2.2.0",
1038
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
1039
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
1040
+ "dev": true
1041
+ },
1042
+ "is-path-inside": {
1043
+ "version": "3.0.2",
1044
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
1045
+ "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
1046
+ "dev": true
1047
+ },
1048
+ "is-promise": {
1049
+ "version": "2.1.0",
1050
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
1051
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
1052
+ "dev": true
1053
+ },
1054
+ "is-regexp": {
1055
+ "version": "1.0.0",
1056
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
1057
+ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
1058
+ "dev": true
1059
+ },
1060
+ "is-stream": {
1061
+ "version": "1.1.0",
1062
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1063
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
1064
+ "dev": true
1065
+ },
1066
+ "is-utf8": {
1067
+ "version": "0.2.1",
1068
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1069
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1070
+ "dev": true
1071
+ },
1072
+ "isexe": {
1073
+ "version": "2.0.0",
1074
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1075
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1076
+ "dev": true
1077
+ },
1078
+ "js-tokens": {
1079
+ "version": "4.0.0",
1080
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1081
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1082
+ "dev": true
1083
+ },
1084
+ "js-yaml": {
1085
+ "version": "3.13.1",
1086
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
1087
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
1088
+ "dev": true,
1089
+ "requires": {
1090
+ "argparse": "^1.0.7",
1091
+ "esprima": "^4.0.0"
1092
+ }
1093
+ },
1094
+ "json-parse-better-errors": {
1095
+ "version": "1.0.2",
1096
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
1097
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
1098
+ "dev": true
1099
+ },
1100
+ "lines-and-columns": {
1101
+ "version": "1.1.6",
1102
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
1103
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
1104
+ "dev": true
1105
+ },
1106
+ "lint-staged": {
1107
+ "version": "9.4.2",
1108
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.4.2.tgz",
1109
+ "integrity": "sha512-OFyGokJSWTn2M6vngnlLXjaHhi8n83VIZZ5/1Z26SULRUWgR3ITWpAEQC9Pnm3MC/EpCxlwts/mQWDHNji2+zA==",
1110
+ "dev": true,
1111
+ "requires": {
1112
+ "chalk": "^2.4.2",
1113
+ "commander": "^2.20.0",
1114
+ "cosmiconfig": "^5.2.1",
1115
+ "debug": "^4.1.1",
1116
+ "dedent": "^0.7.0",
1117
+ "del": "^5.0.0",
1118
+ "execa": "^2.0.3",
1119
+ "listr": "^0.14.3",
1120
+ "log-symbols": "^3.0.0",
1121
+ "micromatch": "^4.0.2",
1122
+ "normalize-path": "^3.0.0",
1123
+ "please-upgrade-node": "^3.1.1",
1124
+ "string-argv": "^0.3.0",
1125
+ "stringify-object": "^3.3.0"
1126
+ },
1127
+ "dependencies": {
1128
+ "cross-spawn": {
1129
+ "version": "7.0.1",
1130
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
1131
+ "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
1132
+ "dev": true,
1133
+ "requires": {
1134
+ "path-key": "^3.1.0",
1135
+ "shebang-command": "^2.0.0",
1136
+ "which": "^2.0.1"
1137
+ }
1138
+ },
1139
+ "execa": {
1140
+ "version": "2.1.0",
1141
+ "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
1142
+ "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
1143
+ "dev": true,
1144
+ "requires": {
1145
+ "cross-spawn": "^7.0.0",
1146
+ "get-stream": "^5.0.0",
1147
+ "is-stream": "^2.0.0",
1148
+ "merge-stream": "^2.0.0",
1149
+ "npm-run-path": "^3.0.0",
1150
+ "onetime": "^5.1.0",
1151
+ "p-finally": "^2.0.0",
1152
+ "signal-exit": "^3.0.2",
1153
+ "strip-final-newline": "^2.0.0"
1154
+ }
1155
+ },
1156
+ "get-stream": {
1157
+ "version": "5.1.0",
1158
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
1159
+ "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
1160
+ "dev": true,
1161
+ "requires": {
1162
+ "pump": "^3.0.0"
1163
+ }
1164
+ },
1165
+ "is-stream": {
1166
+ "version": "2.0.0",
1167
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
1168
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
1169
+ "dev": true
1170
+ },
1171
+ "npm-run-path": {
1172
+ "version": "3.1.0",
1173
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
1174
+ "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
1175
+ "dev": true,
1176
+ "requires": {
1177
+ "path-key": "^3.0.0"
1178
+ }
1179
+ },
1180
+ "p-finally": {
1181
+ "version": "2.0.1",
1182
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
1183
+ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
1184
+ "dev": true
1185
+ },
1186
+ "path-key": {
1187
+ "version": "3.1.0",
1188
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
1189
+ "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
1190
+ "dev": true
1191
+ },
1192
+ "shebang-command": {
1193
+ "version": "2.0.0",
1194
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1195
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1196
+ "dev": true,
1197
+ "requires": {
1198
+ "shebang-regex": "^3.0.0"
1199
+ }
1200
+ },
1201
+ "shebang-regex": {
1202
+ "version": "3.0.0",
1203
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1204
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1205
+ "dev": true
1206
+ },
1207
+ "which": {
1208
+ "version": "2.0.1",
1209
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
1210
+ "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
1211
+ "dev": true,
1212
+ "requires": {
1213
+ "isexe": "^2.0.0"
1214
+ }
1215
+ }
1216
+ }
1217
+ },
1218
+ "listr": {
1219
+ "version": "0.14.3",
1220
+ "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz",
1221
+ "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==",
1222
+ "dev": true,
1223
+ "requires": {
1224
+ "@samverschueren/stream-to-observable": "^0.3.0",
1225
+ "is-observable": "^1.1.0",
1226
+ "is-promise": "^2.1.0",
1227
+ "is-stream": "^1.1.0",
1228
+ "listr-silent-renderer": "^1.1.1",
1229
+ "listr-update-renderer": "^0.5.0",
1230
+ "listr-verbose-renderer": "^0.5.0",
1231
+ "p-map": "^2.0.0",
1232
+ "rxjs": "^6.3.3"
1233
+ },
1234
+ "dependencies": {
1235
+ "p-map": {
1236
+ "version": "2.1.0",
1237
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
1238
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
1239
+ "dev": true
1240
+ }
1241
+ }
1242
+ },
1243
+ "listr-silent-renderer": {
1244
+ "version": "1.1.1",
1245
+ "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz",
1246
+ "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
1247
+ "dev": true
1248
+ },
1249
+ "listr-update-renderer": {
1250
+ "version": "0.5.0",
1251
+ "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz",
1252
+ "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==",
1253
+ "dev": true,
1254
+ "requires": {
1255
+ "chalk": "^1.1.3",
1256
+ "cli-truncate": "^0.2.1",
1257
+ "elegant-spinner": "^1.0.1",
1258
+ "figures": "^1.7.0",
1259
+ "indent-string": "^3.0.0",
1260
+ "log-symbols": "^1.0.2",
1261
+ "log-update": "^2.3.0",
1262
+ "strip-ansi": "^3.0.1"
1263
+ },
1264
+ "dependencies": {
1265
+ "ansi-styles": {
1266
+ "version": "2.2.1",
1267
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1268
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1269
+ "dev": true
1270
+ },
1271
+ "chalk": {
1272
+ "version": "1.1.3",
1273
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1274
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1275
+ "dev": true,
1276
+ "requires": {
1277
+ "ansi-styles": "^2.2.1",
1278
+ "escape-string-regexp": "^1.0.2",
1279
+ "has-ansi": "^2.0.0",
1280
+ "strip-ansi": "^3.0.0",
1281
+ "supports-color": "^2.0.0"
1282
+ }
1283
+ },
1284
+ "indent-string": {
1285
+ "version": "3.2.0",
1286
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
1287
+ "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
1288
+ "dev": true
1289
+ },
1290
+ "log-symbols": {
1291
+ "version": "1.0.2",
1292
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
1293
+ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
1294
+ "dev": true,
1295
+ "requires": {
1296
+ "chalk": "^1.0.0"
1297
+ }
1298
+ },
1299
+ "supports-color": {
1300
+ "version": "2.0.0",
1301
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1302
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1303
+ "dev": true
1304
+ }
1305
+ }
1306
+ },
1307
+ "listr-verbose-renderer": {
1308
+ "version": "0.5.0",
1309
+ "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz",
1310
+ "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==",
1311
+ "dev": true,
1312
+ "requires": {
1313
+ "chalk": "^2.4.1",
1314
+ "cli-cursor": "^2.1.0",
1315
+ "date-fns": "^1.27.2",
1316
+ "figures": "^2.0.0"
1317
+ },
1318
+ "dependencies": {
1319
+ "figures": {
1320
+ "version": "2.0.0",
1321
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
1322
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
1323
+ "dev": true,
1324
+ "requires": {
1325
+ "escape-string-regexp": "^1.0.5"
1326
+ }
1327
+ }
1328
+ }
1329
+ },
1330
+ "load-json-file": {
1331
+ "version": "1.1.0",
1332
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
1333
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
1334
+ "dev": true,
1335
+ "requires": {
1336
+ "graceful-fs": "^4.1.2",
1337
+ "parse-json": "^2.2.0",
1338
+ "pify": "^2.0.0",
1339
+ "pinkie-promise": "^2.0.0",
1340
+ "strip-bom": "^2.0.0"
1341
+ }
1342
+ },
1343
+ "locate-path": {
1344
+ "version": "5.0.0",
1345
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
1346
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
1347
+ "dev": true,
1348
+ "requires": {
1349
+ "p-locate": "^4.1.0"
1350
+ }
1351
+ },
1352
+ "lodash": {
1353
+ "version": "4.17.15",
1354
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1355
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
1356
+ "dev": true
1357
+ },
1358
+ "log-symbols": {
1359
+ "version": "3.0.0",
1360
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
1361
+ "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
1362
+ "dev": true,
1363
+ "requires": {
1364
+ "chalk": "^2.4.2"
1365
+ }
1366
+ },
1367
+ "log-update": {
1368
+ "version": "2.3.0",
1369
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz",
1370
+ "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=",
1371
+ "dev": true,
1372
+ "requires": {
1373
+ "ansi-escapes": "^3.0.0",
1374
+ "cli-cursor": "^2.0.0",
1375
+ "wrap-ansi": "^3.0.1"
1376
+ }
1377
+ },
1378
+ "loud-rejection": {
1379
+ "version": "1.6.0",
1380
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
1381
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
1382
+ "dev": true,
1383
+ "requires": {
1384
+ "currently-unhandled": "^0.4.1",
1385
+ "signal-exit": "^3.0.0"
1386
+ }
1387
+ },
1388
+ "map-obj": {
1389
+ "version": "1.0.1",
1390
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
1391
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
1392
+ "dev": true
1393
+ },
1394
+ "meow": {
1395
+ "version": "3.7.0",
1396
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
1397
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
1398
+ "dev": true,
1399
+ "requires": {
1400
+ "camelcase-keys": "^2.0.0",
1401
+ "decamelize": "^1.1.2",
1402
+ "loud-rejection": "^1.0.0",
1403
+ "map-obj": "^1.0.1",
1404
+ "minimist": "^1.1.3",
1405
+ "normalize-package-data": "^2.3.4",
1406
+ "object-assign": "^4.0.1",
1407
+ "read-pkg-up": "^1.0.1",
1408
+ "redent": "^1.0.0",
1409
+ "trim-newlines": "^1.0.0"
1410
+ }
1411
+ },
1412
+ "merge-stream": {
1413
+ "version": "2.0.0",
1414
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1415
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
1416
+ "dev": true
1417
+ },
1418
+ "merge2": {
1419
+ "version": "1.3.0",
1420
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
1421
+ "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
1422
+ "dev": true
1423
+ },
1424
+ "micromatch": {
1425
+ "version": "4.0.2",
1426
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
1427
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
1428
+ "dev": true,
1429
+ "requires": {
1430
+ "braces": "^3.0.1",
1431
+ "picomatch": "^2.0.5"
1432
+ }
1433
+ },
1434
+ "mimic-fn": {
1435
+ "version": "2.1.0",
1436
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1437
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1438
+ "dev": true
1439
+ },
1440
+ "minimatch": {
1441
+ "version": "3.0.4",
1442
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1443
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1444
+ "dev": true,
1445
+ "requires": {
1446
+ "brace-expansion": "^1.1.7"
1447
+ }
1448
+ },
1449
+ "minimist": {
1450
+ "version": "1.2.0",
1451
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1452
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
1453
+ "dev": true
1454
+ },
1455
+ "mkdirp": {
1456
+ "version": "0.5.1",
1457
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1458
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1459
+ "dev": true,
1460
+ "requires": {
1461
+ "minimist": "0.0.8"
1462
+ },
1463
+ "dependencies": {
1464
+ "minimist": {
1465
+ "version": "0.0.8",
1466
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1467
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1468
+ "dev": true
1469
+ }
1470
+ }
1471
+ },
1472
+ "ms": {
1473
+ "version": "2.1.2",
1474
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1475
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1476
+ "dev": true
1477
+ },
1478
+ "nice-try": {
1479
+ "version": "1.0.5",
1480
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
1481
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
1482
+ "dev": true
1483
+ },
1484
+ "nopt": {
1485
+ "version": "3.0.6",
1486
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
1487
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
1488
+ "dev": true,
1489
+ "requires": {
1490
+ "abbrev": "1"
1491
+ }
1492
+ },
1493
+ "normalize-package-data": {
1494
+ "version": "2.5.0",
1495
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
1496
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
1497
+ "dev": true,
1498
+ "requires": {
1499
+ "hosted-git-info": "^2.1.4",
1500
+ "resolve": "^1.10.0",
1501
+ "semver": "2 || 3 || 4 || 5",
1502
+ "validate-npm-package-license": "^3.0.1"
1503
+ }
1504
+ },
1505
+ "normalize-path": {
1506
+ "version": "3.0.0",
1507
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1508
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1509
+ "dev": true
1510
+ },
1511
+ "npm-run-path": {
1512
+ "version": "2.0.2",
1513
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
1514
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
1515
+ "dev": true,
1516
+ "requires": {
1517
+ "path-key": "^2.0.0"
1518
+ }
1519
+ },
1520
+ "number-is-nan": {
1521
+ "version": "1.0.1",
1522
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1523
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
1524
+ "dev": true
1525
+ },
1526
+ "object-assign": {
1527
+ "version": "4.1.1",
1528
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1529
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1530
+ "dev": true
1531
+ },
1532
+ "once": {
1533
+ "version": "1.4.0",
1534
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1535
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1536
+ "dev": true,
1537
+ "requires": {
1538
+ "wrappy": "1"
1539
+ }
1540
+ },
1541
+ "onetime": {
1542
+ "version": "5.1.0",
1543
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
1544
+ "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
1545
+ "dev": true,
1546
+ "requires": {
1547
+ "mimic-fn": "^2.1.0"
1548
+ }
1549
+ },
1550
+ "opencollective-postinstall": {
1551
+ "version": "2.0.2",
1552
+ "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz",
1553
+ "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==",
1554
+ "dev": true
1555
+ },
1556
+ "p-finally": {
1557
+ "version": "1.0.0",
1558
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
1559
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
1560
+ "dev": true
1561
+ },
1562
+ "p-limit": {
1563
+ "version": "2.2.1",
1564
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
1565
+ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
1566
+ "dev": true,
1567
+ "requires": {
1568
+ "p-try": "^2.0.0"
1569
+ }
1570
+ },
1571
+ "p-locate": {
1572
+ "version": "4.1.0",
1573
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
1574
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
1575
+ "dev": true,
1576
+ "requires": {
1577
+ "p-limit": "^2.2.0"
1578
+ }
1579
+ },
1580
+ "p-map": {
1581
+ "version": "3.0.0",
1582
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
1583
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
1584
+ "dev": true,
1585
+ "requires": {
1586
+ "aggregate-error": "^3.0.0"
1587
+ }
1588
+ },
1589
+ "p-try": {
1590
+ "version": "2.2.0",
1591
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1592
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1593
+ "dev": true
1594
+ },
1595
+ "parse-json": {
1596
+ "version": "2.2.0",
1597
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
1598
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
1599
+ "dev": true,
1600
+ "requires": {
1601
+ "error-ex": "^1.2.0"
1602
+ }
1603
+ },
1604
+ "path-exists": {
1605
+ "version": "2.1.0",
1606
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
1607
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
1608
+ "dev": true,
1609
+ "requires": {
1610
+ "pinkie-promise": "^2.0.0"
1611
+ }
1612
+ },
1613
+ "path-is-absolute": {
1614
+ "version": "1.0.1",
1615
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1616
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1617
+ "dev": true
1618
+ },
1619
+ "path-key": {
1620
+ "version": "2.0.1",
1621
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1622
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
1623
+ "dev": true
1624
+ },
1625
+ "path-parse": {
1626
+ "version": "1.0.6",
1627
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1628
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1629
+ "dev": true
1630
+ },
1631
+ "path-type": {
1632
+ "version": "1.1.0",
1633
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
1634
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
1635
+ "dev": true,
1636
+ "requires": {
1637
+ "graceful-fs": "^4.1.2",
1638
+ "pify": "^2.0.0",
1639
+ "pinkie-promise": "^2.0.0"
1640
+ }
1641
+ },
1642
+ "picomatch": {
1643
+ "version": "2.0.7",
1644
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
1645
+ "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==",
1646
+ "dev": true
1647
+ },
1648
+ "pify": {
1649
+ "version": "2.3.0",
1650
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1651
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1652
+ "dev": true
1653
+ },
1654
+ "pinkie": {
1655
+ "version": "2.0.4",
1656
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1657
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
1658
+ "dev": true
1659
+ },
1660
+ "pinkie-promise": {
1661
+ "version": "2.0.1",
1662
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1663
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
1664
+ "dev": true,
1665
+ "requires": {
1666
+ "pinkie": "^2.0.0"
1667
+ }
1668
+ },
1669
+ "pkg-dir": {
1670
+ "version": "4.2.0",
1671
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
1672
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
1673
+ "dev": true,
1674
+ "requires": {
1675
+ "find-up": "^4.0.0"
1676
+ },
1677
+ "dependencies": {
1678
+ "find-up": {
1679
+ "version": "4.1.0",
1680
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
1681
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
1682
+ "dev": true,
1683
+ "requires": {
1684
+ "locate-path": "^5.0.0",
1685
+ "path-exists": "^4.0.0"
1686
+ }
1687
+ },
1688
+ "path-exists": {
1689
+ "version": "4.0.0",
1690
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1691
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1692
+ "dev": true
1693
+ }
1694
+ }
1695
+ },
1696
+ "please-upgrade-node": {
1697
+ "version": "3.2.0",
1698
+ "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
1699
+ "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
1700
+ "dev": true,
1701
+ "requires": {
1702
+ "semver-compare": "^1.0.0"
1703
+ }
1704
+ },
1705
+ "pump": {
1706
+ "version": "3.0.0",
1707
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1708
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1709
+ "dev": true,
1710
+ "requires": {
1711
+ "end-of-stream": "^1.1.0",
1712
+ "once": "^1.3.1"
1713
+ }
1714
+ },
1715
+ "read-pkg": {
1716
+ "version": "1.1.0",
1717
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
1718
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
1719
+ "dev": true,
1720
+ "requires": {
1721
+ "load-json-file": "^1.0.0",
1722
+ "normalize-package-data": "^2.3.2",
1723
+ "path-type": "^1.0.0"
1724
+ }
1725
+ },
1726
+ "read-pkg-up": {
1727
+ "version": "1.0.1",
1728
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
1729
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
1730
+ "dev": true,
1731
+ "requires": {
1732
+ "find-up": "^1.0.0",
1733
+ "read-pkg": "^1.0.0"
1734
+ }
1735
+ },
1736
+ "redent": {
1737
+ "version": "1.0.0",
1738
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
1739
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
1740
+ "dev": true,
1741
+ "requires": {
1742
+ "indent-string": "^2.1.0",
1743
+ "strip-indent": "^1.0.1"
1744
+ }
1745
+ },
1746
+ "repeating": {
1747
+ "version": "2.0.1",
1748
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
1749
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
1750
+ "dev": true,
1751
+ "requires": {
1752
+ "is-finite": "^1.0.0"
1753
+ }
1754
+ },
1755
+ "resolve": {
1756
+ "version": "1.12.0",
1757
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
1758
+ "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
1759
+ "dev": true,
1760
+ "requires": {
1761
+ "path-parse": "^1.0.6"
1762
+ }
1763
+ },
1764
+ "resolve-from": {
1765
+ "version": "3.0.0",
1766
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
1767
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
1768
+ "dev": true
1769
+ },
1770
+ "restore-cursor": {
1771
+ "version": "2.0.0",
1772
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1773
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1774
+ "dev": true,
1775
+ "requires": {
1776
+ "onetime": "^2.0.0",
1777
+ "signal-exit": "^3.0.2"
1778
+ },
1779
+ "dependencies": {
1780
+ "mimic-fn": {
1781
+ "version": "1.2.0",
1782
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
1783
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
1784
+ "dev": true
1785
+ },
1786
+ "onetime": {
1787
+ "version": "2.0.1",
1788
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1789
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1790
+ "dev": true,
1791
+ "requires": {
1792
+ "mimic-fn": "^1.0.0"
1793
+ }
1794
+ }
1795
+ }
1796
+ },
1797
+ "reusify": {
1798
+ "version": "1.0.4",
1799
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1800
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1801
+ "dev": true
1802
+ },
1803
+ "rimraf": {
1804
+ "version": "2.6.3",
1805
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1806
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1807
+ "dev": true,
1808
+ "requires": {
1809
+ "glob": "^7.1.3"
1810
+ },
1811
+ "dependencies": {
1812
+ "glob": {
1813
+ "version": "7.1.5",
1814
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
1815
+ "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
1816
+ "dev": true,
1817
+ "requires": {
1818
+ "fs.realpath": "^1.0.0",
1819
+ "inflight": "^1.0.4",
1820
+ "inherits": "2",
1821
+ "minimatch": "^3.0.4",
1822
+ "once": "^1.3.0",
1823
+ "path-is-absolute": "^1.0.0"
1824
+ }
1825
+ }
1826
+ }
1827
+ },
1828
+ "run-node": {
1829
+ "version": "1.0.0",
1830
+ "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz",
1831
+ "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==",
1832
+ "dev": true
1833
+ },
1834
+ "run-parallel": {
1835
+ "version": "1.1.9",
1836
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
1837
+ "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
1838
+ "dev": true
1839
+ },
1840
+ "rxjs": {
1841
+ "version": "6.5.3",
1842
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
1843
+ "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
1844
+ "dev": true,
1845
+ "requires": {
1846
+ "tslib": "^1.9.0"
1847
+ }
1848
+ },
1849
+ "safer-buffer": {
1850
+ "version": "2.1.2",
1851
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1852
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1853
+ "dev": true
1854
+ },
1855
+ "semver": {
1856
+ "version": "5.7.1",
1857
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1858
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1859
+ "dev": true
1860
+ },
1861
+ "semver-compare": {
1862
+ "version": "1.0.0",
1863
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
1864
+ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
1865
+ "dev": true
1866
+ },
1867
+ "shebang-command": {
1868
+ "version": "1.2.0",
1869
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1870
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1871
+ "dev": true,
1872
+ "requires": {
1873
+ "shebang-regex": "^1.0.0"
1874
+ }
1875
+ },
1876
+ "shebang-regex": {
1877
+ "version": "1.0.0",
1878
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1879
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1880
+ "dev": true
1881
+ },
1882
+ "signal-exit": {
1883
+ "version": "3.0.2",
1884
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1885
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1886
+ "dev": true
1887
+ },
1888
+ "slash": {
1889
+ "version": "3.0.0",
1890
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
1891
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
1892
+ "dev": true
1893
+ },
1894
+ "slice-ansi": {
1895
+ "version": "0.0.4",
1896
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
1897
+ "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
1898
+ "dev": true
1899
+ },
1900
+ "spdx-correct": {
1901
+ "version": "3.1.0",
1902
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
1903
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
1904
+ "dev": true,
1905
+ "requires": {
1906
+ "spdx-expression-parse": "^3.0.0",
1907
+ "spdx-license-ids": "^3.0.0"
1908
+ }
1909
+ },
1910
+ "spdx-exceptions": {
1911
+ "version": "2.2.0",
1912
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
1913
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
1914
+ "dev": true
1915
+ },
1916
+ "spdx-expression-parse": {
1917
+ "version": "3.0.0",
1918
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
1919
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
1920
+ "dev": true,
1921
+ "requires": {
1922
+ "spdx-exceptions": "^2.1.0",
1923
+ "spdx-license-ids": "^3.0.0"
1924
+ }
1925
+ },
1926
+ "spdx-license-ids": {
1927
+ "version": "3.0.5",
1928
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
1929
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
1930
+ "dev": true
1931
+ },
1932
+ "sprintf-js": {
1933
+ "version": "1.1.2",
1934
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
1935
+ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
1936
+ "dev": true
1937
+ },
1938
+ "string-argv": {
1939
+ "version": "0.3.1",
1940
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
1941
+ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
1942
+ "dev": true
1943
+ },
1944
+ "string-width": {
1945
+ "version": "1.0.2",
1946
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1947
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1948
+ "dev": true,
1949
+ "requires": {
1950
+ "code-point-at": "^1.0.0",
1951
+ "is-fullwidth-code-point": "^1.0.0",
1952
+ "strip-ansi": "^3.0.0"
1953
+ }
1954
+ },
1955
+ "stringify-object": {
1956
+ "version": "3.3.0",
1957
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
1958
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
1959
+ "dev": true,
1960
+ "requires": {
1961
+ "get-own-enumerable-property-symbols": "^3.0.0",
1962
+ "is-obj": "^1.0.1",
1963
+ "is-regexp": "^1.0.0"
1964
+ }
1965
+ },
1966
+ "strip-ansi": {
1967
+ "version": "3.0.1",
1968
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1969
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1970
+ "dev": true,
1971
+ "requires": {
1972
+ "ansi-regex": "^2.0.0"
1973
+ }
1974
+ },
1975
+ "strip-bom": {
1976
+ "version": "2.0.0",
1977
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
1978
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
1979
+ "dev": true,
1980
+ "requires": {
1981
+ "is-utf8": "^0.2.0"
1982
+ }
1983
+ },
1984
+ "strip-eof": {
1985
+ "version": "1.0.0",
1986
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
1987
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
1988
+ "dev": true
1989
+ },
1990
+ "strip-final-newline": {
1991
+ "version": "2.0.0",
1992
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1993
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1994
+ "dev": true
1995
+ },
1996
+ "strip-indent": {
1997
+ "version": "1.0.1",
1998
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
1999
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
2000
+ "dev": true,
2001
+ "requires": {
2002
+ "get-stdin": "^4.0.1"
2003
+ }
2004
+ },
2005
+ "supports-color": {
2006
+ "version": "5.5.0",
2007
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2008
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2009
+ "dev": true,
2010
+ "requires": {
2011
+ "has-flag": "^3.0.0"
2012
+ }
2013
+ },
2014
+ "symbol-observable": {
2015
+ "version": "1.2.0",
2016
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
2017
+ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
2018
+ "dev": true
2019
+ },
2020
+ "text-table": {
2021
+ "version": "0.2.0",
2022
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2023
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
2024
+ "dev": true
2025
+ },
2026
+ "to-regex-range": {
2027
+ "version": "5.0.1",
2028
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2029
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2030
+ "dev": true,
2031
+ "requires": {
2032
+ "is-number": "^7.0.0"
2033
+ }
2034
+ },
2035
+ "trim-newlines": {
2036
+ "version": "1.0.0",
2037
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
2038
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
2039
+ "dev": true
2040
+ },
2041
+ "tslib": {
2042
+ "version": "1.10.0",
2043
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
2044
+ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
2045
+ "dev": true
2046
+ },
2047
+ "type-fest": {
2048
+ "version": "0.6.0",
2049
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
2050
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
2051
+ "dev": true
2052
+ },
2053
+ "underscore.string": {
2054
+ "version": "3.3.5",
2055
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
2056
+ "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
2057
+ "dev": true,
2058
+ "requires": {
2059
+ "sprintf-js": "^1.0.3",
2060
+ "util-deprecate": "^1.0.2"
2061
+ }
2062
+ },
2063
+ "util-deprecate": {
2064
+ "version": "1.0.2",
2065
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2066
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2067
+ "dev": true
2068
+ },
2069
+ "validate-npm-package-license": {
2070
+ "version": "3.0.4",
2071
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
2072
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
2073
+ "dev": true,
2074
+ "requires": {
2075
+ "spdx-correct": "^3.0.0",
2076
+ "spdx-expression-parse": "^3.0.0"
2077
+ }
2078
+ },
2079
+ "which": {
2080
+ "version": "1.3.1",
2081
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2082
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2083
+ "dev": true,
2084
+ "requires": {
2085
+ "isexe": "^2.0.0"
2086
+ }
2087
+ },
2088
+ "wrap-ansi": {
2089
+ "version": "3.0.1",
2090
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz",
2091
+ "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=",
2092
+ "dev": true,
2093
+ "requires": {
2094
+ "string-width": "^2.1.1",
2095
+ "strip-ansi": "^4.0.0"
2096
+ },
2097
+ "dependencies": {
2098
+ "ansi-regex": {
2099
+ "version": "3.0.0",
2100
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
2101
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
2102
+ "dev": true
2103
+ },
2104
+ "is-fullwidth-code-point": {
2105
+ "version": "2.0.0",
2106
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2107
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2108
+ "dev": true
2109
+ },
2110
+ "string-width": {
2111
+ "version": "2.1.1",
2112
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
2113
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
2114
+ "dev": true,
2115
+ "requires": {
2116
+ "is-fullwidth-code-point": "^2.0.0",
2117
+ "strip-ansi": "^4.0.0"
2118
+ }
2119
+ },
2120
+ "strip-ansi": {
2121
+ "version": "4.0.0",
2122
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2123
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2124
+ "dev": true,
2125
+ "requires": {
2126
+ "ansi-regex": "^3.0.0"
2127
+ }
2128
+ }
2129
+ }
2130
+ },
2131
+ "wrappy": {
2132
+ "version": "1.0.2",
2133
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2134
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2135
+ "dev": true
2136
+ }
2137
+ }
2138
+ }
includes/vendor/action-scheduler/package.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "action-scheduler",
3
+ "title": "Action Scheduler",
4
+ "version": "3.1.4",
5
+ "homepage": "https://actionscheduler.org/",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/woocommerce/action-scheduler.git"
9
+ },
10
+ "license": "GPL-3.0+",
11
+ "main": "Gruntfile.js",
12
+ "scripts": {
13
+ "build": "grunt",
14
+ "check-textdomain": "grunt checktextdomain",
15
+ "phpcs": "grunt phpcs"
16
+ },
17
+ "devDependencies": {
18
+ "grunt": "1.0.4",
19
+ "grunt-checktextdomain": "1.0.1",
20
+ "grunt-phpcs": "0.4.0",
21
+ "husky": "3.0.9",
22
+ "lint-staged": "9.4.2"
23
+ },
24
+ "engines": {
25
+ "node": ">=10.15.0",
26
+ "npm": ">=6.4.1"
27
+ },
28
+ "husky": {
29
+ "hooks": {
30
+ "pre-commit": "lint-staged"
31
+ }
32
+ },
33
+ "lint-staged": {
34
+ "*.php": [
35
+ "php -d display_errors=1 -l",
36
+ "composer run-script phpcs-pre-commit"
37
+ ]
38
+ }
39
+ }
includes/vendor/action-scheduler/phpcs.xml ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <ruleset name="WordPress Coding Standards">
3
+ <description>WooCommerce dev PHP_CodeSniffer ruleset.</description>
4
+
5
+ <!-- Exclude paths -->
6
+ <exclude-pattern>docs/</exclude-pattern>
7
+ <exclude-pattern>*/node_modules/*</exclude-pattern>
8
+ <exclude-pattern>*/vendor/*</exclude-pattern>
9
+
10
+ <!-- Configs -->
11
+ <config name="minimum_supported_wp_version" value="4.7" />
12
+ <config name="testVersion" value="5.6-" />
13
+
14
+ <!-- Rules -->
15
+ <rule ref="WooCommerce-Core" />
16
+
17
+ <rule ref="WordPress.WP.I18n">
18
+ <properties>
19
+ <property name="text_domain" type="array" value="action-scheduler" />
20
+ </properties>
21
+ </rule>
22
+
23
+ <rule ref="WordPress.Files.FileName.InvalidClassFileName">
24
+ <exclude-pattern>classes/*</exclude-pattern>
25
+ <exclude-pattern>deprecated/*</exclude-pattern>
26
+ <exclude-pattern>lib/*</exclude-pattern>
27
+ <exclude-pattern>tests/*</exclude-pattern>
28
+ </rule>
29
+ <rule ref="WordPress.Files.FileName.NotHyphenatedLowercase">
30
+ <exclude-pattern>classes/*</exclude-pattern>
31
+ <exclude-pattern>deprecated/*</exclude-pattern>
32
+ <exclude-pattern>lib/*</exclude-pattern>
33
+ <exclude-pattern>tests/*</exclude-pattern>
34
+ </rule>
35
+
36
+ <rule ref="Generic.Commenting">
37
+ <exclude-pattern>tests/</exclude-pattern>
38
+ </rule>
39
+ </ruleset>
includes/vendor/action-scheduler/tests/bootstrap.php CHANGED
@@ -29,3 +29,6 @@ if ( class_exists( 'PHPUnit\Framework\TestResult' ) ) { // PHPUnit 6.0 or newer
29
  } else {
30
  include_once('phpunit/deprecated/ActionScheduler_UnitTestCase.php');
31
  }
 
 
 
29
  } else {
30
  include_once('phpunit/deprecated/ActionScheduler_UnitTestCase.php');
31
  }
32
+
33
+ include_once('phpunit/ActionScheduler_Mocker.php');
34
+ include_once('phpunit/ActionScheduler_Mock_Async_Request_QueueRunner.php');
includes/vendor/action-scheduler/tests/phpunit.xml.dist CHANGED
@@ -12,8 +12,24 @@
12
  bootstrap="bootstrap.php"
13
  >
14
  <testsuites>
 
 
 
 
 
 
 
 
 
15
  <testsuite name="Action Scheduler">
16
- <directory>./phpunit</directory>
 
 
 
 
 
 
 
17
  </testsuite>
18
  </testsuites>
19
  <groups>
12
  bootstrap="bootstrap.php"
13
  >
14
  <testsuites>
15
+ <testsuite name="Migration">
16
+ <directory phpVersion="5.6">./phpunit/migration</directory>
17
+ </testsuite>
18
+ <testsuite name="Tables">
19
+ <file phpVersion="5.6">./phpunit/jobstore/ActionScheduler_DBStoreMigrator_Test.php</file>
20
+ <file phpVersion="5.6">./phpunit/jobstore/ActionScheduler_DBStore_Test.php</file>
21
+ <file phpVersion="5.6">./phpunit/jobstore/ActionScheduler_HybridStore_Test.php</file>
22
+ <file phpVersion="5.6">./phpunit/logging/ActionScheduler_DBLogger_Test.php</file>
23
+ </testsuite>
24
  <testsuite name="Action Scheduler">
25
+ <directory>./phpunit/helpers</directory>
26
+ <directory>./phpunit/jobs</directory>
27
+ <directory>./phpunit/procedural_api</directory>
28
+ <directory>./phpunit/runner</directory>
29
+ <directory>./phpunit/schedules</directory>
30
+ <directory>./phpunit/versioning</directory>
31
+ <file>./phpunit/logging/ActionScheduler_wpCommentLogger_Test.php</file>
32
+ <file>./phpunit/jobstore/ActionScheduler_wpPostStore_Test.php</file>
33
  </testsuite>
34
  </testsuites>
35
  <groups>
includes/vendor/action-scheduler/tests/phpunit/ActionScheduler_Mock_Async_Request_QueueRunner.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ActionScheduler_Mock_AsyncRequest_QueueRunner
4
+ */
5
+
6
+ defined( 'ABSPATH' ) || exit;
7
+
8
+ /**
9
+ * ActionScheduler_Mock_AsyncRequest_QueueRunner class.
10
+ */
11
+ class ActionScheduler_Mock_AsyncRequest_QueueRunner extends ActionScheduler_AsyncRequest_QueueRunner {
12
+
13
+ /**
14
+ * Do not run queues via async requests.
15
+ */
16
+ protected function allow() {
17
+ return false;
18
+ }
19
+ }
includes/vendor/action-scheduler/tests/phpunit/ActionScheduler_Mocker.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ActionScheduler_Mocker
4
+ */
5
+
6
+ defined( 'ABSPATH' ) || exit;
7
+
8
+ /**
9
+ * ActionScheduler_Mocker class.
10
+ */
11
+ class ActionScheduler_Mocker {
12
+
13
+ /**
14
+ * Do not run queues via async requests.
15
+ *
16
+ * @param ActionScheduler_Store $store
17
+ */
18
+ public static function get_queue_runner( ActionScheduler_Store $store = null ) {
19
+
20
+ if ( ! $store ) {
21
+ $store = ActionScheduler_Store::instance();
22
+ }
23
+
24
+ return new ActionScheduler_QueueRunner( $store, null, null, self::get_async_request_queue_runner( $store ) );
25
+ }
26
+
27
+ /**
28
+ * Get an instance of the mock queue runner
29
+ *
30
+ * @param ActionScheduler_Store $store
31
+ */
32
+ protected static function get_async_request_queue_runner( ActionScheduler_Store $store ) {
33
+ return new ActionScheduler_Mock_AsyncRequest_QueueRunner( $store );
34
+ }
35
+ }
includes/vendor/action-scheduler/tests/phpunit/jobs/ActionScheduler_NullAction_Test.php CHANGED
@@ -10,7 +10,7 @@ class ActionScheduler_NullAction_Test extends ActionScheduler_UnitTestCase {
10
 
11
  $this->assertEmpty($action->get_hook());
12
  $this->assertEmpty($action->get_args());
13
- $this->assertNull($action->get_schedule()->next());
14
  }
15
  }
16
 
10
 
11
  $this->assertEmpty($action->get_hook());
12
  $this->assertEmpty($action->get_args());
13
+ $this->assertNull( $action->get_schedule()->get_date() );
14
  }
15
  }
16
 
includes/vendor/action-scheduler/tests/phpunit/jobstore/ActionScheduler_DBStoreMigrator_Test.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class ActionScheduler_DBStoreMigrator_Test
5
+ * @group tables
6
+ */
7
+ class ActionScheduler_DBStoreMigrator_Test extends ActionScheduler_UnitTestCase {
8
+
9
+ public function test_create_action_with_last_attempt_date() {
10
+ $scheduled_date = as_get_datetime_object( strtotime( '-24 hours' ) );
11
+ $last_attempt_date = as_get_datetime_object( strtotime( '-23 hours' ) );
12
+
13
+ $action = new ActionScheduler_FinishedAction( 'my_hook', [], new ActionScheduler_SimpleSchedule( $scheduled_date ) );
14
+ $store = new ActionScheduler_DBStoreMigrator();
15
+
16
+ $action_id = $store->save_action( $action, null, $last_attempt_date );
17
+ $action_date = $store->get_date( $action_id );
18
+
19
+ $this->assertEquals( $last_attempt_date->format( 'U' ), $action_date->format( 'U' ) );
20
+
21
+ $action_id = $store->save_action( $action, $scheduled_date, $last_attempt_date );
22
+ $action_date = $store->get_date( $action_id );
23
+
24
+ $this->assertEquals( $last_attempt_date->format( 'U' ), $action_date->format( 'U' ) );
25
+ }
26
+ }
includes/vendor/action-scheduler/tests/phpunit/jobstore/ActionScheduler_DBStore_Test.php ADDED
@@ -0,0 +1,396 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class ActionScheduler_DBStore_Test
5
+ * @group tables
6
+ */
7
+ class ActionScheduler_DBStore_Test extends ActionScheduler_UnitTestCase {
8
+
9
+ public function test_create_action() {
10
+ $time = as_get_datetime_object();
11
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
12
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
13
+ $store = new ActionScheduler_DBStore();
14
+ $action_id = $store->save_action( $action );
15
+
16
+ $this->assertNotEmpty( $action_id );
17
+ }
18
+
19
+ public function test_create_action_with_scheduled_date() {
20
+ $time = as_get_datetime_object( strtotime( '-1 week' ) );
21
+ $action = new ActionScheduler_Action( 'my_hook', [], new ActionScheduler_SimpleSchedule( $time ) );
22
+ $store = new ActionScheduler_DBStore();
23
+ $action_id = $store->save_action( $action, $time );
24
+ $action_date = $store->get_date( $action_id );
25
+
26
+ $this->assertEquals( $time->format( 'U' ), $action_date->format( 'U' ) );
27
+ }
28
+
29
+ public function test_retrieve_action() {
30
+ $time = as_get_datetime_object();
31
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
32
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule, 'my_group' );
33
+ $store = new ActionScheduler_DBStore();
34
+ $action_id = $store->save_action( $action );
35
+
36
+ $retrieved = $store->fetch_action( $action_id );
37
+ $this->assertEquals( $action->get_hook(), $retrieved->get_hook() );
38
+ $this->assertEqualSets( $action->get_args(), $retrieved->get_args() );
39
+ $this->assertEquals( $action->get_schedule()->get_date()->format( 'U' ), $retrieved->get_schedule()->get_date()->format( 'U' ) );
40
+ $this->assertEquals( $action->get_group(), $retrieved->get_group() );
41
+ }
42
+
43
+ public function test_cancel_action() {
44
+ $time = as_get_datetime_object();
45
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
46
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule, 'my_group' );
47
+ $store = new ActionScheduler_DBStore();
48
+ $action_id = $store->save_action( $action );
49
+ $store->cancel_action( $action_id );
50
+
51
+ $fetched = $store->fetch_action( $action_id );
52
+ $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched );
53
+ }
54
+
55
+ public function test_cancel_actions_by_hook() {
56
+ $store = new ActionScheduler_DBStore();
57
+ $actions = [];
58
+ $hook = 'by_hook_test';
59
+ for ( $day = 1; $day <= 3; $day++ ) {
60
+ $delta = sprintf( '+%d day', $day );
61
+ $time = as_get_datetime_object( $delta );
62
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
63
+ $action = new ActionScheduler_Action( $hook, [], $schedule, 'my_group' );
64
+ $actions[] = $store->save_action( $action );
65
+ }
66
+ $store->cancel_actions_by_hook( $hook );
67
+
68
+ foreach ( $actions as $action_id ) {
69
+ $fetched = $store->fetch_action( $action_id );
70
+ $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched );
71
+ }
72
+ }
73
+
74
+ public function test_cancel_actions_by_group() {
75
+ $store = new ActionScheduler_DBStore();
76
+ $actions = [];
77
+ $group = 'by_group_test';
78
+ for ( $day = 1; $day <= 3; $day++ ) {
79
+ $delta = sprintf( '+%d day', $day );
80
+ $time = as_get_datetime_object( $delta );
81
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
82
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule, $group );
83
+ $actions[] = $store->save_action( $action );
84
+ }
85
+ $store->cancel_actions_by_group( $group );
86
+
87
+ foreach ( $actions as $action_id ) {
88
+ $fetched = $store->fetch_action( $action_id );
89
+ $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched );
90
+ }
91
+ }
92
+
93
+ public function test_claim_actions() {
94
+ $created_actions = [];
95
+ $store = new ActionScheduler_DBStore();
96
+ for ( $i = 3; $i > - 3; $i -- ) {
97
+ $time = as_get_datetime_object( $i . ' hours' );
98
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
99
+ $action = new ActionScheduler_Action( 'my_hook', [ $i ], $schedule, 'my_group' );
100
+
101
+ $created_actions[] = $store->save_action( $action );
102
+ }
103
+
104
+ $claim = $store->stake_claim();
105
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
106
+
107
+ $this->assertCount( 3, $claim->get_actions() );
108
+ $this->assertEqualSets( array_slice( $created_actions, 3, 3 ), $claim->get_actions() );
109
+ }
110
+
111
+ public function test_claim_actions_order() {
112
+
113
+ $store = new ActionScheduler_DBStore();
114
+ $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) );
115
+ $created_actions = array(
116
+ $store->save_action( new ActionScheduler_Action( 'my_hook', array( 1 ), $schedule, 'my_group' ) ),
117
+ $store->save_action( new ActionScheduler_Action( 'my_hook', array( 1 ), $schedule, 'my_group' ) ),
118
+ );
119
+
120
+ $claim = $store->stake_claim();
121
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
122
+
123
+ // Verify uniqueness of action IDs.
124
+ $this->assertEquals( 2, count( array_unique( $created_actions ) ) );
125
+
126
+ // Verify the count and order of the actions.
127
+ $claimed_actions = $claim->get_actions();
128
+ $this->assertCount( 2, $claimed_actions );
129
+ $this->assertEquals( $created_actions, $claimed_actions );
130
+
131
+ // Verify the reversed order doesn't pass.
132
+ $reversed_actions = array_reverse( $created_actions );
133
+ $this->assertNotEquals( $reversed_actions, $claimed_actions );
134
+ }
135
+
136
+ public function test_claim_actions_by_hooks() {
137
+ $created_actions = $created_actions_by_hook = [];
138
+ $store = new ActionScheduler_DBStore();
139
+ $unique_hook_one = 'my_unique_hook_one';
140
+ $unique_hook_two = 'my_unique_hook_two';
141
+ $unique_hooks = array(
142
+ $unique_hook_one,
143
+ $unique_hook_two,
144
+ );
145
+
146
+ for ( $i = 3; $i > - 3; $i -- ) {
147
+ foreach ( $unique_hooks as $unique_hook ) {
148
+ $time = as_get_datetime_object( $i . ' hours' );
149
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
150
+ $action = new ActionScheduler_Action( $unique_hook, [ $i ], $schedule, 'my_group' );
151
+
152
+ $action_id = $store->save_action( $action );
153
+ $created_actions[] = $created_actions_by_hook[ $unique_hook ][] = $action_id;
154
+ }
155
+ }
156
+
157
+ $claim = $store->stake_claim( 10, null, $unique_hooks );
158
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
159
+ $this->assertCount( 6, $claim->get_actions() );
160
+ $this->assertEqualSets( array_slice( $created_actions, 6, 6 ), $claim->get_actions() );
161
+
162
+ $store->release_claim( $claim );
163
+
164
+ $claim = $store->stake_claim( 10, null, array( $unique_hook_one ) );
165
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
166
+ $this->assertCount( 3, $claim->get_actions() );
167
+ $this->assertEqualSets( array_slice( $created_actions_by_hook[ $unique_hook_one ], 3, 3 ), $claim->get_actions() );
168
+
169
+ $store->release_claim( $claim );
170
+
171
+ $claim = $store->stake_claim( 10, null, array( $unique_hook_two ) );
172
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
173
+ $this->assertCount( 3, $claim->get_actions() );
174
+ $this->assertEqualSets( array_slice( $created_actions_by_hook[ $unique_hook_two ], 3, 3 ), $claim->get_actions() );
175
+ }
176
+
177
+ public function test_claim_actions_by_group() {
178
+ $created_actions = [];
179
+ $store = new ActionScheduler_DBStore();
180
+ $unique_group_one = 'my_unique_group_one';
181
+ $unique_group_two = 'my_unique_group_two';
182
+ $unique_groups = array(
183
+ $unique_group_one,
184
+ $unique_group_two,
185
+ );
186
+
187
+ for ( $i = 3; $i > - 3; $i -- ) {
188
+ foreach ( $unique_groups as $unique_group ) {
189
+ $time = as_get_datetime_object( $i . ' hours' );
190
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
191
+ $action = new ActionScheduler_Action( 'my_hook', [ $i ], $schedule, $unique_group );
192
+
193
+ $created_actions[ $unique_group ][] = $store->save_action( $action );
194
+ }
195
+ }
196
+
197
+ $claim = $store->stake_claim( 10, null, array(), $unique_group_one );
198
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
199
+ $this->assertCount( 3, $claim->get_actions() );
200
+ $this->assertEqualSets( array_slice( $created_actions[ $unique_group_one ], 3, 3 ), $claim->get_actions() );
201
+
202
+ $store->release_claim( $claim );
203
+
204
+ $claim = $store->stake_claim( 10, null, array(), $unique_group_two );
205
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
206
+ $this->assertCount( 3, $claim->get_actions() );
207
+ $this->assertEqualSets( array_slice( $created_actions[ $unique_group_two ], 3, 3 ), $claim->get_actions() );
208
+ }
209
+
210
+ public function test_claim_actions_by_hook_and_group() {
211
+ $created_actions = $created_actions_by_hook = [];
212
+ $store = new ActionScheduler_DBStore();
213
+
214
+ $unique_hook_one = 'my_other_unique_hook_one';
215
+ $unique_hook_two = 'my_other_unique_hook_two';
216
+ $unique_hooks = array(
217
+ $unique_hook_one,
218
+ $unique_hook_two,
219
+ );
220
+
221
+ $unique_group_one = 'my_other_other_unique_group_one';
222
+ $unique_group_two = 'my_other_unique_group_two';
223
+ $unique_groups = array(
224
+ $unique_group_one,
225
+ $unique_group_two,
226
+ );
227
+
228
+ for ( $i = 3; $i > - 3; $i -- ) {
229
+ foreach ( $unique_hooks as $unique_hook ) {
230
+ foreach ( $unique_groups as $unique_group ) {
231
+ $time = as_get_datetime_object( $i . ' hours' );
232
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
233
+ $action = new ActionScheduler_Action( $unique_hook, [ $i ], $schedule, $unique_group );
234
+
235
+ $action_id = $store->save_action( $action );
236
+ $created_actions[ $unique_group ][] = $action_id;
237
+ $created_actions_by_hook[ $unique_hook ][ $unique_group ][] = $action_id;
238
+ }
239
+ }
240
+ }
241
+
242
+ /** Test Both Hooks with Each Group */
243
+
244
+ $claim = $store->stake_claim( 10, null, $unique_hooks, $unique_group_one );
245
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
246
+ $this->assertCount( 6, $claim->get_actions() );
247
+ $this->assertEqualSets( array_slice( $created_actions[ $unique_group_one ], 6, 6 ), $claim->get_actions() );
248
+
249
+ $store->release_claim( $claim );
250
+
251
+ $claim = $store->stake_claim( 10, null, $unique_hooks, $unique_group_two );
252
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
253
+ $this->assertCount( 6, $claim->get_actions() );
254
+ $this->assertEqualSets( array_slice( $created_actions[ $unique_group_two ], 6, 6 ), $claim->get_actions() );
255
+
256
+ $store->release_claim( $claim );
257
+
258
+ /** Test Just One Hook with Group One */
259
+
260
+ $claim = $store->stake_claim( 10, null, array( $unique_hook_one ), $unique_group_one );
261
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
262
+ $this->assertCount( 3, $claim->get_actions() );
263
+ $this->assertEqualSets( array_slice( $created_actions_by_hook[ $unique_hook_one ][ $unique_group_one ], 3, 3 ), $claim->get_actions() );
264
+
265
+ $store->release_claim( $claim );
266
+
267
+ $claim = $store->stake_claim( 24, null, array( $unique_hook_two ), $unique_group_one );
268
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
269
+ $this->assertCount( 3, $claim->get_actions() );
270
+ $this->assertEqualSets( array_slice( $created_actions_by_hook[ $unique_hook_two ][ $unique_group_one ], 3, 3 ), $claim->get_actions() );
271
+
272
+ $store->release_claim( $claim );
273
+
274
+ /** Test Just One Hook with Group Two */
275
+
276
+ $claim = $store->stake_claim( 10, null, array( $unique_hook_one ), $unique_group_two );
277
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
278
+ $this->assertCount( 3, $claim->get_actions() );
279
+ $this->assertEqualSets( array_slice( $created_actions_by_hook[ $unique_hook_one ][ $unique_group_two ], 3, 3 ), $claim->get_actions() );
280
+
281
+ $store->release_claim( $claim );
282
+
283
+ $claim = $store->stake_claim( 24, null, array( $unique_hook_two ), $unique_group_two );
284
+ $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
285
+ $this->assertCount( 3, $claim->get_actions() );
286
+ $this->assertEqualSets( array_slice( $created_actions_by_hook[ $unique_hook_two ][ $unique_group_two ], 3, 3 ), $claim->get_actions() );
287
+ }
288
+
289
+ public function test_duplicate_claim() {
290
+ $created_actions = [];
291
+ $store = new ActionScheduler_DBStore();
292
+ for ( $i = 0; $i > - 3; $i -- ) {
293
+ $time = as_get_datetime_object( $i . ' hours' );
294
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
295
+ $action = new ActionScheduler_Action( 'my_hook', [ $i ], $schedule, 'my_group' );
296
+
297
+ $created_actions[] = $store->save_action( $action );
298
+ }
299
+
300
+ $claim1 = $store->stake_claim();
301
+ $claim2 = $store->stake_claim();
302
+ $this->assertCount( 3, $claim1->get_actions() );
303
+ $this->assertCount( 0, $claim2->get_actions() );
304
+ }
305
+
306
+ public function test_release_claim() {
307
+ $created_actions = [];
308
+ $store = new ActionScheduler_DBStore();
309
+ for ( $i = 0; $i > - 3; $i -- ) {
310
+ $time = as_get_datetime_object( $i . ' hours' );
311
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
312
+ $action = new ActionScheduler_Action( 'my_hook', [ $i ], $schedule, 'my_group' );
313
+
314
+ $created_actions[] = $store->save_action( $action );
315
+ }
316
+
317
+ $claim1 = $store->stake_claim();
318
+
319
+ $store->release_claim( $claim1 );
320
+
321
+ $claim2 = $store->stake_claim();
322
+ $this->assertCount( 3, $claim2->get_actions() );
323
+ }
324
+
325
+ public function test_search() {
326
+ $created_actions = [];
327
+ $store = new ActionScheduler_DBStore();
328
+ for ( $i = - 3; $i <= 3; $i ++ ) {
329
+ $time = as_get_datetime_object( $i . ' hours' );
330
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
331
+ $action = new ActionScheduler_Action( 'my_hook', [ $i ], $schedule, 'my_group' );
332
+
333
+ $created_actions[] = $store->save_action( $action );
334
+ }
335
+
336
+ $next_no_args = $store->find_action( 'my_hook' );
337
+ $this->assertEquals( $created_actions[ 0 ], $next_no_args );
338
+
339
+ $next_with_args = $store->find_action( 'my_hook', [ 'args' => [ 1 ] ] );
340
+ $this->assertEquals( $created_actions[ 4 ], $next_with_args );
341
+
342
+ $non_existent = $store->find_action( 'my_hook', [ 'args' => [ 17 ] ] );
343
+ $this->assertNull( $non_existent );
344
+ }
345
+
346
+ public function test_search_by_group() {
347
+ $store = new ActionScheduler_DBStore();
348
+ $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( 'tomorrow' ) );
349
+
350
+ $abc = $store->save_action( new ActionScheduler_Action( 'my_hook', [ 1 ], $schedule, 'abc' ) );
351
+ $def = $store->save_action( new ActionScheduler_Action( 'my_hook', [ 1 ], $schedule, 'def' ) );
352
+ $ghi = $store->save_action( new ActionScheduler_Action( 'my_hook', [ 1 ], $schedule, 'ghi' ) );
353
+
354
+ $this->assertEquals( $abc, $store->find_action( 'my_hook', [ 'group' => 'abc' ] ) );
355
+ $this->assertEquals( $def, $store->find_action( 'my_hook', [ 'group' => 'def' ] ) );
356
+ $this->assertEquals( $ghi, $store->find_action( 'my_hook', [ 'group' => 'ghi' ] ) );
357
+ }
358
+
359
+ public function test_get_run_date() {
360
+ $time = as_get_datetime_object( '-10 minutes' );
361
+ $schedule = new ActionScheduler_IntervalSchedule( $time, HOUR_IN_SECONDS );
362
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
363
+ $store = new ActionScheduler_DBStore();
364
+ $action_id = $store->save_action( $action );
365
+
366
+ $this->assertEquals( $time->format( 'U' ), $store->get_date( $action_id )->format( 'U' ) );
367
+
368
+ $action = $store->fetch_action( $action_id );
369
+ $action->execute();
370
+ $now = as_get_datetime_object();
371
+ $store->mark_complete( $action_id );
372
+
373
+ $this->assertEquals( $now->format( 'U' ), $store->get_date( $action_id )->format( 'U' ) );
374
+
375
+ $next = $action->get_schedule()->get_next( $now );
376
+ $new_action_id = $store->save_action( $action, $next );
377
+
378
+ $this->assertEquals( (int) ( $now->format( 'U' ) ) + HOUR_IN_SECONDS, $store->get_date( $new_action_id )->format( 'U' ) );
379
+ }
380
+
381
+ public function test_get_status() {
382
+ $time = as_get_datetime_object('-10 minutes');
383
+ $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS);
384
+ $action = new ActionScheduler_Action('my_hook', array(), $schedule);
385
+ $store = new ActionScheduler_DBStore();
386
+ $action_id = $store->save_action($action);
387
+
388
+ $this->assertEquals( ActionScheduler_Store::STATUS_PENDING, $store->get_status( $action_id ) );
389
+
390
+ $store->mark_complete( $action_id );
391
+ $this->assertEquals( ActionScheduler_Store::STATUS_COMPLETE, $store->get_status( $action_id ) );
392
+
393
+ $store->mark_failure( $action_id );
394
+ $this->assertEquals( ActionScheduler_Store::STATUS_FAILED, $store->get_status( $action_id ) );
395
+ }
396
+ }
includes/vendor/action-scheduler/tests/phpunit/jobstore/ActionScheduler_HybridStore_Test.php ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ use Action_Scheduler\Migration\Config;
5
+ use ActionScheduler_NullAction as NullAction;
6
+ use ActionScheduler_wpCommentLogger as CommentLogger;
7
+ use ActionScheduler_wpPostStore as PostStore;
8
+
9
+ /**
10
+ * Class ActionScheduler_HybridStore_Test
11
+ * @group tables
12
+ */
13
+
14
+ class ActionScheduler_HybridStore_Test extends ActionScheduler_UnitTestCase {
15
+ private $demarkation_id = 1000;
16
+
17
+ public function setUp() {
18
+ parent::setUp();
19
+ if ( ! taxonomy_exists( PostStore::GROUP_TAXONOMY ) ) {
20
+ // register the post type and taxonomy necessary for the store to work
21
+ $store = new PostStore();
22
+ $store->init();
23
+ }
24
+ update_option( ActionScheduler_HybridStore::DEMARKATION_OPTION, $this->demarkation_id );
25
+ $hybrid = new ActionScheduler_HybridStore();
26
+ $hybrid->set_autoincrement( '', ActionScheduler_StoreSchema::ACTIONS_TABLE );
27
+ }
28
+
29
+ public function tearDown() {
30
+ parent::tearDown();
31
+
32
+ // reset the autoincrement index
33
+ /** @var \wpdb $wpdb */
34
+ global $wpdb;
35
+ $wpdb->query( "TRUNCATE TABLE {$wpdb->actionscheduler_actions}" );
36
+ $wpdb->query( "TRUNCATE TABLE {$wpdb->actionscheduler_logs}" );
37
+ delete_option( ActionScheduler_HybridStore::DEMARKATION_OPTION );
38
+ }
39
+
40
+ public function test_actions_are_migrated_on_find() {
41
+ $source_store = new PostStore();
42
+ $destination_store = new ActionScheduler_DBStore();
43
+ $source_logger = new CommentLogger();
44
+ $destination_logger = new ActionScheduler_DBLogger();
45
+
46
+ $config = new Config();
47
+ $config->set_source_store( $source_store );
48
+ $config->set_source_logger( $source_logger );
49
+ $config->set_destination_store( $destination_store );
50
+ $config->set_destination_logger( $destination_logger );
51
+
52
+ $hybrid_store = new ActionScheduler_HybridStore( $config );
53
+
54
+ $time = as_get_datetime_object( '10 minutes ago' );
55
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
56
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
57
+ $source_id = $source_store->save_action( $action );
58
+
59
+ $found = $hybrid_store->find_action( __FUNCTION__, [] );
60
+
61
+ $this->assertNotEquals( $source_id, $found );
62
+ $this->assertGreaterThanOrEqual( $this->demarkation_id, $found );
63
+
64
+ $found_in_source = $source_store->fetch_action( $source_id );
65
+ $this->assertInstanceOf( NullAction::class, $found_in_source );
66
+ }
67
+
68
+
69
+ public function test_actions_are_migrated_on_query() {
70
+ $source_store = new PostStore();
71
+ $destination_store = new ActionScheduler_DBStore();
72
+ $source_logger = new CommentLogger();
73
+ $destination_logger = new ActionScheduler_DBLogger();
74
+
75
+ $config = new Config();
76
+ $config->set_source_store( $source_store );
77
+ $config->set_source_logger( $source_logger );
78
+ $config->set_destination_store( $destination_store );
79
+ $config->set_destination_logger( $destination_logger );
80
+
81
+ $hybrid_store = new ActionScheduler_HybridStore( $config );
82
+
83
+ $source_actions = [];
84
+ $destination_actions = [];
85
+
86
+ for ( $i = 0; $i < 10; $i++ ) {
87
+ // create in instance in the source store
88
+ $time = as_get_datetime_object( ( $i * 10 + 1 ) . ' minutes' );
89
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
90
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
91
+
92
+ $source_actions[] = $source_store->save_action( $action );
93
+
94
+ // create an instance in the destination store
95
+ $time = as_get_datetime_object( ( $i * 10 + 5 ) . ' minutes' );
96
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
97
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
98
+
99
+ $destination_actions[] = $destination_store->save_action( $action );
100
+ }
101
+
102
+ $found = $hybrid_store->query_actions([
103
+ 'hook' => __FUNCTION__,
104
+ 'per_page' => 6,
105
+ ] );
106
+
107
+ $this->assertCount( 6, $found );
108
+ foreach ( $found as $key => $action_id ) {
109
+ $this->assertNotContains( $action_id, $source_actions );
110
+ $this->assertGreaterThanOrEqual( $this->demarkation_id, $action_id );
111
+ if ( $key % 2 == 0 ) { // it should have been in the source store
112
+ $this->assertNotContains( $action_id, $destination_actions );
113
+ } else { // it should have already been in the destination store
114
+ $this->assertContains( $action_id, $destination_actions );
115
+ }
116
+ }
117
+
118
+ // six of the original 10 should have migrated to the new store
119
+ // even though only three were retrieve in the final query
120
+ $found_in_source = $source_store->query_actions( [
121
+ 'hook' => __FUNCTION__,
122
+ 'per_page' => 10,
123
+ ] );
124
+ $this->assertCount( 4, $found_in_source );
125
+ }
126
+
127
+
128
+ public function test_actions_are_migrated_on_claim() {
129
+ $source_store = new PostStore();
130
+ $destination_store = new ActionScheduler_DBStore();
131
+ $source_logger = new CommentLogger();
132
+ $destination_logger = new ActionScheduler_DBLogger();
133
+
134
+ $config = new Config();
135
+ $config->set_source_store( $source_store );
136
+ $config->set_source_logger( $source_logger );
137
+ $config->set_destination_store( $destination_store );
138
+ $config->set_destination_logger( $destination_logger );
139
+
140
+ $hybrid_store = new ActionScheduler_HybridStore( $config );
141
+
142
+ $source_actions = [];
143
+ $destination_actions = [];
144
+
145
+ for ( $i = 0; $i < 10; $i++ ) {
146
+ // create in instance in the source store
147
+ $time = as_get_datetime_object( ( $i * 10 + 1 ) . ' minutes ago' );
148
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
149
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
150
+
151
+ $source_actions[] = $source_store->save_action( $action );
152
+
153
+ // create an instance in the destination store
154
+ $time = as_get_datetime_object( ( $i * 10 + 5 ) . ' minutes ago' );
155
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
156
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
157
+
158
+ $destination_actions[] = $destination_store->save_action( $action );
159
+ }
160
+
161
+ $claim = $hybrid_store->stake_claim( 6 );
162
+
163
+ $claimed_actions = $claim->get_actions();
164
+ $this->assertCount( 6, $claimed_actions );
165
+ $this->assertCount( 3, array_intersect( $destination_actions, $claimed_actions ) );
166
+
167
+
168
+ // six of the original 10 should have migrated to the new store
169
+ // even though only three were retrieve in the final claim
170
+ $found_in_source = $source_store->query_actions( [
171
+ 'hook' => __FUNCTION__,
172
+ 'per_page' => 10,
173
+ ] );
174
+ $this->assertCount( 4, $found_in_source );
175
+
176
+ $this->assertEquals( 0, $source_store->get_claim_count() );
177
+ $this->assertEquals( 1, $destination_store->get_claim_count() );
178
+ $this->assertEquals( 1, $hybrid_store->get_claim_count() );
179
+
180
+ }
181
+
182
+ public function test_fetch_respects_demarkation() {
183
+ $source_store = new PostStore();
184
+ $destination_store = new ActionScheduler_DBStore();
185
+ $source_logger = new CommentLogger();
186
+ $destination_logger = new ActionScheduler_DBLogger();
187
+
188
+ $config = new Config();
189
+ $config->set_source_store( $source_store );
190
+ $config->set_source_logger( $source_logger );
191
+ $config->set_destination_store( $destination_store );
192
+ $config->set_destination_logger( $destination_logger );
193
+
194
+ $hybrid_store = new ActionScheduler_HybridStore( $config );
195
+
196
+ $source_actions = [];
197
+ $destination_actions = [];
198
+
199
+ for ( $i = 0; $i < 2; $i++ ) {
200
+ // create in instance in the source store
201
+ $time = as_get_datetime_object( ( $i * 10 + 1 ) . ' minutes ago' );
202
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
203
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
204
+
205
+ $source_actions[] = $source_store->save_action( $action );
206
+
207
+ // create an instance in the destination store
208
+ $time = as_get_datetime_object( ( $i * 10 + 5 ) . ' minutes ago' );
209
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
210
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
211
+
212
+ $destination_actions[] = $destination_store->save_action( $action );
213
+ }
214
+
215
+ foreach ( $source_actions as $action_id ) {
216
+ $action = $hybrid_store->fetch_action( $action_id );
217
+ $this->assertInstanceOf( ActionScheduler_Action::class, $action );
218
+ $this->assertNotInstanceOf( NullAction::class, $action );
219
+ }
220
+
221
+ foreach ( $destination_actions as $action_id ) {
222
+ $action = $hybrid_store->fetch_action( $action_id );
223
+ $this->assertInstanceOf( ActionScheduler_Action::class, $action );
224
+ $this->assertNotInstanceOf( NullAction::class, $action );
225
+ }
226
+ }
227
+
228
+ public function test_mark_complete_respects_demarkation() {
229
+ $source_store = new PostStore();
230
+ $destination_store = new ActionScheduler_DBStore();
231
+ $source_logger = new CommentLogger();
232
+ $destination_logger = new ActionScheduler_DBLogger();
233
+
234
+ $config = new Config();
235
+ $config->set_source_store( $source_store );
236
+ $config->set_source_logger( $source_logger );
237
+ $config->set_destination_store( $destination_store );
238
+ $config->set_destination_logger( $destination_logger );
239
+
240
+ $hybrid_store = new ActionScheduler_HybridStore( $config );
241
+
242
+ $source_actions = [];
243
+ $destination_actions = [];
244
+
245
+ for ( $i = 0; $i < 2; $i++ ) {
246
+ // create in instance in the source store
247
+ $time = as_get_datetime_object( ( $i * 10 + 1 ) . ' minutes ago' );
248
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
249
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
250
+
251
+ $source_actions[] = $source_store->save_action( $action );
252
+
253
+ // create an instance in the destination store
254
+ $time = as_get_datetime_object( ( $i * 10 + 5 ) . ' minutes ago' );
255
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
256
+ $action = new ActionScheduler_Action( __FUNCTION__, [], $schedule );
257
+
258
+ $destination_actions[] = $destination_store->save_action( $action );
259
+ }
260
+
261
+ foreach ( $source_actions as $action_id ) {
262
+ $hybrid_store->mark_complete( $action_id );
263
+ $action = $hybrid_store->fetch_action( $action_id );
264
+ $this->assertInstanceOf( ActionScheduler_FinishedAction::class, $action );
265
+ }
266
+
267
+ foreach ( $destination_actions as $action_id ) {
268
+ $hybrid_store->mark_complete( $action_id );
269
+ $action = $hybrid_store->fetch_action( $action_id );
270
+ $this->assertInstanceOf( ActionScheduler_FinishedAction::class, $action );
271
+ }
272
+ }
273
+ }
includes/vendor/action-scheduler/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php CHANGED
@@ -37,7 +37,7 @@ class ActionScheduler_wpPostStore_Test extends ActionScheduler_UnitTestCase {
37
  $retrieved = $store->fetch_action($action_id);
38
  $this->assertEquals($action->get_hook(), $retrieved->get_hook());
39
  $this->assertEqualSets($action->get_args(), $retrieved->get_args());
40
- $this->assertEquals($action->get_schedule()->next()->getTimestamp(), $retrieved->get_schedule()->next()->getTimestamp());
41
  $this->assertEquals($action->get_group(), $retrieved->get_group());
42
  }
43
 
@@ -76,6 +76,45 @@ class ActionScheduler_wpPostStore_Test extends ActionScheduler_UnitTestCase {
76
  $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched );
77
  }
78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  public function test_claim_actions() {
80
  $created_actions = array();
81
  $store = new ActionScheduler_wpPostStore();
@@ -225,7 +264,7 @@ class ActionScheduler_wpPostStore_Test extends ActionScheduler_UnitTestCase {
225
  $action->execute();
226
  $store->mark_complete( $action_id );
227
 
228
- $next = $action->get_schedule()->next( as_get_datetime_object() );
229
  $new_action_id = $store->save_action( $action, $next );
230
 
231
  $this->assertEquals('publish', get_post_status($action_id));
@@ -246,9 +285,9 @@ class ActionScheduler_wpPostStore_Test extends ActionScheduler_UnitTestCase {
246
  $now = as_get_datetime_object();
247
  $store->mark_complete( $action_id );
248
 
249
- $this->assertEquals( $store->get_date($action_id)->getTimestamp(), $now->getTimestamp() );
250
 
251
- $next = $action->get_schedule()->next( $now );
252
  $new_action_id = $store->save_action( $action, $next );
253
 
254
  $this->assertEquals( (int)($now->getTimestamp()) + HOUR_IN_SECONDS, $store->get_date($new_action_id)->getTimestamp() );
37
  $retrieved = $store->fetch_action($action_id);
38
  $this->assertEquals($action->get_hook(), $retrieved->get_hook());
39
  $this->assertEqualSets($action->get_args(), $retrieved->get_args());
40
+ $this->assertEquals( $action->get_schedule()->get_date()->getTimestamp(), $retrieved->get_schedule()->get_date()->getTimestamp() );
41
  $this->assertEquals($action->get_group(), $retrieved->get_group());
42
  }
43
 
76
  $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched );
77
  }
78
 
79
+ public function test_cancel_actions_by_hook() {
80
+ $store = new ActionScheduler_wpPostStore();
81
+ $actions = array();
82
+ $hook = 'by_hook_test';
83
+ for ( $day = 1; $day <= 3; $day++ ) {
84
+ $delta = sprintf( '+%d day', $day );
85
+ $time = as_get_datetime_object( $delta );
86
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
87
+ $action = new ActionScheduler_Action( $hook, array(), $schedule, 'my_group' );
88
+ $actions[] = $store->save_action( $action );
89
+ }
90
+ $store->cancel_actions_by_hook( $hook );
91
+
92
+ foreach ( $actions as $action_id ) {
93
+ $fetched = $store->fetch_action( $action_id );
94
+ $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched );
95
+ }
96
+ }
97
+
98
+ public function test_cancel_actions_by_group() {
99
+ $store = new ActionScheduler_wpPostStore();
100
+ $actions = array();
101
+ $group = 'by_group_test';
102
+
103
+ for ( $day = 1; $day <= 3; $day++ ) {
104
+ $delta = sprintf( '+%d day', $day );
105
+ $time = as_get_datetime_object( $delta );
106
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
107
+ $action = new ActionScheduler_Action( 'my_hook', array(), $schedule, $group );
108
+ $actions[] = $store->save_action( $action );
109
+ }
110
+ $store->cancel_actions_by_group( $group );
111
+
112
+ foreach ( $actions as $action_id ) {
113
+ $fetched = $store->fetch_action( $action_id );
114
+ $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched );
115
+ }
116
+ }
117
+
118
  public function test_claim_actions() {
119
  $created_actions = array();
120
  $store = new ActionScheduler_wpPostStore();
264
  $action->execute();
265
  $store->mark_complete( $action_id );
266
 
267
+ $next = $action->get_schedule()->get_next( as_get_datetime_object() );
268
  $new_action_id = $store->save_action( $action, $next );
269
 
270
  $this->assertEquals('publish', get_post_status($action_id));
285
  $now = as_get_datetime_object();
286
  $store->mark_complete( $action_id );
287
 
288
+ $this->assertEquals( $store->get_date( $action_id )->getTimestamp(), $now->getTimestamp(), '', 1 ); // allow timestamp to be 1 second off for older versions of PHP
289
 
290
+ $next = $action->get_schedule()->get_next( $now );
291
  $new_action_id = $store->save_action( $action, $next );
292
 
293
  $this->assertEquals( (int)($now->getTimestamp()) + HOUR_IN_SECONDS, $store->get_date($new_action_id)->getTimestamp() );
includes/vendor/action-scheduler/tests/phpunit/lock/ActionScheduler_OptionLock_Test.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class ActionScheduler_Lock_Test
5
+ * @package test_cases\lock
6
+ */
7
+ class ActionScheduler_OptionLock_Test extends ActionScheduler_UnitTestCase {
8
+ public function test_instance() {
9
+ $lock = ActionScheduler::lock();
10
+ $this->assertInstanceOf( 'ActionScheduler_Lock', $lock );
11
+ $this->assertInstanceOf( 'ActionScheduler_OptionLock', $lock );
12
+ }
13
+
14
+ public function test_is_locked() {
15
+ $lock = ActionScheduler::lock();
16
+ $lock_type = md5( rand() );
17
+
18
+ $this->assertFalse( $lock->is_locked( $lock_type ) );
19
+
20
+ $lock->set( $lock_type );
21
+ $this->assertTrue( $lock->is_locked( $lock_type ) );
22
+ }
23
+
24
+ public function test_set() {
25
+ $lock = ActionScheduler::lock();
26
+ $lock_type = md5( rand() );
27
+
28
+ $lock->set( $lock_type );
29
+ $this->assertTrue( $lock->is_locked( $lock_type ) );
30
+ }
31
+
32
+ public function test_get_expiration() {
33
+ $lock = ActionScheduler::lock();
34
+ $lock_type = md5( rand() );
35
+
36
+ $lock->set( $lock_type );
37
+
38
+ $expiration = $lock->get_expiration( $lock_type );
39
+ $current_time = time();
40
+
41
+ $this->assertGreaterThanOrEqual( 0, $expiration );
42
+ $this->assertGreaterThan( $current_time, $expiration );
43
+ $this->assertLessThan( $current_time + MINUTE_IN_SECONDS + 1, $expiration );
44
+ }
45
+ }
includes/vendor/action-scheduler/tests/phpunit/logging/ActionScheduler_DBLogger_Test.php ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class ActionScheduler_DBLogger_Test
5
+ * @package test_cases\logging
6
+ * @group tables
7
+ */
8
+ class ActionScheduler_DBLogger_Test extends ActionScheduler_UnitTestCase {
9
+ public function test_default_logger() {
10
+ $logger = ActionScheduler::logger();
11
+ $this->assertInstanceOf( 'ActionScheduler_Logger', $logger );
12
+ $this->assertInstanceOf( ActionScheduler_DBLogger::class, $logger );
13
+ }
14
+
15
+ public function test_add_log_entry() {
16
+ $action_id = as_schedule_single_action( time(), __METHOD__ );
17
+ $logger = ActionScheduler::logger();
18
+ $message = 'Logging that something happened';
19
+ $log_id = $logger->log( $action_id, $message );
20
+ $entry = $logger->get_entry( $log_id );
21
+
22
+ $this->assertEquals( $action_id, $entry->get_action_id() );
23
+ $this->assertEquals( $message, $entry->get_message() );
24
+ }
25
+
26
+ public function test_storage_logs() {
27
+ $action_id = as_schedule_single_action( time(), __METHOD__ );
28
+ $logger = ActionScheduler::logger();
29
+ $logs = $logger->get_logs( $action_id );
30
+ $expected = new ActionScheduler_LogEntry( $action_id, 'action created' );
31
+ $this->assertCount( 1, $logs );
32
+ $this->assertEquals( $expected->get_action_id(), $logs[0]->get_action_id() );
33
+ $this->assertEquals( $expected->get_message(), $logs[0]->get_message() );
34
+ }
35
+
36
+ public function test_execution_logs() {
37
+ $action_id = as_schedule_single_action( time(), __METHOD__ );
38
+ $logger = ActionScheduler::logger();
39
+ $started = new ActionScheduler_LogEntry( $action_id, 'action started via Unit Tests' );
40
+ $finished = new ActionScheduler_LogEntry( $action_id, 'action complete via Unit Tests' );
41
+
42
+ $runner = ActionScheduler_Mocker::get_queue_runner();
43
+ $runner->run( 'Unit Tests' );
44
+
45
+ // Expect 3 logs with the correct action ID.
46
+ $logs = $logger->get_logs( $action_id );
47
+ $this->assertCount( 3, $logs );
48
+ foreach ( $logs as $log ) {
49
+ $this->assertEquals( $action_id, $log->get_action_id() );
50
+ }
51
+
52
+ // Expect created, then started, then completed.
53
+ $this->assertEquals( 'action created', $logs[0]->get_message() );
54
+ $this->assertEquals( $started->get_message(), $logs[1]->get_message() );
55
+ $this->assertEquals( $finished->get_message(), $logs[2]->get_message() );
56
+ }
57
+
58
+ public function test_failed_execution_logs() {
59
+ $hook = __METHOD__;
60
+ add_action( $hook, array( $this, '_a_hook_callback_that_throws_an_exception' ) );
61
+ $action_id = as_schedule_single_action( time(), $hook );
62
+ $logger = ActionScheduler::logger();
63
+ $started = new ActionScheduler_LogEntry( $action_id, 'action started via Unit Tests' );
64
+ $finished = new ActionScheduler_LogEntry( $action_id, 'action complete via Unit Tests' );
65
+ $failed = new ActionScheduler_LogEntry( $action_id, 'action failed via Unit Tests: Execution failed' );
66
+
67
+ $runner = ActionScheduler_Mocker::get_queue_runner();
68
+ $runner->run( 'Unit Tests' );
69
+
70
+ // Expect 3 logs with the correct action ID.
71
+ $logs = $logger->get_logs( $action_id );
72
+ $this->assertCount( 3, $logs );
73
+ foreach ( $logs as $log ) {
74
+ $this->assertEquals( $action_id, $log->get_action_id() );
75
+ $this->assertNotEquals( $finished->get_message(), $log->get_message() );
76
+ }
77
+
78
+ // Expect created, then started, then failed.
79
+ $this->assertEquals( 'action created', $logs[0]->get_message() );
80
+ $this->assertEquals( $started->get_message(), $logs[1]->get_message() );
81
+ $this->assertEquals( $failed->get_message(), $logs[2]->get_message() );
82
+ }
83
+
84
+ public function test_fatal_error_log() {
85
+ $action_id = as_schedule_single_action( time(), __METHOD__ );
86
+ $logger = ActionScheduler::logger();
87
+ do_action( 'action_scheduler_unexpected_shutdown', $action_id, array(
88
+ 'type' => E_ERROR,
89
+ 'message' => 'Test error',
90
+ 'file' => __FILE__,
91
+ 'line' => __LINE__,
92
+ ));
93
+
94
+ $logs = $logger->get_logs( $action_id );
95
+ $found_log = FALSE;
96
+ foreach ( $logs as $l ) {
97
+ if ( strpos( $l->get_message(), 'unexpected shutdown' ) === 0 ) {
98
+ $found_log = TRUE;
99
+ }
100
+ }
101
+ $this->assertTrue( $found_log, 'Unexpected shutdown log not found' );
102
+ }
103
+
104
+ public function test_canceled_action_log() {
105
+ $action_id = as_schedule_single_action( time(), __METHOD__ );
106
+ as_unschedule_action( __METHOD__ );
107
+ $logger = ActionScheduler::logger();
108
+ $logs = $logger->get_logs( $action_id );
109
+ $expected = new ActionScheduler_LogEntry( $action_id, 'action canceled' );
110
+ $this->assertEquals( $expected->get_message(), end( $logs )->get_message() );
111
+ }
112
+
113
+ public function test_deleted_action_cleanup() {
114
+ $time = as_get_datetime_object('-10 minutes');
115
+ $schedule = new \ActionScheduler_SimpleSchedule($time);
116
+ $action = new \ActionScheduler_Action('my_hook', array(), $schedule);
117
+ $store = new ActionScheduler_DBStore();
118
+ $action_id = $store->save_action($action);
119
+
120
+ $logger = new ActionScheduler_DBLogger();
121
+ $logs = $logger->get_logs( $action_id );
122
+ $this->assertNotEmpty( $logs );
123
+
124
+ $store->delete_action( $action_id );
125
+ $logs = $logger->get_logs( $action_id );
126
+ $this->assertEmpty( $logs );
127
+ }
128
+
129
+ public function _a_hook_callback_that_throws_an_exception() {
130
+ throw new \RuntimeException('Execution failed');
131
+ }
132
+ }
includes/vendor/action-scheduler/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php CHANGED
@@ -5,10 +5,16 @@
5
  * @package test_cases\logging
6
  */
7
  class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase {
 
 
8
  public function test_default_logger() {
9
  $logger = ActionScheduler::logger();
10
  $this->assertInstanceOf( 'ActionScheduler_Logger', $logger );
11
- $this->assertInstanceOf( 'ActionScheduler_wpCommentLogger', $logger );
 
 
 
 
12
  }
13
 
14
  public function test_add_log_entry() {
@@ -41,13 +47,6 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
41
  $this->assertEquals( $message, $entry->get_message() );
42
  }
43
 
44
- public function test_null_log_entry() {
45
- $logger = ActionScheduler::logger();
46
- $entry = $logger->get_entry( 1 );
47
- $this->assertEquals( '', $entry->get_action_id() );
48
- $this->assertEquals( '', $entry->get_message() );
49
- }
50
-
51
  public function test_erroneous_entry_id() {
52
  $comment = wp_insert_comment(array(
53
  'comment_post_ID' => 1,
@@ -83,11 +82,11 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
83
  public function test_execution_comments() {
84
  $action_id = as_schedule_single_action( time(), 'a hook' );
85
  $logger = ActionScheduler::logger();
86
- $started = new ActionScheduler_LogEntry( $action_id, 'action started' );
87
- $finished = new ActionScheduler_LogEntry( $action_id, 'action complete' );
88
 
89
- $runner = new ActionScheduler_QueueRunner();
90
- $runner->run();
91
 
92
  $logs = $logger->get_logs( $action_id );
93
  $this->assertTrue( in_array( $this->log_entry_to_array( $started ), $this->log_entry_to_array( $logs ) ) );
@@ -99,12 +98,12 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
99
  add_action( $hook, array( $this, '_a_hook_callback_that_throws_an_exception' ) );
100
  $action_id = as_schedule_single_action( time(), $hook );
101
  $logger = ActionScheduler::logger();
102
- $started = new ActionScheduler_LogEntry( $action_id, 'action started' );
103
- $finished = new ActionScheduler_LogEntry( $action_id, 'action complete' );
104
- $failed = new ActionScheduler_LogEntry( $action_id, 'action failed: Execution failed' );
105
 
106
- $runner = new ActionScheduler_QueueRunner();
107
- $runner->run();
108
 
109
  $logs = $logger->get_logs( $action_id );
110
  $this->assertTrue( in_array( $this->log_entry_to_array( $started ), $this->log_entry_to_array( $logs ) ) );
@@ -112,6 +111,21 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
112
  $this->assertTrue( in_array( $this->log_entry_to_array( $failed ), $this->log_entry_to_array( $logs ) ) );
113
  }
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  public function test_fatal_error_comments() {
116
  $hook = md5(rand());
117
  $action_id = as_schedule_single_action( time(), $hook );
@@ -147,6 +161,10 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
147
  }
148
 
149
  public function test_filtering_of_get_comments() {
 
 
 
 
150
  $post_id = $this->factory->post->create_object(array(
151
  'post_title' => __FUNCTION__,
152
  ));
@@ -181,5 +199,13 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
181
  $this->assertCount( 2, $comments );
182
  $this->assertContains( $log_id, wp_list_pluck($comments, 'comment_ID'));
183
  }
 
 
 
 
 
 
 
 
184
  }
185
 
5
  * @package test_cases\logging
6
  */
7
  class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase {
8
+ private $use_comment_logger;
9
+
10
  public function test_default_logger() {
11
  $logger = ActionScheduler::logger();
12
  $this->assertInstanceOf( 'ActionScheduler_Logger', $logger );
13
+ if ( $this->using_comment_logger() ) {
14
+ $this->assertInstanceOf( 'ActionScheduler_wpCommentLogger', $logger );
15
+ } else {
16
+ $this->assertNotInstanceOf( 'ActionScheduler_wpCommentLogger', $logger );
17
+ }
18
  }
19
 
20
  public function test_add_log_entry() {
47
  $this->assertEquals( $message, $entry->get_message() );
48
  }
49
 
 
 
 
 
 
 
 
50
  public function test_erroneous_entry_id() {
51
  $comment = wp_insert_comment(array(
52
  'comment_post_ID' => 1,
82
  public function test_execution_comments() {
83
  $action_id = as_schedule_single_action( time(), 'a hook' );
84
  $logger = ActionScheduler::logger();
85
+ $started = new ActionScheduler_LogEntry( $action_id, 'action started via Unit Tests' );
86
+ $finished = new ActionScheduler_LogEntry( $action_id, 'action complete via Unit Tests' );
87
 
88
+ $runner = ActionScheduler_Mocker::get_queue_runner();
89
+ $runner->run( 'Unit Tests' );
90
 
91
  $logs = $logger->get_logs( $action_id );
92
  $this->assertTrue( in_array( $this->log_entry_to_array( $started ), $this->log_entry_to_array( $logs ) ) );
98
  add_action( $hook, array( $this, '_a_hook_callback_that_throws_an_exception' ) );
99
  $action_id = as_schedule_single_action( time(), $hook );
100
  $logger = ActionScheduler::logger();
101
+ $started = new ActionScheduler_LogEntry( $action_id, 'action started via Unit Tests' );
102
+ $finished = new ActionScheduler_LogEntry( $action_id, 'action complete via Unit Tests' );
103
+ $failed = new ActionScheduler_LogEntry( $action_id, 'action failed via Unit Tests: Execution failed' );
104
 
105
+ $runner = ActionScheduler_Mocker::get_queue_runner();
106
+ $runner->run( 'Unit Tests' );
107
 
108
  $logs = $logger->get_logs( $action_id );
109
  $this->assertTrue( in_array( $this->log_entry_to_array( $started ), $this->log_entry_to_array( $logs ) ) );
111
  $this->assertTrue( in_array( $this->log_entry_to_array( $failed ), $this->log_entry_to_array( $logs ) ) );
112
  }
113
 
114
+ public function test_failed_schedule_next_instance_comments() {
115
+ $action_id = rand();
116
+ $logger = ActionScheduler::logger();
117
+ $log_entry = new ActionScheduler_LogEntry( $action_id, 'There was a failure scheduling the next instance of this action: Execution failed' );
118
+
119
+ try {
120
+ $this->_a_hook_callback_that_throws_an_exception();
121
+ } catch ( Exception $e ) {
122
+ do_action( 'action_scheduler_failed_to_schedule_next_instance', $action_id, $e, new ActionScheduler_Action('my_hook') );
123
+ }
124
+
125
+ $logs = $logger->get_logs( $action_id );
126
+ $this->assertTrue( in_array( $this->log_entry_to_array( $log_entry ), $this->log_entry_to_array( $logs ) ) );
127
+ }
128
+
129
  public function test_fatal_error_comments() {
130
  $hook = md5(rand());
131
  $action_id = as_schedule_single_action( time(), $hook );
161
  }
162
 
163
  public function test_filtering_of_get_comments() {
164
+ if ( ! $this->using_comment_logger() ) {
165
+ return;
166
+ }
167
+
168
  $post_id = $this->factory->post->create_object(array(
169
  'post_title' => __FUNCTION__,
170
  ));
199
  $this->assertCount( 2, $comments );
200
  $this->assertContains( $log_id, wp_list_pluck($comments, 'comment_ID'));
201
  }
202
+
203
+ private function using_comment_logger() {
204
+ if ( null === $this->use_comment_logger ) {
205
+ $this->use_comment_logger = ! ActionScheduler_DataController::dependencies_met();
206
+ }
207
+
208
+ return $this->use_comment_logger;
209
+ }
210
  }
211
 
includes/vendor/action-scheduler/tests/phpunit/migration/ActionMigrator_Test.php ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Action_Scheduler\Migration\ActionMigrator;
4
+ use Action_Scheduler\Migration\LogMigrator;
5
+
6
+ /**
7
+ * Class ActionMigrator_Test
8
+ * @group migration
9
+ */
10
+ class ActionMigrator_Test extends ActionScheduler_UnitTestCase {
11
+ public function setUp() {
12
+ parent::setUp();
13
+ if ( ! taxonomy_exists( ActionScheduler_wpPostStore::GROUP_TAXONOMY ) ) {
14
+ // register the post type and taxonomy necessary for the store to work
15
+ $store = new ActionScheduler_wpPostStore();
16
+ $store->init();
17
+ }
18
+ }
19
+
20
+ public function test_migrate_from_wpPost_to_db() {
21
+ $source = new ActionScheduler_wpPostStore();
22
+ $destination = new ActionScheduler_DBStore();
23
+ $migrator = new ActionMigrator( $source, $destination, $this->get_log_migrator() );
24
+
25
+ $time = as_get_datetime_object();
26
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
27
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule, 'my_group' );
28
+ $action_id = $source->save_action( $action );
29
+
30
+ $new_id = $migrator->migrate( $action_id );
31
+
32
+ // ensure we get the same record out of the new store as we stored in the old
33
+ $retrieved = $destination->fetch_action( $new_id );
34
+ $this->assertEquals( $action->get_hook(), $retrieved->get_hook() );
35
+ $this->assertEqualSets( $action->get_args(), $retrieved->get_args() );
36
+ $this->assertEquals( $action->get_schedule()->get_date()->format( 'U' ), $retrieved->get_schedule()->get_date()->format( 'U' ) );
37
+ $this->assertEquals( $action->get_group(), $retrieved->get_group() );
38
+ $this->assertEquals( \ActionScheduler_Store::STATUS_PENDING, $destination->get_status( $new_id ) );
39
+
40
+
41
+ // ensure that the record in the old store does not exist
42
+ $old_action = $source->fetch_action( $action_id );
43
+ $this->assertInstanceOf( 'ActionScheduler_NullAction', $old_action );
44
+ }
45
+
46
+ public function test_does_not_migrate_missing_action_from_wpPost_to_db() {
47
+ $source = new ActionScheduler_wpPostStore();
48
+ $destination = new ActionScheduler_DBStore();
49
+ $migrator = new ActionMigrator( $source, $destination, $this->get_log_migrator() );
50
+
51
+ $action_id = rand( 100, 100000 );
52
+
53
+ $new_id = $migrator->migrate( $action_id );
54
+ $this->assertEquals( 0, $new_id );
55
+
56
+ // ensure we get the same record out of the new store as we stored in the old
57
+ $retrieved = $destination->fetch_action( $new_id );
58
+ $this->assertInstanceOf( 'ActionScheduler_NullAction', $retrieved );
59
+ }
60
+
61
+ public function test_migrate_completed_action_from_wpPost_to_db() {
62
+ $source = new ActionScheduler_wpPostStore();
63
+ $destination = new ActionScheduler_DBStore();
64
+ $migrator = new ActionMigrator( $source, $destination, $this->get_log_migrator() );
65
+
66
+ $time = as_get_datetime_object();
67
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
68
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule, 'my_group' );
69
+ $action_id = $source->save_action( $action );
70
+ $source->mark_complete( $action_id );
71
+
72
+ $new_id = $migrator->migrate( $action_id );
73
+
74
+ // ensure we get the same record out of the new store as we stored in the old
75
+ $retrieved = $destination->fetch_action( $new_id );
76
+ $this->assertEquals( $action->get_hook(), $retrieved->get_hook() );
77
+ $this->assertEqualSets( $action->get_args(), $retrieved->get_args() );
78
+ $this->assertEquals( $action->get_schedule()->get_date()->format( 'U' ), $retrieved->get_schedule()->get_date()->format( 'U' ) );
79
+ $this->assertEquals( $action->get_group(), $retrieved->get_group() );
80
+ $this->assertTrue( $retrieved->is_finished() );
81
+ $this->assertEquals( \ActionScheduler_Store::STATUS_COMPLETE, $destination->get_status( $new_id ) );
82
+
83
+ // ensure that the record in the old store does not exist
84
+ $old_action = $source->fetch_action( $action_id );
85
+ $this->assertInstanceOf( 'ActionScheduler_NullAction', $old_action );
86
+ }
87
+
88
+ public function test_migrate_failed_action_from_wpPost_to_db() {
89
+ $source = new ActionScheduler_wpPostStore();
90
+ $destination = new ActionScheduler_DBStore();
91
+ $migrator = new ActionMigrator( $source, $destination, $this->get_log_migrator() );
92
+
93
+ $time = as_get_datetime_object();
94
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
95
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule, 'my_group' );
96
+ $action_id = $source->save_action( $action );
97
+ $source->mark_failure( $action_id );
98
+
99
+ $new_id = $migrator->migrate( $action_id );
100
+
101
+ // ensure we get the same record out of the new store as we stored in the old
102
+ $retrieved = $destination->fetch_action( $new_id );
103
+ $this->assertEquals( $action->get_hook(), $retrieved->get_hook() );
104
+ $this->assertEqualSets( $action->get_args(), $retrieved->get_args() );
105
+ $this->assertEquals( $action->get_schedule()->get_date()->format( 'U' ), $retrieved->get_schedule()->get_date()->format( 'U' ) );
106
+ $this->assertEquals( $action->get_group(), $retrieved->get_group() );
107
+ $this->assertTrue( $retrieved->is_finished() );
108
+ $this->assertEquals( \ActionScheduler_Store::STATUS_FAILED, $destination->get_status( $new_id ) );
109
+
110
+ // ensure that the record in the old store does not exist
111
+ $old_action = $source->fetch_action( $action_id );
112
+ $this->assertInstanceOf( 'ActionScheduler_NullAction', $old_action );
113
+ }
114
+
115
+ public function test_migrate_canceled_action_from_wpPost_to_db() {
116
+ $source = new ActionScheduler_wpPostStore();
117
+ $destination = new ActionScheduler_DBStore();
118
+ $migrator = new ActionMigrator( $source, $destination, $this->get_log_migrator() );
119
+
120
+ $time = as_get_datetime_object();
121
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
122
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule, 'my_group' );
123
+ $action_id = $source->save_action( $action );
124
+ $source->cancel_action( $action_id );
125
+
126
+ $new_id = $migrator->migrate( $action_id );
127
+
128
+ // ensure we get the same record out of the new store as we stored in the old
129
+ $retrieved = $destination->fetch_action( $new_id );
130
+ $this->assertEquals( $action->get_hook(), $retrieved->get_hook() );
131
+ $this->assertEqualSets( $action->get_args(), $retrieved->get_args() );
132
+ $this->assertEquals( $action->get_schedule()->get_date()->format( 'U' ), $retrieved->get_schedule()->get_date()->format( 'U' ) );
133
+ $this->assertEquals( $action->get_group(), $retrieved->get_group() );
134
+ $this->assertTrue( $retrieved->is_finished() );
135
+ $this->assertEquals( \ActionScheduler_Store::STATUS_CANCELED, $destination->get_status( $new_id ) );
136
+
137
+ // ensure that the record in the old store does not exist
138
+ $old_action = $source->fetch_action( $action_id );
139
+ $this->assertInstanceOf( 'ActionScheduler_NullAction', $old_action );
140
+ }
141
+
142
+ private function get_log_migrator() {
143
+ return new LogMigrator( \ActionScheduler::logger(), new ActionScheduler_DBLogger() );
144
+ }
145
+ }
includes/vendor/action-scheduler/tests/phpunit/migration/BatchFetcher_Test.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Action_Scheduler\Migration\BatchFetcher;
4
+ use ActionScheduler_wpPostStore as PostStore;
5
+
6
+ /**
7
+ * Class BatchFetcher_Test
8
+ * @group migration
9
+ */
10
+ class BatchFetcher_Test extends ActionScheduler_UnitTestCase {
11
+ public function setUp() {
12
+ parent::setUp();
13
+ if ( ! taxonomy_exists( PostStore::GROUP_TAXONOMY ) ) {
14
+ // register the post type and taxonomy necessary for the store to work
15
+ $store = new PostStore();
16
+ $store->init();
17
+ }
18
+ }
19
+
20
+ public function test_nothing_to_migrate() {
21
+ $store = new PostStore();
22
+ $batch_fetcher = new BatchFetcher( $store );
23
+
24
+ $actions = $batch_fetcher->fetch();
25
+ $this->assertEmpty( $actions );
26
+ }
27
+
28
+ public function test_get_due_before_future() {
29
+ $store = new PostStore();
30
+ $due = [];
31
+ $future = [];
32
+
33
+ for ( $i = 0; $i < 5; $i ++ ) {
34
+ $time = as_get_datetime_object( $i + 1 . ' minutes' );
35
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
36
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
37
+ $future[] = $store->save_action( $action );
38
+
39
+ $time = as_get_datetime_object( $i + 1 . ' minutes ago' );
40
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
41
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
42
+ $due[] = $store->save_action( $action );
43
+ }
44
+
45
+ $batch_fetcher = new BatchFetcher( $store );
46
+
47
+ $actions = $batch_fetcher->fetch();
48
+
49
+ $this->assertEqualSets( $due, $actions );
50
+ }
51
+
52
+
53
+ public function test_get_future_before_complete() {
54
+ $store = new PostStore();
55
+ $future = [];
56
+ $complete = [];
57
+
58
+ for ( $i = 0; $i < 5; $i ++ ) {
59
+ $time = as_get_datetime_object( $i + 1 . ' minutes' );
60
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
61
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
62
+ $future[] = $store->save_action( $action );
63
+
64
+ $time = as_get_datetime_object( $i + 1 . ' minutes ago' );
65
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
66
+ $action = new ActionScheduler_FinishedAction( 'my_hook', [], $schedule );
67
+ $complete[] = $store->save_action( $action );
68
+ }
69
+
70
+ $batch_fetcher = new BatchFetcher( $store );
71
+
72
+ $actions = $batch_fetcher->fetch();
73
+
74
+ $this->assertEqualSets( $future, $actions );
75
+ }
76
+ }
includes/vendor/action-scheduler/tests/phpunit/migration/Config_Test.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Action_Scheduler\Migration\Config;
4
+
5
+ /**
6
+ * Class Config_Test
7
+ * @group migration
8
+ */
9
+ class Config_Test extends ActionScheduler_UnitTestCase {
10
+ public function test_source_store_required() {
11
+ $config = new Config();
12
+ $this->expectException( \RuntimeException::class );
13
+ $config->get_source_store();
14
+ }
15
+
16
+ public function test_source_logger_required() {
17
+ $config = new Config();
18
+ $this->expectException( \RuntimeException::class );
19
+ $config->get_source_logger();
20
+ }
21
+
22
+ public function test_destination_store_required() {
23
+ $config = new Config();
24
+ $this->expectException( \RuntimeException::class );
25
+ $config->get_destination_store();
26
+ }
27
+
28
+ public function test_destination_logger_required() {
29
+ $config = new Config();
30
+ $this->expectException( \RuntimeException::class );
31
+ $config->get_destination_logger();
32
+ }
33
+ }
includes/vendor/action-scheduler/tests/phpunit/migration/LogMigrator_Test.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Action_Scheduler\Migration\LogMigrator;
4
+
5
+ /**
6
+ * Class LogMigrator_Test
7
+ * @group migration
8
+ */
9
+ class LogMigrator_Test extends ActionScheduler_UnitTestCase {
10
+ function setUp() {
11
+ parent::setUp();
12
+ if ( ! taxonomy_exists( ActionScheduler_wpPostStore::GROUP_TAXONOMY ) ) {
13
+ // register the post type and taxonomy necessary for the store to work
14
+ $store = new ActionScheduler_wpPostStore();
15
+ $store->init();
16
+ }
17
+ }
18
+
19
+ public function test_migrate_from_wpComment_to_db() {
20
+ $source = new ActionScheduler_wpCommentLogger();
21
+ $destination = new ActionScheduler_DBLogger();
22
+ $migrator = new LogMigrator( $source, $destination );
23
+ $source_action_id = rand( 10, 10000 );
24
+ $destination_action_id = rand( 10, 10000 );
25
+
26
+ $logs = [];
27
+ for ( $i = 0 ; $i < 3 ; $i++ ) {
28
+ for ( $j = 0 ; $j < 5 ; $j++ ) {
29
+ $logs[ $i ][ $j ] = md5(rand());
30
+ if ( $i == 1 ) {
31
+ $source->log( $source_action_id, $logs[ $i ][ $j ] );
32
+ }
33
+ }
34
+ }
35
+
36
+ $migrator->migrate( $source_action_id, $destination_action_id );
37
+
38
+ $migrated = $destination->get_logs( $destination_action_id );
39
+ $this->assertEqualSets( $logs[ 1 ], array_map( function( $log ) { return $log->get_message(); }, $migrated ) );
40
+
41
+ // no API for deleting logs, so we leave them for manual cleanup later
42
+ $this->assertCount( 5, $source->get_logs( $source_action_id ) );
43
+ }
44
+ }
includes/vendor/action-scheduler/tests/phpunit/migration/Runner_Test.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ use Action_Scheduler\Migration\Config;
5
+ use Action_Scheduler\Migration\Runner;
6
+ use ActionScheduler_wpCommentLogger as CommentLogger;
7
+ use ActionScheduler_wpPostStore as PostStore;
8
+
9
+ /**
10
+ * Class Runner_Test
11
+ * @group migration
12
+ */
13
+ class Runner_Test extends ActionScheduler_UnitTestCase {
14
+ public function setUp() {
15
+ parent::setUp();
16
+ if ( ! taxonomy_exists( PostStore::GROUP_TAXONOMY ) ) {
17
+ // register the post type and taxonomy necessary for the store to work
18
+ $store = new PostStore();
19
+ $store->init();
20
+ }
21
+ }
22
+
23
+ public function test_migrate_batches() {
24
+ $source_store = new PostStore();
25
+ $destination_store = new ActionScheduler_DBStore();
26
+ $source_logger = new CommentLogger();
27
+ $destination_logger = new ActionScheduler_DBLogger();
28
+
29
+ $config = new Config();
30
+ $config->set_source_store( $source_store );
31
+ $config->set_source_logger( $source_logger );
32
+ $config->set_destination_store( $destination_store );
33
+ $config->set_destination_logger( $destination_logger );
34
+
35
+ $runner = new Runner( $config );
36
+
37
+ $due = [];
38
+ $future = [];
39
+ $complete = [];
40
+
41
+ for ( $i = 0; $i < 5; $i ++ ) {
42
+ $time = as_get_datetime_object( $i + 1 . ' minutes' );
43
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
44
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
45
+ $future[] = $source_store->save_action( $action );
46
+
47
+ $time = as_get_datetime_object( $i + 1 . ' minutes ago' );
48
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
49
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
50
+ $due[] = $source_store->save_action( $action );
51
+
52
+ $time = as_get_datetime_object( $i + 1 . ' minutes ago' );
53
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
54
+ $action = new ActionScheduler_FinishedAction( 'my_hook', [], $schedule );
55
+ $complete[] = $source_store->save_action( $action );
56
+ }
57
+
58
+ $created = $source_store->query_actions( [ 'per_page' => 0 ] );
59
+ $this->assertCount( 15, $created );
60
+
61
+ $runner->run( 10 );
62
+
63
+ // due actions should migrate in the first batch
64
+ $migrated = $destination_store->query_actions( [ 'per_page' => 0, 'hook' => 'my_hook' ] );
65
+ $this->assertCount( 5, $migrated );
66
+
67
+ $remaining = $source_store->query_actions( [ 'per_page' => 0, 'hook' => 'my_hook' ] );
68
+ $this->assertCount( 10, $remaining );
69
+
70
+
71
+ $runner->run( 10 );
72
+
73
+ // pending actions should migrate in the second batch
74
+ $migrated = $destination_store->query_actions( [ 'per_page' => 0, 'hook' => 'my_hook' ] );
75
+ $this->assertCount( 10, $migrated );
76
+
77
+ $remaining = $source_store->query_actions( [ 'per_page' => 0, 'hook' => 'my_hook' ] );
78
+ $this->assertCount( 5, $remaining );
79
+
80
+
81
+ $runner->run( 10 );
82
+
83
+ // completed actions should migrate in the third batch
84
+ $migrated = $destination_store->query_actions( [ 'per_page' => 0, 'hook' => 'my_hook' ] );
85
+ $this->assertCount( 15, $migrated );
86
+
87
+ $remaining = $source_store->query_actions( [ 'per_page' => 0, 'hook' => 'my_hook' ] );
88
+ $this->assertCount( 0, $remaining );
89
+
90
+ }
91
+
92
+ }
includes/vendor/action-scheduler/tests/phpunit/migration/Scheduler_Test.php ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Action_Scheduler\Migration\Scheduler;
4
+ use ActionScheduler_wpPostStore as PostStore;
5
+
6
+ /**
7
+ * Class Scheduler_Test
8
+ * @group migration
9
+ */
10
+ class Scheduler_Test extends ActionScheduler_UnitTestCase {
11
+ public function setUp() {
12
+ parent::setUp();
13
+ if ( ! taxonomy_exists( PostStore::GROUP_TAXONOMY ) ) {
14
+ // register the post type and taxonomy necessary for the store to work
15
+ $store = new PostStore();
16
+ $store->init();
17
+ }
18
+ }
19
+
20
+ public function test_migration_is_complete() {
21
+ ActionScheduler_DataController::mark_migration_complete();
22
+ $this->assertTrue( ActionScheduler_DataController::is_migration_complete() );
23
+ }
24
+
25
+ public function test_migration_is_not_complete() {
26
+ $this->assertFalse( ActionScheduler_DataController::is_migration_complete() );
27
+ update_option( ActionScheduler_DataController::STATUS_FLAG, 'something_random' );
28
+ $this->assertFalse( ActionScheduler_DataController::is_migration_complete() );
29
+ }
30
+
31
+ public function test_migration_is_scheduled() {
32
+ $scheduler = new Scheduler();
33
+ $this->assertTrue( $scheduler->is_migration_scheduled() );
34
+ }
35
+
36
+ public function test_scheduler_runs_migration() {
37
+ $source_store = new PostStore();
38
+ $destination_store = new ActionScheduler_DBStore();
39
+
40
+ $return_5 = function () {
41
+ return 5;
42
+ };
43
+ add_filter( 'action_scheduler/migration_batch_size', $return_5 );
44
+
45
+ // Make sure successive migration actions are delayed so all actions aren't migrated at once on separate hooks
46
+ $return_60 = function () {
47
+ return 60;
48
+ };
49
+ add_filter( 'action_scheduler/migration_interval', $return_60 );
50
+
51
+ for ( $i = 0; $i < 10; $i ++ ) {
52
+ $time = as_get_datetime_object( $i + 1 . ' minutes' );
53
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
54
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
55
+ $future[] = $source_store->save_action( $action );
56
+
57
+ $time = as_get_datetime_object( $i + 1 . ' minutes ago' );
58
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
59
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
60
+ $due[] = $source_store->save_action( $action );
61
+ }
62
+
63
+ $this->assertCount( 20, $source_store->query_actions( [ 'per_page' => 0 ] ) );
64
+
65
+ $scheduler = new Scheduler();
66
+ $scheduler->unschedule_migration();
67
+ $scheduler->schedule_migration( time() - 1 );
68
+
69
+ $queue_runner = ActionScheduler_Mocker::get_queue_runner( $destination_store );
70
+ $queue_runner->run();
71
+
72
+ // 5 actions should have moved from the source store when the queue runner triggered the migration action
73
+ $this->assertCount( 15, $source_store->query_actions( [ 'per_page' => 0, 'hook' => 'my_hook' ] ) );
74
+
75
+ remove_filter( 'action_scheduler/migration_batch_size', $return_5 );
76
+ remove_filter( 'action_scheduler/migration_interval', $return_60 );
77
+ }
78
+
79
+ public function test_scheduler_marks_itself_complete() {
80
+ $source_store = new PostStore();
81
+ $destination_store = new ActionScheduler_DBStore();
82
+
83
+ for ( $i = 0; $i < 5; $i ++ ) {
84
+ $time = as_get_datetime_object( $i + 1 . ' minutes ago' );
85
+ $schedule = new ActionScheduler_SimpleSchedule( $time );
86
+ $action = new ActionScheduler_Action( 'my_hook', [], $schedule );
87
+ $due[] = $source_store->save_action( $action );
88
+ }
89
+
90
+ $this->assertCount( 5, $source_store->query_actions( [ 'per_page' => 0 ] ) );
91
+
92
+ $scheduler = new Scheduler();
93
+ $scheduler->unschedule_migration();
94
+ $scheduler->schedule_migration( time() - 1 );
95
+
96
+ $queue_runner = ActionScheduler_Mocker::get_queue_runner( $destination_store );
97
+ $queue_runner->run();
98
+
99
+ // All actions should have moved from the source store when the queue runner triggered the migration action
100
+ $this->assertCount( 0, $source_store->query_actions( [ 'per_page' => 0, 'hook' => 'my_hook' ] ) );
101
+
102
+ // schedule another so we can get it to run immediately
103
+ $scheduler->unschedule_migration();
104
+ $scheduler->schedule_migration( time() - 1 );
105
+
106
+ // run again so it knows that there's nothing left to process
107
+ $queue_runner->run();
108
+
109
+ $scheduler->unhook();
110
+
111
+ // ensure the flag is set marking migration as complete
112
+ $this->assertTrue( ActionScheduler_DataController::is_migration_complete() );
113
+
114
+ // ensure that another instance has not been scheduled
115
+ $this->assertFalse( $scheduler->is_migration_scheduled() );
116
+
117
+ }
118
+ }
includes/vendor/action-scheduler/tests/phpunit/procedural_api/procedural_api_Test.php CHANGED
@@ -12,7 +12,7 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
12
 
13
  $store = ActionScheduler::store();
14
  $action = $store->fetch_action($action_id);
15
- $this->assertEquals( $time, $action->get_schedule()->next()->getTimestamp() );
16
  $this->assertEquals( $hook, $action->get_hook() );
17
  }
18
 
@@ -23,8 +23,8 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
23
 
24
  $store = ActionScheduler::store();
25
  $action = $store->fetch_action($action_id);
26
- $this->assertEquals( $time, $action->get_schedule()->next()->getTimestamp() );
27
- $this->assertEquals( $time + HOUR_IN_SECONDS + 2, $action->get_schedule()->next(as_get_datetime_object($time + 2))->getTimestamp());
28
  $this->assertEquals( $hook, $action->get_hook() );
29
  }
30
 
@@ -36,8 +36,11 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
36
  $store = ActionScheduler::store();
37
  $action = $store->fetch_action($action_id);
38
  $expected_date = as_get_datetime_object('2014-10-10');
39
- $this->assertEquals( $expected_date->getTimestamp(), $action->get_schedule()->next()->getTimestamp() );
40
  $this->assertEquals( $hook, $action->get_hook() );
 
 
 
41
  }
42
 
43
  public function test_get_next() {
@@ -50,6 +53,32 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
50
  $this->assertEquals( $time->getTimestamp(), $next );
51
  }
52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  public function provider_time_hook_args_group() {
54
  $time = time() + 60 * 2;
55
  $hook = md5( rand() );
@@ -111,13 +140,16 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
111
 
112
  // Make sure the next scheduled action is unscheduled
113
  $this->assertEquals( $hook, $unscheduled_action->get_hook() );
114
- $this->assertNull( $unscheduled_action->get_schedule()->next() );
 
 
115
 
116
  // Make sure other scheduled actions are not unscheduled
 
117
  $scheduled_action = $store->fetch_action( $action_id_scheduled );
118
 
119
  $this->assertEquals( $hook, $scheduled_action->get_hook() );
120
- $this->assertEquals( $action_scheduled_time, $scheduled_action->get_schedule()->next()->getTimestamp() );
121
  }
122
 
123
  /**
@@ -137,13 +169,18 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
137
  $next = as_next_scheduled_action( $hook );
138
  $this->assertFalse($next);
139
 
 
 
 
140
  $store = ActionScheduler::store();
141
 
142
  foreach ( $action_ids as $action_id ) {
143
  $action = $store->fetch_action($action_id);
144
 
145
- $this->assertNull($action->get_schedule()->next());
146
- $this->assertEquals($hook, $action->get_hook() );
 
 
147
  }
148
  }
149
 
@@ -201,7 +238,7 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
201
  $au_now = new ActionScheduler_DateTime(null);
202
  $as_au_now = as_get_datetime_object();
203
 
204
- $this->assertEquals($au_now->getTimestamp(),$as_now->getTimestamp());
205
 
206
  // But not in the same timezone, as $as_now should be using UTC
207
  $this->assertNotEquals($au_now->format('Y-m-d H:i:s'),$as_now->format('Y-m-d H:i:s'));
12
 
13
  $store = ActionScheduler::store();
14
  $action = $store->fetch_action($action_id);
15
+ $this->assertEquals( $time, $action->get_schedule()->get_date()->getTimestamp() );
16
  $this->assertEquals( $hook, $action->get_hook() );
17
  }
18
 
23
 
24
  $store = ActionScheduler::store();
25
  $action = $store->fetch_action($action_id);
26
+ $this->assertEquals( $time, $action->get_schedule()->get_date()->getTimestamp() );
27
+ $this->assertEquals( $time + HOUR_IN_SECONDS + 2, $action->get_schedule()->get_next(as_get_datetime_object($time + 2))->getTimestamp());
28
  $this->assertEquals( $hook, $action->get_hook() );
29
  }
30
 
36
  $store = ActionScheduler::store();
37
  $action = $store->fetch_action($action_id);
38
  $expected_date = as_get_datetime_object('2014-10-10');
39
+ $this->assertEquals( $expected_date->getTimestamp(), $action->get_schedule()->get_date()->getTimestamp() );
40
  $this->assertEquals( $hook, $action->get_hook() );
41
+
42
+ $expected_date = as_get_datetime_object( '2015-10-10' );
43
+ $this->assertEquals( $expected_date->getTimestamp(), $action->get_schedule()->get_next( as_get_datetime_object( '2015-01-02' ) )->getTimestamp() );
44
  }
45
 
46
  public function test_get_next() {
53
  $this->assertEquals( $time->getTimestamp(), $next );
54
  }
55
 
56
+ public function test_get_next_async() {
57
+ $hook = md5(rand());
58
+ $action_id = as_enqueue_async_action( $hook );
59
+
60
+ $next = as_next_scheduled_action( $hook );
61
+
62
+ $this->assertTrue( $next );
63
+
64
+ $store = ActionScheduler::store();
65
+
66
+ // Completed async actions should still return false
67
+ $store->mark_complete( $action_id );
68
+ $next = as_next_scheduled_action( $hook );
69
+ $this->assertFalse( $next );
70
+
71
+ // Failed async actions should still return false
72
+ $store->mark_failure( $action_id );
73
+ $next = as_next_scheduled_action( $hook );
74
+ $this->assertFalse( $next );
75
+
76
+ // Cancelled async actions should still return false
77
+ $store->cancel_action( $action_id );
78
+ $next = as_next_scheduled_action( $hook );
79
+ $this->assertFalse( $next );
80
+ }
81
+
82
  public function provider_time_hook_args_group() {
83
  $time = time() + 60 * 2;
84
  $hook = md5( rand() );
140
 
141
  // Make sure the next scheduled action is unscheduled
142
  $this->assertEquals( $hook, $unscheduled_action->get_hook() );
143
+ $this->assertEquals( as_get_datetime_object($time), $unscheduled_action->get_schedule()->get_date() );
144
+ $this->assertEquals( ActionScheduler_Store::STATUS_CANCELED, $store->get_status( $action_id_unscheduled ) );
145
+ $this->assertNull( $unscheduled_action->get_schedule()->get_next( as_get_datetime_object() ) );
146
 
147
  // Make sure other scheduled actions are not unscheduled
148
+ $this->assertEquals( ActionScheduler_Store::STATUS_PENDING, $store->get_status( $action_id_scheduled ) );
149
  $scheduled_action = $store->fetch_action( $action_id_scheduled );
150
 
151
  $this->assertEquals( $hook, $scheduled_action->get_hook() );
152
+ $this->assertEquals( $action_scheduled_time, $scheduled_action->get_schedule()->get_date()->getTimestamp() );
153
  }
154
 
155
  /**
169
  $next = as_next_scheduled_action( $hook );
170
  $this->assertFalse($next);
171
 
172
+ $after = as_get_datetime_object( $time );
173
+ $after->modify( '+1 minute' );
174
+
175
  $store = ActionScheduler::store();
176
 
177
  foreach ( $action_ids as $action_id ) {
178
  $action = $store->fetch_action($action_id);
179
 
180
+ $this->assertEquals( $hook, $action->get_hook() );
181
+ $this->assertEquals( as_get_datetime_object( $time ), $action->get_schedule()->get_date() );
182
+ $this->assertEquals( ActionScheduler_Store::STATUS_CANCELED, $store->get_status( $action_id ) );
183
+ $this->assertNull( $action->get_schedule()->get_next( $after ) );
184
  }
185
  }
186
 
238
  $au_now = new ActionScheduler_DateTime(null);
239
  $as_au_now = as_get_datetime_object();
240
 
241
+ $this->assertEquals( $au_now->getTimestamp(), $as_now->getTimestamp(), '', 2 );
242
 
243
  // But not in the same timezone, as $as_now should be using UTC
244
  $this->assertNotEquals($au_now->format('Y-m-d H:i:s'),$as_now->format('Y-m-d H:i:s'));
includes/vendor/action-scheduler/tests/phpunit/runner/ActionScheduler_QueueCleaner_Test.php CHANGED
@@ -7,7 +7,7 @@ class ActionScheduler_QueueCleaner_Test extends ActionScheduler_UnitTestCase {
7
 
8
  public function test_delete_old_actions() {
9
  $store = ActionScheduler::store();
10
- $runner = new ActionScheduler_QueueRunner( $store );
11
 
12
  $random = md5(rand());
13
  $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
@@ -62,7 +62,7 @@ class ActionScheduler_QueueCleaner_Test extends ActionScheduler_UnitTestCase {
62
 
63
  public function test_do_not_delete_recent_actions() {
64
  $store = ActionScheduler::store();
65
- $runner = new ActionScheduler_QueueRunner( $store );
66
 
67
  $random = md5(rand());
68
  $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
7
 
8
  public function test_delete_old_actions() {
9
  $store = ActionScheduler::store();
10
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
11
 
12
  $random = md5(rand());
13
  $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
62
 
63
  public function test_do_not_delete_recent_actions() {
64
  $store = ActionScheduler::store();
65
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
66
 
67
  $random = md5(rand());
68
  $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
includes/vendor/action-scheduler/tests/phpunit/runner/ActionScheduler_QueueRunner_Test.php CHANGED
@@ -7,7 +7,7 @@
7
  class ActionScheduler_QueueRunner_Test extends ActionScheduler_UnitTestCase {
8
  public function test_create_runner() {
9
  $store = ActionScheduler::store();
10
- $runner = new ActionScheduler_QueueRunner( $store );
11
  $actions_run = $runner->run();
12
 
13
  $this->assertEquals( 0, $actions_run );
@@ -15,7 +15,7 @@ class ActionScheduler_QueueRunner_Test extends ActionScheduler_UnitTestCase {
15
 
16
  public function test_run() {
17
  $store = ActionScheduler::store();
18
- $runner = new ActionScheduler_QueueRunner( $store );
19
 
20
  $mock = new MockAction();
21
  $random = md5(rand());
@@ -37,7 +37,7 @@ class ActionScheduler_QueueRunner_Test extends ActionScheduler_UnitTestCase {
37
 
38
  public function test_run_with_future_actions() {
39
  $store = ActionScheduler::store();
40
- $runner = new ActionScheduler_QueueRunner( $store );
41
 
42
  $mock = new MockAction();
43
  $random = md5(rand());
@@ -65,7 +65,7 @@ class ActionScheduler_QueueRunner_Test extends ActionScheduler_UnitTestCase {
65
 
66
  public function test_completed_action_status() {
67
  $store = ActionScheduler::store();
68
- $runner = new ActionScheduler_QueueRunner( $store );
69
 
70
  $random = md5(rand());
71
  $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('12 hours ago'));
@@ -80,77 +80,145 @@ class ActionScheduler_QueueRunner_Test extends ActionScheduler_UnitTestCase {
80
  $this->assertTrue( $finished_action->is_finished() );
81
  }
82
 
83
- public function test_next_instance_of_action() {
84
- $store = ActionScheduler::store();
85
- $runner = new ActionScheduler_QueueRunner( $store );
 
 
 
86
 
87
- $random = md5(rand());
88
- $schedule = new ActionScheduler_IntervalSchedule(as_get_datetime_object('12 hours ago'), DAY_IN_SECONDS);
 
 
 
89
 
90
- $action = new ActionScheduler_Action( $random, array(), $schedule );
91
- $store->save_action( $action );
92
 
93
- $runner->run();
 
 
 
 
 
 
 
 
 
 
 
 
 
94
 
95
- $claim = $store->stake_claim(10, as_get_datetime_object((DAY_IN_SECONDS - 60).' seconds'));
96
- $this->assertCount(0, $claim->get_actions());
97
 
98
- $claim = $store->stake_claim(10, as_get_datetime_object(DAY_IN_SECONDS.' seconds'));
99
  $actions = $claim->get_actions();
100
- $this->assertCount(1, $actions);
101
 
102
- $action_id = reset($actions);
103
- $new_action = $store->fetch_action($action_id);
104
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
- $this->assertEquals( $random, $new_action->get_hook() );
107
- $this->assertEquals( $schedule->next(as_get_datetime_object())->getTimestamp(), $new_action->get_schedule()->next(as_get_datetime_object())->getTimestamp() );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  }
109
 
110
  public function test_hooked_into_wp_cron() {
111
- $next = wp_next_scheduled( ActionScheduler_QueueRunner::WP_CRON_HOOK );
112
  $this->assertNotEmpty($next);
113
  }
114
 
115
  public function test_batch_count_limit() {
116
  $store = ActionScheduler::store();
117
- $runner = new ActionScheduler_QueueRunner( $store );
118
 
119
  $mock = new MockAction();
120
  $random = md5(rand());
121
  add_action( $random, array( $mock, 'action' ) );
122
  $schedule = new ActionScheduler_SimpleSchedule(new ActionScheduler_DateTime('1 day ago'));
123
 
124
- for ( $i = 0 ; $i < 30 ; $i++ ) {
125
  $action = new ActionScheduler_Action( $random, array($random), $schedule );
126
  $store->save_action( $action );
127
  }
128
 
129
- $claims = array();
130
-
131
- for ( $i = 0 ; $i < 5 ; $i++ ) {
132
- $claims[] = $store->stake_claim( 5 );
133
- }
134
 
135
  $actions_run = $runner->run();
136
 
137
-
138
  $this->assertEquals( 0, $mock->get_call_count() );
139
  $this->assertEquals( 0, $actions_run );
140
 
141
- $first = reset($claims);
142
- $store->release_claim( $first );
143
 
144
  $actions_run = $runner->run();
145
- $this->assertEquals( 10, $mock->get_call_count() );
146
- $this->assertEquals( 10, $actions_run );
 
147
 
148
  remove_action( $random, array( $mock, 'action' ) );
149
  }
150
 
151
  public function test_changing_batch_count_limit() {
152
  $store = ActionScheduler::store();
153
- $runner = new ActionScheduler_QueueRunner( $store );
154
 
155
  $random = md5(rand());
156
  $schedule = new ActionScheduler_SimpleSchedule(new ActionScheduler_DateTime('1 day ago'));
7
  class ActionScheduler_QueueRunner_Test extends ActionScheduler_UnitTestCase {
8
  public function test_create_runner() {
9
  $store = ActionScheduler::store();
10
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
11
  $actions_run = $runner->run();
12
 
13
  $this->assertEquals( 0, $actions_run );
15
 
16
  public function test_run() {
17
  $store = ActionScheduler::store();
18
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
19
 
20
  $mock = new MockAction();
21
  $random = md5(rand());
37
 
38
  public function test_run_with_future_actions() {
39
  $store = ActionScheduler::store();
40
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
41
 
42
  $mock = new MockAction();
43
  $random = md5(rand());
65
 
66
  public function test_completed_action_status() {
67
  $store = ActionScheduler::store();
68
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
69
 
70
  $random = md5(rand());
71
  $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('12 hours ago'));
80
  $this->assertTrue( $finished_action->is_finished() );
81
  }
82
 
83
+ public function test_next_instance_of_cron_action() {
84
+ // Create an action with daily Cron expression (i.e. midnight each day)
85
+ $random = md5( rand() );
86
+ $action_id = ActionScheduler::factory()->cron( $random, array(), null, '0 0 * * *' );
87
+ $store = ActionScheduler::store();
88
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
89
 
90
+ // Make sure the 1st instance of the action is scheduled to occur tomorrow
91
+ $date = as_get_datetime_object( 'tomorrow' );
92
+ $date->modify( '-1 minute' );
93
+ $claim = $store->stake_claim( 10, $date );
94
+ $this->assertCount( 0, $claim->get_actions() );
95
 
96
+ $store->release_claim( $claim );
 
97
 
98
+ $date->modify( '+1 minute' );
99
+
100
+ $claim = $store->stake_claim( 10, $date );
101
+ $actions = $claim->get_actions();
102
+ $this->assertCount( 1, $actions );
103
+
104
+ $fetched_action_id = reset( $actions );
105
+ $fetched_action = $store->fetch_action( $fetched_action_id );
106
+
107
+ $this->assertEquals( $fetched_action_id, $action_id );
108
+ $this->assertEquals( $random, $fetched_action->get_hook() );
109
+ $this->assertEquals( $date->getTimestamp(), $fetched_action->get_schedule()->get_date()->getTimestamp(), '', 1 );
110
+
111
+ $store->release_claim( $claim );
112
 
113
+ // Make sure the 2nd instance of the cron action is scheduled to occur tomorrow still
114
+ $runner->process_action( $action_id );
115
 
116
+ $claim = $store->stake_claim( 10, $date );
117
  $actions = $claim->get_actions();
118
+ $this->assertCount( 1, $actions );
119
 
120
+ $fetched_action_id = reset( $actions );
121
+ $fetched_action = $store->fetch_action( $fetched_action_id );
122
 
123
+ $this->assertNotEquals( $fetched_action_id, $action_id );
124
+ $this->assertEquals( $random, $fetched_action->get_hook() );
125
+ $this->assertEquals( $date->getTimestamp(), $fetched_action->get_schedule()->get_date()->getTimestamp(), '', 1 );
126
+ }
127
+
128
+ public function test_next_instance_of_interval_action() {
129
+ // Create an action to recur every 24 hours, with the first instance scheduled to run 12 hours ago
130
+ $random = md5( rand() );
131
+ $date = as_get_datetime_object( '12 hours ago' );
132
+ $action_id = ActionScheduler::factory()->recurring( $random, array(), $date->getTimestamp(), DAY_IN_SECONDS );
133
+ $store = ActionScheduler::store();
134
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
135
+
136
+ // Make sure the 1st instance of the action is scheduled to occur 12 hours ago
137
+ $claim = $store->stake_claim( 10, $date );
138
+ $actions = $claim->get_actions();
139
+ $this->assertCount( 1, $actions );
140
 
141
+ $fetched_action_id = reset( $actions );
142
+ $fetched_action = $store->fetch_action( $fetched_action_id );
143
+
144
+ $this->assertEquals( $fetched_action_id, $action_id );
145
+ $this->assertEquals( $random, $fetched_action->get_hook() );
146
+ $this->assertEquals( $date->getTimestamp(), $fetched_action->get_schedule()->get_date()->getTimestamp(), '', 1 );
147
+
148
+ $store->release_claim( $claim );
149
+
150
+ // Make sure after the queue is run, the 2nd instance of the action is scheduled to occur in 24 hours
151
+ $runner->run();
152
+
153
+ $date = as_get_datetime_object( '+1 day' );
154
+ $claim = $store->stake_claim( 10, $date );
155
+ $actions = $claim->get_actions();
156
+ $this->assertCount( 1, $actions );
157
+
158
+ $fetched_action_id = reset( $actions );
159
+ $fetched_action = $store->fetch_action( $fetched_action_id );
160
+
161
+ $this->assertNotEquals( $fetched_action_id, $action_id );
162
+ $this->assertEquals( $random, $fetched_action->get_hook() );
163
+ $this->assertEquals( $date->getTimestamp(), $fetched_action->get_schedule()->get_date()->getTimestamp(), '', 1 );
164
+
165
+ $store->release_claim( $claim );
166
+
167
+ // Make sure the 3rd instance of the cron action is scheduled for 24 hours from now, as the action was run early, ahead of schedule
168
+ $runner->process_action( $action_id );
169
+ $date = as_get_datetime_object( '+1 day' );
170
+
171
+ $claim = $store->stake_claim( 10, $date );
172
+ $actions = $claim->get_actions();
173
+ $this->assertCount( 1, $actions );
174
+
175
+ $fetched_action_id = reset( $actions );
176
+ $fetched_action = $store->fetch_action( $fetched_action_id );
177
+
178
+ $this->assertNotEquals( $fetched_action_id, $action_id );
179
+ $this->assertEquals( $random, $fetched_action->get_hook() );
180
+ $this->assertEquals( $date->getTimestamp(), $fetched_action->get_schedule()->get_date()->getTimestamp(), '', 1 );
181
  }
182
 
183
  public function test_hooked_into_wp_cron() {
184
+ $next = wp_next_scheduled( ActionScheduler_QueueRunner::WP_CRON_HOOK, array( 'WP Cron' ) );
185
  $this->assertNotEmpty($next);
186
  }
187
 
188
  public function test_batch_count_limit() {
189
  $store = ActionScheduler::store();
190
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
191
 
192
  $mock = new MockAction();
193
  $random = md5(rand());
194
  add_action( $random, array( $mock, 'action' ) );
195
  $schedule = new ActionScheduler_SimpleSchedule(new ActionScheduler_DateTime('1 day ago'));
196
 
197
+ for ( $i = 0 ; $i < 2 ; $i++ ) {
198
  $action = new ActionScheduler_Action( $random, array($random), $schedule );
199
  $store->save_action( $action );
200
  }
201
 
202
+ $claim = $store->stake_claim();
 
 
 
 
203
 
204
  $actions_run = $runner->run();
205
 
 
206
  $this->assertEquals( 0, $mock->get_call_count() );
207
  $this->assertEquals( 0, $actions_run );
208
 
209
+ $store->release_claim( $claim );
 
210
 
211
  $actions_run = $runner->run();
212
+
213
+ $this->assertEquals( 2, $mock->get_call_count() );
214
+ $this->assertEquals( 2, $actions_run );
215
 
216
  remove_action( $random, array( $mock, 'action' ) );
217
  }
218
 
219
  public function test_changing_batch_count_limit() {
220
  $store = ActionScheduler::store();
221
+ $runner = ActionScheduler_Mocker::get_queue_runner( $store );
222
 
223
  $random = md5(rand());
224
  $schedule = new ActionScheduler_SimpleSchedule(new ActionScheduler_DateTime('1 day ago'));
includes/vendor/action-scheduler/tests/phpunit/schedules/ActionScheduler_CronSchedule_Test.php CHANGED
@@ -8,15 +8,46 @@ class ActionScheduler_CronSchedule_Test extends ActionScheduler_UnitTestCase {
8
  public function test_creation() {
9
  $time = as_get_datetime_object('tomorrow');
10
  $cron = CronExpression::factory('@daily');
11
- $schedule = new ActionScheduler_CronSchedule(as_get_datetime_object(), $cron);
12
- $this->assertEquals( $time, $schedule->next() );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  }
14
 
15
  public function test_next() {
16
  $time = as_get_datetime_object('2013-06-14');
17
  $cron = CronExpression::factory('@daily');
18
  $schedule = new ActionScheduler_CronSchedule($time, $cron);
19
- $this->assertEquals( as_get_datetime_object('tomorrow'), $schedule->next( as_get_datetime_object() ) );
20
  }
21
 
22
  public function test_is_recurring() {
@@ -28,18 +59,18 @@ class ActionScheduler_CronSchedule_Test extends ActionScheduler_UnitTestCase {
28
  $time = as_get_datetime_object('2014-01-01');
29
  $cron = CronExpression::factory('0 0 10 10 *');
30
  $schedule = new ActionScheduler_CronSchedule($time, $cron);
31
- $this->assertEquals( as_get_datetime_object('2014-10-10'), $schedule->next() );
32
 
33
  $cron = CronExpression::factory('0 0 L 1/2 *');
34
  $schedule = new ActionScheduler_CronSchedule($time, $cron);
35
- $this->assertEquals( as_get_datetime_object('2014-01-31'), $schedule->next() );
36
- $this->assertEquals( as_get_datetime_object('2014-07-31'), $schedule->next( as_get_datetime_object('2014-06-01') ) );
37
- $this->assertEquals( as_get_datetime_object('2028-11-30'), $schedule->next( as_get_datetime_object('2028-11-01') ) );
38
 
39
  $cron = CronExpression::factory('30 14 * * MON#3 *');
40
  $schedule = new ActionScheduler_CronSchedule($time, $cron);
41
- $this->assertEquals( as_get_datetime_object('2014-01-20 14:30:00'), $schedule->next() );
42
- $this->assertEquals( as_get_datetime_object('2014-05-19 14:30:00'), $schedule->next( as_get_datetime_object('2014-05-01') ) );
43
  }
44
  }
45
 
8
  public function test_creation() {
9
  $time = as_get_datetime_object('tomorrow');
10
  $cron = CronExpression::factory('@daily');
11
+ $start = clone $time;
12
+ $start->modify( '-1 hour' );
13
+ $schedule = new ActionScheduler_CronSchedule( $start, $cron );
14
+ $this->assertEquals( $time, $schedule->get_date() );
15
+ $this->assertEquals( $start, $schedule->get_first_date() );
16
+
17
+ // Test delaying for a future start date
18
+ $start->modify( '+1 week' );
19
+ $time->modify( '+1 week' );
20
+
21
+ $schedule = new ActionScheduler_CronSchedule( $start, $cron );
22
+ $this->assertEquals( $time, $schedule->get_date() );
23
+ $this->assertEquals( $start, $schedule->get_first_date() );
24
+ }
25
+
26
+ public function test_creation_with_first_date() {
27
+ $time = as_get_datetime_object( 'tomorrow' );
28
+ $cron = CronExpression::factory( '@daily' );
29
+ $start = clone $time;
30
+ $start->modify( '-1 hour' );
31
+ $schedule = new ActionScheduler_CronSchedule( $start, $cron );
32
+ $this->assertEquals( $time, $schedule->get_date() );
33
+ $this->assertEquals( $start, $schedule->get_first_date() );
34
+
35
+ // Test delaying for a future start date
36
+ $first = clone $time;
37
+ $first->modify( '-1 day' );
38
+ $start->modify( '+1 week' );
39
+ $time->modify( '+1 week' );
40
+
41
+ $schedule = new ActionScheduler_CronSchedule( $start, $cron, $first );
42
+ $this->assertEquals( $time, $schedule->get_date() );
43
+ $this->assertEquals( $first, $schedule->get_first_date() );
44
  }
45
 
46
  public function test_next() {
47
  $time = as_get_datetime_object('2013-06-14');
48
  $cron = CronExpression::factory('@daily');
49
  $schedule = new ActionScheduler_CronSchedule($time, $cron);
50
+ $this->assertEquals( as_get_datetime_object('tomorrow'), $schedule->get_next( as_get_datetime_object() ) );
51
  }
52
 
53
  public function test_is_recurring() {
59
  $time = as_get_datetime_object('2014-01-01');
60
  $cron = CronExpression::factory('0 0 10 10 *');
61
  $schedule = new ActionScheduler_CronSchedule($time, $cron);
62
+ $this->assertEquals( as_get_datetime_object('2014-10-10'), $schedule->get_date() );
63
 
64
  $cron = CronExpression::factory('0 0 L 1/2 *');
65
  $schedule = new ActionScheduler_CronSchedule($time, $cron);
66
+ $this->assertEquals( as_get_datetime_object('2014-01-31'), $schedule->get_date() );
67
+ $this->assertEquals( as_get_datetime_object('2014-07-31'), $schedule->get_next( as_get_datetime_object('2014-06-01') ) );
68
+ $this->assertEquals( as_get_datetime_object('2028-11-30'), $schedule->get_next( as_get_datetime_object('2028-11-01') ) );
69
 
70
  $cron = CronExpression::factory('30 14 * * MON#3 *');
71
  $schedule = new ActionScheduler_CronSchedule($time, $cron);
72
+ $this->assertEquals( as_get_datetime_object('2014-01-20 14:30:00'), $schedule->get_date() );
73
+ $this->assertEquals( as_get_datetime_object('2014-05-19 14:30:00'), $schedule->get_next( as_get_datetime_object('2014-05-01') ) );
74
  }
75
  }
76
 
includes/vendor/action-scheduler/tests/phpunit/schedules/ActionScheduler_IntervalSchedule_Test.php CHANGED
@@ -8,16 +8,25 @@ class ActionScheduler_IntervalSchedule_Test extends ActionScheduler_UnitTestCase
8
  public function test_creation() {
9
  $time = as_get_datetime_object();
10
  $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS);
11
- $this->assertEquals( $time, $schedule->next() );
 
 
 
 
 
 
 
 
 
12
  }
13
 
14
  public function test_next() {
15
  $now = time();
16
  $start = $now - 30;
17
  $schedule = new ActionScheduler_IntervalSchedule( as_get_datetime_object("@$start"), MINUTE_IN_SECONDS );
18
- $this->assertEquals( $start, $schedule->next()->getTimestamp() );
19
- $this->assertEquals( $now + MINUTE_IN_SECONDS, $schedule->next(as_get_datetime_object())->getTimestamp() );
20
- $this->assertEquals( $start, $schedule->next(as_get_datetime_object("@$start"))->getTimestamp() );
21
  }
22
 
23
  public function test_is_recurring() {
8
  public function test_creation() {
9
  $time = as_get_datetime_object();
10
  $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS);
11
+ $this->assertEquals( $time, $schedule->get_date() );
12
+ $this->assertEquals( $time, $schedule->get_first_date() );
13
+ }
14
+
15
+ public function test_creation_with_first_date() {
16
+ $first = as_get_datetime_object();
17
+ $time = as_get_datetime_object( '+12 hours' );
18
+ $schedule = new ActionScheduler_IntervalSchedule( $time, HOUR_IN_SECONDS, $first );
19
+ $this->assertEquals( $time, $schedule->get_date() );
20
+ $this->assertEquals( $first, $schedule->get_first_date() );
21
  }
22
 
23
  public function test_next() {
24
  $now = time();
25
  $start = $now - 30;
26
  $schedule = new ActionScheduler_IntervalSchedule( as_get_datetime_object("@$start"), MINUTE_IN_SECONDS );
27
+ $this->assertEquals( $start, $schedule->get_date()->getTimestamp() );
28
+ $this->assertEquals( $now + MINUTE_IN_SECONDS, $schedule->get_next(as_get_datetime_object())->getTimestamp() );
29
+ $this->assertEquals( $start, $schedule->get_next( as_get_datetime_object( "@$start" ) )->getTimestamp() );
30
  }
31
 
32
  public function test_is_recurring() {
includes/vendor/action-scheduler/tests/phpunit/schedules/ActionScheduler_NullSchedule_Test.php CHANGED
@@ -7,7 +7,7 @@
7
  class ActionScheduler_NullSchedule_Test extends ActionScheduler_UnitTestCase {
8
  public function test_null_schedule() {
9
  $schedule = new ActionScheduler_NullSchedule();
10
- $this->assertNull( $schedule->next() );
11
  }
12
 
13
  public function test_is_recurring() {
7
  class ActionScheduler_NullSchedule_Test extends ActionScheduler_UnitTestCase {
8
  public function test_null_schedule() {
9
  $schedule = new ActionScheduler_NullSchedule();
10
+ $this->assertNull( $schedule->get_date() );
11
  }
12
 
13
  public function test_is_recurring() {
includes/vendor/action-scheduler/tests/phpunit/schedules/ActionScheduler_SimpleSchedule_Test.php CHANGED
@@ -8,25 +8,25 @@ class ActionScheduler_SimpleSchedule_Test extends ActionScheduler_UnitTestCase {
8
  public function test_creation() {
9
  $time = as_get_datetime_object();
10
  $schedule = new ActionScheduler_SimpleSchedule($time);
11
- $this->assertEquals( $time, $schedule->next() );
12
  }
13
 
14
  public function test_past_date() {
15
  $time = as_get_datetime_object('-1 day');
16
  $schedule = new ActionScheduler_SimpleSchedule($time);
17
- $this->assertEquals( $time, $schedule->next() );
18
  }
19
 
20
  public function test_future_date() {
21
  $time = as_get_datetime_object('+1 day');
22
  $schedule = new ActionScheduler_SimpleSchedule($time);
23
- $this->assertEquals( $time, $schedule->next() );
24
  }
25
 
26
  public function test_grace_period_for_next() {
27
  $time = as_get_datetime_object('3 seconds ago');
28
  $schedule = new ActionScheduler_SimpleSchedule($time);
29
- $this->assertEquals( $time, $schedule->next() );
30
  }
31
 
32
  public function test_is_recurring() {
8
  public function test_creation() {
9
  $time = as_get_datetime_object();
10
  $schedule = new ActionScheduler_SimpleSchedule($time);
11
+ $this->assertEquals( $time, $schedule->get_date() );
12
  }
13
 
14
  public function test_past_date() {
15
  $time = as_get_datetime_object('-1 day');
16
  $schedule = new ActionScheduler_SimpleSchedule($time);
17
+ $this->assertEquals( $time, $schedule->get_date() );
18
  }
19
 
20
  public function test_future_date() {
21
  $time = as_get_datetime_object('+1 day');
22
  $schedule = new ActionScheduler_SimpleSchedule($time);
23
+ $this->assertEquals( $time, $schedule->get_date() );
24
  }
25
 
26
  public function test_grace_period_for_next() {
27
  $time = as_get_datetime_object('3 seconds ago');
28
  $schedule = new ActionScheduler_SimpleSchedule($time);
29
+ $this->assertEquals( $time, $schedule->get_date() );
30
  }
31
 
32
  public function test_is_recurring() {
languages/mc-woocommerce-pt_BR.mo DELETED
Binary file
languages/mc-woocommerce-pt_BR.po DELETED
@@ -1,933 +0,0 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: \n"
4
- "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/mailchimp-for-"
5
- "woocommerce\n"
6
- "POT-Creation-Date: 2019-11-06T10:22:06+00:00\n"
7
- "PO-Revision-Date: 2019-11-06 11:23+0100\n"
8
- "Last-Translator: \n"
9
- "Language-Team: \n"
10
- "Language: pt_BR\n"
11
- "MIME-Version: 1.0\n"
12
- "Content-Type: text/plain; charset=UTF-8\n"
13
- "Content-Transfer-Encoding: 8bit\n"
14
- "X-Generator: Poedit 2.0.7\n"
15
- "X-Poedit-Basepath: .\n"
16
- "Plural-Forms: nplurals=2; plural=(n > 1);\n"
17
-
18
- #. Plugin Name of the plugin
19
- msgid "Mailchimp for WooCommerce"
20
- msgstr "Mailchimp para Woocommerce"
21
-
22
- #. Plugin URI of the plugin
23
- msgid "https://mailchimp.com/connect-your-store/"
24
- msgstr ""
25
-
26
- #. Description of the plugin
27
- msgid ""
28
- "Connects WooCommerce to Mailchimp to sync your store data, send targeted "
29
- "campaigns to your customers, and sell more stuff."
30
- msgstr ""
31
- "Conecta o Woocommerce ao Mailchimp para sincronizar sua Loja, enviar "
32
- "campanhas segmentadas para seus clientes, e vender mais."
33
-
34
- #. Author of the plugin
35
- msgid "Mailchimp"
36
- msgstr "Mailchimp"
37
-
38
- #. Author URI of the plugin
39
- msgid "https://mailchimp.com"
40
- msgstr ""
41
-
42
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:179
43
- msgid "Please select an option"
44
- msgstr "Por favor selecione uma opção"
45
-
46
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:182
47
- msgid "Sending Feedback"
48
- msgstr "Enviando Feedback"
49
-
50
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:327
51
- msgid "I want to change the audience associated with this integration."
52
- msgstr "Gostaria de trocar a audiência associada a esta integração."
53
-
54
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:331
55
- msgid "I want to change the site or store connected through this integration."
56
- msgstr "Gostaria de trocar o Site ou Loja conectado a esta integração."
57
-
58
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:335
59
- msgid "The order data isn't syncing."
60
- msgstr "Os dados de Pedidos não estão sincronizando."
61
-
62
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:339
63
- msgid "The promo codes aren't showing up."
64
- msgstr "Os Cupons não estão sincronizando."
65
-
66
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:343
67
- msgid "I'm trying to troubleshoot the integration."
68
- msgstr "Estou tentando resolver um problema com a integração."
69
-
70
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:347
71
- msgid "I was instructed to disconnect by Mailchimp Support."
72
- msgstr "Fui instruído pelo suporte do Mailchimp a desconectar."
73
-
74
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:351
75
- msgid "I no longer use this integration."
76
- msgstr "Não utilizo mais esta integração."
77
-
78
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:355
79
- msgid "It's a temporary deactivation."
80
- msgstr "É uma desativação temporária."
81
-
82
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:359
83
- msgid "Other"
84
- msgstr "Outros"
85
-
86
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:361
87
- msgid "Please share the reason"
88
- msgstr "Por favor, compartilhe o motivo"
89
-
90
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:370
91
- msgid "Quick Feedback"
92
- msgstr "Feedback rápido"
93
-
94
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:371
95
- msgid "Close"
96
- msgstr "Fechar"
97
-
98
- #. translators: %s - plugin name.
99
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:378
100
- msgid "If you have a moment, please share why you are deactivating %s:"
101
- msgstr ""
102
- "Se você tiver um momento, por favor nos diga porque você está desativando %s:"
103
-
104
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:379
105
- #: admin/class-mailchimp-woocommerce-admin.php:270
106
- msgid "Mailchimp for Woocommerce"
107
- msgstr "Mailchimp para Woocommerce"
108
-
109
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:398
110
- msgid "Submit & Deactivate"
111
- msgstr "Enviar e Desativar"
112
-
113
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:399
114
- msgid "Skip & Deactivate"
115
- msgstr "Pular e Desativar"
116
-
117
- #. translators: %s - Mailchimp Privacy Policy URL.
118
- #: includes/class-mailchimp-woocommerce-privacy.php:12
119
- msgid ""
120
- "When shopping, we keep a record of your email and the cart contents for up "
121
- "to 30 days on our server. This record is kept to repopulate the contents of "
122
- "your cart if you switch devices or needed to come back another day. Read our "
123
- "privacy policy <a href=\"%s\">here</a>."
124
- msgstr ""
125
- "Quando em compras, nós mantemos seu email e o conteúdo do carrinho de "
126
- "compras por até 30 dias em nossos servidores. Este registro é armazenado "
127
- "para popular o conteúdo do seu carrinho de compras se você trocar de "
128
- "dispositivo ou precisa voltar em um outro dia. Leia nossa Política de "
129
- "Privacidade <a href=“%s”>aqui</a>."
130
-
131
- #: includes/class-mailchimp-woocommerce-privacy.php:78
132
- msgid "MailChimp Shopping Cart Data"
133
- msgstr "Dados de carrinho de compras do Mailchimp"
134
-
135
- #: includes/class-mailchimp-woocommerce-privacy.php:82
136
- msgid "User ID"
137
- msgstr "ID do Usuário"
138
-
139
- #: includes/class-mailchimp-woocommerce-newsletter.php:43
140
- #: admin/class-mailchimp-woocommerce-admin.php:748
141
- #: admin/partials/tabs/newsletter_settings.php:97
142
- msgid "Subscribe to our newsletter"
143
- msgstr "Inscreva-se em nossa newsletter"
144
-
145
- #: includes/class-mailchimp-woocommerce-rest-api.php:141
146
- #: admin/partials/tabs/store_sync.php:169
147
- msgid "D, M j, Y g:i A"
148
- msgstr "l, d\\/m\\/Y H:i"
149
-
150
- #: admin/class-mailchimp-woocommerce-admin.php:123
151
- msgid "Mailchimp - WooCommerce Setup"
152
- msgstr "Mailchimp para Woocommerce"
153
-
154
- #: admin/class-mailchimp-woocommerce-admin.php:271
155
- msgid ""
156
- "We dectected that this site has the following constants defined, likely at "
157
- "wp-config.php file"
158
- msgstr ""
159
- "Detectamos que este site tem as seguintes constantes definidas, "
160
- "possivelmente no arquivo wp-config.php"
161
-
162
- #: admin/class-mailchimp-woocommerce-admin.php:273
163
- msgid ""
164
- "These constants are deprecated since Mailchimp for Woocommerce version 2.3. "
165
- "Please refer to the <a href=\"https://github.com/mailchimp/mc-woocommerce/"
166
- "wiki/\">plugin official wiki</a> for further details."
167
- msgstr ""
168
- "Estas constantes estão obsoletas desde Mailchimp para Woocommerce versão "
169
- "2.3. Leia o <a href=“https://github.com/mailchimp/mc-woocommerce/wiki/“>wiki "
170
- "oficial do plugin</a> para maiores detalhes."
171
-
172
- #: admin/class-mailchimp-woocommerce-admin.php:393
173
- msgid "Store Disconnected"
174
- msgstr "Loja desconectada"
175
-
176
- #: admin/class-mailchimp-woocommerce-admin.php:397
177
- msgid "Store Disconnect Failed"
178
- msgstr "Falha ao desconectar da Loja"
179
-
180
- #: admin/class-mailchimp-woocommerce-admin.php:668
181
- msgid ""
182
- "As part of the Mailchimp Terms of Use, we require a contact email and a "
183
- "physical mailing address."
184
- msgstr ""
185
- "Como parte dos Termos de Uso do Mailchimp, são mandatórios um email de "
186
- "contato e um endereço físico de correspondência."
187
-
188
- #: admin/class-mailchimp-woocommerce-admin.php:676
189
- msgid ""
190
- "As part of the Mailchimp Terms of Use, we require a valid phone number for "
191
- "your store."
192
- msgstr ""
193
- "Como parte dos Termos de Uso do Mailchimp, é mandatório um número de "
194
- "telefone válido para sua Loja."
195
-
196
- #: admin/class-mailchimp-woocommerce-admin.php:684
197
- msgid "Mailchimp for WooCommerce requires a Store Name to connect your store."
198
- msgstr ""
199
- "Mailchimp para Woocommerce requer um Nome de Loja para conectar sua Loja."
200
-
201
- #. translators: %s - plugin name.
202
- #: admin/class-mailchimp-woocommerce-admin.php:702
203
- #: admin/partials/tabs/campaign_defaults.php:68
204
- msgid "You were subscribed to the newsletter from %s"
205
- msgstr "Você foi inscrito na newsletter de %s"
206
-
207
- #: admin/class-mailchimp-woocommerce-admin.php:707
208
- msgid "One or more fields were not updated"
209
- msgstr "Um ou mais campos não foram atualizados"
210
-
211
- #: admin/class-mailchimp-woocommerce-admin.php:858
212
- msgid "You must supply your Mailchimp API key to pull the audiences."
213
- msgstr ""
214
- "É necessário fornecer a sua Mailchimp API Key para recuperar as audiências."
215
-
216
- #: admin/class-mailchimp-woocommerce-admin.php:1320
217
- msgid "Starting the sync process..."
218
- msgstr "Iniciando a Sincronização…"
219
-
220
- #: admin/class-mailchimp-woocommerce-admin.php:1322
221
- msgid ""
222
- "The plugin has started the initial sync with your store, and the process "
223
- "will work in the background automatically."
224
- msgstr ""
225
- "O plugin iniciou a sincronização inicial com a sua Loja, e o processo "
226
- "executará em segundo plano automaticamente."
227
-
228
- #: admin/class-mailchimp-woocommerce-admin.php:1324
229
- msgid ""
230
- "Sometimes the sync can take a while, especially on sites with lots of orders "
231
- "and/or products. It is safe to navigate away from this screen while it is "
232
- "running."
233
- msgstr ""
234
- "Em alguns casos a sincronização pode levar algum tempo, especialmente em "
235
- "sites com muitos pedidos e/ou produtos. É seguro navegar para fora desta "
236
- "página."
237
-
238
- #: admin/class-mailchimp-woocommerce-admin.php:1334
239
- msgid "Your store is synced with Mailchimp!"
240
- msgstr "Sua Loja está sincronizada com o Mailchimp!"
241
-
242
- #. translators: %1$s: Number of synced orders %2$s: Audience name
243
- #: admin/class-mailchimp-woocommerce-admin.php:1337
244
- msgid ""
245
- "We've successfully synced %1$s orders to your Audience %2$s, that's awesome!"
246
- msgstr ""
247
- "%1$s ordem foi sincronizada a sua Audiência %2$s com sucesso. Muito bom!"
248
-
249
- #. translators: %s - Wordpress.org plugin review URL.
250
- #: admin/class-mailchimp-woocommerce-admin.php:1345
251
- msgid ""
252
- "Could you please do us a favor and leave the plugin a 5-star <a href=%s "
253
- "target='_blank'>rating on Wordpress.org</a>? It helps our community know "
254
- "that we're working hard to make it better each day."
255
- msgstr ""
256
- "Você poderia nos fazer um favor e avaliar o nosso plugin com uma <a href=%s "
257
- "target=_blank>avaliação 5 estrelas no WordPress.org</a>?. Ajude a comunidade "
258
- "saber que estamos melhorando a cada dia."
259
-
260
- #: admin/class-mailchimp-woocommerce-admin.php:1348
261
- msgid "Leave a Review"
262
- msgstr "Faça uma avaliação"
263
-
264
- #: admin/partials/tabs/newsletter_settings.php:36
265
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:162
266
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:185
267
- msgid "Audience Settings"
268
- msgstr "Configurações de Audiência"
269
-
270
- #: admin/partials/tabs/newsletter_settings.php:41
271
- msgid "Sync audience with your store"
272
- msgstr "Escolha uma Audiência para sincronizar com a sua Loja"
273
-
274
- #: admin/partials/tabs/newsletter_settings.php:47
275
- msgid "Create New Audience"
276
- msgstr "Criar nova Audiência"
277
-
278
- #: admin/partials/tabs/newsletter_settings.php:51
279
- msgid "Select Audience"
280
- msgstr "Selecione a Audiência"
281
-
282
- #: admin/partials/tabs/newsletter_settings.php:76
283
- msgid "During initial sync, auto subscribe the existing customers."
284
- msgstr ""
285
- "Durante a sincronização inicial, inscreva automaticamente os clientes "
286
- "existentes."
287
-
288
- #: admin/partials/tabs/newsletter_settings.php:81
289
- msgid "Optional Audience Settings"
290
- msgstr "Configurações Opcionais de Audiência"
291
-
292
- #: admin/partials/tabs/newsletter_settings.php:86
293
- msgid "Opt-in Settings"
294
- msgstr "Configurações de inscrição"
295
-
296
- #: admin/partials/tabs/newsletter_settings.php:91
297
- msgid "Message for the opt-in checkbox"
298
- msgstr "Texto para a caixa de seleção de inclusão"
299
-
300
- #: admin/partials/tabs/newsletter_settings.php:92
301
- #: admin/partials/tabs/newsletter_settings.php:104
302
- msgid ""
303
- "Add text to go along with the other opt-in checkboxes. <br/>Customers can "
304
- "click a box at checkout to opt in to your newsletter."
305
- msgstr ""
306
- "Adicione um texto para exibir próximo à caixa de seleção de inscrição <br/> "
307
- "Usuários podem clicar em uma caixa de seleção na etapa de pagamento para se "
308
- "inscrever em sua newsletter."
309
-
310
- #: admin/partials/tabs/newsletter_settings.php:98
311
- msgid "HTML tags allowed: <a href=\"\" target=\"\" title=\"\"></a> and <br>"
312
- msgstr "Tags HTML permitidas: <a href=“” target=“” title=“”></a> e <br>"
313
-
314
- #: admin/partials/tabs/newsletter_settings.php:103
315
- msgid "Checkbox Display Options"
316
- msgstr "Opções de exibição da caixa de seleção"
317
-
318
- #: admin/partials/tabs/newsletter_settings.php:112
319
- msgid "Visible, checked by default"
320
- msgstr "Visível, ativada por padrão"
321
-
322
- #: admin/partials/tabs/newsletter_settings.php:115
323
- msgid "Visible, unchecked by default"
324
- msgstr "Visível, desativada por padrão"
325
-
326
- #: admin/partials/tabs/newsletter_settings.php:118
327
- msgid "Hidden, unchecked by default"
328
- msgstr "Escondida, desativada por padrão"
329
-
330
- #: admin/partials/tabs/newsletter_settings.php:125
331
- msgid "Advanced Checkbox Settings"
332
- msgstr "Configurações avançadas para a caixa de seleção"
333
-
334
- #. translators: %s - Woocommerce Actions documentation URL.
335
- #: admin/partials/tabs/newsletter_settings.php:126
336
- msgid ""
337
- "To change the location of the opt-in <br/>checkbox at checkout, input one of "
338
- "the <a href=%s target=_blank>available WooCommerce form actions</a>."
339
- msgstr ""
340
- "Para alterar a localização da caixa de seleção de inscrição na etapa de "
341
- "pagamento, insira uma das <a href=%s target=_blank>Actions de formulário do "
342
- "WooCommerce</a>."
343
-
344
- #: admin/partials/tabs/newsletter_settings.php:132
345
- msgid "Enter a WooCommerce form action"
346
- msgstr "Insira uma action de formulário do Woocommerce"
347
-
348
- #: admin/partials/tabs/newsletter_settings.php:136
349
- #: admin/partials/tabs/newsletter_settings.php:141
350
- msgid "Subscriber Tags"
351
- msgstr "Etiquetas de Usuário"
352
-
353
- #: admin/partials/tabs/newsletter_settings.php:147
354
- msgid ""
355
- "Add a comma separated list of tags to add to the subscriber at Mailchimp"
356
- msgstr ""
357
- "Adicione uma lista de etiquetas separadas por vírgulas para adicionar ao "
358
- "usuário no Mailchimp"
359
-
360
- #: admin/partials/tabs/newsletter_settings.php:151
361
- msgid "Product Settings"
362
- msgstr "Configurações de Produto"
363
-
364
- #: admin/partials/tabs/newsletter_settings.php:157
365
- msgid "Product Image Size"
366
- msgstr "Tamanho da imagem de Produto"
367
-
368
- #: admin/partials/tabs/newsletter_settings.php:158
369
- msgid ""
370
- "Define the product image size used by abandoned carts, order notifications, "
371
- "and product recommendations."
372
- msgstr ""
373
- "Defina o tamanho das imagens utilizado em carrinhos de compra abandonados, "
374
- "outras notificações, e recomendações de produtos."
375
-
376
- #: admin/partials/tabs/newsletter_settings.php:164
377
- msgid "Size"
378
- msgstr "Tamanho"
379
-
380
- #: admin/partials/tabs/logs.php:38
381
- msgid "Logging Preference"
382
- msgstr "Preferências de Log"
383
-
384
- #: admin/partials/tabs/logs.php:42
385
- msgid "Logging Preferences"
386
- msgstr "Preferências de Log"
387
-
388
- #: admin/partials/tabs/logs.php:47
389
- msgid ""
390
- "Advanced troubleshooting can be conducted with the logging capability turned "
391
- "on.\n"
392
- " By default, it’s set to “standard” and you may toggle to either "
393
- "“debug” or “none” as needed.\n"
394
- " With standard logging, you can see basic information about the "
395
- "data submission to Mailchimp including any errors.\n"
396
- " “Debug” gives a much deeper insight that is useful to share with "
397
- "support if problems arise."
398
- msgstr ""
399
- "A resolução de problemas pode ser realizada com os Logs ativados.\n"
400
- "Por padrão, está configurado para “nenhum” e pode ser trocado para “padrão” "
401
- "ou “debug” de acordo com sua necessidade.\n"
402
- "Com o Log padrão, são registradas informações básicas sobre o envio de dados "
403
- "para o Mailchimp incluindo os erros.\n"
404
- "A opção “Debug” exibe informações mais aprofundadas e é útil para "
405
- "compartilhar com o suporte se surgirem problemas."
406
-
407
- #: admin/partials/tabs/logs.php:59
408
- msgid "None"
409
- msgstr "Nenhum"
410
-
411
- #: admin/partials/tabs/logs.php:59
412
- msgid "Debug"
413
- msgstr "Debug"
414
-
415
- #: admin/partials/tabs/logs.php:59
416
- msgid "Standard"
417
- msgstr "Padrão"
418
-
419
- #: admin/partials/tabs/logs.php:71
420
- msgid "Recent Logs"
421
- msgstr "Logs Recentes"
422
-
423
- #: admin/partials/tabs/logs.php:97
424
- msgid "Delete log"
425
- msgstr "Apagar Log"
426
-
427
- #: admin/partials/tabs/logs.php:101
428
- msgid "Copy log"
429
- msgstr "Copiar Log"
430
-
431
- #: admin/partials/tabs/notices.php:6
432
- msgid "Mailchimp says: You must enter in a valid API key."
433
- msgstr "Maichimp diz: Insira uma API Key válida."
434
-
435
- #: admin/partials/tabs/notices.php:9
436
- msgid ""
437
- "Mailchimp says: Sorry you must set up your campaign defaults before you "
438
- "proceed!"
439
- msgstr ""
440
- "Maichimp diz: É necessário configurar os Padrões de Lista antes de continuar!"
441
-
442
- #: admin/partials/tabs/notices.php:12
443
- msgid "Mailchimp says: You must select a marketing audience."
444
- msgstr "Maichimp diz: É Necessário selecionar uma Audiência."
445
-
446
- #: admin/partials/tabs/notices.php:15
447
- msgid "Mailchimp says: Sorry you must set up your store before you proceed!"
448
- msgstr "Maichimp diz: É necessário configurar sua Loja antes de continuar!"
449
-
450
- #: admin/partials/tabs/notices.php:18
451
- msgid ""
452
- "Mailchimp says: You are not fully ready to run the Store Sync, please verify "
453
- "your settings before proceeding."
454
- msgstr ""
455
- "Maichimp diz: Ainda não está tudo pronto para iniciar a sincronização de sua "
456
- "Loja, verifique as configurações antes de continuar."
457
-
458
- #: admin/partials/tabs/notices.php:32
459
- msgid "Mailchimp says: Your re-sync has been started!"
460
- msgstr "Maichimp diz: A ressincronização foi iniciada!"
461
-
462
- #: admin/partials/tabs/campaign_defaults.php:19
463
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:150
464
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:182
465
- msgid "Audience Defaults"
466
- msgstr "Padrões de Audiência"
467
-
468
- #: admin/partials/tabs/campaign_defaults.php:24
469
- msgid "Default from name"
470
- msgstr "Nome padrão do Remetente"
471
-
472
- #: admin/partials/tabs/campaign_defaults.php:31
473
- msgid "Default from email"
474
- msgstr "Email padrão do Remetente"
475
-
476
- #: admin/partials/tabs/campaign_defaults.php:38
477
- msgid "Default subject"
478
- msgstr "Assunto padrão"
479
-
480
- #: admin/partials/tabs/campaign_defaults.php:40
481
- msgid "Store Newsletter"
482
- msgstr "Newsletter da Loja"
483
-
484
- #: admin/partials/tabs/campaign_defaults.php:45
485
- msgid "Default language"
486
- msgstr "Lingua padrão"
487
-
488
- #: admin/partials/tabs/campaign_defaults.php:62
489
- msgid "Permission reminder message"
490
- msgstr "Mensagem de lembrete"
491
-
492
- #: admin/partials/tabs/store_sync.php:82
493
- msgid "Coupons"
494
- msgstr "Cupons"
495
-
496
- #: admin/partials/tabs/store_sync.php:92
497
- msgid "Products"
498
- msgstr "Produtos"
499
-
500
- #: admin/partials/tabs/store_sync.php:102
501
- msgid "Orders"
502
- msgstr "Pedidos"
503
-
504
- #: admin/partials/tabs/store_sync.php:115
505
- msgid "Subscribers"
506
- msgstr "Inscritos"
507
-
508
- #: admin/partials/tabs/store_sync.php:122
509
- msgid "Transactional"
510
- msgstr "Transacional"
511
-
512
- #: admin/partials/tabs/store_sync.php:129
513
- msgid "Unsubscribed"
514
- msgstr "Desinscritos"
515
-
516
- #: admin/partials/tabs/store_sync.php:148
517
- msgid "DISCONNECT STORE"
518
- msgstr "DESCONECTAR LOJA"
519
-
520
- #: admin/partials/tabs/store_sync.php:151
521
- msgid "Account Connected"
522
- msgstr "Conta conectada"
523
-
524
- #: admin/partials/tabs/store_sync.php:153
525
- msgid "Audience Connected"
526
- msgstr "Audiência conectada"
527
-
528
- #: admin/partials/tabs/store_sync.php:159
529
- msgid "Status:"
530
- msgstr "Status:"
531
-
532
- #: admin/partials/tabs/store_sync.php:160
533
- msgid "Sync Completed"
534
- msgstr "Sincronização Completa"
535
-
536
- #: admin/partials/tabs/store_sync.php:160
537
- msgid "Syncing..."
538
- msgstr "Sincronizando..."
539
-
540
- #: admin/partials/tabs/store_sync.php:162
541
- msgid "Initial sync in progress"
542
- msgstr "Sincronização inicial em progresso"
543
-
544
- #: admin/partials/tabs/store_sync.php:166
545
- msgid "Last Updated:"
546
- msgstr "Última atualização:"
547
-
548
- #: admin/partials/tabs/store_sync.php:171
549
- msgid "Starting..."
550
- msgstr "Iniciando…"
551
-
552
- #: admin/partials/tabs/store_sync.php:182
553
- msgid "Advanced"
554
- msgstr "Avançado"
555
-
556
- #: admin/partials/tabs/store_sync.php:184
557
- msgid ""
558
- "You can resync your audience at any time without losing any of your e-"
559
- "commerce data."
560
- msgstr ""
561
- "Você pode ressincronizar sua Audiência a qualquer momento, sem perder nenhum "
562
- "de seus dados."
563
-
564
- #: admin/partials/tabs/store_sync.php:186
565
- msgid "Force Resync"
566
- msgstr "Ressincronizar"
567
-
568
- #: admin/partials/tabs/store_sync.php:189
569
- msgid "More Information"
570
- msgstr "Mais informações"
571
-
572
- #: admin/partials/tabs/api_key.php:6 admin/partials/tabs/api_key.php:11
573
- msgid "Connect your store to Mailchimp"
574
- msgstr "Conecte sua loja ao Mailchimp"
575
-
576
- #: admin/partials/tabs/api_key.php:10
577
- msgid "Reconnect"
578
- msgstr "Reconectar"
579
-
580
- #: admin/partials/tabs/api_key.php:10
581
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:129
582
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:176
583
- msgid "Connect"
584
- msgstr "Conectar"
585
-
586
- #: admin/partials/tabs/api_key.php:14
587
- msgid ""
588
- "Already connected. You can reconnect with another Mailchimp account if you "
589
- "want."
590
- msgstr ""
591
- "Já conectado. Você pode reconectar com outra conta Mailchimp se assim "
592
- "desejar."
593
-
594
- #: admin/partials/tabs/api_key.php:16
595
- msgid ""
596
- "Connecting. A new window will open with Mailchimp's OAuth service. Please "
597
- "log-in an we will take care of the rest."
598
- msgstr ""
599
- "Conectando. Uma nova janela abrirá com o Login OAuth do Mailchimp. Por favor "
600
- "faça o login e cuidaremos do resto."
601
-
602
- #: admin/partials/tabs/api_key.php:17
603
- msgid "Error, can't login."
604
- msgstr "Erro. Não foi possível conectar."
605
-
606
- #: admin/partials/tabs/api_key.php:18
607
- msgid "Connection in progress"
608
- msgstr "Conexão em progresso"
609
-
610
- #: admin/partials/tabs/api_key.php:19
611
- msgid "Connected! Please wait while loading next step"
612
- msgstr "Conectado! Por favor aguarde o carregamento do próximo passo"
613
-
614
- #: admin/partials/tabs/store_info.php:15
615
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:138
616
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:179
617
- msgid "Store Settings"
618
- msgstr "Configurações de Loja"
619
-
620
- #: admin/partials/tabs/store_info.php:19
621
- msgid "Name"
622
- msgstr "Nome"
623
-
624
- #: admin/partials/tabs/store_info.php:26
625
- msgid "Email"
626
- msgstr "Email"
627
-
628
- #: admin/partials/tabs/store_info.php:33
629
- msgid "Street address"
630
- msgstr "Endereço"
631
-
632
- #: admin/partials/tabs/store_info.php:40
633
- msgid "City"
634
- msgstr "Cidade"
635
-
636
- #: admin/partials/tabs/store_info.php:47
637
- msgid "State"
638
- msgstr "Estado"
639
-
640
- #: admin/partials/tabs/store_info.php:54
641
- msgid "Postal Code"
642
- msgstr "CEP"
643
-
644
- #: admin/partials/tabs/store_info.php:61
645
- msgid "Country"
646
- msgstr "País"
647
-
648
- #: admin/partials/tabs/store_info.php:87
649
- msgid "Phone Number"
650
- msgstr "Telefone"
651
-
652
- #: admin/partials/tabs/store_info.php:93
653
- msgid "Locale Settings"
654
- msgstr "Configurações de Local"
655
-
656
- #: admin/partials/tabs/store_info.php:95
657
- msgid ""
658
- "Please apply your locale settings. If you're unsure about these, use the "
659
- "defaults."
660
- msgstr ""
661
- "Configure seu local. Se estive inseguro com estas informações, deixe o "
662
- "padrão."
663
-
664
- #: admin/partials/tabs/store_info.php:100
665
- msgid "Locale"
666
- msgstr "Língua"
667
-
668
- #: admin/partials/tabs/store_info.php:104
669
- msgid "Select store's locale"
670
- msgstr "Selecione o Locale da loja"
671
-
672
- #: admin/partials/tabs/store_info.php:119
673
- msgid "Woocommerce Currency"
674
- msgstr "Moeda do Woocommerce"
675
-
676
- #: admin/partials/tabs/store_info.php:126
677
- msgid "Timezone"
678
- msgstr "Fuso Horário"
679
-
680
- #: admin/partials/tabs/store_info.php:130
681
- msgid "Select store's timezone"
682
- msgstr "Selecione o fuso horário da Loja"
683
-
684
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:65
685
- msgid "Mailchimp says: Please upgrade your PHP version to a minimum of 7.0"
686
- msgstr "Mailchimp diz: Atualize a versão do PHP para no mínimo 7.0"
687
-
688
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:71
689
- msgid "Mailchimp says: API Request Error - "
690
- msgstr "Mailchimp diz: API Request Error - "
691
-
692
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:103
693
- msgid ""
694
- "Add Mailchimp for WooCommerce to build custom segments,<br/>send "
695
- "automations, and track purchase activity in Mailchimp"
696
- msgstr ""
697
- "Configure o Mailchimp para Woocommerce para criar segmentações customizadas, "
698
- "<br/> enviar automatizações, e rastrear atividade de compras no Mailchimp"
699
-
700
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:107
701
- msgid "Please provide a bit of information<br/>about your WooCommerce store"
702
- msgstr "Insira as informações relativas<br/>à sua loja WooCommerce"
703
-
704
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:111
705
- msgid "Please fill out the audience default<br/>campaign information"
706
- msgstr "Por favor preencha <br/>as informações padrão da Lista"
707
-
708
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:115
709
- msgid ""
710
- "Please apply your audience settings. If you don’t<br/>have an audience, you "
711
- "can choose to create one"
712
- msgstr ""
713
- "Configure sua Audiência. Se você não tem <br/>nenhuma audiência, você pode "
714
- "escolher criar uma"
715
-
716
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:118
717
- msgid ""
718
- "Connect your WooCommerce store to a<br/>Mailchimp audience in less than 60 "
719
- "seconds"
720
- msgstr ""
721
- "Conecte sua loja Woocommerce a uma<br/>Audiência Mailchimp em menos de 60 "
722
- "segundos"
723
-
724
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:122
725
- msgid "Log events from the <br/>Mailchimp plugin"
726
- msgstr "Grave eventos do<br/>plugin Mailchimp"
727
-
728
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:178
729
- msgid "Overview"
730
- msgstr "Visão Geral"
731
-
732
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:188
733
- msgid "Logs"
734
- msgstr "Logs"
735
-
736
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:202
737
- msgid "Start sync"
738
- msgstr "Iniciar Sincronização"
739
-
740
- #~ msgid ""
741
- #~ "Have a larger store or having issues syncing? Consider using <a href=%s "
742
- #~ "target=_blank>WP-CLI</a>."
743
- #~ msgstr ""
744
- #~ "Tem uma loja muito grande, ou está encontrando problemas ao sincronizar? "
745
- #~ "Considere usar o <a href=%s target=_blank>WP-CLI</a>."
746
-
747
- #~ msgid ""
748
- #~ "Order and customer information will not sync if they contain an Amazon or "
749
- #~ "generic email address."
750
- #~ msgstr ""
751
- #~ "Dados de Pedidos e Clientes não serão sincronizados se eles conterem um "
752
- #~ "email genérico ou da Amazon."
753
-
754
- #~ msgid ""
755
- #~ "Need help to connect your store? Visit the Mailchimp <a href=%s "
756
- #~ "target=_blank>Knowledge Base</a>."
757
- #~ msgstr ""
758
- #~ "Precisa de ajuda para conectar sua Loja? Visite a <a href=%s "
759
- #~ "target=_blank>Base de Conhecimento do Mailchimp</a>."
760
-
761
- #~ msgid ""
762
- #~ "Want to tell us how we're doing? <a href=%s target=_blank>Leave a review "
763
- #~ "on Wordpress.org</a>."
764
- #~ msgstr ""
765
- #~ "Quer nos contar o que você acha deste plugin? <a href=%s "
766
- #~ "target=_blank>Deixe uma classificação no Wordpress.org</a>."
767
-
768
- #~ msgid ""
769
- #~ "By using this plugin, Mailchimp will process customer information in "
770
- #~ "accordance with their <a href=%s target=_blank>Privacy Policy</a>."
771
- #~ msgstr ""
772
- #~ "Ao utilizar este plugin, o Mailchimp irá processar as informações de "
773
- #~ "clientes de acordo com sua <a href=%s target=_blank>Política de "
774
- #~ "Privacidade</a>."
775
-
776
- #~ msgid "MailChimp for WooCommerce"
777
- #~ msgstr "Mailchimp para Woocommerce"
778
-
779
- #~ msgid "Email Address"
780
- #~ msgstr "Email"
781
-
782
- #~ msgid "Settings"
783
- #~ msgstr "Configurações"
784
-
785
- #~ msgid "View"
786
- #~ msgstr "Ver"
787
-
788
- #~ msgid "There are currently no logs to view."
789
- #~ msgstr "Não há nenhum Log para ser visualizado."
790
-
791
- #~ msgid "Select a Country"
792
- #~ msgstr "Selecione um País"
793
-
794
- #~ msgid "Save all changes"
795
- #~ msgstr "Salvar todas alterações"
796
-
797
- #~ msgid "Next"
798
- #~ msgstr "Próximo"
799
-
800
- #~ msgid ""
801
- #~ "The MailChimp For WooCommerce plugin requires the <a href=\"http://"
802
- #~ "wordpress.org/extend/plugins/woocommerce/\">WooCommerce</a> plugin to be "
803
- #~ "active!"
804
- #~ msgstr ""
805
- #~ "O plugin Mailchimp para Woocommerce requer que o plugin <a href=“http://"
806
- #~ "wordpress.org/extend/plugins/woocommerce/“>WooCommerce</a> esteja ativo!"
807
-
808
- #~ msgid "function \"wp_remote_post\" does not exist"
809
- #~ msgstr "a funcão “wp_remote_post” não existe"
810
-
811
- #~ msgid ""
812
- #~ "The REST API seems to be disabled on this wordpress site. Please enable "
813
- #~ "to sync data."
814
- #~ msgstr ""
815
- #~ "A REST API aparenta ester desabilitada nest site WordPress. For favor, "
816
- #~ "habilite para sincronizar dados."
817
-
818
- #~ msgid "Please hang tight while we work our mojo."
819
- #~ msgstr "Por favor aguarde."
820
-
821
- #~ msgid "Initial Sync:"
822
- #~ msgstr "Sincronização inicial:"
823
-
824
- #~ msgid "In Progress"
825
- #~ msgstr "Em progresso"
826
-
827
- #~ msgid "Mailchimp API Key"
828
- #~ msgstr "Insira sua API Key do Mailchimp"
829
-
830
- #~ msgid "Enter your Mailchimp API key."
831
- #~ msgstr "Insira sua API Key do Mailchimp."
832
-
833
- #~ msgid ""
834
- #~ "To find your Mailchimp API key, log into your account settings > Extras > "
835
- #~ "API keys. From there, either grab an existing key or generate a new one "
836
- #~ "for your WooCommerce store."
837
- #~ msgstr ""
838
- #~ "Para localizar sua Mailchimp API key, entre em sua conta no Mailchimp, "
839
- #~ "abra “Account Settings > Extras > API Keys”. Copie a chave existente, ou "
840
- #~ "crie uma nova para sua Loja Woocommerce."
841
-
842
- #~ msgid "Optional Store Settings"
843
- #~ msgstr "Configurações Opcionais da Loja"
844
-
845
- #~ msgid "Sync"
846
- #~ msgstr "Sincronização"
847
-
848
- #~ msgid "Audience Name"
849
- #~ msgstr "Nome da Audiência"
850
-
851
- #~ msgid "Auto Subscribe On Initial Sync"
852
- #~ msgstr "Inscrição automática na Sincronização inicial"
853
-
854
- #~ msgid "No"
855
- #~ msgstr "Não"
856
-
857
- #~ msgid "Yes"
858
- #~ msgstr "Sim"
859
-
860
- #~ msgid "Newsletter Label"
861
- #~ msgstr "Texto da Newsletter"
862
-
863
- #~ msgid "Newsletter Checkbox Action"
864
- #~ msgstr "Action para a caixa de seleção de inscrição"
865
-
866
- #~ msgid "Audience Member Tags"
867
- #~ msgstr "Etiquetas para Membros de Audiência"
868
-
869
- #~ msgid "Contact Name"
870
- #~ msgstr "Nome de contato"
871
-
872
- #~ msgid "From Email"
873
- #~ msgstr "Email do Remetente"
874
-
875
- #~ msgid "Permission Reminder"
876
- #~ msgstr "Mensagem de lembrete de inclusão"
877
-
878
- #~ msgid "Sync Information"
879
- #~ msgstr "Informações de sincronização"
880
-
881
- #~ msgid "API Information"
882
- #~ msgstr "Informações da API"
883
-
884
- #~ msgid "Store Name"
885
- #~ msgstr "Nome da Loja"
886
-
887
- #~ msgid "Street Address"
888
- #~ msgstr "Endereço"
889
-
890
- #~ msgid "Currency Code"
891
- #~ msgstr "Código da Moeda"
892
-
893
- #~ msgid "Currency"
894
- #~ msgstr "Moeda"
895
-
896
- #~ msgid "Retrieved from Woocommerce Settings"
897
- #~ msgstr "Configuração do Woocommerce"
898
-
899
- #~ msgid "Mailchimp for Woocommerce Settings"
900
- #~ msgstr "Mailchimp para Woocommerce - Configurações"
901
-
902
- #~ msgid ""
903
- #~ "Currency is currently deprecated. Please select one from the list above"
904
- #~ msgstr "Moeda obsoleta. Selecione uma da lista acima"
905
-
906
- #~ msgid "deprecated"
907
- #~ msgstr "obsoleta"
908
-
909
- #~ msgid "List Settings"
910
- #~ msgstr "Configurações de Lista"
911
-
912
- #~ msgid "List Name"
913
- #~ msgstr "Nome da Lista"
914
-
915
- #, fuzzy
916
- #~| msgid "List Defaults"
917
- #~ msgid "List Defaults"
918
- #~ msgstr "Padrões de Lista"
919
-
920
- #~ msgid "Phone"
921
- #~ msgstr "Telefone"
922
-
923
- #~ msgid "Default Subject"
924
- #~ msgstr "Assunto padrão"
925
-
926
- #~ msgid "Default Language"
927
- #~ msgstr "Lingua padrão"
928
-
929
- #~ msgid "Mailchimp Settings"
930
- #~ msgstr "Configurações Mailchimp para Woocommerce"
931
-
932
- #~ msgid "Every %d Minutes"
933
- #~ msgstr "Cada %d minutos"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
languages/mc-woocommerce.pot CHANGED
@@ -2,19 +2,20 @@
2
  # This file is distributed under the same license as the Mailchimp for WooCommerce plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Mailchimp for WooCommerce 2.3.2\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/mailchimp-for-woocommerce\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2020-01-20T13:17:37+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
- "X-Generator: WP-CLI 2.1.0\n"
15
  "X-Domain: mailchimp-for-woocommerce\n"
16
 
17
  #. Plugin Name of the plugin
 
18
  msgid "Mailchimp for WooCommerce"
19
  msgstr ""
20
 
@@ -34,283 +35,211 @@ msgstr ""
34
  msgid "https://mailchimp.com"
35
  msgstr ""
36
 
37
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:179
38
- msgid "Please select an option"
39
- msgstr ""
40
-
41
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:182
42
- msgid "Sending Feedback"
43
- msgstr ""
44
-
45
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:327
46
- msgid "I want to change the audience associated with this integration."
47
- msgstr ""
48
-
49
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:331
50
- msgid "I want to change the site or store connected through this integration."
51
- msgstr ""
52
-
53
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:335
54
- msgid "The order data isn't syncing."
55
- msgstr ""
56
-
57
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:339
58
- msgid "The promo codes aren't showing up."
59
- msgstr ""
60
-
61
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:343
62
- msgid "I'm trying to troubleshoot the integration."
63
- msgstr ""
64
-
65
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:347
66
- msgid "I was instructed to disconnect by Mailchimp Support."
67
- msgstr ""
68
-
69
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:351
70
- msgid "I no longer use this integration."
71
- msgstr ""
72
-
73
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:355
74
- msgid "It's a temporary deactivation."
75
  msgstr ""
76
 
77
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:359
78
- msgid "Other"
 
 
79
  msgstr ""
80
 
81
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:361
82
- msgid "Please share the reason"
 
 
 
 
83
  msgstr ""
84
 
85
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:370
86
- msgid "Quick Feedback"
 
 
 
 
87
  msgstr ""
88
 
89
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:371
90
- msgid "Close"
 
 
 
 
91
  msgstr ""
92
 
93
- #. translators: %s - plugin name.
94
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:378
95
- msgid "If you have a moment, please share why you are deactivating %s:"
 
96
  msgstr ""
97
 
 
98
  #: includes/class-mailchimp-woocommerce-deactivation-survey.php:379
99
- #: admin/class-mailchimp-woocommerce-admin.php:274
100
  msgid "Mailchimp for Woocommerce"
101
  msgstr ""
102
 
103
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:398
104
- msgid "Submit & Deactivate"
105
- msgstr ""
106
-
107
- #: includes/class-mailchimp-woocommerce-deactivation-survey.php:399
108
- msgid "Skip & Deactivate"
109
- msgstr ""
110
-
111
- #. translators: %s - Mailchimp Privacy Policy URL.
112
- #: includes/class-mailchimp-woocommerce-privacy.php:12
113
- msgid "When shopping, we keep a record of your email and the cart contents for up to 30 days on our server. This record is kept to repopulate the contents of your cart if you switch devices or needed to come back another day. Read our privacy policy <a href=\"%s\">here</a>."
114
- msgstr ""
115
-
116
- #: includes/class-mailchimp-woocommerce-privacy.php:78
117
- msgid "MailChimp Shopping Cart Data"
118
- msgstr ""
119
-
120
- #: includes/class-mailchimp-woocommerce-privacy.php:82
121
- msgid "User ID"
122
- msgstr ""
123
-
124
- #: includes/class-mailchimp-woocommerce-newsletter.php:43
125
- #: admin/class-mailchimp-woocommerce-admin.php:870
126
- #: admin/partials/tabs/newsletter_settings.php:97
127
- msgid "Subscribe to our newsletter"
128
- msgstr ""
129
-
130
- #: includes/class-mailchimp-woocommerce-rest-api.php:141
131
- #: admin/partials/tabs/store_sync.php:164
132
- msgid "D, M j, Y g:i A"
133
- msgstr ""
134
-
135
- #: admin/class-mailchimp-woocommerce-admin.php:127
136
- msgid "Mailchimp - WooCommerce Setup"
137
- msgstr ""
138
-
139
- #: admin/class-mailchimp-woocommerce-admin.php:275
140
  msgid "We dectected that this site has the following constants defined, likely at wp-config.php file"
141
  msgstr ""
142
 
143
- #: admin/class-mailchimp-woocommerce-admin.php:277
144
  msgid "These constants are deprecated since Mailchimp for Woocommerce version 2.3. Please refer to the <a href=\"https://github.com/mailchimp/mc-woocommerce/wiki/\">plugin official wiki</a> for further details."
145
  msgstr ""
146
 
147
- #: admin/class-mailchimp-woocommerce-admin.php:437
148
  msgid "Store Disconnected"
149
  msgstr ""
150
 
151
- #: admin/class-mailchimp-woocommerce-admin.php:441
152
  msgid "Store Disconnect Failed"
153
  msgstr ""
154
 
155
- #: admin/class-mailchimp-woocommerce-admin.php:784
156
  msgid "As part of the Mailchimp Terms of Use, we require a contact email and a physical mailing address."
157
  msgstr ""
158
 
159
- #: admin/class-mailchimp-woocommerce-admin.php:792
160
  msgid "As part of the Mailchimp Terms of Use, we require a valid phone number for your store."
161
  msgstr ""
162
 
163
- #: admin/class-mailchimp-woocommerce-admin.php:800
164
  msgid "Mailchimp for WooCommerce requires a Store Name to connect your store."
165
  msgstr ""
166
 
167
  #. translators: %s - plugin name.
168
- #: admin/class-mailchimp-woocommerce-admin.php:818
169
  #: admin/partials/tabs/campaign_defaults.php:68
170
  msgid "You were subscribed to the newsletter from %s"
171
  msgstr ""
172
 
173
- #: admin/class-mailchimp-woocommerce-admin.php:823
 
174
  msgid "One or more fields were not updated"
175
  msgstr ""
176
 
177
- #: admin/class-mailchimp-woocommerce-admin.php:976
 
 
 
 
 
 
178
  msgid "You must supply your Mailchimp API key to pull the audiences."
179
  msgstr ""
180
 
181
- #: admin/class-mailchimp-woocommerce-admin.php:1450
182
  msgid "Starting the sync process..."
183
  msgstr ""
184
 
185
- #: admin/class-mailchimp-woocommerce-admin.php:1452
186
  msgid "The plugin has started the initial sync with your store, and the process will work in the background automatically."
187
  msgstr ""
188
 
189
- #: admin/class-mailchimp-woocommerce-admin.php:1454
190
  msgid "Sometimes the sync can take a while, especially on sites with lots of orders and/or products. It is safe to navigate away from this screen while it is running."
191
  msgstr ""
192
 
193
- #: admin/class-mailchimp-woocommerce-admin.php:1470
194
  msgid "Your store is synced with Mailchimp!"
195
  msgstr ""
196
 
197
  #. translators: %1$s: Number of synced orders %2$s: Audience name
198
- #: admin/class-mailchimp-woocommerce-admin.php:1473
199
  msgid "We've successfully synced %1$s orders to your Audience %2$s, that's awesome!"
200
  msgstr ""
201
 
202
  #. translators: %s - Wordpress.org plugin review URL.
203
- #: admin/class-mailchimp-woocommerce-admin.php:1481
204
  msgid "Could you please do us a favor and leave the plugin a 5-star <a href=%s target='_blank'>rating on Wordpress.org</a>? It helps our community know that we're working hard to make it better each day."
205
  msgstr ""
206
 
207
- #: admin/class-mailchimp-woocommerce-admin.php:1484
208
  msgid "Leave a Review"
209
  msgstr ""
210
 
211
- #: admin/class-mailchimp-woocommerce-admin.php:1517
212
  msgid "Saved"
213
  msgstr ""
214
 
215
- #: admin/class-mailchimp-woocommerce-admin.php:1522
216
  msgid "Error setting communications status"
217
  msgstr ""
218
 
219
- #: admin/partials/tabs/newsletter_settings.php:36
220
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:162
221
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:185
222
- msgid "Audience Settings"
223
- msgstr ""
224
-
225
- #: admin/partials/tabs/newsletter_settings.php:41
226
- msgid "Sync audience with your store"
227
- msgstr ""
228
-
229
- #: admin/partials/tabs/newsletter_settings.php:47
230
- msgid "Create New Audience"
231
- msgstr ""
232
-
233
- #: admin/partials/tabs/newsletter_settings.php:51
234
- msgid "Select Audience"
235
- msgstr ""
236
-
237
- #: admin/partials/tabs/newsletter_settings.php:76
238
- msgid "During initial sync, auto subscribe the existing customers."
239
- msgstr ""
240
-
241
- #: admin/partials/tabs/newsletter_settings.php:81
242
- msgid "Optional Audience Settings"
243
  msgstr ""
244
 
245
- #: admin/partials/tabs/newsletter_settings.php:86
246
- msgid "Opt-in Settings"
247
  msgstr ""
248
 
249
- #: admin/partials/tabs/newsletter_settings.php:91
250
- msgid "Message for the opt-in checkbox"
251
  msgstr ""
252
 
253
- #: admin/partials/tabs/newsletter_settings.php:92
254
- #: admin/partials/tabs/newsletter_settings.php:104
255
- msgid "Add text to go along with the other opt-in checkboxes. <br/>Customers can click a box at checkout to opt in to your newsletter."
256
  msgstr ""
257
 
258
- #: admin/partials/tabs/newsletter_settings.php:98
259
- msgid "HTML tags allowed: <a href=\"\" target=\"\" title=\"\"></a> and <br>"
260
  msgstr ""
261
 
262
- #: admin/partials/tabs/newsletter_settings.php:103
263
- msgid "Checkbox Display Options"
264
  msgstr ""
265
 
266
- #: admin/partials/tabs/newsletter_settings.php:112
267
- msgid "Visible, checked by default"
268
  msgstr ""
269
 
270
- #: admin/partials/tabs/newsletter_settings.php:115
271
- msgid "Visible, unchecked by default"
272
  msgstr ""
273
 
274
- #: admin/partials/tabs/newsletter_settings.php:118
275
- msgid "Hidden, unchecked by default"
276
  msgstr ""
277
 
278
- #: admin/partials/tabs/newsletter_settings.php:125
279
- msgid "Advanced Checkbox Settings"
 
 
280
  msgstr ""
281
 
282
- #. translators: %s - Woocommerce Actions documentation URL.
283
- #: admin/partials/tabs/newsletter_settings.php:126
284
- msgid "To change the location of the opt-in <br/>checkbox at checkout, input one of the <a href=%s target=_blank>available WooCommerce form actions</a>."
285
  msgstr ""
286
 
287
- #: admin/partials/tabs/newsletter_settings.php:132
288
- msgid "Enter a WooCommerce form action"
 
289
  msgstr ""
290
 
291
- #: admin/partials/tabs/newsletter_settings.php:136
292
- #: admin/partials/tabs/newsletter_settings.php:141
293
- msgid "Subscriber Tags"
294
  msgstr ""
295
 
296
- #: admin/partials/tabs/newsletter_settings.php:147
297
- msgid "Add a comma separated list of tags to add to the subscriber at Mailchimp"
298
  msgstr ""
299
 
300
- #: admin/partials/tabs/newsletter_settings.php:151
301
- msgid "Product Settings"
302
  msgstr ""
303
 
304
- #: admin/partials/tabs/newsletter_settings.php:157
305
- msgid "Product Image Size"
306
  msgstr ""
307
 
308
- #: admin/partials/tabs/newsletter_settings.php:158
309
- msgid "Define the product image size used by abandoned carts, order notifications, and product recommendations."
310
  msgstr ""
311
 
312
- #: admin/partials/tabs/newsletter_settings.php:164
313
- msgid "Size"
314
  msgstr ""
315
 
316
  #: admin/partials/tabs/api_key_create_account.php:33
@@ -372,7 +301,7 @@ msgstr ""
372
 
373
  #. translators: %s - Mailchimp legal pages
374
  #: admin/partials/tabs/api_key_create_account.php:161
375
- msgid "By clicking the \"Get Started!\" button, you are creating a Mailchimp account, and you agree to Mailchimp's <a href=%s target=_blank>Terms of Use</a> and <a href=%s target=_blank>Privacy Policy</a>."
376
  msgstr ""
377
 
378
  #: admin/partials/tabs/api_key_create_account.php:167
@@ -415,6 +344,30 @@ msgstr ""
415
  msgid "Connecting..."
416
  msgstr ""
417
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
418
  #: admin/partials/tabs/logs.php:38
419
  msgid "Logging Preference"
420
  msgstr ""
@@ -447,12 +400,109 @@ msgstr ""
447
  msgid "Recent Logs"
448
  msgstr ""
449
 
450
- #: admin/partials/tabs/logs.php:97
 
 
 
 
451
  msgid "Delete log"
452
  msgstr ""
453
 
454
- #: admin/partials/tabs/logs.php:101
455
- msgid "Copy log"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
456
  msgstr ""
457
 
458
  #: admin/partials/tabs/notices.php:6
@@ -479,34 +529,64 @@ msgstr ""
479
  msgid "Mailchimp says: Your re-sync has been started!"
480
  msgstr ""
481
 
482
- #: admin/partials/tabs/campaign_defaults.php:19
483
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:150
484
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:182
485
- msgid "Audience Defaults"
486
  msgstr ""
487
 
488
- #: admin/partials/tabs/campaign_defaults.php:24
489
- msgid "Default from name"
490
  msgstr ""
491
 
492
- #: admin/partials/tabs/campaign_defaults.php:31
493
- msgid "Default from email"
494
  msgstr ""
495
 
496
- #: admin/partials/tabs/campaign_defaults.php:38
497
- msgid "Default subject"
498
  msgstr ""
499
 
500
- #: admin/partials/tabs/campaign_defaults.php:40
501
- msgid "Store Newsletter"
502
  msgstr ""
503
 
504
- #: admin/partials/tabs/campaign_defaults.php:45
505
- msgid "Default language"
506
  msgstr ""
507
 
508
- #: admin/partials/tabs/campaign_defaults.php:62
509
- msgid "Permission reminder message"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
510
  msgstr ""
511
 
512
  #: admin/partials/tabs/store_sync.php:77
@@ -565,6 +645,11 @@ msgstr ""
565
  msgid "Last Updated:"
566
  msgstr ""
567
 
 
 
 
 
 
568
  #: admin/partials/tabs/store_sync.php:166
569
  msgid "Starting..."
570
  msgstr ""
@@ -610,7 +695,7 @@ msgstr ""
610
 
611
  #. translators: %s - Mailchimp Support URL.
612
  #: admin/partials/tabs/store_sync.php:220
613
- msgid "Need help to connect your store? Visit the Mailchimp <a href=%s target=_blank>Knowledge Base</a>."
614
  msgstr ""
615
 
616
  #. translators: %s - Mailchimp Privacy Policy URL.
@@ -618,147 +703,84 @@ msgstr ""
618
  msgid "By using this plugin, Mailchimp will process customer information in accordance with their <a href=%s target=_blank>Privacy Policy</a>."
619
  msgstr ""
620
 
621
- #: admin/partials/tabs/api_key.php:6
622
- #: admin/partials/tabs/api_key.php:11
623
- msgid "Connect your store to Mailchimp"
624
- msgstr ""
625
-
626
- #: admin/partials/tabs/api_key.php:10
627
- msgid "Reconnect"
628
- msgstr ""
629
-
630
- #: admin/partials/tabs/api_key.php:10
631
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:129
632
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:176
633
- msgid "Connect"
634
- msgstr ""
635
-
636
- #: admin/partials/tabs/api_key.php:14
637
- msgid "Already connected. You can reconnect with another Mailchimp account if you want."
638
- msgstr ""
639
-
640
- #: admin/partials/tabs/api_key.php:16
641
- msgid "Connecting. A new window will open with Mailchimp's OAuth service. Please log-in an we will take care of the rest."
642
- msgstr ""
643
-
644
- #: admin/partials/tabs/api_key.php:17
645
- msgid "Error, can't login."
646
- msgstr ""
647
-
648
- #: admin/partials/tabs/api_key.php:18
649
- msgid "Connection in progress"
650
- msgstr ""
651
-
652
- #: admin/partials/tabs/api_key.php:19
653
- msgid "Connected! Please wait while loading next step"
654
- msgstr ""
655
-
656
- #: admin/partials/tabs/store_info.php:15
657
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:138
658
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:179
659
- msgid "Store Settings"
660
- msgstr ""
661
-
662
- #: admin/partials/tabs/store_info.php:19
663
- msgid "Name"
664
- msgstr ""
665
-
666
- #: admin/partials/tabs/store_info.php:33
667
- msgid "Street address"
668
- msgstr ""
669
-
670
- #: admin/partials/tabs/store_info.php:54
671
- msgid "Postal Code"
672
- msgstr ""
673
-
674
- #: admin/partials/tabs/store_info.php:87
675
- msgid "Phone Number"
676
- msgstr ""
677
-
678
- #: admin/partials/tabs/store_info.php:93
679
- msgid "Locale Settings"
680
- msgstr ""
681
-
682
- #: admin/partials/tabs/store_info.php:95
683
- msgid "Please apply your locale settings. If you're unsure about these, use the defaults."
684
- msgstr ""
685
-
686
- #: admin/partials/tabs/store_info.php:100
687
- msgid "Locale"
688
  msgstr ""
689
 
690
- #: admin/partials/tabs/store_info.php:104
691
- msgid "Select store's locale"
692
  msgstr ""
693
 
694
- #: admin/partials/tabs/store_info.php:119
695
- msgid "Woocommerce Currency"
696
  msgstr ""
697
 
698
- #: admin/partials/tabs/store_info.php:130
699
- msgid "Select store's timezone"
700
  msgstr ""
701
 
702
- #: admin/partials/tabs/store_info.php:146
703
- msgid "Optional Store Settings"
704
  msgstr ""
705
 
706
- #: admin/partials/tabs/store_info.php:152
707
- msgid "Plugin Permission Level"
708
  msgstr ""
709
 
710
- #: admin/partials/tabs/store_info.php:153
711
- msgid "Select the minimum permission capability to manage Mailchimp for Woocommerce options"
712
  msgstr ""
713
 
714
- #: admin/partials/tabs/store_info.php:160
715
- msgid "Administrators Only"
716
  msgstr ""
717
 
718
- #: admin/partials/tabs/store_info.php:163
719
- msgid "Shop Managers and Administrators"
720
  msgstr ""
721
 
722
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:65
723
- msgid "Mailchimp says: Please upgrade your PHP version to a minimum of 7.0"
724
  msgstr ""
725
 
726
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:71
727
- msgid "Mailchimp says: API Request Error - "
728
  msgstr ""
729
 
730
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:103
731
- msgid "Add Mailchimp for WooCommerce to build custom segments,<br/>send automations, and track purchase activity in Mailchimp"
732
  msgstr ""
733
 
734
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:107
735
- msgid "Please provide a bit of information<br/>about your WooCommerce store"
736
  msgstr ""
737
 
738
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:111
739
- msgid "Please fill out the audience default<br/>campaign information"
740
  msgstr ""
741
 
742
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:115
743
- msgid "Please apply your audience settings. If you don’t<br/>have an audience, you can choose to create one"
 
744
  msgstr ""
745
 
746
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:118
747
- msgid "Connect your WooCommerce store to a<br/>Mailchimp audience in less than 60 seconds"
748
  msgstr ""
749
 
750
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:122
751
- msgid "Log events from the <br/>Mailchimp plugin"
752
  msgstr ""
753
 
754
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:178
755
- msgid "Overview"
 
756
  msgstr ""
757
 
758
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:188
759
- msgid "Logs"
760
  msgstr ""
761
 
762
- #: admin/partials/mailchimp-woocommerce-admin-tabs.php:202
763
- msgid "Start sync"
764
  msgstr ""
2
  # This file is distributed under the same license as the Mailchimp for WooCommerce plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Mailchimp for WooCommerce 2.4.1\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/mailchimp-for-woocommerce\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2020-05-19T08:19:38+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
+ "X-Generator: WP-CLI 2.4.0\n"
15
  "X-Domain: mailchimp-for-woocommerce\n"
16
 
17
  #. Plugin Name of the plugin
18
+ #: admin/class-mailchimp-woocommerce-admin.php:219
19
  msgid "Mailchimp for WooCommerce"
20
  msgstr ""
21
 
35
  msgid "https://mailchimp.com"
36
  msgstr ""
37
 
38
+ #: admin/class-mailchimp-woocommerce-admin.php:129
39
+ msgid "Mailchimp - WooCommerce Setup"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  msgstr ""
41
 
42
+ #: admin/class-mailchimp-woocommerce-admin.php:142
43
+ #: admin/class-mailchimp-woocommerce-admin.php:143
44
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:176
45
+ msgid "Overview"
46
  msgstr ""
47
 
48
+ #: admin/class-mailchimp-woocommerce-admin.php:151
49
+ #: admin/class-mailchimp-woocommerce-admin.php:152
50
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:136
51
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:177
52
+ #: admin/partials/tabs/store_info.php:15
53
+ msgid "Store Settings"
54
  msgstr ""
55
 
56
+ #: admin/class-mailchimp-woocommerce-admin.php:160
57
+ #: admin/class-mailchimp-woocommerce-admin.php:161
58
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:148
59
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:180
60
+ #: admin/partials/tabs/campaign_defaults.php:19
61
+ msgid "Audience Defaults"
62
  msgstr ""
63
 
64
+ #: admin/class-mailchimp-woocommerce-admin.php:169
65
+ #: admin/class-mailchimp-woocommerce-admin.php:170
66
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:160
67
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:183
68
+ #: admin/partials/tabs/newsletter_settings.php:36
69
+ msgid "Audience Settings"
70
  msgstr ""
71
 
72
+ #: admin/class-mailchimp-woocommerce-admin.php:178
73
+ #: admin/class-mailchimp-woocommerce-admin.php:179
74
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:186
75
+ msgid "Logs"
76
  msgstr ""
77
 
78
+ #: admin/class-mailchimp-woocommerce-admin.php:375
79
  #: includes/class-mailchimp-woocommerce-deactivation-survey.php:379
 
80
  msgid "Mailchimp for Woocommerce"
81
  msgstr ""
82
 
83
+ #: admin/class-mailchimp-woocommerce-admin.php:376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  msgid "We dectected that this site has the following constants defined, likely at wp-config.php file"
85
  msgstr ""
86
 
87
+ #: admin/class-mailchimp-woocommerce-admin.php:378
88
  msgid "These constants are deprecated since Mailchimp for Woocommerce version 2.3. Please refer to the <a href=\"https://github.com/mailchimp/mc-woocommerce/wiki/\">plugin official wiki</a> for further details."
89
  msgstr ""
90
 
91
+ #: admin/class-mailchimp-woocommerce-admin.php:537
92
  msgid "Store Disconnected"
93
  msgstr ""
94
 
95
+ #: admin/class-mailchimp-woocommerce-admin.php:541
96
  msgid "Store Disconnect Failed"
97
  msgstr ""
98
 
99
+ #: admin/class-mailchimp-woocommerce-admin.php:884
100
  msgid "As part of the Mailchimp Terms of Use, we require a contact email and a physical mailing address."
101
  msgstr ""
102
 
103
+ #: admin/class-mailchimp-woocommerce-admin.php:892
104
  msgid "As part of the Mailchimp Terms of Use, we require a valid phone number for your store."
105
  msgstr ""
106
 
107
+ #: admin/class-mailchimp-woocommerce-admin.php:900
108
  msgid "Mailchimp for WooCommerce requires a Store Name to connect your store."
109
  msgstr ""
110
 
111
  #. translators: %s - plugin name.
112
+ #: admin/class-mailchimp-woocommerce-admin.php:918
113
  #: admin/partials/tabs/campaign_defaults.php:68
114
  msgid "You were subscribed to the newsletter from %s"
115
  msgstr ""
116
 
117
+ #: admin/class-mailchimp-woocommerce-admin.php:923
118
+ #: admin/class-mailchimp-woocommerce-admin.php:1018
119
  msgid "One or more fields were not updated"
120
  msgstr ""
121
 
122
+ #: admin/class-mailchimp-woocommerce-admin.php:970
123
+ #: admin/partials/tabs/newsletter_settings.php:97
124
+ #: includes/class-mailchimp-woocommerce-newsletter.php:43
125
+ msgid "Subscribe to our newsletter"
126
+ msgstr ""
127
+
128
+ #: admin/class-mailchimp-woocommerce-admin.php:1083
129
  msgid "You must supply your Mailchimp API key to pull the audiences."
130
  msgstr ""
131
 
132
+ #: admin/class-mailchimp-woocommerce-admin.php:1548
133
  msgid "Starting the sync process..."
134
  msgstr ""
135
 
136
+ #: admin/class-mailchimp-woocommerce-admin.php:1550
137
  msgid "The plugin has started the initial sync with your store, and the process will work in the background automatically."
138
  msgstr ""
139
 
140
+ #: admin/class-mailchimp-woocommerce-admin.php:1552
141
  msgid "Sometimes the sync can take a while, especially on sites with lots of orders and/or products. It is safe to navigate away from this screen while it is running."
142
  msgstr ""
143
 
144
+ #: admin/class-mailchimp-woocommerce-admin.php:1568
145
  msgid "Your store is synced with Mailchimp!"
146
  msgstr ""
147
 
148
  #. translators: %1$s: Number of synced orders %2$s: Audience name
149
+ #: admin/class-mailchimp-woocommerce-admin.php:1571
150
  msgid "We've successfully synced %1$s orders to your Audience %2$s, that's awesome!"
151
  msgstr ""
152
 
153
  #. translators: %s - Wordpress.org plugin review URL.
154
+ #: admin/class-mailchimp-woocommerce-admin.php:1579
155
  msgid "Could you please do us a favor and leave the plugin a 5-star <a href=%s target='_blank'>rating on Wordpress.org</a>? It helps our community know that we're working hard to make it better each day."
156
  msgstr ""
157
 
158
+ #: admin/class-mailchimp-woocommerce-admin.php:1582
159
  msgid "Leave a Review"
160
  msgstr ""
161
 
162
+ #: admin/class-mailchimp-woocommerce-admin.php:1607
163
  msgid "Saved"
164
  msgstr ""
165
 
166
+ #: admin/class-mailchimp-woocommerce-admin.php:1612
167
  msgid "Error setting communications status"
168
  msgstr ""
169
 
170
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:65
171
+ msgid "Mailchimp says: Please upgrade your PHP version to a minimum of 7.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  msgstr ""
173
 
174
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:71
175
+ msgid "Mailchimp says: API Request Error - "
176
  msgstr ""
177
 
178
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:96
179
+ msgid "Add Mailchimp for WooCommerce to build custom segments,<br/>send automations, and track purchase activity in Mailchimp"
180
  msgstr ""
181
 
182
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:100
183
+ msgid "Please provide a bit of information<br/>about your WooCommerce store"
 
184
  msgstr ""
185
 
186
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:104
187
+ msgid "Please fill out the audience default<br/>campaign information"
188
  msgstr ""
189
 
190
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:108
191
+ msgid "Please apply your audience settings. If you don’t<br/>have an audience, you can choose to create one"
192
  msgstr ""
193
 
194
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:112
195
+ msgid "Sweet! You're connected with<br/>Mailchimp and syncing data"
196
  msgstr ""
197
 
198
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:115
199
+ msgid "Connect your WooCommerce store to a<br/>Mailchimp audience in less than 60 seconds"
200
  msgstr ""
201
 
202
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:120
203
+ msgid "Log events from the <br/>Mailchimp plugin"
204
  msgstr ""
205
 
206
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:127
207
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:174
208
+ #: admin/partials/tabs/api_key.php:10
209
+ msgid "Connect"
210
  msgstr ""
211
 
212
+ #: admin/partials/mailchimp-woocommerce-admin-tabs.php:205
213
+ msgid "Start sync"
 
214
  msgstr ""
215
 
216
+ #: admin/partials/tabs/api_key.php:6
217
+ #: admin/partials/tabs/api_key.php:11
218
+ msgid "Connect your store to Mailchimp"
219
  msgstr ""
220
 
221
+ #: admin/partials/tabs/api_key.php:10
222
+ msgid "Reconnect"
 
223
  msgstr ""
224
 
225
+ #: admin/partials/tabs/api_key.php:14
226
+ msgid "Already connected. You can reconnect with another Mailchimp account if you want."
227
  msgstr ""
228
 
229
+ #: admin/partials/tabs/api_key.php:16
230
+ msgid "Connecting. A new window will open with Mailchimp's OAuth service. Please log-in an we will take care of the rest."
231
  msgstr ""
232
 
233
+ #: admin/partials/tabs/api_key.php:17
234
+ msgid "Error, can't login."
235
  msgstr ""
236
 
237
+ #: admin/partials/tabs/api_key.php:18
238
+ msgid "Connection in progress"
239
  msgstr ""
240
 
241
+ #: admin/partials/tabs/api_key.php:19
242
+ msgid "Connected! Please wait while loading next step"
243
  msgstr ""
244
 
245
  #: admin/partials/tabs/api_key_create_account.php:33
301
 
302
  #. translators: %s - Mailchimp legal pages
303
  #: admin/partials/tabs/api_key_create_account.php:161
304
+ msgid "By clicking the \"Get Started!\" button, you are creating a Mailchimp account, and you agree to Mailchimp's <a href=%1$s target=_blank>Terms of Use</a> and <a href=%2$s target=_blank>Privacy Policy</a>."
305
  msgstr ""
306
 
307
  #: admin/partials/tabs/api_key_create_account.php:167
344
  msgid "Connecting..."
345
  msgstr ""
346
 
347
+ #: admin/partials/tabs/campaign_defaults.php:24
348
+ msgid "Default from name"
349
+ msgstr ""
350
+
351
+ #: admin/partials/tabs/campaign_defaults.php:31
352
+ msgid "Default from email"
353
+ msgstr ""
354
+
355
+ #: admin/partials/tabs/campaign_defaults.php:38
356
+ msgid "Default subject"
357
+ msgstr ""
358
+
359
+ #: admin/partials/tabs/campaign_defaults.php:40
360
+ msgid "Store Newsletter"
361
+ msgstr ""
362
+
363
+ #: admin/partials/tabs/campaign_defaults.php:45
364
+ msgid "Default language"
365
+ msgstr ""
366
+
367
+ #: admin/partials/tabs/campaign_defaults.php:62
368
+ msgid "Permission reminder message"
369
+ msgstr ""
370
+
371
  #: admin/partials/tabs/logs.php:38
372
  msgid "Logging Preference"
373
  msgstr ""
400
  msgid "Recent Logs"
401
  msgstr ""
402
 
403
+ #: admin/partials/tabs/logs.php:94
404
+ msgid "Copy log"
405
+ msgstr ""
406
+
407
+ #: admin/partials/tabs/logs.php:100
408
  msgid "Delete log"
409
  msgstr ""
410
 
411
+ #: admin/partials/tabs/newsletter_settings.php:41
412
+ msgid "Sync audience with your store"
413
+ msgstr ""
414
+
415
+ #: admin/partials/tabs/newsletter_settings.php:47
416
+ msgid "Create New Audience"
417
+ msgstr ""
418
+
419
+ #: admin/partials/tabs/newsletter_settings.php:51
420
+ msgid "Select Audience"
421
+ msgstr ""
422
+
423
+ #: admin/partials/tabs/newsletter_settings.php:76
424
+ msgid "During initial sync, auto subscribe the existing customers."
425
+ msgstr ""
426
+
427
+ #: admin/partials/tabs/newsletter_settings.php:81
428
+ msgid "Optional Audience Settings"
429
+ msgstr ""
430
+
431
+ #: admin/partials/tabs/newsletter_settings.php:86
432
+ msgid "Opt-in Settings"
433
+ msgstr ""
434
+
435
+ #: admin/partials/tabs/newsletter_settings.php:91
436
+ msgid "Message for the opt-in checkbox"
437
+ msgstr ""
438
+
439
+ #: admin/partials/tabs/newsletter_settings.php:92
440
+ msgid "The call-to-action text that prompts customers to subscribe to your newsletter at checkout."
441
+ msgstr ""
442
+
443
+ #: admin/partials/tabs/newsletter_settings.php:98
444
+ msgid "HTML tags allowed: <a href=\"\" target=\"\" title=\"\"></a> and <br>"
445
+ msgstr ""
446
+
447
+ #: admin/partials/tabs/newsletter_settings.php:103
448
+ msgid "Checkbox Display Options"
449
+ msgstr ""
450
+
451
+ #: admin/partials/tabs/newsletter_settings.php:104
452
+ msgid "Choose how you want the opt-in to your newsletter checkbox to render at checkout"
453
+ msgstr ""
454
+
455
+ #: admin/partials/tabs/newsletter_settings.php:112
456
+ msgid "Visible, checked by default"
457
+ msgstr ""
458
+
459
+ #: admin/partials/tabs/newsletter_settings.php:115
460
+ msgid "Visible, unchecked by default"
461
+ msgstr ""
462
+
463
+ #: admin/partials/tabs/newsletter_settings.php:118
464
+ msgid "Hidden, unchecked by default"
465
+ msgstr ""
466
+
467
+ #: admin/partials/tabs/newsletter_settings.php:125
468
+ msgid "Advanced Checkbox Settings"
469
+ msgstr ""
470
+
471
+ #. translators: %s - Woocommerce Actions documentation URL.
472
+ #: admin/partials/tabs/newsletter_settings.php:126
473
+ msgid "To change the location of the opt-in <br/>checkbox at checkout, input one of the <a href=%s target=_blank>available WooCommerce form actions</a>."
474
+ msgstr ""
475
+
476
+ #: admin/partials/tabs/newsletter_settings.php:132
477
+ msgid "Enter a WooCommerce form action"
478
+ msgstr ""
479
+
480
+ #: admin/partials/tabs/newsletter_settings.php:136
481
+ msgid "Subscriber Settings"
482
+ msgstr ""
483
+
484
+ #: admin/partials/tabs/newsletter_settings.php:141
485
+ msgid "Tags"
486
+ msgstr ""
487
+
488
+ #: admin/partials/tabs/newsletter_settings.php:142
489
+ msgid "Add a comma-separated list of tags to apply to a subscriber in Mailchimp after a transaction occurs"
490
+ msgstr ""
491
+
492
+ #: admin/partials/tabs/newsletter_settings.php:151
493
+ msgid "Product Settings"
494
+ msgstr ""
495
+
496
+ #: admin/partials/tabs/newsletter_settings.php:157
497
+ msgid "Product Image Size"
498
+ msgstr ""
499
+
500
+ #: admin/partials/tabs/newsletter_settings.php:158
501
+ msgid "Define the product image size used by abandoned carts, order notifications, and product recommendations."
502
+ msgstr ""
503
+
504
+ #: admin/partials/tabs/newsletter_settings.php:164
505
+ msgid "Size"
506
  msgstr ""
507
 
508
  #: admin/partials/tabs/notices.php:6
529
  msgid "Mailchimp says: Your re-sync has been started!"
530
  msgstr ""
531
 
532
+ #: admin/partials/tabs/store_info.php:19
533
+ msgid "Name"
 
 
534
  msgstr ""
535
 
536
+ #: admin/partials/tabs/store_info.php:33
537
+ msgid "Street address"
538
  msgstr ""
539
 
540
+ #: admin/partials/tabs/store_info.php:54
541
+ msgid "Postal Code"
542
  msgstr ""
543
 
544
+ #: admin/partials/tabs/store_info.php:87
545
+ msgid "Phone Number"
546
  msgstr ""
547
 
548
+ #: admin/partials/tabs/store_info.php:93
549
+ msgid "Locale Settings"
550
  msgstr ""
551
 
552
+ #: admin/partials/tabs/store_info.php:95
553
+ msgid "Please apply your locale settings. If you're unsure about these, use the defaults."
554
  msgstr ""
555
 
556
+ #: admin/partials/tabs/store_info.php:100
557
+ msgid "Locale"
558
+ msgstr ""
559
+
560
+ #: admin/partials/tabs/store_info.php:104
561
+ msgid "Select store's locale"
562
+ msgstr ""
563
+
564
+ #: admin/partials/tabs/store_info.php:119
565
+ msgid "Woocommerce Currency"
566
+ msgstr ""
567
+
568
+ #: admin/partials/tabs/store_info.php:130
569
+ msgid "Select store's timezone"
570
+ msgstr ""
571
+
572
+ #: admin/partials/tabs/store_info.php:146
573
+ msgid "Optional Store Settings"
574
+ msgstr ""
575
+
576
+ #: admin/partials/tabs/store_info.php:152
577
+ msgid "Plugin Permission Level"
578
+ msgstr ""
579
+
580
+ #: admin/partials/tabs/store_info.php:153
581
+ msgid "Select the minimum permission capability to manage Mailchimp for Woocommerce options"
582
+ msgstr ""
583
+
584
+ #: admin/partials/tabs/store_info.php:160
585
+ msgid "Administrators Only"
586
+ msgstr ""
587
+
588
+ #: admin/partials/tabs/store_info.php:163
589
+ msgid "Shop Managers and Administrators"
590
  msgstr ""
591
 
592
  #: admin/partials/tabs/store_sync.php:77
645
  msgid "Last Updated:"
646
  msgstr ""
647
 
648
+ #: admin/partials/tabs/store_sync.php:164
649
+ #: includes/class-mailchimp-woocommerce-rest-api.php:140
650
+ msgid "D, M j, Y g:i A"
651
+ msgstr ""
652
+
653
  #: admin/partials/tabs/store_sync.php:166
654
  msgid "Starting..."
655
  msgstr ""
695
 
696
  #. translators: %s - Mailchimp Support URL.
697
  #: admin/partials/tabs/store_sync.php:220
698
+ msgid "Need help? Visit Mailchimp <a href=%s target=_blank>support</a>."
699
  msgstr ""
700
 
701
  #. translators: %s - Mailchimp Privacy Policy URL.
703
  msgid "By using this plugin, Mailchimp will process customer information in accordance with their <a href=%s target=_blank>Privacy Policy</a>."
704
  msgstr ""
705
 
706
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:179
707
+ msgid "Please select an option"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
708
  msgstr ""
709
 
710
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:182
711
+ msgid "Sending Feedback"
712
  msgstr ""
713
 
714
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:327
715
+ msgid "I want to change the audience associated with this integration."
716
  msgstr ""
717
 
718
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:331
719
+ msgid "I want to change the site or store connected through this integration."
720
  msgstr ""
721
 
722
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:335
723
+ msgid "The order data isn't syncing."
724
  msgstr ""
725
 
726
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:339
727
+ msgid "The promo codes aren't showing up."
728
  msgstr ""
729
 
730
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:343
731
+ msgid "I'm trying to troubleshoot the integration."
732
  msgstr ""
733
 
734
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:347
735
+ msgid "I was instructed to disconnect by Mailchimp Support."
736
  msgstr ""
737
 
738
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:351
739
+ msgid "I no longer use this integration."
740
  msgstr ""
741
 
742
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:355
743
+ msgid "It's a temporary deactivation."
744
  msgstr ""
745
 
746
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:359
747
+ msgid "Other"
748
  msgstr ""
749
 
750
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:361
751
+ msgid "Please share the reason"
752
  msgstr ""
753
 
754
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:370
755
+ msgid "Quick Feedback"
756
  msgstr ""
757
 
758
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:371
759
+ msgid "Close"
760
  msgstr ""
761
 
762
+ #. translators: %s - plugin name.
763
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:378
764
+ msgid "If you have a moment, please share why you are deactivating %s:"
765
  msgstr ""
766
 
767
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:398
768
+ msgid "Submit & Deactivate"
769
  msgstr ""
770
 
771
+ #: includes/class-mailchimp-woocommerce-deactivation-survey.php:399
772
+ msgid "Skip & Deactivate"
773
  msgstr ""
774
 
775
+ #. translators: %s - Mailchimp Privacy Policy URL.
776
+ #: includes/class-mailchimp-woocommerce-privacy.php:12
777
+ msgid "When shopping, we keep a record of your email and the cart contents for up to 30 days on our server. This record is kept to repopulate the contents of your cart if you switch devices or needed to come back another day. Read our privacy policy <a href=\"%s\">here</a>."
778
  msgstr ""
779
 
780
+ #: includes/class-mailchimp-woocommerce-privacy.php:78
781
+ msgid "MailChimp Shopping Cart Data"
782
  msgstr ""
783
 
784
+ #: includes/class-mailchimp-woocommerce-privacy.php:82
785
+ msgid "User ID"
786
  msgstr ""
mailchimp-woocommerce.php CHANGED
@@ -16,7 +16,7 @@
16
  * Plugin Name: Mailchimp for WooCommerce
17
  * Plugin URI: https://mailchimp.com/connect-your-store/
18
  * Description: Connects WooCommerce to Mailchimp to sync your store data, send targeted campaigns to your customers, and sell more stuff.
19
- * Version: 2.4.0
20
  * Author: Mailchimp
21
  * Author URI: https://mailchimp.com
22
  * License: GPL-2.0+
@@ -26,7 +26,7 @@
26
  * Requires at least: 4.9
27
  * Tested up to: 5.4
28
  * WC requires at least: 3.5
29
- * WC tested up to: 4.0
30
  */
31
 
32
  // If this file is called directly, abort.
16
  * Plugin Name: Mailchimp for WooCommerce
17
  * Plugin URI: https://mailchimp.com/connect-your-store/
18
  * Description: Connects WooCommerce to Mailchimp to sync your store data, send targeted campaigns to your customers, and sell more stuff.
19
+ * Version: 2.4.1
20
  * Author: Mailchimp
21
  * Author URI: https://mailchimp.com
22
  * License: GPL-2.0+
26
  * Requires at least: 4.9
27
  * Tested up to: 5.4
28
  * WC requires at least: 3.5
29
+ * WC tested up to: 4.1
30
  */
31
 
32
  // If this file is called directly, abort.
public/class-mailchimp-woocommerce-public.php CHANGED
@@ -76,9 +76,15 @@ class MailChimp_WooCommerce_Public {
76
  //}
77
  }
78
 
79
- public function add_inline_footer_script(){
80
- if (($fragment = mailchimp_get_connected_site_script_fragment()) && !empty($fragment)) {
81
- echo $fragment;
 
 
 
 
 
 
82
  }
83
  }
84
  }
76
  //}
77
  }
78
 
79
+ /**
80
+ * Add the inline footer script if the filter allows it.
81
+ */
82
+ public function add_inline_footer_script()
83
+ {
84
+ if (apply_filters( 'mailchimp_add_inline_footer_script', true)) {
85
+ if (($fragment = mailchimp_get_connected_site_script_fragment()) && !empty($fragment)) {
86
+ echo $fragment;
87
+ }
88
  }
89
  }
90
  }