MailChimp for WordPress - Version 4.7

Version Description

Download this release

Release Info

Developer DvanKooten
Plugin Icon 128x128 MailChimp for WordPress
Version 4.7
Comparing to
See all releases

Code changes from version 4.6.2 to 4.7

CHANGELOG.md CHANGED
@@ -1,6 +1,18 @@
1
  Changelog
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  #### 4.6.2 - Oct 24, 2019
5
 
6
  **Fixes**
1
  Changelog
2
  =========
3
 
4
+
5
+ #### 4.7 - Nov 7, 2019
6
+
7
+ **Improvements**
8
+
9
+ - Add role=alert to form notices.
10
+ - Add setting to pre-check sign-up checkbox for Gravity Forms integrations.
11
+ - Add new position for WooCommerce integration: directly after the billing_email field.
12
+ - Fix PHP notices for submitting a form and saving a form as an administrator.
13
+ - Add link to [Koko Analytics plugin](https://wordpress.org/plugins/koko-analytics/).
14
+
15
+
16
  #### 4.6.2 - Oct 24, 2019
17
 
18
  **Fixes**
includes/api/class-api-v3.php CHANGED
@@ -904,7 +904,7 @@ class MC4WP_API_v3
904
  }
905
 
906
  /**
907
- * @link https://developer.mailchimp.com/documentation/mailchimp/reference/ecommerce/stores/carts/#delete-delete_ecommerce_stores_store_id_carts_cart_id
908
  *
909
  * @param string $store_id
910
  * @param string $cart_id
904
  }
905
 
906
  /**
907
+ * @link https://mailchimp.com/developer/reference/ecommerce-stores/ecommerce-carts/#delete-delete_ecommerce_stores_store_id_carts_cart_id
908
  *
909
  * @param string $store_id
910
  * @param string $cart_id
includes/class-mailchimp.php CHANGED
@@ -91,10 +91,11 @@ class MC4WP_MailChimp
91
  try {
92
  if ($existing_member_data) {
93
  $data = $api->update_list_member($list_id, $email_address, $args);
94
- $data->was_already_on_list = $existing_member_data->status === 'subscribed';
95
  } else {
96
  $data = $api->add_new_list_member($list_id, $args);
97
  }
 
 
98
  } catch (MC4WP_API_Exception $e) {
99
  $this->error_code = $e->getCode();
100
  $this->error_message = $e;
91
  try {
92
  if ($existing_member_data) {
93
  $data = $api->update_list_member($list_id, $email_address, $args);
 
94
  } else {
95
  $data = $api->add_new_list_member($list_id, $args);
96
  }
97
+
98
+ $data->was_already_on_list = $existing_member_data->status === 'subscribed';
99
  } catch (MC4WP_API_Exception $e) {
100
  $this->error_code = $e->getCode();
101
  $this->error_message = $e;
includes/forms/class-admin.php CHANGED
@@ -278,12 +278,14 @@ class MC4WP_Forms_Admin
278
  check_admin_referer('edit_form', '_mc4wp_nonce');
279
 
280
  // save global settings (if submitted)
281
- $options = get_option('mc4wp', array());
282
- $posted = $_POST['mc4wp'];
283
- foreach($posted as $key => $value) {
284
- $options[$key] = trim($value);
285
- }
286
- update_option('mc4wp', $options);
 
 
287
 
288
  // save form + settings
289
  $form_id = (int) $_POST['mc4wp_form_id'];
278
  check_admin_referer('edit_form', '_mc4wp_nonce');
279
 
280
  // save global settings (if submitted)
281
+ if (isset($_POST['mc4wp']) && is_array($_POST['mc4wp'])) {
282
+ $options = get_option('mc4wp', array());
283
+ $posted = $_POST['mc4wp'];
284
+ foreach ($posted as $key => $value) {
285
+ $options[$key] = trim($value);
286
+ }
287
+ update_option('mc4wp', $options);
288
+ }
289
 
290
  // save form + settings
291
  $form_id = (int) $_POST['mc4wp_form_id'];
includes/forms/class-form-element.php CHANGED
@@ -114,7 +114,7 @@ class MC4WP_Form_Element
114
  return '';
115
  }
116
 
117
- $html = sprintf('<div class="mc4wp-alert mc4wp-%s"><p>%s</p></div>', esc_attr($notice->type), $notice->text);
118
  return $html;
119
  }
120
 
114
  return '';
115
  }
116
 
117
+ $html = sprintf('<div class="mc4wp-alert mc4wp-%s" role="alert"><p>%s</p></div>', esc_attr($notice->type), $notice->text);
118
  return $html;
119
  }
120
 
includes/integrations/class-integration.php CHANGED
@@ -14,554 +14,563 @@
14
  abstract class MC4WP_Integration
15
  {
16
 
17
- /**
18
- * @var string Name of this integration.
19
- */
20
- public $name = '';
21
-
22
- /**
23
- * @var string Description
24
- */
25
- public $description = '';
26
-
27
- /**
28
- * @var string Slug, used as an unique identifier for this integration.
29
- */
30
- public $slug = '';
31
-
32
- /**
33
- * @var array Array of settings
34
- */
35
- public $options = array();
36
-
37
- /**
38
- * @var string Name attribute for the checkbox element. Will be created from slug if empty.
39
- */
40
- protected $checkbox_name = '';
41
-
42
- /**
43
- * Constructor
44
- *
45
- * @param string $slug
46
- * @param array $options
47
- */
48
- public function __construct($slug, array $options)
49
- {
50
- $this->slug = $slug;
51
- $this->options = $this->parse_options($options);
52
-
53
- // if checkbox name is not set, set a good custom value
54
- if ($this->checkbox_name === '') {
55
- $this->checkbox_name = '_mc4wp_subscribe_' . $this->slug;
56
- }
57
- }
58
-
59
- /**
60
- * Return array of default options
61
- *
62
- * @return array
63
- */
64
- protected function get_default_options()
65
- {
66
- return array(
67
- 'css' => 0,
68
- 'double_optin' => 1,
69
- 'enabled' => 0,
70
- 'implicit' => 0,
71
- 'label' => __('Sign me up for the newsletter!', 'mailchimp-for-wp'),
72
- 'lists' => array(),
73
- 'precheck' => 0,
74
- 'replace_interests' => 0,
75
- 'update_existing' => 0,
76
- 'wrap_p' => 1
77
- );
78
- }
79
-
80
- /**
81
- * @param array $options
82
- *
83
- * @return array
84
- */
85
- protected function parse_options(array $options)
86
- {
87
- $slug = $this->slug;
88
-
89
- $default_options = $this->get_default_options();
90
- $options = array_merge($default_options, $options);
91
-
92
- /**
93
- * @deprecated Use mc4wp_integration_{$slug}_options instead
94
- */
95
- $options = (array) apply_filters('mc4wp_' . $slug . '_integration_options', $options);
96
-
97
- /**
98
- * Filters options for a specific integration
99
- *
100
- * The dynamic portion of the hook, `$slug`, refers to the slug of the ingration.
101
- *
102
- * @param array $integration_options
103
- */
104
- return (array) apply_filters('mc4wp_integration_' . $slug . '_options', $options);
105
- }
106
-
107
- /**
108
- * Initialize the integration
109
- */
110
- public function initialize()
111
- {
112
- $this->add_required_hooks();
113
- $this->add_hooks();
114
- }
115
-
116
- /**
117
- * Adds the required hooks for core functionality, like adding checkbox reset CSS.
118
- */
119
- protected function add_required_hooks()
120
- {
121
- if ($this->options['css'] && ! $this->options['implicit']) {
122
- add_action('wp_head', array( $this, 'print_css_reset' ));
123
- }
124
- }
125
-
126
- /**
127
- * Was integration triggered?
128
- *
129
- * Will always return true when integration is implicit. Otherwise, will check value of checkbox.
130
- *
131
- * @param int $object_id Useful when overriding method. (optional)
132
- * @return bool
133
- */
134
- public function triggered($object_id = null)
135
- {
136
- return $this->options['implicit'] || $this->checkbox_was_checked();
137
- }
138
-
139
- /**
140
- * Adds the hooks which are specific to this integration
141
- */
142
- abstract protected function add_hooks();
143
-
144
- /**
145
- * Print CSS reset
146
- *
147
- * @hooked `wp_head`
148
- */
149
- public function print_css_reset()
150
- {
151
- $suffix = defined('SCRIPT_DEBUG') ? '' : '.min';
152
- $css = file_get_contents(MC4WP_PLUGIN_DIR . 'assets/css/checkbox-reset' . $suffix . '.css');
153
-
154
- // replace selector by integration specific selector so the css affects just this checkbox
155
- $css = str_ireplace('__INTEGRATION_SLUG__', $this->slug, $css);
156
-
157
- printf('<style type="text/css">%s</style>', $css);
158
- }
159
-
160
- /**
161
- * Get the text for the label element
162
- *
163
- * @return string
164
- */
165
- public function get_label_text()
166
- {
167
- $integration = $this;
168
- $label = $this->options['label'];
169
-
170
- /**
171
- * Filters the checkbox label
172
- *
173
- * @since 3.0
174
- *
175
- * @param string $label
176
- * @param MC4WP_Integration $integration
177
- * @ignore
178
- */
179
- $label = (string) apply_filters('mc4wp_integration_checkbox_label', $label, $integration);
180
- return $label;
181
- }
182
-
183
- /**
184
- * Was the integration checkbox checked?
185
- *
186
- * @return bool
187
- */
188
- public function checkbox_was_checked()
189
- {
190
- $data = $this->get_data();
191
- return (isset($data[ $this->checkbox_name ]) && $data[ $this->checkbox_name ] == 1);
192
- }
193
-
194
- /**
195
- * Get a string of attributes for the checkbox element.
196
- *
197
- * @return string
198
- */
199
- protected function get_checkbox_attributes()
200
- {
201
- $integration = $this;
202
- $slug = $this->slug;
203
-
204
- $attributes = array();
205
-
206
- if ($this->options['precheck']) {
207
- $attributes['checked'] = 'checked';
208
- }
209
-
210
- /**
211
- * Filters the attributes array.
212
- *
213
- * @param array $attributes
214
- * @param MC4WP_Integration $integration
215
- * @ignore
216
- */
217
- $attributes = (array) apply_filters('mc4wp_integration_checkbox_attributes', $attributes, $integration);
218
-
219
- /**
220
- * Filters the attributes array.
221
- *
222
- * The dynamic portion of the hook, `$slug`, refers to the slug for this integration.
223
- *
224
- * @param array $attributes
225
- * @param MC4WP_Integration $integration
226
- * @ignore
227
- */
228
- $attributes = (array) apply_filters('mc4wp_integration_' . $slug . '_checkbox_attributes', $attributes, $integration);
229
-
230
- $string = '';
231
- foreach ($attributes as $key => $value) {
232
- $string .= sprintf('%s="%s"', $key, esc_attr($value));
233
- }
234
-
235
- return $string;
236
- }
237
-
238
- /**
239
- * Outputs a checkbox
240
- */
241
- public function output_checkbox()
242
- {
243
- echo $this->get_checkbox_html();
244
- }
245
-
246
- /**
247
- * Get HTML for the checkbox
248
- *
249
- * @return string
250
- */
251
- public function get_checkbox_html()
252
- {
253
- $show_checkbox = empty($this->options['implicit']);
254
- $integration_slug = $this->slug;
255
-
256
- /**
257
- * Filters whether to show the sign-up checkbox for this integration.
258
- *
259
- * @param bool $show_checkbox
260
- * @param string $integration_slug
261
- */
262
- $show_checkbox = (bool) apply_filters('mc4wp_integration_show_checkbox', $show_checkbox, $integration_slug);
263
-
264
- if (! $show_checkbox) {
265
- return '';
266
- }
267
-
268
- ob_start();
269
-
270
- echo sprintf('<!-- Mailchimp for WordPress v%s - https://mc4wp.com/ -->', MC4WP_VERSION);
271
-
272
- /** @ignore */
273
- do_action('mc4wp_integration_before_checkbox_wrapper', $this);
274
-
275
- /** @ignore */
276
- do_action('mc4wp_integration_'. $this->slug .'_before_checkbox_wrapper', $this);
277
-
278
- $wrapper_tag = $this->options['wrap_p'] ? 'p' : 'span';
279
-
280
- // Hidden field to make sure "0" is sent to server
281
- echo sprintf('<input type="hidden" name="%s" value="0" />', esc_attr($this->checkbox_name));
282
-
283
- echo sprintf('<%s class="mc4wp-checkbox mc4wp-checkbox-%s">', $wrapper_tag, esc_attr($this->slug));
284
- echo '<label>';
285
- echo sprintf('<input type="checkbox" name="%s" value="1" %s />', esc_attr($this->checkbox_name), $this->get_checkbox_attributes());
286
- echo sprintf('<span>%s</span>', $this->get_label_text());
287
- echo '</label>';
288
- echo sprintf('</%s>', $wrapper_tag);
289
-
290
- /** @ignore */
291
- do_action('mc4wp_integration_after_checkbox_wrapper', $this);
292
-
293
- /** @ignore */
294
- do_action('mc4wp_integration_'. $this->slug .'_after_checkbox_wrapper', $this);
295
- echo '<!-- / Mailchimp for WordPress -->';
296
-
297
- $html = ob_get_clean();
298
- return $html;
299
- }
300
-
301
- /**
302
- * Get the selected Mailchimp lists
303
- *
304
- * @return array Array of List ID's
305
- */
306
- public function get_lists()
307
- {
308
- $data = $this->get_data();
309
- $integration = $this;
310
- $slug = $this->slug;
311
-
312
- // get checkbox lists options
313
- $lists = $this->options['lists'];
314
-
315
- // get lists from request, if set.
316
- if (! empty($data['_mc4wp_lists'])) {
317
- $lists = $data['_mc4wp_lists'];
318
-
319
- // ensure lists is an array
320
- if (! is_array($lists)) {
321
- $lists = explode(',', $lists);
322
- $lists = array_map('trim', $lists);
323
- }
324
- }
325
-
326
- /**
327
- * Allow plugins to filter final lists value. This filter is documented elsewhere.
328
- *
329
- * @since 2.0
330
- * @see MC4WP_Form::get_lists
331
- * @ignore
332
- */
333
- $lists = (array) apply_filters('mc4wp_lists', $lists);
334
-
335
- /**
336
- * Filters the Mailchimp lists this integration should subscribe to
337
- *
338
- * @since 3.0
339
- *
340
- * @param array $lists
341
- * @param MC4WP_Integration $integration
342
- */
343
- $lists = (array) apply_filters('mc4wp_integration_lists', $lists, $integration);
344
-
345
- /**
346
- * Filters the Mailchimp lists a specific integration should subscribe to
347
- *
348
- * The dynamic portion of the hook, `$slug`, refers to the slug of the integration.
349
- *
350
- * @since 3.0
351
- *
352
- * @param array $lists
353
- * @param MC4WP_Integration $integration
354
- */
355
- $lists = (array) apply_filters('mc4wp_integration_' . $slug . '_lists', $lists, $integration);
356
-
357
- return $lists;
358
- }
359
-
360
- /**
361
- * Makes a subscription request
362
- *
363
- * @param array $data
364
- * @param int $related_object_id
365
- *
366
- * @return boolean
367
- */
368
- protected function subscribe(array $data, $related_object_id = 0)
369
- {
370
- $integration = $this;
371
- $slug = $this->slug;
372
- $mailchimp = new MC4WP_MailChimp();
373
- $log = $this->get_log();
374
- $list_ids = $this->get_lists();
375
-
376
- /** @var MC4WP_MailChimp_Subscriber $subscriber */
377
- $subscriber = null;
378
- $result = false;
379
-
380
- // validate lists
381
- if (empty($list_ids)) {
382
- $log->warning(sprintf('%s > No Mailchimp lists were selected', $this->name));
383
- return false;
384
- }
385
-
386
- /**
387
- * Filters data for integration requests.
388
- *
389
- * @param array $data
390
- */
391
- $data = apply_filters('mc4wp_integration_data', $data);
392
-
393
- /**
394
- * Filters data for a specific integration request.
395
- *
396
- * The dynamic portion of the hook, `$slug`, refers to the integration slug.
397
- *
398
- * @param array $data
399
- * @param int $related_object_id
400
- */
401
- $data = apply_filters("mc4wp_integration_{$slug}_data", $data, $related_object_id);
402
-
403
- /**
404
- * @ignore
405
- * @deprecated 4.0
406
- */
407
- $data = apply_filters('mc4wp_merge_vars', $data);
408
-
409
- /**
410
- * @deprecated 4.0
411
- * @ignore
412
- */
413
- $data = apply_filters('mc4wp_integration_merge_vars', $data, $integration);
414
-
415
- /**
416
- * @deprecated 4.0
417
- * @ignore
418
- */
419
- $data = apply_filters("mc4wp_integration_{$slug}_merge_vars", $data, $integration);
420
-
421
- $email_type = mc4wp_get_email_type();
422
-
423
- $mapper = new MC4WP_List_Data_Mapper($data, $list_ids);
424
-
425
- /** @var MC4WP_MailChimp_Subscriber[] $map */
426
- $map = $mapper->map();
427
-
428
- foreach ($map as $list_id => $subscriber) {
429
- $subscriber->status = $this->options['double_optin'] ? 'pending' : 'subscribed';
430
- $subscriber->email_type = $email_type;
431
- $subscriber->ip_signup = mc4wp_get_request_ip_address();
432
-
433
- /** @ignore (documented elsewhere) */
434
- $subscriber = apply_filters('mc4wp_subscriber_data', $subscriber);
435
-
436
- /**
437
- * Filters subscriber data before it is sent to Mailchimp. Only fires for integration requests.
438
- *
439
- * @param MC4WP_MailChimp_Subscriber $subscriber
440
- */
441
- $subscriber = apply_filters('mc4wp_integration_subscriber_data', $subscriber);
442
-
443
- /**
444
- * Filters subscriber data before it is sent to Mailchimp. Only fires for integration requests.
445
- *
446
- * The dynamic portion of the hook, `$slug`, refers to the integration slug.
447
- *
448
- * @param MC4WP_MailChimp_Subscriber $subscriber
449
- * @param int $related_object_id
450
- */
451
- $subscriber = apply_filters("mc4wp_integration_{$slug}_subscriber_data", $subscriber, $related_object_id);
452
-
453
- $result = $mailchimp->list_subscribe($list_id, $subscriber->email_address, $subscriber->to_array(), $this->options['update_existing'], $this->options['replace_interests']);
454
- }
455
-
456
- // if result failed, show error message
457
- if (! $result) {
458
-
459
- // log error
460
- if ($mailchimp->get_error_code() == 214) {
461
- $log->warning(sprintf("%s > %s is already subscribed to the selected list(s)", $this->name, $subscriber->email_address));
462
- } else {
463
- $log->error(sprintf('%s > Mailchimp API Error: %s', $this->name, $mailchimp->get_error_message()));
464
- }
465
-
466
- // bail
467
- return false;
468
- }
469
-
470
- $log->info(sprintf('%s > Successfully subscribed %s', $this->name, $subscriber->email_address));
471
-
472
- /**
473
- * Runs right after someone is subscribed using an integration
474
- *
475
- * @since 3.0
476
- *
477
- * @param MC4WP_Integration $integration
478
- * @param string $email_address
479
- * @param array $merge_vars
480
- * @param MC4WP_MailChimp_Subscriber[] $subscriber_data
481
- * @param int $related_object_id
482
- */
483
- do_action('mc4wp_integration_subscribed', $integration, $subscriber->email_address, $subscriber->merge_fields, $map, $related_object_id);
484
-
485
- return $result;
486
- }
487
-
488
- /**
489
- * Are the required dependencies for this integration installed?
490
- *
491
- * @return bool
492
- */
493
- public function is_installed()
494
- {
495
- return false;
496
- }
497
-
498
- /**
499
- * Which UI elements should we show on the settings page for this integration?
500
- *
501
- * @return array
502
- */
503
- public function get_ui_elements()
504
- {
505
- return array_keys($this->options);
506
- }
507
-
508
- /**
509
- * Does integration have the given UI element?
510
- *
511
- * @param string $element
512
- * @return bool
513
- */
514
- public function has_ui_element($element)
515
- {
516
- $elements = $this->get_ui_elements();
517
- return in_array($element, $elements);
518
- }
519
-
520
- /**
521
- * Return a string to the admin settings page for this object (if any)
522
- *
523
- * @param int $object_id
524
- * @return string
525
- */
526
- public function get_object_link($object_id)
527
- {
528
- return '';
529
- }
530
-
531
- /**
532
- * Get the data for this integration request
533
- *
534
- * By default, this will return a combination of all $_GET and $_POST parameters.
535
- * Override this method if you need data from somewhere else.
536
- *
537
- * This data should contain the value of the checkbox (required)
538
- * and the lists to which should be subscribed (optional)
539
- *
540
- * @see MC4WP_Integration::$checkbox_name
541
- * @see MC4WP_Integration::get_lists
542
- * @see MC4WP_Integration::checkbox_was_checked
543
- *
544
- * @return array
545
- */
546
- public function get_data()
547
- {
548
- $data = array_merge((array) $_GET, (array) $_POST);
549
- return $data;
550
- }
551
-
552
- /**
553
- * @return MC4WP_Debug_Log
554
- */
555
- protected function get_log()
556
- {
557
- return mc4wp('log');
558
- }
559
-
560
- /**
561
- * @return MC4WP_API_v3
562
- */
563
- protected function get_api()
564
- {
565
- return mc4wp('api');
566
- }
 
 
 
 
 
 
 
 
 
567
  }
14
  abstract class MC4WP_Integration
15
  {
16
 
17
+ /**
18
+ * @var string Name of this integration.
19
+ */
20
+ public $name = '';
21
+
22
+ /**
23
+ * @var string Description
24
+ */
25
+ public $description = '';
26
+
27
+ /**
28
+ * @var string Slug, used as an unique identifier for this integration.
29
+ */
30
+ public $slug = '';
31
+
32
+ /**
33
+ * @var array Array of settings
34
+ */
35
+ public $options = array();
36
+
37
+ /**
38
+ * @var string Name attribute for the checkbox element. Will be created from slug if empty.
39
+ */
40
+ protected $checkbox_name = '';
41
+
42
+ /**
43
+ * Constructor
44
+ *
45
+ * @param string $slug
46
+ * @param array $options
47
+ */
48
+ public function __construct($slug, array $options)
49
+ {
50
+ $this->slug = $slug;
51
+ $this->options = $this->parse_options($options);
52
+
53
+ // if checkbox name is not set, set a good custom value
54
+ if ($this->checkbox_name === '') {
55
+ $this->checkbox_name = '_mc4wp_subscribe_' . $this->slug;
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Return array of default options
61
+ *
62
+ * @return array
63
+ */
64
+ protected function get_default_options()
65
+ {
66
+ return array(
67
+ 'css' => 0,
68
+ 'double_optin' => 1,
69
+ 'enabled' => 0,
70
+ 'implicit' => 0,
71
+ 'label' => __('Sign me up for the newsletter!', 'mailchimp-for-wp'),
72
+ 'lists' => array(),
73
+ 'precheck' => 0,
74
+ 'replace_interests' => 0,
75
+ 'update_existing' => 0,
76
+ 'wrap_p' => 1
77
+ );
78
+ }
79
+
80
+ /**
81
+ * @param array $options
82
+ *
83
+ * @return array
84
+ */
85
+ protected function parse_options(array $options)
86
+ {
87
+ $slug = $this->slug;
88
+
89
+ $default_options = $this->get_default_options();
90
+ $options = array_merge($default_options, $options);
91
+
92
+ /**
93
+ * @deprecated Use mc4wp_integration_{$slug}_options instead
94
+ */
95
+ $options = (array) apply_filters('mc4wp_' . $slug . '_integration_options', $options);
96
+
97
+ /**
98
+ * Filters options for a specific integration
99
+ *
100
+ * The dynamic portion of the hook, `$slug`, refers to the slug of the ingration.
101
+ *
102
+ * @param array $integration_options
103
+ */
104
+ return (array) apply_filters('mc4wp_integration_' . $slug . '_options', $options);
105
+ }
106
+
107
+ /**
108
+ * Initialize the integration
109
+ */
110
+ public function initialize()
111
+ {
112
+ $this->add_required_hooks();
113
+ $this->add_hooks();
114
+ }
115
+
116
+ /**
117
+ * Adds the required hooks for core functionality, like adding checkbox reset CSS.
118
+ */
119
+ protected function add_required_hooks()
120
+ {
121
+ if ($this->options['css'] && ! $this->options['implicit']) {
122
+ add_action('wp_head', array( $this, 'print_css_reset' ));
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Was integration triggered?
128
+ *
129
+ * Will always return true when integration is implicit. Otherwise, will check value of checkbox.
130
+ *
131
+ * @param int $object_id Useful when overriding method. (optional)
132
+ * @return bool
133
+ */
134
+ public function triggered($object_id = null)
135
+ {
136
+ return $this->options['implicit'] || $this->checkbox_was_checked();
137
+ }
138
+
139
+ /**
140
+ * Adds the hooks which are specific to this integration
141
+ */
142
+ abstract protected function add_hooks();
143
+
144
+ /**
145
+ * Print CSS reset
146
+ *
147
+ * @hooked `wp_head`
148
+ */
149
+ public function print_css_reset()
150
+ {
151
+ $suffix = defined('SCRIPT_DEBUG') ? '' : '.min';
152
+ $css = file_get_contents(MC4WP_PLUGIN_DIR . 'assets/css/checkbox-reset' . $suffix . '.css');
153
+
154
+ // replace selector by integration specific selector so the css affects just this checkbox
155
+ $css = str_ireplace('__INTEGRATION_SLUG__', $this->slug, $css);
156
+
157
+ printf('<style type="text/css">%s</style>', $css);
158
+ }
159
+
160
+ /**
161
+ * Get the text for the label element
162
+ *
163
+ * @return string
164
+ */
165
+ public function get_label_text()
166
+ {
167
+ $integration = $this;
168
+ $label = $this->options['label'];
169
+
170
+ /**
171
+ * Filters the checkbox label
172
+ *
173
+ * @since 3.0
174
+ *
175
+ * @param string $label
176
+ * @param MC4WP_Integration $integration
177
+ * @ignore
178
+ */
179
+ $label = (string) apply_filters('mc4wp_integration_checkbox_label', $label, $integration);
180
+ return $label;
181
+ }
182
+
183
+ /**
184
+ * Was the integration checkbox checked?
185
+ *
186
+ * @return bool
187
+ */
188
+ public function checkbox_was_checked()
189
+ {
190
+ $data = $this->get_data();
191
+ return (isset($data[ $this->checkbox_name ]) && $data[ $this->checkbox_name ] == 1);
192
+ }
193
+
194
+ /**
195
+ * Get a string of attributes for the checkbox element.
196
+ *
197
+ * @return string
198
+ */
199
+ protected function get_checkbox_attributes()
200
+ {
201
+ $integration = $this;
202
+ $slug = $this->slug;
203
+
204
+ $attributes = array();
205
+
206
+ if ($this->options['precheck']) {
207
+ $attributes['checked'] = 'checked';
208
+ }
209
+
210
+ /**
211
+ * Filters the attributes array.
212
+ *
213
+ * @param array $attributes
214
+ * @param MC4WP_Integration $integration
215
+ * @ignore
216
+ */
217
+ $attributes = (array) apply_filters('mc4wp_integration_checkbox_attributes', $attributes, $integration);
218
+
219
+ /**
220
+ * Filters the attributes array.
221
+ *
222
+ * The dynamic portion of the hook, `$slug`, refers to the slug for this integration.
223
+ *
224
+ * @param array $attributes
225
+ * @param MC4WP_Integration $integration
226
+ * @ignore
227
+ */
228
+ $attributes = (array) apply_filters('mc4wp_integration_' . $slug . '_checkbox_attributes', $attributes, $integration);
229
+
230
+ $string = '';
231
+ foreach ($attributes as $key => $value) {
232
+ $string .= sprintf('%s="%s"', $key, esc_attr($value));
233
+ }
234
+
235
+ return $string;
236
+ }
237
+
238
+ /**
239
+ * Outputs a checkbox
240
+ */
241
+ public function output_checkbox()
242
+ {
243
+ echo $this->get_checkbox_html();
244
+ }
245
+
246
+ /**
247
+ * Get HTML for the checkbox
248
+ * @param array $html_attrs
249
+ * @return string
250
+ */
251
+ public function get_checkbox_html(array $html_attrs = array())
252
+ {
253
+ $show_checkbox = empty($this->options['implicit']);
254
+ $integration_slug = $this->slug;
255
+
256
+ /**
257
+ * Filters whether to show the sign-up checkbox for this integration.
258
+ *
259
+ * @param bool $show_checkbox
260
+ * @param string $integration_slug
261
+ */
262
+ $show_checkbox = (bool) apply_filters('mc4wp_integration_show_checkbox', $show_checkbox, $integration_slug);
263
+
264
+ if (! $show_checkbox) {
265
+ return '';
266
+ }
267
+
268
+ ob_start();
269
+
270
+ echo sprintf('<!-- Mailchimp for WordPress v%s - https://mc4wp.com/ -->', MC4WP_VERSION);
271
+
272
+ /** @ignore */
273
+ do_action('mc4wp_integration_before_checkbox_wrapper', $this);
274
+
275
+ /** @ignore */
276
+ do_action('mc4wp_integration_'. $this->slug .'_before_checkbox_wrapper', $this);
277
+
278
+ $wrapper_tag = $this->options['wrap_p'] ? 'p' : 'span';
279
+
280
+ $html_attrs = array_merge(array(
281
+ 'class' => '',
282
+ ), $html_attrs);
283
+ $html_attrs['class'] = $html_attrs['class'] . sprintf(' mc4wp-checkbox mc4wp-checkbox-%s', $this->slug);
284
+
285
+ $html_attr_str = '';
286
+ foreach ($html_attrs as $key => $value) {
287
+ $html_attr_str .= sprintf('%s="%s" ', $key, esc_attr($value));
288
+ }
289
+
290
+ // Hidden field to make sure "0" is sent to server
291
+ echo sprintf('<input type="hidden" name="%s" value="0" />', esc_attr($this->checkbox_name));
292
+ echo sprintf('<%s %s>', $wrapper_tag, $html_attr_str);
293
+ echo '<label>';
294
+ echo sprintf('<input type="checkbox" name="%s" value="1" %s />', esc_attr($this->checkbox_name), $this->get_checkbox_attributes());
295
+ echo sprintf('<span>%s</span>', $this->get_label_text());
296
+ echo '</label>';
297
+ echo sprintf('</%s>', $wrapper_tag);
298
+
299
+ /** @ignore */
300
+ do_action('mc4wp_integration_after_checkbox_wrapper', $this);
301
+
302
+ /** @ignore */
303
+ do_action('mc4wp_integration_'. $this->slug .'_after_checkbox_wrapper', $this);
304
+ echo '<!-- / Mailchimp for WordPress -->';
305
+
306
+ $html = ob_get_clean();
307
+ return $html;
308
+ }
309
+
310
+ /**
311
+ * Get the selected Mailchimp lists
312
+ *
313
+ * @return array Array of List ID's
314
+ */
315
+ public function get_lists()
316
+ {
317
+ $data = $this->get_data();
318
+ $integration = $this;
319
+ $slug = $this->slug;
320
+
321
+ // get checkbox lists options
322
+ $lists = $this->options['lists'];
323
+
324
+ // get lists from request, if set.
325
+ if (! empty($data['_mc4wp_lists'])) {
326
+ $lists = $data['_mc4wp_lists'];
327
+
328
+ // ensure lists is an array
329
+ if (! is_array($lists)) {
330
+ $lists = explode(',', $lists);
331
+ $lists = array_map('trim', $lists);
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Allow plugins to filter final lists value. This filter is documented elsewhere.
337
+ *
338
+ * @since 2.0
339
+ * @see MC4WP_Form::get_lists
340
+ * @ignore
341
+ */
342
+ $lists = (array) apply_filters('mc4wp_lists', $lists);
343
+
344
+ /**
345
+ * Filters the Mailchimp lists this integration should subscribe to
346
+ *
347
+ * @since 3.0
348
+ *
349
+ * @param array $lists
350
+ * @param MC4WP_Integration $integration
351
+ */
352
+ $lists = (array) apply_filters('mc4wp_integration_lists', $lists, $integration);
353
+
354
+ /**
355
+ * Filters the Mailchimp lists a specific integration should subscribe to
356
+ *
357
+ * The dynamic portion of the hook, `$slug`, refers to the slug of the integration.
358
+ *
359
+ * @since 3.0
360
+ *
361
+ * @param array $lists
362
+ * @param MC4WP_Integration $integration
363
+ */
364
+ $lists = (array) apply_filters('mc4wp_integration_' . $slug . '_lists', $lists, $integration);
365
+
366
+ return $lists;
367
+ }
368
+
369
+ /**
370
+ * Makes a subscription request
371
+ *
372
+ * @param array $data
373
+ * @param int $related_object_id
374
+ *
375
+ * @return boolean
376
+ */
377
+ protected function subscribe(array $data, $related_object_id = 0)
378
+ {
379
+ $integration = $this;
380
+ $slug = $this->slug;
381
+ $mailchimp = new MC4WP_MailChimp();
382
+ $log = $this->get_log();
383
+ $list_ids = $this->get_lists();
384
+
385
+ /** @var MC4WP_MailChimp_Subscriber $subscriber */
386
+ $subscriber = null;
387
+ $result = false;
388
+
389
+ // validate lists
390
+ if (empty($list_ids)) {
391
+ $log->warning(sprintf('%s > No Mailchimp lists were selected', $this->name));
392
+ return false;
393
+ }
394
+
395
+ /**
396
+ * Filters data for integration requests.
397
+ *
398
+ * @param array $data
399
+ */
400
+ $data = apply_filters('mc4wp_integration_data', $data);
401
+
402
+ /**
403
+ * Filters data for a specific integration request.
404
+ *
405
+ * The dynamic portion of the hook, `$slug`, refers to the integration slug.
406
+ *
407
+ * @param array $data
408
+ * @param int $related_object_id
409
+ */
410
+ $data = apply_filters("mc4wp_integration_{$slug}_data", $data, $related_object_id);
411
+
412
+ /**
413
+ * @ignore
414
+ * @deprecated 4.0
415
+ */
416
+ $data = apply_filters('mc4wp_merge_vars', $data);
417
+
418
+ /**
419
+ * @deprecated 4.0
420
+ * @ignore
421
+ */
422
+ $data = apply_filters('mc4wp_integration_merge_vars', $data, $integration);
423
+
424
+ /**
425
+ * @deprecated 4.0
426
+ * @ignore
427
+ */
428
+ $data = apply_filters("mc4wp_integration_{$slug}_merge_vars", $data, $integration);
429
+
430
+ $email_type = mc4wp_get_email_type();
431
+
432
+ $mapper = new MC4WP_List_Data_Mapper($data, $list_ids);
433
+
434
+ /** @var MC4WP_MailChimp_Subscriber[] $map */
435
+ $map = $mapper->map();
436
+
437
+ foreach ($map as $list_id => $subscriber) {
438
+ $subscriber->status = $this->options['double_optin'] ? 'pending' : 'subscribed';
439
+ $subscriber->email_type = $email_type;
440
+ $subscriber->ip_signup = mc4wp_get_request_ip_address();
441
+
442
+ /** @ignore (documented elsewhere) */
443
+ $subscriber = apply_filters('mc4wp_subscriber_data', $subscriber);
444
+
445
+ /**
446
+ * Filters subscriber data before it is sent to Mailchimp. Only fires for integration requests.
447
+ *
448
+ * @param MC4WP_MailChimp_Subscriber $subscriber
449
+ */
450
+ $subscriber = apply_filters('mc4wp_integration_subscriber_data', $subscriber);
451
+
452
+ /**
453
+ * Filters subscriber data before it is sent to Mailchimp. Only fires for integration requests.
454
+ *
455
+ * The dynamic portion of the hook, `$slug`, refers to the integration slug.
456
+ *
457
+ * @param MC4WP_MailChimp_Subscriber $subscriber
458
+ * @param int $related_object_id
459
+ */
460
+ $subscriber = apply_filters("mc4wp_integration_{$slug}_subscriber_data", $subscriber, $related_object_id);
461
+
462
+ $result = $mailchimp->list_subscribe($list_id, $subscriber->email_address, $subscriber->to_array(), $this->options['update_existing'], $this->options['replace_interests']);
463
+ }
464
+
465
+ // if result failed, show error message
466
+ if (! $result) {
467
+
468
+ // log error
469
+ if ($mailchimp->get_error_code() == 214) {
470
+ $log->warning(sprintf("%s > %s is already subscribed to the selected list(s)", $this->name, $subscriber->email_address));
471
+ } else {
472
+ $log->error(sprintf('%s > Mailchimp API Error: %s', $this->name, $mailchimp->get_error_message()));
473
+ }
474
+
475
+ // bail
476
+ return false;
477
+ }
478
+
479
+ $log->info(sprintf('%s > Successfully subscribed %s', $this->name, $subscriber->email_address));
480
+
481
+ /**
482
+ * Runs right after someone is subscribed using an integration
483
+ *
484
+ * @since 3.0
485
+ *
486
+ * @param MC4WP_Integration $integration
487
+ * @param string $email_address
488
+ * @param array $merge_vars
489
+ * @param MC4WP_MailChimp_Subscriber[] $subscriber_data
490
+ * @param int $related_object_id
491
+ */
492
+ do_action('mc4wp_integration_subscribed', $integration, $subscriber->email_address, $subscriber->merge_fields, $map, $related_object_id);
493
+
494
+ return $result;
495
+ }
496
+
497
+ /**
498
+ * Are the required dependencies for this integration installed?
499
+ *
500
+ * @return bool
501
+ */
502
+ public function is_installed()
503
+ {
504
+ return false;
505
+ }
506
+
507
+ /**
508
+ * Which UI elements should we show on the settings page for this integration?
509
+ *
510
+ * @return array
511
+ */
512
+ public function get_ui_elements()
513
+ {
514
+ return array_keys($this->options);
515
+ }
516
+
517
+ /**
518
+ * Does integration have the given UI element?
519
+ *
520
+ * @param string $element
521
+ * @return bool
522
+ */
523
+ public function has_ui_element($element)
524
+ {
525
+ $elements = $this->get_ui_elements();
526
+ return in_array($element, $elements);
527
+ }
528
+
529
+ /**
530
+ * Return a string to the admin settings page for this object (if any)
531
+ *
532
+ * @param int $object_id
533
+ * @return string
534
+ */
535
+ public function get_object_link($object_id)
536
+ {
537
+ return '';
538
+ }
539
+
540
+ /**
541
+ * Get the data for this integration request
542
+ *
543
+ * By default, this will return a combination of all $_GET and $_POST parameters.
544
+ * Override this method if you need data from somewhere else.
545
+ *
546
+ * This data should contain the value of the checkbox (required)
547
+ * and the lists to which should be subscribed (optional)
548
+ *
549
+ * @see MC4WP_Integration::$checkbox_name
550
+ * @see MC4WP_Integration::get_lists
551
+ * @see MC4WP_Integration::checkbox_was_checked
552
+ *
553
+ * @return array
554
+ */
555
+ public function get_data()
556
+ {
557
+ $data = array_merge((array) $_GET, (array) $_POST);
558
+ return $data;
559
+ }
560
+
561
+ /**
562
+ * @return MC4WP_Debug_Log
563
+ */
564
+ protected function get_log()
565
+ {
566
+ return mc4wp('log');
567
+ }
568
+
569
+ /**
570
+ * @return MC4WP_API_v3
571
+ */
572
+ protected function get_api()
573
+ {
574
+ return mc4wp('api');
575
+ }
576
  }
includes/views/other-settings.php CHANGED
@@ -119,7 +119,7 @@ add_action('mc4wp_admin_other_settings', '_mc4wp_usage_tracking_setting', 70);
119
  if (! empty($line)) {
120
  echo '<div class="debug-log-line">' . $line . '</div>';
121
  }
122
-
123
  $line = $log_reader->read_as_html();
124
  }
125
  } else {
@@ -159,9 +159,9 @@ add_action('mc4wp_admin_other_settings', '_mc4wp_usage_tracking_setting', 70);
159
 
160
  // add filter
161
  var logFilter = document.getElementById('debug-log-filter');
162
- logFilter.addEventListener('keydown', function(e) {
163
- if(e.keyCode == 13 ) {
164
- searchLog(e.target.value.trim());
165
  }
166
  });
167
 
119
  if (! empty($line)) {
120
  echo '<div class="debug-log-line">' . $line . '</div>';
121
  }
122
+
123
  $line = $log_reader->read_as_html();
124
  }
125
  } else {
159
 
160
  // add filter
161
  var logFilter = document.getElementById('debug-log-filter');
162
+ logFilter.addEventListener('keydown', function(evt) {
163
+ if(evt.keyCode === 13 ) {
164
+ searchLog(evt.target.value.trim());
165
  }
166
  });
167
 
includes/views/parts/admin-sidebar.php CHANGED
@@ -31,16 +31,22 @@ function _mc4wp_admin_sidebar_other_plugins()
31
 
32
  echo '<ul style="margin-bottom: 0;">';
33
 
 
 
 
 
 
 
34
  // Boxzilla
35
- echo '<li>';
36
- echo sprintf('<strong><a href="%s">Boxzilla Pop-ups</a></strong><br />', 'https://boxzillaplugin.com/#utm_source=wp-plugin&utm_medium=mailchimp-for-wp&utm_campaign=sidebar');
37
  echo __('Pop-ups or boxes that slide-in with a newsletter sign-up form. A sure-fire way to grow your email lists.', 'mailchimp-for-wp');
38
  echo '</li>';
39
 
40
  // HTML Forms
41
- echo '<li>';
42
- echo sprintf('<strong><a href="%s">HTML Forms</a></strong><br />', 'https://www.htmlforms.io/#utm_source=wp-plugin&utm_medium=mailchimp-for-wp&utm_campaign=sidebar');
43
- echo __('Super flexible forms using native HTML. Just like with Mailchimp for WordPress forms but for other purposes, like a contact form.', 'mailchimp-for-wp');
44
  echo '</li>';
45
 
46
  echo '</ul>';
31
 
32
  echo '<ul style="margin-bottom: 0;">';
33
 
34
+ // Koko Analytics
35
+ echo '<li style="margin: 12px 0;">';
36
+ echo sprintf('<strong><a href="%s">Koko Analytics</a></strong><br />', 'https://wordpress.org/plugins/koko-analytics/#utm_source=wp-plugin&utm_medium=mailchimp-for-wp&utm_campaign=sidebar');
37
+ echo __('Privacy-friendly analytics plugin that does not use any external services.', 'mailchimp-for-wp');
38
+ echo '</li>';
39
+
40
  // Boxzilla
41
+ echo '<li style="margin: 12px 0;">';
42
+ echo sprintf('<strong><a href="%s">Boxzilla Pop-ups</a></strong><br />', 'https://wordpress.org/plugins/boxzilla/#utm_source=wp-plugin&utm_medium=mailchimp-for-wp&utm_campaign=sidebar');
43
  echo __('Pop-ups or boxes that slide-in with a newsletter sign-up form. A sure-fire way to grow your email lists.', 'mailchimp-for-wp');
44
  echo '</li>';
45
 
46
  // HTML Forms
47
+ echo '<li style="margin: 12px 0;">';
48
+ echo sprintf('<strong><a href="%s">HTML Forms</a></strong><br />', 'https://wordpress.org/plugins/html-forms/#utm_source=wp-plugin&utm_medium=mailchimp-for-wp&utm_campaign=sidebar');
49
+ echo __('Super flexible forms using native HTML. Just like Mailchimp for WordPress forms but for other purposes, like a contact form.', 'mailchimp-for-wp');
50
  echo '</li>';
51
 
52
  echo '</ul>';
integrations/gravity-forms/class-field.php CHANGED
@@ -48,6 +48,7 @@ class MC4WP_Gravity_Forms_Field extends GF_Field
48
  'css_class_setting',
49
  'mailchimp_list_setting',
50
  'mailchimp_double_optin',
 
51
  'rules_setting',
52
  );
53
  }
@@ -81,7 +82,7 @@ class MC4WP_Gravity_Forms_Field extends GF_Field
81
 
82
  $options = array(
83
  'label' => $this->get_field_label(false, $value),
84
- 'precheck' => false,
85
  );
86
  $options = $this->apply_mc4wp_options_filters($options);
87
 
48
  'css_class_setting',
49
  'mailchimp_list_setting',
50
  'mailchimp_double_optin',
51
+ 'mailchimp_precheck',
52
  'rules_setting',
53
  );
54
  }
82
 
83
  $options = array(
84
  'label' => $this->get_field_label(false, $value),
85
+ 'precheck' => isset($this->mailchimp_precheck) ? $this->mailchimp_precheck : false,
86
  );
87
  $options = $this->apply_mc4wp_options_filters($options);
88
 
integrations/gravity-forms/class-gravity-forms.php CHANGED
@@ -81,6 +81,7 @@ class MC4WP_Gravity_Forms_Integration extends MC4WP_Integration
81
  jQuery(document).on('gform_load_field_settings', function(ev, field) {
82
  jQuery('#field_mailchimp_list').val(field.mailchimp_list || '');
83
  jQuery('#field_mailchimp_double_optin').val(field.mailchimp_double_optin || "1");
 
84
  });
85
  </script>
86
  <?php
@@ -101,9 +102,12 @@ class MC4WP_Gravity_Forms_Integration extends MC4WP_Integration
101
  <select id="field_mailchimp_list" onchange="SetFieldProperty('mailchimp_list', this.value)">
102
  <option value="" disabled><?php _e('Select a Mailchimp list', 'mailchimp-for-wp'); ?></option>
103
  <?php foreach ($lists as $list) {
104
- echo sprintf('<option value="%s">%s</option>', $list->id, $list->name);
105
- } ?>
106
  </select>
 
 
 
107
  </li>
108
  <li class="mailchimp_double_optin field_setting">
109
  <label for="field_mailchimp_double_optin" class="section_label">
@@ -113,6 +117,23 @@ class MC4WP_Gravity_Forms_Integration extends MC4WP_Integration
113
  <option value="1"><?php echo __('Yes'); ?></option>
114
  <option value="0"><?php echo __('No'); ?></option>
115
  </select>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  </li>
117
  <?php
118
  }
81
  jQuery(document).on('gform_load_field_settings', function(ev, field) {
82
  jQuery('#field_mailchimp_list').val(field.mailchimp_list || '');
83
  jQuery('#field_mailchimp_double_optin').val(field.mailchimp_double_optin || "1");
84
+ jQuery('#field_mailchimp_precheck').val(field.mailchimp_precheck || "0");
85
  });
86
  </script>
87
  <?php
102
  <select id="field_mailchimp_list" onchange="SetFieldProperty('mailchimp_list', this.value)">
103
  <option value="" disabled><?php _e('Select a Mailchimp list', 'mailchimp-for-wp'); ?></option>
104
  <?php foreach ($lists as $list) {
105
+ echo sprintf('<option value="%s">%s</option>', $list->id, $list->name);
106
+ } ?>
107
  </select>
108
+ <p class="help">
109
+ <?php echo __('Select the list(s) to which people who check the checkbox should be subscribed.', 'mailchimp-for-wp'); ?>
110
+ </p>
111
  </li>
112
  <li class="mailchimp_double_optin field_setting">
113
  <label for="field_mailchimp_double_optin" class="section_label">
117
  <option value="1"><?php echo __('Yes'); ?></option>
118
  <option value="0"><?php echo __('No'); ?></option>
119
  </select>
120
+ <p class="help">
121
+ <?php _e('Select "yes" if you want people to confirm their email address before being subscribed (recommended)', 'mailchimp-for-wp'); ?>
122
+ </p>
123
+ </li>
124
+ <li class="mailchimp_precheck field_setting">
125
+ <label for="field_mailchimp_precheck" class="section_label">
126
+ <?php esc_html_e('Pre-check the checkbox?', 'mailchimp-for-wp'); ?>
127
+ </label>
128
+ <select id="field_mailchimp_precheck" onchange="SetFieldProperty('mailchimp_precheck', this.value)">
129
+ <option value="1"><?php echo __('Yes'); ?></option>
130
+ <option value="0"><?php echo __('No'); ?></option>
131
+ </select>
132
+ <p class="help">
133
+ <?php _e('Select "yes" if the checkbox should be pre-checked.', 'mailchimp-for-wp');
134
+ echo '<br />';
135
+ printf(__('<strong>Warning: </strong> enabling this may affect your <a href="%s">GDPR compliance</a>.', 'mailchimp-for-wp'), 'https://kb.mc4wp.com/gdpr-compliance/#utm_source=wp-plugin&utm_medium=mailchimp-for-wp&utm_campaign=integrations-page'); ?>
136
+ </p>
137
  </li>
138
  <?php
139
  }
integrations/woocommerce/admin-after.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  $position_options = array(
 
4
  'checkout_billing' => __("After billing details", 'mailchimp-for-wp'),
5
  'checkout_shipping' => __('After shipping details', 'mailchimp-for-wp'),
6
  'checkout_after_customer_details' => __('After customer details', 'mailchimp-for-wp'),
1
  <?php
2
 
3
  $position_options = array(
4
+ 'after_email_field' => __('After email field', 'mailchimp-for-wp'),
5
  'checkout_billing' => __("After billing details", 'mailchimp-for-wp'),
6
  'checkout_shipping' => __('After shipping details', 'mailchimp-for-wp'),
7
  'checkout_after_customer_details' => __('After customer details', 'mailchimp-for-wp'),
integrations/woocommerce/class-woocommerce.php CHANGED
@@ -26,14 +26,20 @@ class MC4WP_WooCommerce_Integration extends MC4WP_Integration
26
  public function add_hooks()
27
  {
28
  if (! $this->options['implicit']) {
29
- // create hook name based on position setting
30
- $hook = sprintf('woocommerce_%s', $this->options['position']);
31
- add_action($hook, array( $this, 'output_checkbox' ), 20);
 
 
 
 
 
32
  add_action('woocommerce_checkout_update_order_meta', array( $this, 'save_woocommerce_checkout_checkbox_value' ));
33
 
34
  // specific hooks for klarna
35
  add_filter('kco_create_order', array($this, 'add_klarna_field'));
36
  add_filter('klarna_after_kco_confirmation', array($this, 'subscribe_from_klarna_checkout'), 10, 2);
 
37
  }
38
 
39
  add_action('woocommerce_checkout_order_processed', array( $this, 'subscribe_from_woocommerce_checkout' ));
@@ -58,6 +64,17 @@ class MC4WP_WooCommerce_Integration extends MC4WP_Integration
58
  return $create;
59
  }
60
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
  /**
63
  * @param int $order_id
26
  public function add_hooks()
27
  {
28
  if (! $this->options['implicit']) {
29
+ // create hook name based on position setting
30
+ if ($this->options['position'] !== 'after_email_field') {
31
+ $hook = sprintf('woocommerce_%s', $this->options['position']);
32
+ add_action($hook, array($this, 'output_checkbox'), 20);
33
+ } else {
34
+ add_filter('woocommerce_form_field_email', array($this, 'add_checkbox_after_email_field'), 10, 4);
35
+ }
36
+
37
  add_action('woocommerce_checkout_update_order_meta', array( $this, 'save_woocommerce_checkout_checkbox_value' ));
38
 
39
  // specific hooks for klarna
40
  add_filter('kco_create_order', array($this, 'add_klarna_field'));
41
  add_filter('klarna_after_kco_confirmation', array($this, 'subscribe_from_klarna_checkout'), 10, 2);
42
+
43
  }
44
 
45
  add_action('woocommerce_checkout_order_processed', array( $this, 'subscribe_from_woocommerce_checkout' ));
64
  return $create;
65
  }
66
 
67
+ function add_checkbox_after_email_field($field, $key, $args, $value) {
68
+ if ($key !== 'billing_email') {
69
+ return $field;
70
+ }
71
+
72
+ $field .= PHP_EOL;
73
+ $field .= $this->get_checkbox_html(array(
74
+ 'class' => 'form-row form-row-wide'
75
+ ));
76
+ return $field;
77
+ }
78
 
79
  /**
80
  * @param int $order_id
languages/mailchimp-for-wp.pot CHANGED
@@ -53,7 +53,7 @@ msgstr ""
53
  msgid "Property of the current page or post."
54
  msgstr ""
55
 
56
- #: includes/class-mailchimp.php:177, includes/forms/class-admin.php:80
57
  msgid "Email address"
58
  msgstr ""
59
 
@@ -377,19 +377,19 @@ msgstr ""
377
  msgid "Form"
378
  msgstr ""
379
 
380
- #: includes/forms/class-admin.php:162, includes/forms/class-admin.php:295
381
  msgid "<strong>Success!</strong> Form successfully saved."
382
  msgstr ""
383
 
384
- #: includes/forms/class-admin.php:403
385
  msgid "Form not found."
386
  msgstr ""
387
 
388
- #: includes/forms/class-admin.php:469, includes/forms/class-widget.php:32
389
  msgid "Mailchimp Sign-Up Form"
390
  msgstr ""
391
 
392
- #: includes/forms/class-admin.php:473
393
  msgid "Select the form to show"
394
  msgstr ""
395
 
@@ -777,11 +777,15 @@ msgid "Other plugins by ibericode"
777
  msgstr ""
778
 
779
  #: includes/views/parts/admin-sidebar.php:37
780
- msgid "Pop-ups or boxes that slide-in with a newsletter sign-up form. A sure-fire way to grow your email lists."
781
  msgstr ""
782
 
783
  #: includes/views/parts/admin-sidebar.php:43
784
- msgid "Super flexible forms using native HTML. Just like with Mailchimp for WordPress forms but for other purposes, like a contact form."
 
 
 
 
785
  msgstr ""
786
 
787
  #: includes/views/parts/lists-overview.php:1
53
  msgid "Property of the current page or post."
54
  msgstr ""
55
 
56
+ #: includes/class-mailchimp.php:178, includes/forms/class-admin.php:80
57
  msgid "Email address"
58
  msgstr ""
59
 
377
  msgid "Form"
378
  msgstr ""
379
 
380
+ #: includes/forms/class-admin.php:162, includes/forms/class-admin.php:297
381
  msgid "<strong>Success!</strong> Form successfully saved."
382
  msgstr ""
383
 
384
+ #: includes/forms/class-admin.php:405
385
  msgid "Form not found."
386
  msgstr ""
387
 
388
+ #: includes/forms/class-admin.php:471, includes/forms/class-widget.php:32
389
  msgid "Mailchimp Sign-Up Form"
390
  msgstr ""
391
 
392
+ #: includes/forms/class-admin.php:475
393
  msgid "Select the form to show"
394
  msgstr ""
395
 
777
  msgstr ""
778
 
779
  #: includes/views/parts/admin-sidebar.php:37
780
+ msgid "Privacy-friendly analytics plugin that does not use any external services."
781
  msgstr ""
782
 
783
  #: includes/views/parts/admin-sidebar.php:43
784
+ msgid "Pop-ups or boxes that slide-in with a newsletter sign-up form. A sure-fire way to grow your email lists."
785
+ msgstr ""
786
+
787
+ #: includes/views/parts/admin-sidebar.php:49
788
+ msgid "Super flexible forms using native HTML. Just like Mailchimp for WordPress forms but for other purposes, like a contact form."
789
  msgstr ""
790
 
791
  #: includes/views/parts/lists-overview.php:1
mailchimp-for-wp.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: MC4WP: Mailchimp for WordPress
4
  Plugin URI: https://mc4wp.com/#utm_source=wp-plugin&utm_medium=mailchimp-for-wp&utm_campaign=plugins-page
5
  Description: Mailchimp for WordPress by ibericode. Adds various highly effective sign-up methods to your site.
6
- Version: 4.6.2
7
  Author: ibericode
8
  Author URI: https://ibericode.com/
9
  Text Domain: mailchimp-for-wp
@@ -41,7 +41,7 @@ function _mc4wp_load_plugin()
41
  }
42
 
43
  // bootstrap the core plugin
44
- define('MC4WP_VERSION', '4.6.2');
45
  define('MC4WP_PLUGIN_DIR', dirname(__FILE__) . '/');
46
  define('MC4WP_PLUGIN_URL', plugins_url('/', __FILE__));
47
  define('MC4WP_PLUGIN_FILE', __FILE__);
3
  Plugin Name: MC4WP: Mailchimp for WordPress
4
  Plugin URI: https://mc4wp.com/#utm_source=wp-plugin&utm_medium=mailchimp-for-wp&utm_campaign=plugins-page
5
  Description: Mailchimp for WordPress by ibericode. Adds various highly effective sign-up methods to your site.
6
+ Version: 4.7
7
  Author: ibericode
8
  Author URI: https://ibericode.com/
9
  Text Domain: mailchimp-for-wp
41
  }
42
 
43
  // bootstrap the core plugin
44
+ define('MC4WP_VERSION', '4.7');
45
  define('MC4WP_PLUGIN_DIR', dirname(__FILE__) . '/');
46
  define('MC4WP_PLUGIN_URL', plugins_url('/', __FILE__));
47
  define('MC4WP_PLUGIN_FILE', __FILE__);
package-lock.json DELETED
@@ -1,8007 +0,0 @@
1
- {
2
- "name": "mailchimp-for-wp",
3
- "requires": true,
4
- "lockfileVersion": 1,
5
- "dependencies": {
6
- "@babel/code-frame": {
7
- "version": "7.5.5",
8
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
9
- "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
10
- "dev": true,
11
- "requires": {
12
- "@babel/highlight": "^7.0.0"
13
- }
14
- },
15
- "@babel/core": {
16
- "version": "7.6.2",
17
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.2.tgz",
18
- "integrity": "sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ==",
19
- "dev": true,
20
- "requires": {
21
- "@babel/code-frame": "^7.5.5",
22
- "@babel/generator": "^7.6.2",
23
- "@babel/helpers": "^7.6.2",
24
- "@babel/parser": "^7.6.2",
25
- "@babel/template": "^7.6.0",
26
- "@babel/traverse": "^7.6.2",
27
- "@babel/types": "^7.6.0",
28
- "convert-source-map": "^1.1.0",
29
- "debug": "^4.1.0",
30
- "json5": "^2.1.0",
31
- "lodash": "^4.17.13",
32
- "resolve": "^1.3.2",
33
- "semver": "^5.4.1",
34
- "source-map": "^0.5.0"
35
- },
36
- "dependencies": {
37
- "@babel/types": {
38
- "version": "7.6.1",
39
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
40
- "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
41
- "dev": true,
42
- "requires": {
43
- "esutils": "^2.0.2",
44
- "lodash": "^4.17.13",
45
- "to-fast-properties": "^2.0.0"
46
- }
47
- }
48
- }
49
- },
50
- "@babel/generator": {
51
- "version": "7.6.2",
52
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz",
53
- "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==",
54
- "dev": true,
55
- "requires": {
56
- "@babel/types": "^7.6.0",
57
- "jsesc": "^2.5.1",
58
- "lodash": "^4.17.13",
59
- "source-map": "^0.5.0"
60
- },
61
- "dependencies": {
62
- "@babel/types": {
63
- "version": "7.6.1",
64
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
65
- "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
66
- "dev": true,
67
- "requires": {
68
- "esutils": "^2.0.2",
69
- "lodash": "^4.17.13",
70
- "to-fast-properties": "^2.0.0"
71
- }
72
- }
73
- }
74
- },
75
- "@babel/helper-annotate-as-pure": {
76
- "version": "7.0.0",
77
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
78
- "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
79
- "dev": true,
80
- "requires": {
81
- "@babel/types": "^7.0.0"
82
- }
83
- },
84
- "@babel/helper-builder-binary-assignment-operator-visitor": {
85
- "version": "7.1.0",
86
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
87
- "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
88
- "dev": true,
89
- "requires": {
90
- "@babel/helper-explode-assignable-expression": "^7.1.0",
91
- "@babel/types": "^7.0.0"
92
- }
93
- },
94
- "@babel/helper-builder-react-jsx": {
95
- "version": "7.3.0",
96
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz",
97
- "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==",
98
- "dev": true,
99
- "requires": {
100
- "@babel/types": "^7.3.0",
101
- "esutils": "^2.0.0"
102
- }
103
- },
104
- "@babel/helper-call-delegate": {
105
- "version": "7.4.4",
106
- "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
107
- "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
108
- "dev": true,
109
- "requires": {
110
- "@babel/helper-hoist-variables": "^7.4.4",
111
- "@babel/traverse": "^7.4.4",
112
- "@babel/types": "^7.4.4"
113
- }
114
- },
115
- "@babel/helper-define-map": {
116
- "version": "7.5.5",
117
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz",
118
- "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==",
119
- "dev": true,
120
- "requires": {
121
- "@babel/helper-function-name": "^7.1.0",
122
- "@babel/types": "^7.5.5",
123
- "lodash": "^4.17.13"
124
- }
125
- },
126
- "@babel/helper-explode-assignable-expression": {
127
- "version": "7.1.0",
128
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
129
- "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
130
- "dev": true,
131
- "requires": {
132
- "@babel/traverse": "^7.1.0",
133
- "@babel/types": "^7.0.0"
134
- }
135
- },
136
- "@babel/helper-function-name": {
137
- "version": "7.1.0",
138
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
139
- "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
140
- "dev": true,
141
- "requires": {
142
- "@babel/helper-get-function-arity": "^7.0.0",
143
- "@babel/template": "^7.1.0",
144
- "@babel/types": "^7.0.0"
145
- }
146
- },
147
- "@babel/helper-get-function-arity": {
148
- "version": "7.0.0",
149
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
150
- "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
151
- "dev": true,
152
- "requires": {
153
- "@babel/types": "^7.0.0"
154
- }
155
- },
156
- "@babel/helper-hoist-variables": {
157
- "version": "7.4.4",
158
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
159
- "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
160
- "dev": true,
161
- "requires": {
162
- "@babel/types": "^7.4.4"
163
- }
164
- },
165
- "@babel/helper-member-expression-to-functions": {
166
- "version": "7.5.5",
167
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
168
- "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
169
- "dev": true,
170
- "requires": {
171
- "@babel/types": "^7.5.5"
172
- }
173
- },
174
- "@babel/helper-module-imports": {
175
- "version": "7.0.0",
176
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
177
- "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
178
- "dev": true,
179
- "requires": {
180
- "@babel/types": "^7.0.0"
181
- }
182
- },
183
- "@babel/helper-module-transforms": {
184
- "version": "7.5.5",
185
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz",
186
- "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==",
187
- "dev": true,
188
- "requires": {
189
- "@babel/helper-module-imports": "^7.0.0",
190
- "@babel/helper-simple-access": "^7.1.0",
191
- "@babel/helper-split-export-declaration": "^7.4.4",
192
- "@babel/template": "^7.4.4",
193
- "@babel/types": "^7.5.5",
194
- "lodash": "^4.17.13"
195
- }
196
- },
197
- "@babel/helper-optimise-call-expression": {
198
- "version": "7.0.0",
199
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
200
- "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
201
- "dev": true,
202
- "requires": {
203
- "@babel/types": "^7.0.0"
204
- }
205
- },
206
- "@babel/helper-plugin-utils": {
207
- "version": "7.0.0",
208
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
209
- "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
210
- "dev": true
211
- },
212
- "@babel/helper-regex": {
213
- "version": "7.5.5",
214
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
215
- "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
216
- "dev": true,
217
- "requires": {
218
- "lodash": "^4.17.13"
219
- }
220
- },
221
- "@babel/helper-remap-async-to-generator": {
222
- "version": "7.1.0",
223
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
224
- "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
225
- "dev": true,
226
- "requires": {
227
- "@babel/helper-annotate-as-pure": "^7.0.0",
228
- "@babel/helper-wrap-function": "^7.1.0",
229
- "@babel/template": "^7.1.0",
230
- "@babel/traverse": "^7.1.0",
231
- "@babel/types": "^7.0.0"
232
- }
233
- },
234
- "@babel/helper-replace-supers": {
235
- "version": "7.5.5",
236
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
237
- "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
238
- "dev": true,
239
- "requires": {
240
- "@babel/helper-member-expression-to-functions": "^7.5.5",
241
- "@babel/helper-optimise-call-expression": "^7.0.0",
242
- "@babel/traverse": "^7.5.5",
243
- "@babel/types": "^7.5.5"
244
- }
245
- },
246
- "@babel/helper-simple-access": {
247
- "version": "7.1.0",
248
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
249
- "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
250
- "dev": true,
251
- "requires": {
252
- "@babel/template": "^7.1.0",
253
- "@babel/types": "^7.0.0"
254
- }
255
- },
256
- "@babel/helper-split-export-declaration": {
257
- "version": "7.4.4",
258
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
259
- "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
260
- "dev": true,
261
- "requires": {
262
- "@babel/types": "^7.4.4"
263
- }
264
- },
265
- "@babel/helper-wrap-function": {
266
- "version": "7.2.0",
267
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
268
- "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
269
- "dev": true,
270
- "requires": {
271
- "@babel/helper-function-name": "^7.1.0",
272
- "@babel/template": "^7.1.0",
273
- "@babel/traverse": "^7.1.0",
274
- "@babel/types": "^7.2.0"
275
- }
276
- },
277
- "@babel/helpers": {
278
- "version": "7.6.2",
279
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz",
280
- "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==",
281
- "dev": true,
282
- "requires": {
283
- "@babel/template": "^7.6.0",
284
- "@babel/traverse": "^7.6.2",
285
- "@babel/types": "^7.6.0"
286
- },
287
- "dependencies": {
288
- "@babel/types": {
289
- "version": "7.6.1",
290
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
291
- "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
292
- "dev": true,
293
- "requires": {
294
- "esutils": "^2.0.2",
295
- "lodash": "^4.17.13",
296
- "to-fast-properties": "^2.0.0"
297
- }
298
- }
299
- }
300
- },
301
- "@babel/highlight": {
302
- "version": "7.5.0",
303
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
304
- "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
305
- "dev": true,
306
- "requires": {
307
- "chalk": "^2.0.0",
308
- "esutils": "^2.0.2",
309
- "js-tokens": "^4.0.0"
310
- }
311
- },
312
- "@babel/parser": {
313
- "version": "7.6.2",
314
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz",
315
- "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==",
316
- "dev": true
317
- },
318
- "@babel/plugin-proposal-async-generator-functions": {
319
- "version": "7.2.0",
320
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
321
- "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
322
- "dev": true,
323
- "requires": {
324
- "@babel/helper-plugin-utils": "^7.0.0",
325
- "@babel/helper-remap-async-to-generator": "^7.1.0",
326
- "@babel/plugin-syntax-async-generators": "^7.2.0"
327
- }
328
- },
329
- "@babel/plugin-proposal-dynamic-import": {
330
- "version": "7.5.0",
331
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz",
332
- "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==",
333
- "dev": true,
334
- "requires": {
335
- "@babel/helper-plugin-utils": "^7.0.0",
336
- "@babel/plugin-syntax-dynamic-import": "^7.2.0"
337
- }
338
- },
339
- "@babel/plugin-proposal-json-strings": {
340
- "version": "7.2.0",
341
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
342
- "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
343
- "dev": true,
344
- "requires": {
345
- "@babel/helper-plugin-utils": "^7.0.0",
346
- "@babel/plugin-syntax-json-strings": "^7.2.0"
347
- }
348
- },
349
- "@babel/plugin-proposal-object-rest-spread": {
350
- "version": "7.6.2",
351
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz",
352
- "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==",
353
- "dev": true,
354
- "requires": {
355
- "@babel/helper-plugin-utils": "^7.0.0",
356
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
357
- }
358
- },
359
- "@babel/plugin-proposal-optional-catch-binding": {
360
- "version": "7.2.0",
361
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
362
- "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
363
- "dev": true,
364
- "requires": {
365
- "@babel/helper-plugin-utils": "^7.0.0",
366
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
367
- }
368
- },
369
- "@babel/plugin-proposal-unicode-property-regex": {
370
- "version": "7.6.2",
371
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz",
372
- "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==",
373
- "dev": true,
374
- "requires": {
375
- "@babel/helper-plugin-utils": "^7.0.0",
376
- "@babel/helper-regex": "^7.4.4",
377
- "regexpu-core": "^4.6.0"
378
- }
379
- },
380
- "@babel/plugin-syntax-async-generators": {
381
- "version": "7.2.0",
382
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
383
- "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
384
- "dev": true,
385
- "requires": {
386
- "@babel/helper-plugin-utils": "^7.0.0"
387
- }
388
- },
389
- "@babel/plugin-syntax-dynamic-import": {
390
- "version": "7.2.0",
391
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
392
- "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
393
- "dev": true,
394
- "requires": {
395
- "@babel/helper-plugin-utils": "^7.0.0"
396
- }
397
- },
398
- "@babel/plugin-syntax-json-strings": {
399
- "version": "7.2.0",
400
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
401
- "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
402
- "dev": true,
403
- "requires": {
404
- "@babel/helper-plugin-utils": "^7.0.0"
405
- }
406
- },
407
- "@babel/plugin-syntax-jsx": {
408
- "version": "7.2.0",
409
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz",
410
- "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==",
411
- "dev": true,
412
- "requires": {
413
- "@babel/helper-plugin-utils": "^7.0.0"
414
- }
415
- },
416
- "@babel/plugin-syntax-object-rest-spread": {
417
- "version": "7.2.0",
418
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
419
- "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
420
- "dev": true,
421
- "requires": {
422
- "@babel/helper-plugin-utils": "^7.0.0"
423
- }
424
- },
425
- "@babel/plugin-syntax-optional-catch-binding": {
426
- "version": "7.2.0",
427
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
428
- "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
429
- "dev": true,
430
- "requires": {
431
- "@babel/helper-plugin-utils": "^7.0.0"
432
- }
433
- },
434
- "@babel/plugin-transform-arrow-functions": {
435
- "version": "7.2.0",
436
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
437
- "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
438
- "dev": true,
439
- "requires": {
440
- "@babel/helper-plugin-utils": "^7.0.0"
441
- }
442
- },
443
- "@babel/plugin-transform-async-to-generator": {
444
- "version": "7.5.0",
445
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz",
446
- "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==",
447
- "dev": true,
448
- "requires": {
449
- "@babel/helper-module-imports": "^7.0.0",
450
- "@babel/helper-plugin-utils": "^7.0.0",
451
- "@babel/helper-remap-async-to-generator": "^7.1.0"
452
- }
453
- },
454
- "@babel/plugin-transform-block-scoped-functions": {
455
- "version": "7.2.0",
456
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
457
- "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
458
- "dev": true,
459
- "requires": {
460
- "@babel/helper-plugin-utils": "^7.0.0"
461
- }
462
- },
463
- "@babel/plugin-transform-block-scoping": {
464
- "version": "7.6.2",
465
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz",
466
- "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==",
467
- "dev": true,
468
- "requires": {
469
- "@babel/helper-plugin-utils": "^7.0.0",
470
- "lodash": "^4.17.13"
471
- }
472
- },
473
- "@babel/plugin-transform-classes": {
474
- "version": "7.5.5",
475
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz",
476
- "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==",
477
- "dev": true,
478
- "requires": {
479
- "@babel/helper-annotate-as-pure": "^7.0.0",
480
- "@babel/helper-define-map": "^7.5.5",
481
- "@babel/helper-function-name": "^7.1.0",
482
- "@babel/helper-optimise-call-expression": "^7.0.0",
483
- "@babel/helper-plugin-utils": "^7.0.0",
484
- "@babel/helper-replace-supers": "^7.5.5",
485
- "@babel/helper-split-export-declaration": "^7.4.4",
486
- "globals": "^11.1.0"
487
- }
488
- },
489
- "@babel/plugin-transform-computed-properties": {
490
- "version": "7.2.0",
491
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
492
- "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
493
- "dev": true,
494
- "requires": {
495
- "@babel/helper-plugin-utils": "^7.0.0"
496
- }
497
- },
498
- "@babel/plugin-transform-destructuring": {
499
- "version": "7.6.0",
500
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz",
501
- "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==",
502
- "dev": true,
503
- "requires": {
504
- "@babel/helper-plugin-utils": "^7.0.0"
505
- }
506
- },
507
- "@babel/plugin-transform-dotall-regex": {
508
- "version": "7.6.2",
509
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz",
510
- "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==",
511
- "dev": true,
512
- "requires": {
513
- "@babel/helper-plugin-utils": "^7.0.0",
514
- "@babel/helper-regex": "^7.4.4",
515
- "regexpu-core": "^4.6.0"
516
- }
517
- },
518
- "@babel/plugin-transform-duplicate-keys": {
519
- "version": "7.5.0",
520
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz",
521
- "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==",
522
- "dev": true,
523
- "requires": {
524
- "@babel/helper-plugin-utils": "^7.0.0"
525
- }
526
- },
527
- "@babel/plugin-transform-exponentiation-operator": {
528
- "version": "7.2.0",
529
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
530
- "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
531
- "dev": true,
532
- "requires": {
533
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
534
- "@babel/helper-plugin-utils": "^7.0.0"
535
- }
536
- },
537
- "@babel/plugin-transform-for-of": {
538
- "version": "7.4.4",
539
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
540
- "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
541
- "dev": true,
542
- "requires": {
543
- "@babel/helper-plugin-utils": "^7.0.0"
544
- }
545
- },
546
- "@babel/plugin-transform-function-name": {
547
- "version": "7.4.4",
548
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
549
- "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
550
- "dev": true,
551
- "requires": {
552
- "@babel/helper-function-name": "^7.1.0",
553
- "@babel/helper-plugin-utils": "^7.0.0"
554
- }
555
- },
556
- "@babel/plugin-transform-literals": {
557
- "version": "7.2.0",
558
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
559
- "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
560
- "dev": true,
561
- "requires": {
562
- "@babel/helper-plugin-utils": "^7.0.0"
563
- }
564
- },
565
- "@babel/plugin-transform-member-expression-literals": {
566
- "version": "7.2.0",
567
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz",
568
- "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==",
569
- "dev": true,
570
- "requires": {
571
- "@babel/helper-plugin-utils": "^7.0.0"
572
- }
573
- },
574
- "@babel/plugin-transform-modules-amd": {
575
- "version": "7.5.0",
576
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz",
577
- "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==",
578
- "dev": true,
579
- "requires": {
580
- "@babel/helper-module-transforms": "^7.1.0",
581
- "@babel/helper-plugin-utils": "^7.0.0",
582
- "babel-plugin-dynamic-import-node": "^2.3.0"
583
- }
584
- },
585
- "@babel/plugin-transform-modules-commonjs": {
586
- "version": "7.6.0",
587
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz",
588
- "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==",
589
- "dev": true,
590
- "requires": {
591
- "@babel/helper-module-transforms": "^7.4.4",
592
- "@babel/helper-plugin-utils": "^7.0.0",
593
- "@babel/helper-simple-access": "^7.1.0",
594
- "babel-plugin-dynamic-import-node": "^2.3.0"
595
- }
596
- },
597
- "@babel/plugin-transform-modules-systemjs": {
598
- "version": "7.5.0",
599
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz",
600
- "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==",
601
- "dev": true,
602
- "requires": {
603
- "@babel/helper-hoist-variables": "^7.4.4",
604
- "@babel/helper-plugin-utils": "^7.0.0",
605
- "babel-plugin-dynamic-import-node": "^2.3.0"
606
- }
607
- },
608
- "@babel/plugin-transform-modules-umd": {
609
- "version": "7.2.0",
610
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
611
- "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
612
- "dev": true,
613
- "requires": {
614
- "@babel/helper-module-transforms": "^7.1.0",
615
- "@babel/helper-plugin-utils": "^7.0.0"
616
- }
617
- },
618
- "@babel/plugin-transform-named-capturing-groups-regex": {
619
- "version": "7.6.2",
620
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz",
621
- "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==",
622
- "dev": true,
623
- "requires": {
624
- "regexpu-core": "^4.6.0"
625
- }
626
- },
627
- "@babel/plugin-transform-new-target": {
628
- "version": "7.4.4",
629
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
630
- "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
631
- "dev": true,
632
- "requires": {
633
- "@babel/helper-plugin-utils": "^7.0.0"
634
- }
635
- },
636
- "@babel/plugin-transform-object-super": {
637
- "version": "7.5.5",
638
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz",
639
- "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==",
640
- "dev": true,
641
- "requires": {
642
- "@babel/helper-plugin-utils": "^7.0.0",
643
- "@babel/helper-replace-supers": "^7.5.5"
644
- }
645
- },
646
- "@babel/plugin-transform-parameters": {
647
- "version": "7.4.4",
648
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
649
- "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
650
- "dev": true,
651
- "requires": {
652
- "@babel/helper-call-delegate": "^7.4.4",
653
- "@babel/helper-get-function-arity": "^7.0.0",
654
- "@babel/helper-plugin-utils": "^7.0.0"
655
- }
656
- },
657
- "@babel/plugin-transform-property-literals": {
658
- "version": "7.2.0",
659
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz",
660
- "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==",
661
- "dev": true,
662
- "requires": {
663
- "@babel/helper-plugin-utils": "^7.0.0"
664
- }
665
- },
666
- "@babel/plugin-transform-react-jsx": {
667
- "version": "7.3.0",
668
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz",
669
- "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==",
670
- "dev": true,
671
- "requires": {
672
- "@babel/helper-builder-react-jsx": "^7.3.0",
673
- "@babel/helper-plugin-utils": "^7.0.0",
674
- "@babel/plugin-syntax-jsx": "^7.2.0"
675
- }
676
- },
677
- "@babel/plugin-transform-regenerator": {
678
- "version": "7.4.5",
679
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
680
- "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
681
- "dev": true,
682
- "requires": {
683
- "regenerator-transform": "^0.14.0"
684
- }
685
- },
686
- "@babel/plugin-transform-reserved-words": {
687
- "version": "7.2.0",
688
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz",
689
- "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==",
690
- "dev": true,
691
- "requires": {
692
- "@babel/helper-plugin-utils": "^7.0.0"
693
- }
694
- },
695
- "@babel/plugin-transform-shorthand-properties": {
696
- "version": "7.2.0",
697
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
698
- "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
699
- "dev": true,
700
- "requires": {
701
- "@babel/helper-plugin-utils": "^7.0.0"
702
- }
703
- },
704
- "@babel/plugin-transform-spread": {
705
- "version": "7.6.2",
706
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz",
707
- "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==",
708
- "dev": true,
709
- "requires": {
710
- "@babel/helper-plugin-utils": "^7.0.0"
711
- }
712
- },
713
- "@babel/plugin-transform-sticky-regex": {
714
- "version": "7.2.0",
715
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
716
- "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
717
- "dev": true,
718
- "requires": {
719
- "@babel/helper-plugin-utils": "^7.0.0",
720
- "@babel/helper-regex": "^7.0.0"
721
- }
722
- },
723
- "@babel/plugin-transform-template-literals": {
724
- "version": "7.4.4",
725
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
726
- "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
727
- "dev": true,
728
- "requires": {
729
- "@babel/helper-annotate-as-pure": "^7.0.0",
730
- "@babel/helper-plugin-utils": "^7.0.0"
731
- }
732
- },
733
- "@babel/plugin-transform-typeof-symbol": {
734
- "version": "7.2.0",
735
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
736
- "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
737
- "dev": true,
738
- "requires": {
739
- "@babel/helper-plugin-utils": "^7.0.0"
740
- }
741
- },
742
- "@babel/plugin-transform-unicode-regex": {
743
- "version": "7.6.2",
744
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz",
745
- "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==",
746
- "dev": true,
747
- "requires": {
748
- "@babel/helper-plugin-utils": "^7.0.0",
749
- "@babel/helper-regex": "^7.4.4",
750
- "regexpu-core": "^4.6.0"
751
- }
752
- },
753
- "@babel/preset-env": {
754
- "version": "7.6.2",
755
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.2.tgz",
756
- "integrity": "sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q==",
757
- "dev": true,
758
- "requires": {
759
- "@babel/helper-module-imports": "^7.0.0",
760
- "@babel/helper-plugin-utils": "^7.0.0",
761
- "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
762
- "@babel/plugin-proposal-dynamic-import": "^7.5.0",
763
- "@babel/plugin-proposal-json-strings": "^7.2.0",
764
- "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
765
- "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
766
- "@babel/plugin-proposal-unicode-property-regex": "^7.6.2",
767
- "@babel/plugin-syntax-async-generators": "^7.2.0",
768
- "@babel/plugin-syntax-dynamic-import": "^7.2.0",
769
- "@babel/plugin-syntax-json-strings": "^7.2.0",
770
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
771
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
772
- "@babel/plugin-transform-arrow-functions": "^7.2.0",
773
- "@babel/plugin-transform-async-to-generator": "^7.5.0",
774
- "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
775
- "@babel/plugin-transform-block-scoping": "^7.6.2",
776
- "@babel/plugin-transform-classes": "^7.5.5",
777
- "@babel/plugin-transform-computed-properties": "^7.2.0",
778
- "@babel/plugin-transform-destructuring": "^7.6.0",
779
- "@babel/plugin-transform-dotall-regex": "^7.6.2",
780
- "@babel/plugin-transform-duplicate-keys": "^7.5.0",
781
- "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
782
- "@babel/plugin-transform-for-of": "^7.4.4",
783
- "@babel/plugin-transform-function-name": "^7.4.4",
784
- "@babel/plugin-transform-literals": "^7.2.0",
785
- "@babel/plugin-transform-member-expression-literals": "^7.2.0",
786
- "@babel/plugin-transform-modules-amd": "^7.5.0",
787
- "@babel/plugin-transform-modules-commonjs": "^7.6.0",
788
- "@babel/plugin-transform-modules-systemjs": "^7.5.0",
789
- "@babel/plugin-transform-modules-umd": "^7.2.0",
790
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.2",
791
- "@babel/plugin-transform-new-target": "^7.4.4",
792
- "@babel/plugin-transform-object-super": "^7.5.5",
793
- "@babel/plugin-transform-parameters": "^7.4.4",
794
- "@babel/plugin-transform-property-literals": "^7.2.0",
795
- "@babel/plugin-transform-regenerator": "^7.4.5",
796
- "@babel/plugin-transform-reserved-words": "^7.2.0",
797
- "@babel/plugin-transform-shorthand-properties": "^7.2.0",
798
- "@babel/plugin-transform-spread": "^7.6.2",
799
- "@babel/plugin-transform-sticky-regex": "^7.2.0",
800
- "@babel/plugin-transform-template-literals": "^7.4.4",
801
- "@babel/plugin-transform-typeof-symbol": "^7.2.0",
802
- "@babel/plugin-transform-unicode-regex": "^7.6.2",
803
- "@babel/types": "^7.6.0",
804
- "browserslist": "^4.6.0",
805
- "core-js-compat": "^3.1.1",
806
- "invariant": "^2.2.2",
807
- "js-levenshtein": "^1.1.3",
808
- "semver": "^5.5.0"
809
- },
810
- "dependencies": {
811
- "@babel/types": {
812
- "version": "7.6.1",
813
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
814
- "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
815
- "dev": true,
816
- "requires": {
817
- "esutils": "^2.0.2",
818
- "lodash": "^4.17.13",
819
- "to-fast-properties": "^2.0.0"
820
- }
821
- }
822
- }
823
- },
824
- "@babel/template": {
825
- "version": "7.6.0",
826
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz",
827
- "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==",
828
- "dev": true,
829
- "requires": {
830
- "@babel/code-frame": "^7.0.0",
831
- "@babel/parser": "^7.6.0",
832
- "@babel/types": "^7.6.0"
833
- },
834
- "dependencies": {
835
- "@babel/types": {
836
- "version": "7.6.1",
837
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
838
- "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
839
- "dev": true,
840
- "requires": {
841
- "esutils": "^2.0.2",
842
- "lodash": "^4.17.13",
843
- "to-fast-properties": "^2.0.0"
844
- }
845
- }
846
- }
847
- },
848
- "@babel/traverse": {
849
- "version": "7.6.2",
850
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz",
851
- "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==",
852
- "dev": true,
853
- "requires": {
854
- "@babel/code-frame": "^7.5.5",
855
- "@babel/generator": "^7.6.2",
856
- "@babel/helper-function-name": "^7.1.0",
857
- "@babel/helper-split-export-declaration": "^7.4.4",
858
- "@babel/parser": "^7.6.2",
859
- "@babel/types": "^7.6.0",
860
- "debug": "^4.1.0",
861
- "globals": "^11.1.0",
862
- "lodash": "^4.17.13"
863
- },
864
- "dependencies": {
865
- "@babel/types": {
866
- "version": "7.6.1",
867
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz",
868
- "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==",
869
- "dev": true,
870
- "requires": {
871
- "esutils": "^2.0.2",
872
- "lodash": "^4.17.13",
873
- "to-fast-properties": "^2.0.0"
874
- }
875
- }
876
- }
877
- },
878
- "@babel/types": {
879
- "version": "7.5.5",
880
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz",
881
- "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==",
882
- "dev": true,
883
- "requires": {
884
- "esutils": "^2.0.2",
885
- "lodash": "^4.17.13",
886
- "to-fast-properties": "^2.0.0"
887
- }
888
- },
889
- "@gulp-sourcemaps/identity-map": {
890
- "version": "1.0.2",
891
- "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz",
892
- "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==",
893
- "dev": true,
894
- "requires": {
895
- "acorn": "^5.0.3",
896
- "css": "^2.2.1",
897
- "normalize-path": "^2.1.1",
898
- "source-map": "^0.6.0",
899
- "through2": "^2.0.3"
900
- },
901
- "dependencies": {
902
- "acorn": {
903
- "version": "5.7.3",
904
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
905
- "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
906
- "dev": true
907
- },
908
- "source-map": {
909
- "version": "0.6.1",
910
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
911
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
912
- "dev": true
913
- },
914
- "through2": {
915
- "version": "2.0.5",
916
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
917
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
918
- "dev": true,
919
- "requires": {
920
- "readable-stream": "~2.3.6",
921
- "xtend": "~4.0.1"
922
- }
923
- }
924
- }
925
- },
926
- "@gulp-sourcemaps/map-sources": {
927
- "version": "1.0.0",
928
- "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz",
929
- "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=",
930
- "dev": true,
931
- "requires": {
932
- "normalize-path": "^2.0.1",
933
- "through2": "^2.0.3"
934
- },
935
- "dependencies": {
936
- "through2": {
937
- "version": "2.0.5",
938
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
939
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
940
- "dev": true,
941
- "requires": {
942
- "readable-stream": "~2.3.6",
943
- "xtend": "~4.0.1"
944
- }
945
- }
946
- }
947
- },
948
- "@mrmlnc/readdir-enhanced": {
949
- "version": "2.2.1",
950
- "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
951
- "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
952
- "dev": true,
953
- "requires": {
954
- "call-me-maybe": "^1.0.1",
955
- "glob-to-regexp": "^0.3.0"
956
- }
957
- },
958
- "@nodelib/fs.stat": {
959
- "version": "1.1.3",
960
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
961
- "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
962
- "dev": true
963
- },
964
- "@types/events": {
965
- "version": "3.0.0",
966
- "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
967
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
968
- "dev": true
969
- },
970
- "@types/glob": {
971
- "version": "7.1.1",
972
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
973
- "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
974
- "dev": true,
975
- "requires": {
976
- "@types/events": "*",
977
- "@types/minimatch": "*",
978
- "@types/node": "*"
979
- }
980
- },
981
- "@types/minimatch": {
982
- "version": "3.0.3",
983
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
984
- "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
985
- "dev": true
986
- },
987
- "@types/node": {
988
- "version": "12.6.8",
989
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz",
990
- "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==",
991
- "dev": true
992
- },
993
- "JSONStream": {
994
- "version": "1.3.5",
995
- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
996
- "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
997
- "dev": true,
998
- "requires": {
999
- "jsonparse": "^1.2.0",
1000
- "through": ">=2.2.7 <3"
1001
- }
1002
- },
1003
- "abbrev": {
1004
- "version": "1.1.1",
1005
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
1006
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
1007
- "dev": true
1008
- },
1009
- "acorn": {
1010
- "version": "7.1.0",
1011
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
1012
- "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
1013
- "dev": true
1014
- },
1015
- "acorn-node": {
1016
- "version": "1.8.2",
1017
- "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
1018
- "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
1019
- "dev": true,
1020
- "requires": {
1021
- "acorn": "^7.0.0",
1022
- "acorn-walk": "^7.0.0",
1023
- "xtend": "^4.0.2"
1024
- }
1025
- },
1026
- "acorn-walk": {
1027
- "version": "7.0.0",
1028
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz",
1029
- "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==",
1030
- "dev": true
1031
- },
1032
- "ajv": {
1033
- "version": "6.10.2",
1034
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
1035
- "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
1036
- "dev": true,
1037
- "requires": {
1038
- "fast-deep-equal": "^2.0.1",
1039
- "fast-json-stable-stringify": "^2.0.0",
1040
- "json-schema-traverse": "^0.4.1",
1041
- "uri-js": "^4.2.2"
1042
- }
1043
- },
1044
- "amdefine": {
1045
- "version": "1.0.1",
1046
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
1047
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
1048
- "dev": true
1049
- },
1050
- "ansi-colors": {
1051
- "version": "1.1.0",
1052
- "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
1053
- "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
1054
- "dev": true,
1055
- "requires": {
1056
- "ansi-wrap": "^0.1.0"
1057
- }
1058
- },
1059
- "ansi-gray": {
1060
- "version": "0.1.1",
1061
- "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
1062
- "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
1063
- "dev": true,
1064
- "requires": {
1065
- "ansi-wrap": "0.1.0"
1066
- }
1067
- },
1068
- "ansi-regex": {
1069
- "version": "2.1.1",
1070
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1071
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1072
- "dev": true
1073
- },
1074
- "ansi-styles": {
1075
- "version": "3.2.1",
1076
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1077
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1078
- "dev": true,
1079
- "requires": {
1080
- "color-convert": "^1.9.0"
1081
- }
1082
- },
1083
- "ansi-wrap": {
1084
- "version": "0.1.0",
1085
- "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
1086
- "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
1087
- "dev": true
1088
- },
1089
- "anymatch": {
1090
- "version": "2.0.0",
1091
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
1092
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
1093
- "dev": true,
1094
- "requires": {
1095
- "micromatch": "^3.1.4",
1096
- "normalize-path": "^2.1.1"
1097
- }
1098
- },
1099
- "append-buffer": {
1100
- "version": "1.0.2",
1101
- "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
1102
- "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
1103
- "dev": true,
1104
- "requires": {
1105
- "buffer-equal": "^1.0.0"
1106
- }
1107
- },
1108
- "aproba": {
1109
- "version": "1.2.0",
1110
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
1111
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
1112
- "dev": true
1113
- },
1114
- "archy": {
1115
- "version": "1.0.0",
1116
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
1117
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
1118
- "dev": true
1119
- },
1120
- "are-we-there-yet": {
1121
- "version": "1.1.5",
1122
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
1123
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
1124
- "dev": true,
1125
- "requires": {
1126
- "delegates": "^1.0.0",
1127
- "readable-stream": "^2.0.6"
1128
- }
1129
- },
1130
- "argparse": {
1131
- "version": "1.0.10",
1132
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
1133
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
1134
- "dev": true,
1135
- "requires": {
1136
- "sprintf-js": "~1.0.2"
1137
- }
1138
- },
1139
- "arr-diff": {
1140
- "version": "4.0.0",
1141
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
1142
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
1143
- "dev": true
1144
- },
1145
- "arr-filter": {
1146
- "version": "1.1.2",
1147
- "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
1148
- "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
1149
- "dev": true,
1150
- "requires": {
1151
- "make-iterator": "^1.0.0"
1152
- }
1153
- },
1154
- "arr-flatten": {
1155
- "version": "1.1.0",
1156
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
1157
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
1158
- "dev": true
1159
- },
1160
- "arr-map": {
1161
- "version": "2.0.2",
1162
- "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
1163
- "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
1164
- "dev": true,
1165
- "requires": {
1166
- "make-iterator": "^1.0.0"
1167
- }
1168
- },
1169
- "arr-union": {
1170
- "version": "3.1.0",
1171
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
1172
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
1173
-