From 3589899d6be85116ca63e3554df0dbdc9d572794 Mon Sep 17 00:00:00 2001 From: "Fred. P" Date: Thu, 31 May 2018 12:14:42 +0200 Subject: [PATCH 01/89] Dont call flush_rewrite in init [MAILPOET-1392] Following http://wpengineer.com/2044/custom-post-type-and-permalink/ and validating with Tautvidas we concluded there was not reason not to use flush_rewrite_rules() as recommended which is, upon activating and deactivating the plugin. --- lib/Settings/Pages.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Settings/Pages.php b/lib/Settings/Pages.php index f2bc701141..9abae8cce5 100644 --- a/lib/Settings/Pages.php +++ b/lib/Settings/Pages.php @@ -37,7 +37,6 @@ class Pages { 'post_title' => __('MailPoet Page', 'mailpoet'), 'post_name' => 'subscriptions' )); - flush_rewrite_rules(); return ((int)$id > 0) ? (int)$id : false; } From b8ce6ff88c7e03bcbaadcd97011664f72087c809 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Mon, 4 Jun 2018 16:00:32 +0100 Subject: [PATCH 02/89] Rotate scheduled tasks Scheduled tasks should rotate so that they don't block sending when they cannot be send. [MAILPOET-1391] --- lib/Cron/Workers/Scheduler.php | 9 +++++++++ lib/Models/ScheduledTask.php | 8 ++++++++ lib/Tasks/Sending.php | 1 + tests/unit/Cron/Workers/SchedulerTest.php | 16 +++++++++++++++- tests/unit/Tasks/SendingTest.php | 19 +++++++++++++++++++ 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index 384f388b80..d03805e315 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -5,6 +5,7 @@ namespace MailPoet\Cron\Workers; use Carbon\Carbon; use MailPoet\Cron\CronHelper; use MailPoet\Models\Newsletter; +use MailPoet\Models\ScheduledTask; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Segments\SubscribersFinder; @@ -29,6 +30,7 @@ class Scheduler { function process() { $scheduled_queues = self::getScheduledQueues(); if(!count($scheduled_queues)) return false; + $this->updateTasks($scheduled_queues); foreach($scheduled_queues as $i => $queue) { $newsletter = Newsletter::filter('filterWithOptions') ->findOne($queue->newsletter_id); @@ -177,6 +179,13 @@ class Scheduler { false; } + private function updateTasks(array $scheduled_queues) { + $ids = array_map(function ($queue) { + return $queue->task_id; + }, $scheduled_queues); + ScheduledTask::touchAllByIds($ids); + } + static function getScheduledQueues() { return SendingTask::getScheduledQueues(self::TASK_BATCH_SIZE); } diff --git a/lib/Models/ScheduledTask.php b/lib/Models/ScheduledTask.php index 4aa7ce32e0..525f896ce1 100644 --- a/lib/Models/ScheduledTask.php +++ b/lib/Models/ScheduledTask.php @@ -74,4 +74,12 @@ class ScheduledTask extends Model { parent::save(); return $this; } + + static function touchAllByIds(array $ids) { + ScheduledTask::rawExecute( + 'UPDATE `' . ScheduledTask::$_table . '`' . + 'SET `updated_at` = NOW() ' . + 'WHERE `id` IN (' . join(',', $ids) . ')' + ); + } } diff --git a/lib/Tasks/Sending.php b/lib/Tasks/Sending.php index 0cc44c4d2b..7cf7281f2f 100644 --- a/lib/Tasks/Sending.php +++ b/lib/Tasks/Sending.php @@ -227,6 +227,7 @@ class Sending { ->whereLte('scheduled_at', Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp'))) ->where('type', 'sending') ->whereNotEqual('status', ScheduledTask::STATUS_PAUSED) + ->orderByAsc('updated_at') ->limit($amount) ->findMany(); $result = array(); diff --git a/tests/unit/Cron/Workers/SchedulerTest.php b/tests/unit/Cron/Workers/SchedulerTest.php index 04d4985674..38b4109f5f 100644 --- a/tests/unit/Cron/Workers/SchedulerTest.php +++ b/tests/unit/Cron/Workers/SchedulerTest.php @@ -571,6 +571,20 @@ class SchedulerTest extends \MailPoetTest { $scheduler->process(); } + function testItUpdatesUpdateTime() { + $originalUpdated = Carbon::createFromTimestamp(current_time('timestamp'))->subHours(5)->toDateTimeString(); + $newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME, Newsletter::STATUS_DRAFT); + $queue = $this->_createQueue($newsletter->id); + $queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); + $queue->updated_at = $originalUpdated; + $queue->save(); + $scheduler = new Scheduler(); + $scheduler->timer = microtime(true); + $scheduler->process(); + $newQueue = ScheduledTask::findOne($queue->task_id); + expect($newQueue->updated_at)->notEquals($originalUpdated); + } + function _createNewsletterSegment($newsletter_id, $segment_id) { $newsletter_segment = NewsletterSegment::create(); $newsletter_segment->newsletter_id = $newsletter_id; @@ -685,4 +699,4 @@ class SchedulerTest extends \MailPoetTest { \ORM::raw_execute('TRUNCATE ' . Segment::$_table); \ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table); } -} \ No newline at end of file +} diff --git a/tests/unit/Tasks/SendingTest.php b/tests/unit/Tasks/SendingTest.php index a8373d7d00..ec770b67e1 100644 --- a/tests/unit/Tasks/SendingTest.php +++ b/tests/unit/Tasks/SendingTest.php @@ -176,6 +176,25 @@ class SendingTest extends \MailPoetTest { expect(SendingTask::getRunningQueues($amount))->count($amount); } + function testItGetsBatchOfRunningQueuesSortedByUpdatedTime() { + $this->_after(); + + $sending1 = $this->createNewSendingTask(['status' => ScheduledTask::STATUS_SCHEDULED]); + $sending1->updated_at = '2017-05-04 14:00:00'; + $sending1->save(); + $sending2 = $this->createNewSendingTask(['status' => ScheduledTask::STATUS_SCHEDULED]); + $sending2->updated_at = '2017-05-04 16:00:00'; + $sending2->save(); + $sending3 = $this->createNewSendingTask(['status' => ScheduledTask::STATUS_SCHEDULED]); + $sending3->updated_at = '2017-05-04 15:00:00'; + $sending3->save(); + + $queues = SendingTask::getScheduledQueues(3); + expect($queues[0]->task_id)->equals($sending1->id()); + expect($queues[1]->task_id)->equals($sending3->id()); + expect($queues[2]->task_id)->equals($sending2->id()); + } + function createNewNewsletter() { $newsletter = Newsletter::create(); $newsletter->type = Newsletter::TYPE_STANDARD; From c88c8a9c967d2e902f90bd0da6545b1817e47d92 Mon Sep 17 00:00:00 2001 From: qfrery Date: Mon, 4 Jun 2018 18:12:48 +0100 Subject: [PATCH 03/89] add video links --- assets/css/src/box.styl | 3 +- assets/css/src/listing/newsletters.styl | 18 +++++++++++ assets/js/src/newsletters/types.jsx | 9 ++++++ lib/Config/Menu.php | 31 +++++++++++++++++++ views/forms.html | 4 +++ views/newsletters.html | 2 ++ views/settings/mta.html | 6 +++- .../importExport/import/step1.html | 4 +++ 8 files changed, 74 insertions(+), 3 deletions(-) diff --git a/assets/css/src/box.styl b/assets/css/src/box.styl index 374e80b5c0..14ef074e16 100644 --- a/assets/css/src/box.styl +++ b/assets/css/src/box.styl @@ -30,7 +30,7 @@ $box-description-font-size = $box-description-line-height margin: 0 0 $box-margin-big padding: 0 width: 30.5% - + @media screen and (max-width 1178px) width: 47% @@ -151,7 +151,6 @@ $box-description-font-size = $box-description-line-height width: 258px max-height: $box-description-height padding-bottom: 0 - overflow: hidden word-wrap: break-word overflow-wrap: break-word diff --git a/assets/css/src/listing/newsletters.styl b/assets/css/src/listing/newsletters.styl index b5c8b9c144..938ee33ef0 100644 --- a/assets/css/src/listing/newsletters.styl +++ b/assets/css/src/listing/newsletters.styl @@ -2,6 +2,7 @@ $excellent-badge-color = #2993ab $good-badge-color = #f0b849 $bad-badge-color = #d54e21 $green-badge-color = #55bd56 +$cta-badge-color = #46b450 #newsletters_container h2.nav-tab-wrapper @@ -51,3 +52,20 @@ $green-badge-color = #55bd56 &_green background: $green-badge-color + + &_cta + background: $cta-badge-color + line-height: 5em + padding: 7px 6px 7px 6px + text-decoration: none + + &:hover, &:active, &:focus + color: #FFFFFF + background: $green-badge-color + + &_grey + background: #c3c3c3 + + .dashicons + font-size: 14px; + line-height: 3.4em; diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index 84cb328afd..54a6892539 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -90,6 +90,7 @@ const NewsletterTypes = React.createClass({ slug: 'welcome', title: MailPoet.I18n.t('welcomeNewsletterTypeTitle'), description: MailPoet.I18n.t('welcomeNewsletterTypeDescription'), + videoGuide: 'https://beta.docs.mailpoet.com/article/254-video-guide-to-welcome-emails', action: (function action() { return (
@@ -104,6 +105,7 @@ const NewsletterTypes = React.createClass({ slug: 'notification', title: MailPoet.I18n.t('postNotificationNewsletterTypeTitle'), description: MailPoet.I18n.t('postNotificationNewsletterTypeDescription'), + videoGuide: 'https://beta.docs.mailpoet.com/article/210-video-guide-to-post-notifications', action: (function action() { return ( @@ -138,6 +141,12 @@ const NewsletterTypes = React.createClass({

{type.title}

{type.description}

+ { type.videoGuide && ( +
+ {MailPoet.I18n.t('seeVideoGuide')} + + ) + }
diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 385f7d6d20..0eaae9fba4 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -438,6 +438,13 @@ class Menu { ) ); + $data['is_new_user'] = true; + if(!empty($data['settings']['installed_at'])) { + $installed_at = Carbon::createFromTimestamp(strtotime($data['settings']['installed_at'])); + $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); + $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30; + } + $data = array_merge($data, Installer::getPremiumStatus()); $this->displayPage('settings.html', $data); @@ -541,6 +548,14 @@ class Menu { $data['items_per_page'] = $this->getLimitPerPage('forms'); $data['segments'] = Segment::findArray(); + $data['is_new_user'] = true; + $installed_at = Setting::getValue('installed_at'); + if(!is_null($installed_at)) { + $installed_at = Carbon::createFromTimestamp(strtotime($installed_at)); + $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); + $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30; + } + $this->displayPage('forms.html', $data); } @@ -579,6 +594,13 @@ class Menu { $data['automatic_emails'] = array(); + $data['is_new_user'] = 'true'; + if(!empty($data['settings']['installed_at'])) { + $installed_at = Carbon::createFromTimestamp(strtotime($data['settings']['installed_at'])); + $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); + $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30 ? 'true' : 'false'; + } + wp_enqueue_script('jquery-ui'); wp_enqueue_script('jquery-ui-datepicker'); @@ -609,6 +631,15 @@ class Menu { 'month_names' => Block\Date::getMonthNames(), 'sub_menu' => 'mailpoet-subscribers' )); + + $data['is_new_user'] = true; + $installed_at = Setting::getValue('installed_at'); + if(!is_null($installed_at)) { + $installed_at = Carbon::createFromTimestamp(strtotime($installed_at)); + $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); + $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30; + } + $this->displayPage('subscribers/importExport/import.html', $data); } diff --git a/views/forms.html b/views/forms.html index 8e51940fa2..2bcf4a42fb 100644 --- a/views/forms.html +++ b/views/forms.html @@ -12,6 +12,10 @@

+ + <%= __('See video guide') %> + + <% endblock %> @@ -122,6 +123,7 @@ 'draftNewsletterTitle': __('Subject'), 'pickCampaignType': __('Select type of email'), + 'seeVideoGuide': __('See video guide'), 'regularNewsletterTypeTitle': __('Newsletter'), 'regularNewsletterTypeDescription': __('Send a newsletter with images, buttons, dividers, and social bookmarks. Or, just send a basic text email.'), 'create': __('Create'), diff --git a/views/settings/mta.html b/views/settings/mta.html index 712c44008b..a543a39ebb 100644 --- a/views/settings/mta.html +++ b/views/settings/mta.html @@ -145,7 +145,11 @@

- <%= __("Need help to pick? [link]Check out the comparison table of sending methods[/link].") + <%= __("Need help to pick?") %> + + <%= __('See video guide') %> + + <%= __("[link]or check out the comparison table of sending methods[/link].") |replaceLinkTags('http://beta.docs.mailpoet.com/article/181-comparison-table-of-sending-methods', {'target' : '_blank'}) |raw %> diff --git a/views/subscribers/importExport/import/step1.html b/views/subscribers/importExport/import/step1.html index 88e8646483..54b557ec9f 100644 --- a/views/subscribers/importExport/import/step1.html +++ b/views/subscribers/importExport/import/step1.html @@ -22,6 +22,10 @@ + + <%= __('See video guide') %> + +

From 705241d330ef473825e03edf6f6c977722e9c2f2 Mon Sep 17 00:00:00 2001 From: qfrery Date: Mon, 4 Jun 2018 20:47:10 +0100 Subject: [PATCH 04/89] qa --- assets/js/src/newsletters/types.jsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index 54a6892539..e25b223826 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -123,7 +123,10 @@ const NewsletterTypes = React.createClass({ ]; const types = Hooks.applyFilters('mailpoet_newsletters_types', [...defaultTypes, ...this.getAutomaticEmails()], this); - const isNewUser = window.mailpoet_is_new_user; + let badgeClassName = 'mailpoet_badge mailpoet_badge_cta'; + if (window.mailpoet_is_new_user === false) { + badgeClassName += ' mailpoet_badge_cta_grey'; + } return (
@@ -142,11 +145,10 @@ const NewsletterTypes = React.createClass({

{type.title}

{type.description}

{ type.videoGuide && ( - - {MailPoet.I18n.t('seeVideoGuide')} - - ) - } + + {MailPoet.I18n.t('seeVideoGuide')} + + ) }
From ac47866295ee9753539450da45a015b1935875d9 Mon Sep 17 00:00:00 2001 From: "Fred. P" Date: Wed, 30 May 2018 11:37:50 +0200 Subject: [PATCH 05/89] Fix image fullwidth toggle [MAILPOET-1365] Prevent WordPress $content_width global to override mailpoet_image_size when calling wp_get_attachment_image_src() in ACL generated posts. --- lib/Config/Env.php | 2 + lib/Config/Initializer.php | 4 +- lib/Newsletter/Editor/PostTransformer.php | 9 ++-- lib/WP/Functions.php | 23 +++++++- tests/_data/test-image.jpg | Bin 0 -> 4620 bytes tests/unit/WP/FunctionsTest.php | 63 ++++++++++++++++++++++ 6 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 tests/_data/test-image.jpg create mode 100644 tests/unit/WP/FunctionsTest.php diff --git a/lib/Config/Env.php b/lib/Config/Env.php index 56092b6c34..a2d07896d1 100644 --- a/lib/Config/Env.php +++ b/lib/Config/Env.php @@ -5,6 +5,8 @@ namespace MailPoet\Config; if(!defined('ABSPATH')) exit; class Env { + const NEWSLETTER_CONTENT_WIDTH = 1320; + static $version; static $plugin_name; static $plugin_path; diff --git a/lib/Config/Initializer.php b/lib/Config/Initializer.php index af0f4c043c..b8e662c91e 100644 --- a/lib/Config/Initializer.php +++ b/lib/Config/Initializer.php @@ -213,7 +213,7 @@ class Initializer { } function setupImages() { - add_image_size('mailpoet_newsletter_max', 1320); + add_image_size('mailpoet_newsletter_max', Env::NEWSLETTER_CONTENT_WIDTH); } function setupChangelog() { @@ -301,4 +301,4 @@ class Initializer { } return WPNotice::displayError($exception); } -} \ No newline at end of file +} diff --git a/lib/Newsletter/Editor/PostTransformer.php b/lib/Newsletter/Editor/PostTransformer.php index 436bb29914..addded1ad5 100644 --- a/lib/Newsletter/Editor/PostTransformer.php +++ b/lib/Newsletter/Editor/PostTransformer.php @@ -4,6 +4,7 @@ namespace MailPoet\Newsletter\Editor; use MailPoet\Newsletter\Editor\PostContentManager; use MailPoet\Newsletter\Editor\MetaInformationManager; use MailPoet\Newsletter\Editor\StructureTransformer; +use MailPoet\WP\Functions as WPFunctions; if(!defined('ABSPATH')) exit; @@ -68,14 +69,10 @@ class PostTransformer { } private function getFeaturedImage($post_id, $post_title, $image_full_width) { + if(has_post_thumbnail($post_id)) { $thumbnail_id = get_post_thumbnail_id($post_id); - - // get attachment data (src, width, height) - $image_info = wp_get_attachment_image_src( - $thumbnail_id, - 'mailpoet_newsletter_max' - ); + $image_info = WPFunctions::getImageInfo($thumbnail_id); // get alt text $alt_text = trim(strip_tags(get_post_meta( diff --git a/lib/WP/Functions.php b/lib/WP/Functions.php index 0841186beb..388e8c08d9 100644 --- a/lib/WP/Functions.php +++ b/lib/WP/Functions.php @@ -1,6 +1,8 @@ Ofxh1x2R=fb&WC6NA#@+TEme^O5`W&6?umC7g7&e4f%X{MoB$TG~9YcyQLlug?;8?J4m3aUJx zGFV_)U64837Oye%oNF3^8oam-z=;%p%oM3Xva=FWTLF6fa{qUnA z2h>xZ)sKv$WQX;GgPW9{-F$XVZZ3&KmG)El$=Dr-Nyu_6kHbNfxnoZefE1thQ&r%bjrTQgKB-JXWLZQOU5&GLi;K9>kH%8F4or=AHunMPRT(_Qs$nsQFwFXF1h7FtH&K0O*!s zv{b`VEr-WGO)5-|j%Joi>lcPIbe8X3&HXGzXXn=m(@$9z4^zVSu2_^mDxD>RVYcXN zm@%#ru@0!OLzv==m3ZD4GdwR?F9;KX=ExF7$qbVW(}7s0L}vpQg7XX*%^4Q#X5gja zb5f{?yBm`sH}C9v3is;Lm;}@nVy#YmTyHkix?@n)#!XXo9MV*s8guH*!q{ha$&T%g4B{Cr++mYxMKuQMBCEErhT;3k6zZu&%(m0{_1X%rBQLf`8IRaCMygfp*a3bqA10ugfv{32kj4>HaTO zX$w`hr0SM5`5CD^z%K=qMYD=#IRAzvcF5YZUU91F1?e}lWil8b~0E+S-j_MuxZr+ve6!404 H0Px%2Ksx`L literal 0 HcmV?d00001 diff --git a/tests/unit/WP/FunctionsTest.php b/tests/unit/WP/FunctionsTest.php new file mode 100644 index 0000000000..684360674e --- /dev/null +++ b/tests/unit/WP/FunctionsTest.php @@ -0,0 +1,63 @@ +_content_width = $content_width; + $content_width = 150; + } + + function makeAttachment($upload, $parent_post_id = 0) { + $type = ''; + if(!empty($upload['type'])) { + $type = $upload['type']; + } else { + $mime = wp_check_filetype($upload['file']); + if ($mime) + $type = $mime['type']; + } + + $attachment = array( + 'post_title' => basename($upload['file']), + 'post_content' => '', + 'post_type' => 'attachment', + 'post_parent' => $parent_post_id, + 'post_mime_type' => $type, + 'guid' => $upload['url'], + ); + + // Save the data + $id = wp_insert_attachment($attachment, $upload['file'], $parent_post_id); + $metadata = wp_generate_attachment_metadata($id, $upload['file']); + wp_update_attachment_metadata($id, $metadata); + + return $this->ids[] = $id; + } + + function testItCanGetImageInfo() { + expect( + function_exists('wp_generate_attachment_metadata') + )->true(); + + $filename = 'tests/_data/test-image.jpg'; + $contents = file_get_contents($filename); + + $upload = wp_upload_bits(basename($filename), null, $contents); + $id = $this->makeAttachment($upload); + expect($id)->notEmpty(); + + $image = WPFunctions::getImageInfo($id); + expect($image[1])->equals(Env::NEWSLETTER_CONTENT_WIDTH); + + wp_delete_attachment($id, $force_delete = true); + } + + function _after() { + global $content_width; + $content_width = $this->_content_width; + } +} From 2c290c6e4ce18333f4b033f3f890e25ac0fdc580 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Tue, 5 Jun 2018 11:05:59 +0100 Subject: [PATCH 06/89] Rotate sending queues This should prevent sending queues to be stuck when a newsletter cannot be send. [MAILPOET-1391] --- .../Workers/SendingQueue/SendingQueue.php | 1 + lib/Tasks/Sending.php | 2 +- .../Workers/SendingQueue/SendingQueueTest.php | 22 ++++++++++++++++++- tests/unit/Tasks/SendingTest.php | 19 ++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/lib/Cron/Workers/SendingQueue/SendingQueue.php b/lib/Cron/Workers/SendingQueue/SendingQueue.php index bebb66737e..03101f5362 100644 --- a/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -34,6 +34,7 @@ class SendingQueue { $this->enforceSendingAndExecutionLimits(); foreach(self::getRunningQueues() as $queue) { if(!$queue instanceof SendingTask) continue; + ScheduledTaskModel::touchAllByIds(array($queue->task_id)); $newsletter = $this->newsletter_task->getNewsletterFromQueue($queue); if(!$newsletter) { diff --git a/lib/Tasks/Sending.php b/lib/Tasks/Sending.php index 7cf7281f2f..8baa9e4f82 100644 --- a/lib/Tasks/Sending.php +++ b/lib/Tasks/Sending.php @@ -239,7 +239,7 @@ class Sending { static function getRunningQueues($amount = self::RESULT_BATCH_SIZE) { $tasks = ScheduledTask::orderByAsc('priority') - ->orderByAsc('created_at') + ->orderByAsc('updated_at') ->whereNull('deleted_at') ->whereNull('status') ->where('type', 'sending') diff --git a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php index 758c62f7cd..4f2e532608 100644 --- a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -385,6 +385,26 @@ class SendingQueueTest extends \MailPoetTest { expect($statistics)->notEquals(false); } + function testItUpdatesUpdateTime() { + $originalUpdated = Carbon::createFromTimestamp(current_time('timestamp'))->subHours(5)->toDateTimeString(); + + $this->queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); + $this->queue->updated_at = $originalUpdated; + $this->queue->save(); + + $this->newsletter->type = Newsletter::TYPE_WELCOME; + $this->newsletter_segment->delete(); + + $sending_queue_worker = new SendingQueueWorker( + $timer = false, + Stub::makeEmpty(new MailerTask(), array(), $this) + ); + $sending_queue_worker->process(); + + $newQueue = ScheduledTask::findOne($this->queue->task_id); + expect($newQueue->updated_at)->notEquals($originalUpdated); + } + function testItCanProcessWelcomeNewsletters() { $this->newsletter->type = Newsletter::TYPE_WELCOME; $this->newsletter_segment->delete(); @@ -631,4 +651,4 @@ class SendingQueueTest extends \MailPoetTest { \ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table); \ORM::raw_execute('TRUNCATE ' . StatisticsNewsletters::$_table); } -} \ No newline at end of file +} diff --git a/tests/unit/Tasks/SendingTest.php b/tests/unit/Tasks/SendingTest.php index ec770b67e1..16eaed09ff 100644 --- a/tests/unit/Tasks/SendingTest.php +++ b/tests/unit/Tasks/SendingTest.php @@ -195,6 +195,25 @@ class SendingTest extends \MailPoetTest { expect($queues[2]->task_id)->equals($sending2->id()); } + function testItGetsBatchOfScheduledQueuesSortedByUpdatedTime() { + $this->_after(); + + $sending1 = $this->createNewSendingTask(['status' => null]); + $sending1->updated_at = '2017-05-04 14:00:00'; + $sending1->save(); + $sending2 = $this->createNewSendingTask(['status' => null]); + $sending2->updated_at = '2017-05-04 16:00:00'; + $sending2->save(); + $sending3 = $this->createNewSendingTask(['status' => null]); + $sending3->updated_at = '2017-05-04 15:00:00'; + $sending3->save(); + + $queues = SendingTask::getRunningQueues(3); + expect($queues[0]->task_id)->equals($sending1->id()); + expect($queues[1]->task_id)->equals($sending3->id()); + expect($queues[2]->task_id)->equals($sending2->id()); + } + function createNewNewsletter() { $newsletter = Newsletter::create(); $newsletter->type = Newsletter::TYPE_STANDARD; From a41c327996523c04c495b74f6cd60302b88adeaa Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 5 Jun 2018 12:40:12 -0400 Subject: [PATCH 07/89] Updates changelog and bumps up release version --- mailpoet.php | 4 ++-- readme.txt | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mailpoet.php b/mailpoet.php index 5148dc566e..24b5dd8533 100644 --- a/mailpoet.php +++ b/mailpoet.php @@ -4,7 +4,7 @@ if(!defined('ABSPATH')) exit; /* * Plugin Name: MailPoet 3 (New) - * Version: 3.7.4 + * Version: 3.7.5 * Plugin URI: http://www.mailpoet.com * Description: Create and send newsletters, post notifications and welcome emails from your WordPress. * Author: MailPoet @@ -20,7 +20,7 @@ if(!defined('ABSPATH')) exit; */ $mailpoet_plugin = array( - 'version' => '3.7.4', + 'version' => '3.7.5', 'filename' => __FILE__, 'path' => dirname(__FILE__), 'autoloader' => dirname(__FILE__) . '/vendor/autoload.php', diff --git a/readme.txt b/readme.txt index 3fc208357e..89f675d35f 100644 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Tags: newsletter, email, welcome email, post notification, autoresponder, signup Requires at least: 4.7 Tested up to: 4.9 Requires PHP: 5.6 -Stable tag: 3.7.4 +Stable tag: 3.7.5 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html @@ -118,6 +118,10 @@ Stop by our [support site](https://www.mailpoet.com/support). == Changelog == += 3.7.5 - 2018-06-05 = +* Added: align images left or right of posts excerpts; +* Fixed: post content block image alignment issues. + = 3.7.4 - 2018-05-30 = * Added: What's New page no longer shows after every update; * Improved: template selection page thumbnails are larger; From 506f2d0fbfbddbde091ba0d048e393aedc7d5906 Mon Sep 17 00:00:00 2001 From: "Fred. P" Date: Tue, 5 Jun 2018 15:09:03 +0200 Subject: [PATCH 08/89] Separate welcome/whats_new pages [MAILPOET-1364] --- assets/css/src/pages.styl | 7 ++++++- views/update.html | 10 +--------- views/welcome.html | 7 +------ 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/assets/css/src/pages.styl b/assets/css/src/pages.styl index b828f2fdec..65a6814667 100644 --- a/assets/css/src/pages.styl +++ b/assets/css/src/pages.styl @@ -46,12 +46,17 @@ Please add custom styles to pages_custom.styl margin-right: auto h1 - margin: 0.2em 200px 0 0 + margin: 1em 0 0.5em 0 padding: 0 color: #32373c line-height: 1.2em font-size: 2.8em font-weight: 400 + text-align: center + + h1.welcome + margin-right: 200px + text-align: left h2 margin: 40px 0 .6em diff --git a/views/update.html b/views/update.html index 6b79568a5c..5620bfa594 100644 --- a/views/update.html +++ b/views/update.html @@ -3,20 +3,12 @@ <% block content %>
-

<%= __('Greetings, humans.') %>

- -

<%= __('The new MailPoet. Simply better. And with regular updates.') %>

- +

<%= __('Thanks for updating MailPoet') %>

- -

<%= __('List of Changes') %>

<% if changelog %> diff --git a/views/welcome.html b/views/welcome.html index f483a9b732..ca386af575 100644 --- a/views/welcome.html +++ b/views/welcome.html @@ -3,16 +3,11 @@ <% block content %>
-

<%= __('Greetings, humans.') %>

+

<%= __('Greetings, humans.') %>

<%= __('The new MailPoet. Simply better. And with regular updates.') %>

- - <% set random = random(2) %>
style="display: none;"<% endif %>> From d6f72087e9f0d3f5a0dee0e5b882b7d2c9d659de Mon Sep 17 00:00:00 2001 From: qfrery Date: Wed, 6 Jun 2018 12:55:20 +0100 Subject: [PATCH 09/89] video badges code review --- assets/css/src/listing/newsletters.styl | 6 +-- assets/js/src/newsletters/types.jsx | 5 +-- lib/Config/Menu.php | 42 +++++++------------ lib/Twig/Filters.php | 2 +- views/forms.html | 3 +- views/newsletters.html | 3 +- views/settings/mta.html | 11 +++-- .../importExport/import/step1.html | 3 +- 8 files changed, 31 insertions(+), 44 deletions(-) diff --git a/assets/css/src/listing/newsletters.styl b/assets/css/src/listing/newsletters.styl index 938ee33ef0..4e7b5b4ba9 100644 --- a/assets/css/src/listing/newsletters.styl +++ b/assets/css/src/listing/newsletters.styl @@ -2,7 +2,7 @@ $excellent-badge-color = #2993ab $good-badge-color = #f0b849 $bad-badge-color = #d54e21 $green-badge-color = #55bd56 -$cta-badge-color = #46b450 +$video-guide-badge-color = #46b450 #newsletters_container h2.nav-tab-wrapper @@ -53,8 +53,8 @@ $cta-badge-color = #46b450 &_green background: $green-badge-color - &_cta - background: $cta-badge-color + &_video + background: $video-guide-badge-color line-height: 5em padding: 7px 6px 7px 6px text-decoration: none diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index e25b223826..f8ae2b9969 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -123,10 +123,7 @@ const NewsletterTypes = React.createClass({ ]; const types = Hooks.applyFilters('mailpoet_newsletters_types', [...defaultTypes, ...this.getAutomaticEmails()], this); - let badgeClassName = 'mailpoet_badge mailpoet_badge_cta'; - if (window.mailpoet_is_new_user === false) { - badgeClassName += ' mailpoet_badge_cta_grey'; - } + const badgeClassName = (window.mailpoet_is_new_user === true) ? 'mailpoet_badge mailpoet_badge_video' : 'mailpoet_badge mailpoet_badge_video mailpoet_badge_video_grey'; return (
diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 0eaae9fba4..8308caf9ac 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -384,7 +384,7 @@ class Menu { $data['is_old_user'] = false; if(!empty($data['settings']['installed_at'])) { $installed_at = Carbon::createFromTimestamp(strtotime($data['settings']['installed_at'])); - $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); + $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30; $data['is_old_user'] = $current_time->diffInMonths($installed_at) >= 6; $data['stop_call_for_rating'] = isset($data['settings']['stop_call_for_rating']) ? $data['settings']['stop_call_for_rating'] : false; @@ -438,12 +438,7 @@ class Menu { ) ); - $data['is_new_user'] = true; - if(!empty($data['settings']['installed_at'])) { - $installed_at = Carbon::createFromTimestamp(strtotime($data['settings']['installed_at'])); - $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); - $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30; - } + $data['is_new_user'] = $this->is_new_user(); $data = array_merge($data, Installer::getPremiumStatus()); @@ -548,13 +543,7 @@ class Menu { $data['items_per_page'] = $this->getLimitPerPage('forms'); $data['segments'] = Segment::findArray(); - $data['is_new_user'] = true; - $installed_at = Setting::getValue('installed_at'); - if(!is_null($installed_at)) { - $installed_at = Carbon::createFromTimestamp(strtotime($installed_at)); - $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); - $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30; - } + $data['is_new_user'] = $this->is_new_user(); $this->displayPage('forms.html', $data); } @@ -594,12 +583,7 @@ class Menu { $data['automatic_emails'] = array(); - $data['is_new_user'] = 'true'; - if(!empty($data['settings']['installed_at'])) { - $installed_at = Carbon::createFromTimestamp(strtotime($data['settings']['installed_at'])); - $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); - $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30 ? 'true' : 'false'; - } + $data['is_new_user'] = $this->is_new_user(); wp_enqueue_script('jquery-ui'); wp_enqueue_script('jquery-ui-datepicker'); @@ -632,13 +616,7 @@ class Menu { 'sub_menu' => 'mailpoet-subscribers' )); - $data['is_new_user'] = true; - $installed_at = Setting::getValue('installed_at'); - if(!is_null($installed_at)) { - $installed_at = Carbon::createFromTimestamp(strtotime($installed_at)); - $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); - $data['is_new_user'] = $current_time->diffInDays($installed_at) <= 30; - } + $data['is_new_user'] = $this->is_new_user(); $this->displayPage('subscribers/importExport/import.html', $data); } @@ -778,4 +756,14 @@ class Menu { $notice->displayWPNotice(); } } + + function is_new_user() { + $installed_at = Setting::getValue('installed_at'); + if(is_null($installed_at)) { + return true; + } + $installed_at = Carbon::createFromTimestamp(strtotime($installed_at)); + $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); + return $current_time->diffInDays($installed_at) <= 30; + } } diff --git a/lib/Twig/Filters.php b/lib/Twig/Filters.php index a1936d86b3..ae27635e1c 100644 --- a/lib/Twig/Filters.php +++ b/lib/Twig/Filters.php @@ -22,4 +22,4 @@ class Filters extends \Twig_Extension { ) ); } -} \ No newline at end of file +} diff --git a/views/forms.html b/views/forms.html index 2bcf4a42fb..4c1487f228 100644 --- a/views/forms.html +++ b/views/forms.html @@ -12,7 +12,8 @@

- + <% set badgeClassName = (is_new_user == true) ? 'mailpoet_badge mailpoet_badge_video' : 'mailpoet_badge mailpoet_badge_video mailpoet_badge_video_grey' %> + <%= __('See video guide') %> diff --git a/views/newsletters.html b/views/newsletters.html index aca8896730..aad1536c97 100644 --- a/views/newsletters.html +++ b/views/newsletters.html @@ -17,7 +17,8 @@ var mailpoet_tracking_enabled = <%= json_encode(tracking_enabled) %>; var mailpoet_premium_active = <%= json_encode(premium_plugin_active) %>; var mailpoet_automatic_emails = <%= json_encode(automatic_emails) %>; - var mailpoet_is_new_user = <%= is_new_user %>; + <% set newUser = (is_new_user == true) ? 'true' : 'false' %> + var mailpoet_is_new_user = <%= newUser %>; <% endblock %> diff --git a/views/settings/mta.html b/views/settings/mta.html index a543a39ebb..c4067ab2b3 100644 --- a/views/settings/mta.html +++ b/views/settings/mta.html @@ -145,12 +145,11 @@

- <%= __("Need help to pick?") %> - - <%= __('See video guide') %> - - <%= __("[link]or check out the comparison table of sending methods[/link].") - |replaceLinkTags('http://beta.docs.mailpoet.com/article/181-comparison-table-of-sending-methods', {'target' : '_blank'}) + <% set badgeClassName = (is_new_user == true) ? 'mailpoet_badge mailpoet_badge_video' : 'mailpoet_badge mailpoet_badge_video mailpoet_badge_video_grey' %> + <%= __('Need help to pick? [link1]%s See video guide[/link1] [link2]or check out the comparison table of sending methods[/link2].') + |format('') + |replaceLinkTags('https://beta.docs.mailpoet.com/article/235-video-guide-sending-options', {'class' : badgeClassName, 'target' : '_blank'}, 'link1') + |replaceLinkTags('http://beta.docs.mailpoet.com/article/181-comparison-table-of-sending-methods', {'target' : '_blank'}, 'link2') |raw %>

diff --git a/views/subscribers/importExport/import/step1.html b/views/subscribers/importExport/import/step1.html index 54b557ec9f..965c6ac629 100644 --- a/views/subscribers/importExport/import/step1.html +++ b/views/subscribers/importExport/import/step1.html @@ -22,7 +22,8 @@
- + <% set badgeClassName = (is_new_user == true) ? 'mailpoet_badge mailpoet_badge_video' : 'mailpoet_badge mailpoet_badge_video mailpoet_badge_video_grey' %> + <%= __('See video guide') %> From df2cd9e6e3abe37a8955ced519032e3dd489dc2e Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 6 Jun 2018 15:13:39 +0100 Subject: [PATCH 10/89] Add feedback tooltips [MAILPOET-1320] --- assets/css/src/admin.styl | 3 +- assets/css/src/badge.styl | 9 +++++ assets/css/src/common.styl | 7 ++++ assets/css/src/listing/newsletters.styl | 8 +---- assets/css/src/newsletter_templates.styl | 5 ++- assets/js/src/newsletters/templates/tabs.jsx | 38 ++++++++++++++++++++ views/newsletters.html | 2 ++ webpack.config.js | 4 +++ 8 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 assets/css/src/badge.styl diff --git a/assets/css/src/admin.styl b/assets/css/src/admin.styl index b1ef9c2cfe..ee8c726139 100644 --- a/assets/css/src/admin.styl +++ b/assets/css/src/admin.styl @@ -2,6 +2,7 @@ @require 'select2/dist/css/select2.css' @require 'datepicker/datepicker' +@require 'badge' @require 'common' @require 'modal' @@ -30,4 +31,4 @@ @require '../../../node_modules/react-confirm-alert/src/react-confirm-alert.css' -@require 'newsletter_templates' \ No newline at end of file +@require 'newsletter_templates' diff --git a/assets/css/src/badge.styl b/assets/css/src/badge.styl new file mode 100644 index 0000000000..98c1fe1c77 --- /dev/null +++ b/assets/css/src/badge.styl @@ -0,0 +1,9 @@ +badge() + text-transform uppercase + cursor pointer + color white + font-size 0.5625rem + font-weight 500 + border-radius 3px + letter-spacing 1px + vertical-align middle diff --git a/assets/css/src/common.styl b/assets/css/src/common.styl index 622e6906ce..3c2cdfe5b7 100644 --- a/assets/css/src/common.styl +++ b/assets/css/src/common.styl @@ -71,3 +71,10 @@ progress::-webkit-progress-value progress::-moz-progress-bar background-color: progress-foreground border-radius: progress-border-radius + +span.feedback-tooltip + badge() + display inline-block + padding 0 4px + background-color #ca4a1f + diff --git a/assets/css/src/listing/newsletters.styl b/assets/css/src/listing/newsletters.styl index b5c8b9c144..f62bd7ebce 100644 --- a/assets/css/src/listing/newsletters.styl +++ b/assets/css/src/listing/newsletters.styl @@ -31,14 +31,8 @@ $green-badge-color = #55bd56 .mailpoet_badge padding: 4px 6px 3px 6px - color: #FFFFFF margin-right: 4px - text-transform: uppercase - font-size: 0.5625rem - font-weight: 500 - border-radius: 3px - letter-spacing: 1px - vertical-align: middle + badge() &_excellent, &_teal background: $excellent-badge-color diff --git a/assets/css/src/newsletter_templates.styl b/assets/css/src/newsletter_templates.styl index 9c606afa87..7e5e8c1194 100644 --- a/assets/css/src/newsletter_templates.styl +++ b/assets/css/src/newsletter_templates.styl @@ -6,4 +6,7 @@ top: 0 left: 0 width: $newsletter-width - max-width: $newsletter-width \ No newline at end of file + max-width: $newsletter-width + +.newsletter-templates-feedback + margin: 0 10px diff --git a/assets/js/src/newsletters/templates/tabs.jsx b/assets/js/src/newsletters/templates/tabs.jsx index 9c720b2645..cf895c882f 100644 --- a/assets/js/src/newsletters/templates/tabs.jsx +++ b/assets/js/src/newsletters/templates/tabs.jsx @@ -1,5 +1,21 @@ import React from 'react'; import PropTypes from 'prop-types'; +import ReactTooltip from 'react-tooltip'; +import MailPoet from 'mailpoet'; +import ReactStringReplace from 'react-string-replace'; + +const tooltipText = ReactStringReplace( + MailPoet.I18n.t('tooltipTemplateTabs'), + /\[link\](.*?)\[\/link\]/g, + match => ( + { match } + ) +); const Tabs = ({ tabs, selected, select }) => (
@@ -13,6 +29,28 @@ const Tabs = ({ tabs, selected, select }) => ( ))} + {MailPoet.I18n.t('feedback')} + + + {tooltipText} + +
); diff --git a/views/newsletters.html b/views/newsletters.html index a825b72cda..7e78dd8d90 100644 --- a/views/newsletters.html +++ b/views/newsletters.html @@ -190,6 +190,8 @@ 'websiteTimeIs': __("Your website’s time is"), 'noScheduledDateError': __('Please enter the scheduled date.'), 'schedule': __('Schedule'), + 'feedback': __('Feedback?'), + 'tooltipTemplateTabs': __("Click [link]here[/link] to give your feedback on this feature. We’d love to hear from you."), 'close': __('Close'), 'today': __('Today'), diff --git a/webpack.config.js b/webpack.config.js index 6aa33cb87f..d680dc205c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -73,6 +73,10 @@ var baseConfig = { include: require.resolve('underscore'), loader: 'expose-loader?_', }, + { + include: require.resolve('react-tooltip'), + loader: 'expose-loader?' + globalPrefix + '.ReactTooltip', + }, { include: require.resolve('history'), loader: 'expose-loader?' + globalPrefix + '.History', From 4070a56547eae2aa8910b6f2e6db94040ce0d310 Mon Sep 17 00:00:00 2001 From: qfrery Date: Wed, 6 Jun 2018 17:03:22 +0100 Subject: [PATCH 11/89] camel case --- lib/Config/Menu.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 8308caf9ac..68573a21ed 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -438,7 +438,7 @@ class Menu { ) ); - $data['is_new_user'] = $this->is_new_user(); + $data['is_new_user'] = $this->isNewUser(); $data = array_merge($data, Installer::getPremiumStatus()); @@ -543,7 +543,7 @@ class Menu { $data['items_per_page'] = $this->getLimitPerPage('forms'); $data['segments'] = Segment::findArray(); - $data['is_new_user'] = $this->is_new_user(); + $data['is_new_user'] = $this->isNewUser(); $this->displayPage('forms.html', $data); } @@ -583,7 +583,7 @@ class Menu { $data['automatic_emails'] = array(); - $data['is_new_user'] = $this->is_new_user(); + $data['is_new_user'] = $this->isNewUser(); wp_enqueue_script('jquery-ui'); wp_enqueue_script('jquery-ui-datepicker'); @@ -616,7 +616,7 @@ class Menu { 'sub_menu' => 'mailpoet-subscribers' )); - $data['is_new_user'] = $this->is_new_user(); + $data['is_new_user'] = $this->isNewUser(); $this->displayPage('subscribers/importExport/import.html', $data); } @@ -757,7 +757,7 @@ class Menu { } } - function is_new_user() { + function isNewUser() { $installed_at = Setting::getValue('installed_at'); if(is_null($installed_at)) { return true; From 87dbb7ff96ca6a3a998e3866faf74fb2e11c245e Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 6 Jun 2018 22:17:28 -0400 Subject: [PATCH 12/89] Updates HTML code/template formatting --- views/form/widget.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/views/form/widget.html b/views/form/widget.html index 14e84d3777..af259c5d60 100644 --- a/views/form/widget.html +++ b/views/form/widget.html @@ -4,7 +4,7 @@ <% if(title) %> <%= before_title | raw %><%= title | raw %><%= after_title | raw %> <% endif %> - +
<%= styles | raw %>
-

style="display:none;" <% endif %> - ><%= form.settings.success_message %>

+ ><%= form.settings.success_message %> +

style="display:none;" From 20cecc885a9cac3398a2f9d500a7c3254a7dcecf Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Tue, 5 Jun 2018 16:45:47 +0100 Subject: [PATCH 13/89] Stop blocking user on template save When the template save function throws an error the newsletter is already being sent. We cannot stop users. [MAILPOET-1325] --- assets/js/src/newsletters/send.jsx | 5 ++++- lib/Router/Endpoints/ViewInBrowser.php | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/assets/js/src/newsletters/send.jsx b/assets/js/src/newsletters/send.jsx index 65796814ea..491cd493e8 100644 --- a/assets/js/src/newsletters/send.jsx +++ b/assets/js/src/newsletters/send.jsx @@ -74,7 +74,7 @@ const NewsletterSend = React.createClass({ }, saveTemplate: function saveTemplate(response, done) { fromUrl(response.meta.preview_url) - .then(function saveTemplateAjax(thumbnail) { + .then((thumbnail) => { MailPoet.Ajax.post({ api_version: window.mailpoet_api_version, endpoint: 'newsletterTemplates', @@ -88,6 +88,9 @@ const NewsletterSend = React.createClass({ }, }).then(done).fail((err) => { this.showError(err); + this.setState({ loading: false }); + MailPoet.Modal.loading(false); + done(); }); }) .catch((err) => { diff --git a/lib/Router/Endpoints/ViewInBrowser.php b/lib/Router/Endpoints/ViewInBrowser.php index 7e8a961d63..6fcf6df0b5 100644 --- a/lib/Router/Endpoints/ViewInBrowser.php +++ b/lib/Router/Endpoints/ViewInBrowser.php @@ -101,4 +101,4 @@ class ViewInBrowser { status_header(404); exit; } -} \ No newline at end of file +} From 0f08c5fa37591e8e2e75a3f7daf99bce686fe007 Mon Sep 17 00:00:00 2001 From: "Fred. P" Date: Thu, 7 Jun 2018 14:00:54 +0200 Subject: [PATCH 14/89] Always display colum block controls on mouse over [MAILPOET-1399] the div.mailpoet_tools is now behind the newsletter editor and move to the right on mouse over instead of simply hidden which, caused all the invisible elements to overlap. --- .../css/src/newsletter_editor/components/blockTools.styl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/assets/css/src/newsletter_editor/components/blockTools.styl b/assets/css/src/newsletter_editor/components/blockTools.styl index 86ea0cf680..45f62c0b80 100644 --- a/assets/css/src/newsletter_editor/components/blockTools.styl +++ b/assets/css/src/newsletter_editor/components/blockTools.styl @@ -32,15 +32,18 @@ $master-column-tool-width = 24px vertical-align: top .mailpoet_container_horizontal + & - left: 100% - right: initial padding-left: 5px + width: 30px + transition: right 3s linear .mailpoet_tool_slider left: -100% right: initial &.mailpoet_display_tools + right: -38px + transition: none + .mailpoet_tool_slider left: 0 From 62fd56400b53cd4bcc2880b8f539b71d3b115b45 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Fri, 8 Jun 2018 16:58:28 +0200 Subject: [PATCH 15/89] renderer: Fixed notice in PostTransformer for older data without 'withLayout' property [MAILPOET-1409] --- lib/Newsletter/Editor/PostTransformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Newsletter/Editor/PostTransformer.php b/lib/Newsletter/Editor/PostTransformer.php index 75ceaa78e4..3578c53391 100644 --- a/lib/Newsletter/Editor/PostTransformer.php +++ b/lib/Newsletter/Editor/PostTransformer.php @@ -17,7 +17,7 @@ class PostTransformer { function __construct($args) { $this->args = $args; - $this->with_layout = (bool)filter_var($args['withLayout'], FILTER_VALIDATE_BOOLEAN); + $this->with_layout = isset($args['withLayout']) ? (bool)filter_var($args['withLayout'], FILTER_VALIDATE_BOOLEAN) : false; $this->image_position = 'left'; } From b36537a4e89e5c65bc0d0910bec8e4cb701803b9 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Fri, 8 Jun 2018 17:05:37 +0200 Subject: [PATCH 16/89] renderer: Processing Post without layout renders featured_image only for excerpt display type [MAILPOET-1409] --- lib/Newsletter/Editor/PostTransformer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Newsletter/Editor/PostTransformer.php b/lib/Newsletter/Editor/PostTransformer.php index 3578c53391..e9f08ceb7d 100644 --- a/lib/Newsletter/Editor/PostTransformer.php +++ b/lib/Newsletter/Editor/PostTransformer.php @@ -44,7 +44,7 @@ class PostTransformer { $image_position = $this->args['featuredImagePosition']; - if($featured_image && $image_position === 'belowTitle') { + if($featured_image && $image_position === 'belowTitle' && $this->args['displayType'] === 'excerpt') { array_unshift($content, $title, $featured_image); } else { if($content[0]['type'] === 'text') { @@ -52,7 +52,7 @@ class PostTransformer { } else { array_unshift($content, $title); } - if($featured_image) { + if($featured_image && $this->args['displayType'] === 'excerpt') { array_unshift($content, $featured_image); } } From fdc5aad62abb81ccc0902e9695799843a514465c Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Mon, 11 Jun 2018 09:00:08 +0200 Subject: [PATCH 17/89] renderer: Added unit test for PostTransformer structrure generation without layout --- .../Editor/PostContentTransformerTest.php | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 tests/unit/Newsletter/Editor/PostContentTransformerTest.php diff --git a/tests/unit/Newsletter/Editor/PostContentTransformerTest.php b/tests/unit/Newsletter/Editor/PostContentTransformerTest.php new file mode 100644 index 0000000000..c0ae687f53 --- /dev/null +++ b/tests/unit/Newsletter/Editor/PostContentTransformerTest.php @@ -0,0 +1,106 @@ +content_mock = array( + array( + 'type' => 'button', + 'text' => 'foo', + ), + ); + $this->title_mock = array( + 'text' => 'Title', + ); + $this->image_mock = array( + 'type' => 'image', + ); + } + + function testShouldAddImageAboveTitleForExcerptWithoutLayout() { + $args = array ( + 'withLayout' => false, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'aboveTitle', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result)->equals(array($this->image_mock, $this->title_mock, $this->content_mock[0])); + } + + function testShouldAddImageBelowTitleForExcerptWithoutLayout() { + $args = array ( + 'withLayout' => false, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'belowTitle', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result)->equals(array($this->title_mock, $this->image_mock, $this->content_mock[0])); + } + + function testShouldTransformContentWithoutLayoutWhenImageIsMissing() { + $args = array ( + 'withLayout' => false, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'belowTitle', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, null); + $result = $transformer->transform(array()); + expect($result)->equals(array($this->title_mock, $this->content_mock[0])); + } + + function testShouldNotAddImageForTitleOnlyWhenImageIsPresentWithoutLayout() { + $args = array ( + 'withLayout' => false, + 'displayType' => 'titleOnly', + 'featuredImagePosition' => 'aboveTitle', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result)->equals(array($this->title_mock, $this->content_mock[0])); + } + + function testShouldPrependTitleTextToContentTextIfFirstContentBlockIsTextual() { + $args = array ( + 'withLayout' => false, + 'displayType' => 'titleOnly', + 'featuredImagePosition' => 'aboveTitle', + ); + + $this->content_mock[0]['type'] = 'text'; + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + $expected = $this->content_mock[0]; + $expected['text'] = 'Titlefoo'; + expect($result)->equals(array($expected)); + } + + /** + * @return PostTransformer + */ + private function getTransformer(array $args, array $content, array $title, array $image = null) { + $transformer = new PostTransformer($args); + Mock::double($transformer, array('getContent' => $content)); + Mock::double($transformer, array('getFeaturedImage' => $image)); + Mock::double($transformer, array('getTitle' => $title)); + return $transformer; + } +} \ No newline at end of file From 0af3be61dd782866619824a66f7345df8a4cab52 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Mon, 11 Jun 2018 09:44:59 +0200 Subject: [PATCH 18/89] renderer: Added basic unit test for PostTransformer structrure generation with layout --- .../Editor/PostContentTransformerTest.php | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/tests/unit/Newsletter/Editor/PostContentTransformerTest.php b/tests/unit/Newsletter/Editor/PostContentTransformerTest.php index c0ae687f53..42367f9215 100644 --- a/tests/unit/Newsletter/Editor/PostContentTransformerTest.php +++ b/tests/unit/Newsletter/Editor/PostContentTransformerTest.php @@ -93,6 +93,107 @@ class PostContentTransformerTest extends \MailPoetTest { expect($result)->equals(array($expected)); } + function testShouldCreateLayoutStructureForCenteredImageWithLayout() { + $args = array ( + 'withLayout' => true, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'centered', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result[0]['type'])->equals('container'); + expect($result[0]['orientation'])->equals('horizontal'); + expect($result[0]['styles'])->notEmpty(); + expect($result[0]['blocks'][0]['type'])->equals('container'); + expect($result[0]['blocks'][0]['orientation'])->equals('vertical'); + expect($result[0]['blocks'][0]['styles'])->notEmpty(); + expect(count($result[0]['blocks'][0]['blocks']))->equals(3); + } + + function testShouldCreateLayoutStructureForOtherThanCenteredPositionedImageWithLayout() { + $args = array ( + 'withLayout' => true, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'alternate', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result[0]['type'])->equals('container'); + expect($result[0]['orientation'])->equals('horizontal'); + expect($result[0]['styles'])->notEmpty(); + expect($result[0]['blocks'][0]['type'])->equals('container'); + expect($result[0]['blocks'][0]['orientation'])->equals('vertical'); + expect($result[0]['blocks'][0]['styles'])->notEmpty(); + expect(count($result[0]['blocks'][0]['blocks']))->equals(1); + expect(count($result[1]['blocks']))->equals(2); + } + + function testShouldAddCenteredImageForExcerptWithLayout() { + $args = array ( + 'withLayout' => true, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'centered', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result[0]['blocks'][0]['blocks'])->equals(array($this->title_mock, $this->image_mock, $this->content_mock[0])); + } + + function testShouldHandleOldStructureImagePositionValueAndAddImageForExcerptWithLayout() { + $args = array ( + 'withLayout' => true, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'aboveTitle', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result[0]['blocks'][0]['blocks'])->equals(array($this->title_mock, $this->image_mock, $this->content_mock[0])); + } + + function testShouldAddLeftPositionedImageForExcerptWithLayout() { + $args = array ( + 'withLayout' => true, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'left', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result[0]['blocks'][0]['blocks'])->equals(array($this->title_mock)); + expect($result[1]['blocks'][0]['blocks'])->equals(array($this->image_mock)); + expect($result[1]['blocks'][1]['blocks'])->equals(array($this->content_mock[0])); + } + + function testShouldAddRightPositionedImageForExcerptWithLayout() { + $args = array ( + 'withLayout' => true, + 'displayType' => 'excerpt', + 'featuredImagePosition' => 'right', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result[0]['blocks'][0]['blocks'])->equals(array($this->title_mock)); + expect($result[1]['blocks'][0]['blocks'])->equals(array($this->content_mock[0])); + expect($result[1]['blocks'][1]['blocks'])->equals(array($this->image_mock)); + } + + function testShouldNotAddImageForTitleOnlyWithLayout() { + $args = array ( + 'withLayout' => true, + 'displayType' => 'titleOnly', + 'featuredImagePosition' => 'centered', + ); + + $transformer = $this->getTransformer($args, $this->content_mock, $this->title_mock, $this->image_mock); + $result = $transformer->transform(array()); + expect($result[0]['blocks'][0]['blocks'])->equals(array($this->title_mock, $this->content_mock[0])); + } + /** * @return PostTransformer */ From e3a63b54cc4661449110094968230399ac39e8f3 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Fri, 8 Jun 2018 11:50:08 +0200 Subject: [PATCH 19/89] Unify emails list heading code [MAILPOET-1408] --- assets/js/src/newsletters/listings/notification.jsx | 12 +++++++++++- .../newsletters/listings/notification_history.jsx | 12 +++++++++++- assets/js/src/newsletters/listings/standard.jsx | 4 ++-- assets/js/src/newsletters/listings/welcome.jsx | 12 +++++++++++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/assets/js/src/newsletters/listings/notification.jsx b/assets/js/src/newsletters/listings/notification.jsx index 064b37810c..9e321d2a59 100644 --- a/assets/js/src/newsletters/listings/notification.jsx +++ b/assets/js/src/newsletters/listings/notification.jsx @@ -311,7 +311,17 @@ const NewsletterListNotification = React.createClass({ return (

- {MailPoet.I18n.t('pageTitle')} {MailPoet.I18n.t('new')} + { MailPoet.I18n.t('pageTitle') } + MailPoet.trackEvent('Emails > Add New', + { 'MailPoet Free version': window.mailpoet_version } + )} + data-automation-id="new_email" + > + { MailPoet.I18n.t('new') } +

diff --git a/assets/js/src/newsletters/listings/notification_history.jsx b/assets/js/src/newsletters/listings/notification_history.jsx index 99eb48dcb3..855394672f 100644 --- a/assets/js/src/newsletters/listings/notification_history.jsx +++ b/assets/js/src/newsletters/listings/notification_history.jsx @@ -98,7 +98,17 @@ const NewsletterListNotificationHistory = React.createClass({ return (

- {MailPoet.I18n.t('pageTitle')} {MailPoet.I18n.t('new')} + { MailPoet.I18n.t('pageTitle') } + MailPoet.trackEvent('Emails > Add New', + { 'MailPoet Free version': window.mailpoet_version } + )} + data-automation-id="new_email" + > + { MailPoet.I18n.t('new') } +

diff --git a/assets/js/src/newsletters/listings/standard.jsx b/assets/js/src/newsletters/listings/standard.jsx index 3cc43048c5..906336789f 100644 --- a/assets/js/src/newsletters/listings/standard.jsx +++ b/assets/js/src/newsletters/listings/standard.jsx @@ -215,7 +215,7 @@ const NewsletterListStandard = React.createClass({ return (

- {MailPoet.I18n.t('pageTitle')} + { MailPoet.I18n.t('pageTitle') } - {MailPoet.I18n.t('new')} + { MailPoet.I18n.t('new') }

diff --git a/assets/js/src/newsletters/listings/welcome.jsx b/assets/js/src/newsletters/listings/welcome.jsx index 06ec73396a..f50672129d 100644 --- a/assets/js/src/newsletters/listings/welcome.jsx +++ b/assets/js/src/newsletters/listings/welcome.jsx @@ -294,7 +294,17 @@ const NewsletterListWelcome = React.createClass({ return (

- { MailPoet.I18n.t('pageTitle') } { MailPoet.I18n.t('new') } + { MailPoet.I18n.t('pageTitle') } + MailPoet.trackEvent('Emails > Add New', + { 'MailPoet Free version': window.mailpoet_version } + )} + data-automation-id="new_email" + > + { MailPoet.I18n.t('new') } +

From b00b42e4ca18de96459c6d5a12f7d9d72bbdcdaf Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Fri, 8 Jun 2018 14:09:19 +0200 Subject: [PATCH 20/89] Refactor emails list heading to respect DRY [MAILPOET-1408] --- .../js/src/newsletters/listings/heading.jsx | 23 +++++++++++++++++++ .../src/newsletters/listings/notification.jsx | 15 ++---------- .../listings/notification_history.jsx | 15 ++---------- .../js/src/newsletters/listings/standard.jsx | 16 ++----------- .../js/src/newsletters/listings/welcome.jsx | 16 ++----------- 5 files changed, 31 insertions(+), 54 deletions(-) create mode 100644 assets/js/src/newsletters/listings/heading.jsx diff --git a/assets/js/src/newsletters/listings/heading.jsx b/assets/js/src/newsletters/listings/heading.jsx new file mode 100644 index 0000000000..0577e96b1b --- /dev/null +++ b/assets/js/src/newsletters/listings/heading.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { Link } from 'react-router'; +import MailPoet from 'mailpoet'; + +const ListingHeading = () => ( +

+ {MailPoet.I18n.t('pageTitle')} + MailPoet.trackEvent( + 'Emails > Add New', + { 'MailPoet Free version': window.mailpoet_version } + )} + data-automation-id="new_email" + > + {MailPoet.I18n.t('new')} + +

+); + + +module.exports = ListingHeading; diff --git a/assets/js/src/newsletters/listings/notification.jsx b/assets/js/src/newsletters/listings/notification.jsx index 9e321d2a59..7a87ba1513 100644 --- a/assets/js/src/newsletters/listings/notification.jsx +++ b/assets/js/src/newsletters/listings/notification.jsx @@ -3,6 +3,7 @@ import { Link } from 'react-router'; import Listing from 'listing/listing.jsx'; import ListingTabs from 'newsletters/listings/tabs.jsx'; +import ListingHeading from 'newsletters/listings/heading.jsx'; import { MailerMixin } from 'newsletters/listings/mixins.jsx'; @@ -310,19 +311,7 @@ const NewsletterListNotification = React.createClass({ render: function render() { return (
-

- { MailPoet.I18n.t('pageTitle') } - MailPoet.trackEvent('Emails > Add New', - { 'MailPoet Free version': window.mailpoet_version } - )} - data-automation-id="new_email" - > - { MailPoet.I18n.t('new') } - -

+ diff --git a/assets/js/src/newsletters/listings/notification_history.jsx b/assets/js/src/newsletters/listings/notification_history.jsx index 855394672f..1ff132d206 100644 --- a/assets/js/src/newsletters/listings/notification_history.jsx +++ b/assets/js/src/newsletters/listings/notification_history.jsx @@ -6,6 +6,7 @@ import Hooks from 'wp-js-hooks'; import Listing from 'listing/listing.jsx'; import ListingTabs from 'newsletters/listings/tabs.jsx'; +import ListingHeading from 'newsletters/listings/heading.jsx'; import { QueueMixin, @@ -97,19 +98,7 @@ const NewsletterListNotificationHistory = React.createClass({ render: function render() { return (
-

- { MailPoet.I18n.t('pageTitle') } - MailPoet.trackEvent('Emails > Add New', - { 'MailPoet Free version': window.mailpoet_version } - )} - data-automation-id="new_email" - > - { MailPoet.I18n.t('new') } - -

+ diff --git a/assets/js/src/newsletters/listings/standard.jsx b/assets/js/src/newsletters/listings/standard.jsx index 906336789f..4254a49a59 100644 --- a/assets/js/src/newsletters/listings/standard.jsx +++ b/assets/js/src/newsletters/listings/standard.jsx @@ -1,5 +1,4 @@ import React from 'react'; -import { Link } from 'react-router'; import { confirmAlert } from 'react-confirm-alert'; import classNames from 'classnames'; import MailPoet from 'mailpoet'; @@ -7,6 +6,7 @@ import Hooks from 'wp-js-hooks'; import Listing from 'listing/listing.jsx'; import ListingTabs from 'newsletters/listings/tabs.jsx'; +import ListingHeading from 'newsletters/listings/heading.jsx'; import { QueueMixin, @@ -214,19 +214,7 @@ const NewsletterListStandard = React.createClass({ render: function render() { return (
-

- { MailPoet.I18n.t('pageTitle') } - MailPoet.trackEvent('Emails > Add New', - { 'MailPoet Free version': window.mailpoet_version } - )} - data-automation-id="new_email" - > - { MailPoet.I18n.t('new') } - -

+ diff --git a/assets/js/src/newsletters/listings/welcome.jsx b/assets/js/src/newsletters/listings/welcome.jsx index f50672129d..6d8684412e 100644 --- a/assets/js/src/newsletters/listings/welcome.jsx +++ b/assets/js/src/newsletters/listings/welcome.jsx @@ -1,8 +1,8 @@ import React from 'react'; -import { Link } from 'react-router'; import Listing from 'listing/listing.jsx'; import ListingTabs from 'newsletters/listings/tabs.jsx'; +import ListingHeading from 'newsletters/listings/heading.jsx'; import { StatisticsMixin, MailerMixin } from 'newsletters/listings/mixins.jsx'; @@ -293,19 +293,7 @@ const NewsletterListWelcome = React.createClass({ render: function render() { return (
-

- { MailPoet.I18n.t('pageTitle') } - MailPoet.trackEvent('Emails > Add New', - { 'MailPoet Free version': window.mailpoet_version } - )} - data-automation-id="new_email" - > - { MailPoet.I18n.t('new') } - -

+ From 32e02cbf5290b9e8e8ab7d442ae7ca908bf8ea32 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 28 Apr 2018 21:40:57 -0400 Subject: [PATCH 21/89] Adds meta column to sending queues --- lib/Config/Migrator.php | 1 + lib/Models/SendingQueue.php | 11 +++++++++++ lib/Tasks/Sending.php | 3 ++- tests/unit/Models/SendingQueueTest.php | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/Config/Migrator.php b/lib/Config/Migrator.php index 7038655b5e..6489590f3d 100644 --- a/lib/Config/Migrator.php +++ b/lib/Config/Migrator.php @@ -148,6 +148,7 @@ class Migrator { 'count_total int(11) unsigned NOT NULL DEFAULT 0,', 'count_processed int(11) unsigned NOT NULL DEFAULT 0,', 'count_to_process int(11) unsigned NOT NULL DEFAULT 0,', + 'meta longtext,', 'created_at TIMESTAMP NULL,', 'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,', 'deleted_at TIMESTAMP NULL,', diff --git a/lib/Models/SendingQueue.php b/lib/Models/SendingQueue.php index 21d67bb423..f443aaeb73 100644 --- a/lib/Models/SendingQueue.php +++ b/lib/Models/SendingQueue.php @@ -60,6 +60,12 @@ class SendingQueue extends Model { json_encode($this->encodeEmojisInBody($this->newsletter_rendered_body)) ); } + if(!Helpers::isJson($this->meta)) { + $this->set( + 'meta', + json_encode($this->meta) + ); + } parent::save(); $this->newsletter_rendered_body = $this->getNewsletterRenderedBody(); return $this; @@ -86,6 +92,10 @@ class SendingQueue extends Model { $rendered_newsletter; } + function getMeta() { + return (Helpers::isJson($this->meta)) ? json_decode($this->meta, true) : $this->meta; + } + function encodeEmojisInBody($newsletter_rendered_body) { if(is_array($newsletter_rendered_body)) { foreach($newsletter_rendered_body as $key => $value) { @@ -126,6 +136,7 @@ class SendingQueue extends Model { function asArray() { $model = parent::asArray(); $model['newsletter_rendered_body'] = $this->getNewsletterRenderedBody(); + $model['meta'] = $this->getMeta(); return $model; } diff --git a/lib/Tasks/Sending.php b/lib/Tasks/Sending.php index 8baa9e4f82..632267d9f6 100644 --- a/lib/Tasks/Sending.php +++ b/lib/Tasks/Sending.php @@ -30,7 +30,8 @@ class Sending { 'newsletter_rendered_body', 'count_total', 'count_processed', - 'count_to_process' + 'count_to_process', + 'meta' ); private $common_fields = array( diff --git a/tests/unit/Models/SendingQueueTest.php b/tests/unit/Models/SendingQueueTest.php index eac1833017..572c97ff72 100644 --- a/tests/unit/Models/SendingQueueTest.php +++ b/tests/unit/Models/SendingQueueTest.php @@ -96,6 +96,22 @@ class SendingQueueTest extends \MailPoetTest { expect(json_decode($queue->newsletter_rendered_body, true))->equals($data); } + function testItJsonEncodesMetaWhenSaving() { + $queue = SendingQueue::create(); + $meta = array( + 'some' => 'value' + ); + $queue->task_id = 0; + $queue->newsletter_id = 1; + $queue->meta = $meta; + $queue->save(); + + $queue = SendingQueue::findOne($queue->id); + + expect(Helpers::isJson($queue->meta))->true(); + expect(json_decode($queue->meta, true))->equals($meta); + } + function testItReencodesSerializedObjectToJsonEncoded() { $queue = $this->queue; $newsletter_rendered_body = $this->rendered_body; From b16cbf9e7dda8e15c6eb336c051719cf352b2bf2 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 28 Apr 2018 21:41:44 -0400 Subject: [PATCH 22/89] Updates column type since it may contain long meta object --- lib/Config/Migrator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Config/Migrator.php b/lib/Config/Migrator.php index 6489590f3d..dcb79b0642 100644 --- a/lib/Config/Migrator.php +++ b/lib/Config/Migrator.php @@ -279,7 +279,7 @@ class Migrator { 'id int(11) unsigned NOT NULL AUTO_INCREMENT,', 'newsletter_id int(11) unsigned NOT NULL,', 'option_field_id int(11) unsigned NOT NULL,', - 'value varchar(255) NOT NULL DEFAULT "",', + 'value longtext,', 'created_at TIMESTAMP NULL,', 'updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,', 'PRIMARY KEY (id),', From 116ee51497ae33456dbb5f804bee0f0754587d61 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 29 Apr 2018 12:38:26 -0400 Subject: [PATCH 23/89] Does not use queue when previewing automatic emails in browser --- lib/Router/Endpoints/ViewInBrowser.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/Router/Endpoints/ViewInBrowser.php b/lib/Router/Endpoints/ViewInBrowser.php index 6fcf6df0b5..ba8fad2a2b 100644 --- a/lib/Router/Endpoints/ViewInBrowser.php +++ b/lib/Router/Endpoints/ViewInBrowser.php @@ -74,6 +74,11 @@ class ViewInBrowser { $data->queue = false; } + // reset queue when automatic email is being previewed + if($data->newsletter->type === Newsletter::TYPE_AUTOMATIC && !empty($data->preview)) { + $data->queue = false; + } + // allow users with permission to manage emails to preview any newsletter if(!empty($data->preview) && $this->access_control->validatePermission(AccessControl::PERMISSION_MANAGE_EMAILS) ) return $data; From b75d4db412feb036406728cc85ec32669791ac9f Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 29 Apr 2018 20:10:13 -0400 Subject: [PATCH 24/89] Adds newsletter/cron scheduler for automatic emails --- lib/Cron/Workers/Scheduler.php | 21 +++++++- lib/Newsletter/Scheduler/Scheduler.php | 70 ++++++++++++++++++-------- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index d03805e315..2122e3b322 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -32,8 +32,7 @@ class Scheduler { if(!count($scheduled_queues)) return false; $this->updateTasks($scheduled_queues); foreach($scheduled_queues as $i => $queue) { - $newsletter = Newsletter::filter('filterWithOptions') - ->findOne($queue->newsletter_id); + $newsletter = Newsletter::filter('filterWithOptions')->findOne($queue->newsletter_id); if(!$newsletter || $newsletter->deleted_at !== null) { $queue->delete(); } elseif($newsletter->status !== Newsletter::STATUS_ACTIVE && $newsletter->status !== Newsletter::STATUS_SCHEDULED) { @@ -44,6 +43,8 @@ class Scheduler { $this->processPostNotificationNewsletter($newsletter, $queue); } elseif($newsletter->type === Newsletter::TYPE_STANDARD) { $this->processScheduledStandardNewsletter($newsletter, $queue); + } elseif($newsletter->type === Newsletter::TYPE_AUTOMATIC) { + $this->processScheduledAutomaticEmail($newsletter, $queue); } CronHelper::enforceExecutionLimit($this->timer); } @@ -101,6 +102,22 @@ class Scheduler { return true; } + function processScheduledAutomaticEmail($newsletter, $queue) { + if($newsletter->sendTo === 'segment') { + $segment = Segment::findOne($newsletter->segment)->asArray(); + $finder = new SubscribersFinder(); + $result = $finder->addSubscribersToTaskFromSegments($queue->task(), array($segment)); + if(empty($result)) { + $queue->delete(); + return false; + } + } + + $queue->status = null; + $queue->save(); + return true; + } + function processScheduledStandardNewsletter($newsletter, $queue) { $segments = $newsletter->segments()->findArray(); $finder = new SubscribersFinder(); diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index c02c0fcb5e..de50981fbf 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -47,6 +47,16 @@ class Scheduler { } } + static function scheduleAutomaticEmail($group, $event, $scheduling_condition = false, $subscriber_id = false, $meta = false) { + $newsletters = self::getNewsletters(Newsletter::TYPE_AUTOMATIC, $group); + if(empty($newsletters)) return false; + foreach($newsletters as $newsletter) { + if($newsletter->event !== $event) continue; + if(is_callable($scheduling_condition) && !$scheduling_condition($newsletter)) continue; + self::createAutomaticEmailQueue($newsletter, $subscriber_id, $meta); + } + } + static function scheduleWPUserWelcomeNotification( $subscriber_id, $wp_user, @@ -84,26 +94,30 @@ class Scheduler { $queue = SendingTask::create(); $queue->newsletter_id = $newsletter->id; $queue->setSubscribers(array($subscriber_id)); - $after_time_type = $newsletter->afterTimeType; - $after_time_number = $newsletter->afterTimeNumber; - $scheduled_at = null; - $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); - switch($after_time_type) { - case 'hours': - $scheduled_at = $current_time->addHours($after_time_number); - break; - case 'days': - $scheduled_at = $current_time->addDays($after_time_number); - break; - case 'weeks': - $scheduled_at = $current_time->addWeeks($after_time_number); - break; - default: - $scheduled_at = $current_time; - } $queue->status = SendingQueue::STATUS_SCHEDULED; $queue->priority = SendingQueue::PRIORITY_HIGH; - $queue->scheduled_at = $scheduled_at; + $queue->scheduled_at = self::getScheduledTimeForWelcomeOrAutomaticEmails( + $newsletter->afterTimeType, + $newsletter->afterTimeNumber + ); + return $queue->save(); + } + + static function createAutomaticEmailQueue($newsletter, $subscriber_id, $meta) { + $queue = SendingTask::create(); + $queue->newsletter_id = $newsletter->id; + if($newsletter->sendTo === 'user' && $subscriber_id) { + $queue->setSubscribers(array($subscriber_id)); + } + if($meta) { + $queue->__set('meta', $meta); + } + $queue->status = SendingQueue::STATUS_SCHEDULED; + $queue->priority = SendingQueue::PRIORITY_MEDIUM; + $queue->scheduled_at = self::getScheduledTimeForWelcomeNotificationOrAutomaticEmails( + $newsletter->afterTimeType, + $newsletter->afterTimeNumber + ); return $queue->save(); } @@ -195,9 +209,9 @@ class Scheduler { return $previous_run_date; } - static function getNewsletters($type) { + static function getNewsletters($type, $group = false) { return Newsletter::getPublished() - ->filter('filterType', $type) + ->filter('filterType', $type, $group) ->filter('filterStatus', Newsletter::STATUS_ACTIVE) ->filter('filterWithOptions') ->findMany(); @@ -206,4 +220,18 @@ class Scheduler { static function formatDatetimeString($datetime_string) { return Carbon::parse($datetime_string)->format('Y-m-d H:i:s'); } -} + + static function getScheduledTimeForWelcomeNotificationOrAutomaticEmails($after_time_type, $after_time_number) { + $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); + switch($after_time_type) { + case 'hours': + return $current_time->addHours($after_time_number); + case 'days': + return $current_time->addDays($after_time_number); + case 'weeks': + return $current_time->addWeeks($after_time_number); + default: + return $current_time; + } + } +} \ No newline at end of file From 08fa5b88b55b35902e8abcd5fbcf0ca02ae2f340 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 29 Apr 2018 20:12:10 -0400 Subject: [PATCH 25/89] Removes unused condition --- lib/Models/Newsletter.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index 0e955cd46f..697cdcd3b6 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -840,7 +840,6 @@ class Newsletter extends Model { NewsletterOptionField::$_table, array( 'option_fields.newsletter_type', '=', self::$_table . '.type', - 'option_fields.name', '=', 'group' ), 'option_fields' ) From e578b0a4eaf856f814a172e8e34af45cb70a6de0 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 29 Apr 2018 21:24:49 -0400 Subject: [PATCH 26/89] Decodes meta option field if it exists on the object --- lib/Models/Newsletter.php | 6 ++++ tests/unit/Models/NewsletterTest.php | 42 ++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index 697cdcd3b6..e80c685d15 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -975,4 +975,10 @@ class Newsletter extends Model { return parent::where('hash', $hash) ->findOne(); } + + function getMeta() { + if(!$this->meta) return; + + return (Helpers::isJson($this->meta)) ? json_decode($this->meta, true) : $this->meta; + } } diff --git a/tests/unit/Models/NewsletterTest.php b/tests/unit/Models/NewsletterTest.php index df93bb3cb8..ed89f5c928 100644 --- a/tests/unit/Models/NewsletterTest.php +++ b/tests/unit/Models/NewsletterTest.php @@ -1,7 +1,6 @@ id)->equals($newsletter_2->id); } - function testPauseTaskWhenDisablePostNotification() { + function testItGetsAndDecodesNewsletterOptionMetaField() { + $newsletter = Newsletter::createOrUpdate( + array( + 'subject' => 'Test Option Meta Field', + 'preheader' => 'Pre Header', + 'type' => Newsletter::TYPE_AUTOMATIC + ) + ); + $newsletter_option_field = NewsletterOptionField::create(); + $newsletter_option_field->hydrate( + array( + 'newsletter_type' => Newsletter::TYPE_AUTOMATIC, + 'name' => 'meta' + ) + ); + $newsletter_option_field->save(); + $newsletter_option = NewsletterOption::create(); + $meta = array('some' => 'value'); + $newsletter_option->hydrate( + array( + 'newsletter_id' => $newsletter->id, + 'option_field_id' => $newsletter_option_field->id, + 'value' => json_encode($meta) + ) + ); + $newsletter_option->save(); + + // by default meta option does not exist on newsletter object + expect($newsletter->getMeta())->isEmpty(); + + // if meta option exists, it should be returned as an array + $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + expect($newsletter->getMeta())->equals($meta); + } + + function testPausesTaskWhenPostNotificationIsDisabled() { $newsletter = Newsletter::createOrUpdate(array( 'type' => Newsletter::TYPE_NOTIFICATION )); @@ -854,7 +888,7 @@ class NewsletterTest extends \MailPoetTest { expect($task_found->status)->equals(ScheduledTask::STATUS_PAUSED); } - function testUnPauseTaskWhenEnablePostNotification() { + function testUnpausesTasksWhenPostNotificationIsEnabled() { $newsletter = Newsletter::createOrUpdate(array( 'type' => Newsletter::TYPE_NOTIFICATION )); @@ -870,8 +904,6 @@ class NewsletterTest extends \MailPoetTest { $task_found = ScheduledTask::findOne($task->id()); expect($task_found->status)->equals(ScheduledTask::STATUS_SCHEDULED); } - - function _after() { \ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table); \ORM::raw_execute('TRUNCATE ' . Newsletter::$_table); From bf0c5abd4f4159c095facd1d80fd20a2070e0404 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 30 Apr 2018 21:06:50 -0400 Subject: [PATCH 27/89] Adds newsletter scheduler unit tests for automatic emails --- lib/Newsletter/Scheduler/Scheduler.php | 6 +- .../Newsletter/Scheduler/SchedulerTest.php | 180 ++++++++++++++++-- 2 files changed, 163 insertions(+), 23 deletions(-) diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index de50981fbf..f7ee0d3dc3 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -96,7 +96,7 @@ class Scheduler { $queue->setSubscribers(array($subscriber_id)); $queue->status = SendingQueue::STATUS_SCHEDULED; $queue->priority = SendingQueue::PRIORITY_HIGH; - $queue->scheduled_at = self::getScheduledTimeForWelcomeOrAutomaticEmails( + $queue->scheduled_at = self::getScheduledTimeForWelcomeNotificationOrAutomaticEmail( $newsletter->afterTimeType, $newsletter->afterTimeNumber ); @@ -114,7 +114,7 @@ class Scheduler { } $queue->status = SendingQueue::STATUS_SCHEDULED; $queue->priority = SendingQueue::PRIORITY_MEDIUM; - $queue->scheduled_at = self::getScheduledTimeForWelcomeNotificationOrAutomaticEmails( + $queue->scheduled_at = self::getScheduledTimeForWelcomeNotificationOrAutomaticEmail( $newsletter->afterTimeType, $newsletter->afterTimeNumber ); @@ -221,7 +221,7 @@ class Scheduler { return Carbon::parse($datetime_string)->format('Y-m-d H:i:s'); } - static function getScheduledTimeForWelcomeNotificationOrAutomaticEmails($after_time_type, $after_time_number) { + static function getScheduledTimeForWelcomeNotificationOrAutomaticEmail($after_time_type, $after_time_number) { $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); switch($after_time_type) { case 'hours': diff --git a/tests/unit/Newsletter/Scheduler/SchedulerTest.php b/tests/unit/Newsletter/Scheduler/SchedulerTest.php index 2d77acac5e..9c3954340f 100644 --- a/tests/unit/Newsletter/Scheduler/SchedulerTest.php +++ b/tests/unit/Newsletter/Scheduler/SchedulerTest.php @@ -2,13 +2,16 @@ namespace MailPoet\Test\Newsletter\Scheduler; use Carbon\Carbon; +use Codeception\Util\Fixtures; use Mailpoet\Config\Hooks; use MailPoet\Models\Newsletter; use MailPoet\Models\NewsletterOption; use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterPost; use MailPoet\Models\ScheduledTask; +use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\SendingQueue; +use MailPoet\Models\Subscriber; use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Tasks\Sending as SendingTask; use MailPoet\WP\Posts as WPPosts; @@ -26,7 +29,7 @@ class SchedulerTest extends \MailPoetTest { expect(Scheduler::INTERVAL_NTHWEEKDAY)->notEmpty(); } - function testItGetsActiveNewslettersFilteredByType() { + function testItGetsActiveNewslettersFilteredByTypeAndGroup() { $newsletter = $this->_createNewsletter($type = Newsletter::TYPE_WELCOME); // no newsletters with type "notification" should be found @@ -34,6 +37,19 @@ class SchedulerTest extends \MailPoetTest { // one newsletter with type "welcome" should be found expect(Scheduler::getNewsletters(Newsletter::TYPE_WELCOME))->count(1); + + // one automatic email belonging to "test" group should be found + $newsletter = $this->_createNewsletter($type = Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'group' => 'test' + ) + ); + + expect(Scheduler::getNewsletters(Newsletter::TYPE_AUTOMATIC, 'group_does_not_exist'))->isEmpty(); + expect(Scheduler::getNewsletters(Newsletter::TYPE_WELCOME, 'test'))->count(1); } function testItCanGetNextRunDate() { @@ -438,11 +454,130 @@ class SchedulerTest extends \MailPoetTest { ->equals('2017-01-01 13:01:00'); } + function testItCreatesAutomaticEmailQueueRecordWithSubscriberAndMeta() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + $subscriber = Subscriber::create(); + $subscriber->hydrate(Fixtures::get('subscriber_template')); + $subscriber->save(); + $meta = array('some' => 'value'); + + Scheduler::createAutomaticEmailQueue($newsletter, $subscriber->id, $meta); + // new queue record should be created with meta data + $queue = SendingQueue::where('newsletter_id', $newsletter->id)->findOne(); + expect($queue->getMeta())->equals($meta); + // new scheduled task should be created with 1 subscriber + $task = $queue->getTasks()->findOne(); + $current_time = Carbon::createFromTimestamp(current_time('timestamp')); + expect($task->id)->greaterOrEquals(1); + expect($task->priority)->equals(SendingQueue::PRIORITY_MEDIUM); + expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); + expect(Carbon::parse($task->scheduled_at)->format('Y-m-d H:i')) + ->equals($current_time->addHours(2)->format('Y-m-d H:i')); + // task should have 1 subscriber + $subscribers = $task->subscribers()->findMany(); + expect($subscribers)->count(1); + expect($subscribers[0]->id)->equals($subscriber->id); + } + + function testItCreatesAutomaticEmailQueueRecord() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'sendTo' => 'segment', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + + Scheduler::createAutomaticEmailQueue($newsletter, $subscriber = null, $meta = null); + // new queue record should be created without meta + $queue = SendingQueue::where('newsletter_id', $newsletter->id)->findOne(); + expect($queue->getMeta())->isEmpty(); + // new scheduled task should be created + $task = $queue->getTasks()->findOne(); + $current_time = Carbon::createFromTimestamp(current_time('timestamp')); + expect($task->id)->greaterOrEquals(1); + expect($task->priority)->equals(SendingQueue::PRIORITY_MEDIUM); + expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); + expect(Carbon::parse($task->scheduled_at)->format('Y-m-d H:i')) + ->equals($current_time->addHours(2)->format('Y-m-d H:i')); + // task should not have any subscribers + $subscribers = $task->subscribers()->findMany(); + expect($subscribers)->count(0); + } + + function testItSchedulesAutomaticEmailOnlyWhenItMatchesCondition() { + $newsletter_1 = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter_1->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'group' => 'some_group', + 'event' => 'some_event', + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + $newsletter_2 = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter_2->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'group' => 'some_group', + 'event' => 'some_event', + 'sendTo' => 'segment', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + $condition = function($email) { + return $email->sendTo === 'segment'; + }; + $meta = array('some' => 'value'); + + // email should not be scheduled when group is not matched + Scheduler::scheduleAutomaticEmail('group_does_not_exist', 'some_event'); + expect(SendingQueue::findMany())->count(0); + + // email should not be scheduled when event is not matched + Scheduler::scheduleAutomaticEmail('some_group', 'event_does_not_exist'); + expect(SendingQueue::findMany())->count(0); + + // email should only be scheduled if it matches condition ("send to segment") + Scheduler::scheduleAutomaticEmail('some_group', 'some_event', $condition, $subscriber_id = null, $meta); + $result = SendingQueue::findMany(); + expect($result)->count(1); + expect($result[0]->newsletter_id)->equals($newsletter_2->id); + expect($result[0]->getMeta())->equals($meta); + // scheduled task should be created + $task = $result[0]->getTasks()->findOne(); + $current_time = Carbon::createFromTimestamp(current_time('timestamp')); + expect($task->id)->greaterOrEquals(1); + expect($task->priority)->equals(SendingQueue::PRIORITY_MEDIUM); + expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); + expect(Carbon::parse($task->scheduled_at)->format('Y-m-d H:i')) + ->equals($current_time->addHours(2)->format('Y-m-d H:i')); + } + function testUnsearchablePostTypeDoesNotSchedulePostNotification() { $hook = new Hooks; - + $newsletter = $this->_createNewsletter(Newsletter::TYPE_NOTIFICATION); - + $this->_createNewsletterOptions( $newsletter->id, Newsletter::TYPE_NOTIFICATION, @@ -451,33 +586,33 @@ class SchedulerTest extends \MailPoetTest { 'schedule' => '* * * * *' ) ); - + $this->_removePostNotificationHooks(); register_post_type('post', array('exclude_from_search' => true)); $hook->setupPostNotifications(); - + $post_data = array( 'post_title' => 'title', 'post_status' => 'publish', ); wp_insert_post($post_data); - + $queue = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); expect($queue)->equals(false); - + $this->_removePostNotificationHooks(); register_post_type('post', array('exclude_from_search' => false)); $hook->setupPostNotifications(); - + wp_insert_post($post_data); - + $queue = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); expect($queue)->notequals(false); } - + function testSchedulerWontRunIfUnsentNotificationHistoryExists() { $newsletter = $this->_createNewsletter(Newsletter::TYPE_NOTIFICATION); - + $this->_createNewsletterOptions( $newsletter->id, Newsletter::TYPE_NOTIFICATION, @@ -486,22 +621,22 @@ class SchedulerTest extends \MailPoetTest { 'schedule' => '* * * * *' ) ); - + $notification_history = Newsletter::create(); $notification_history->type = Newsletter::TYPE_NOTIFICATION_HISTORY; $notification_history->status = Newsletter::STATUS_SENDING; $notification_history->parent_id = $newsletter->id; $notification_history->save(); - + $post_data = array( 'post_title' => 'title', 'post_status' => 'publish', ); wp_insert_post($post_data); - + $queue = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); expect($queue)->equals(false); - } + } function _createQueue( $newsletter_id, @@ -531,11 +666,14 @@ class SchedulerTest extends \MailPoetTest { function _createNewsletterOptions($newsletter_id, $newsletter_type, $options) { foreach($options as $option => $value) { - $newsletter_option_field = NewsletterOptionField::create(); - $newsletter_option_field->name = $option; - $newsletter_option_field->newsletter_type = $newsletter_type; - $newsletter_option_field->save(); - expect($newsletter_option_field->getErrors())->false(); + $newsletter_option_field = NewsletterOptionField::where('name', $option)->findOne(); + if(!$newsletter_option_field) { + $newsletter_option_field = NewsletterOptionField::create(); + $newsletter_option_field->name = $option; + $newsletter_option_field->newsletter_type = $newsletter_type; + $newsletter_option_field->save(); + expect($newsletter_option_field->getErrors())->false(); + } $newsletter_option = NewsletterOption::create(); $newsletter_option->option_field_id = $newsletter_option_field->id; @@ -562,6 +700,8 @@ class SchedulerTest extends \MailPoetTest { \ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table); \ORM::raw_execute('TRUNCATE ' . NewsletterPost::$_table); \ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table); + \ORM::raw_execute('TRUNCATE ' . ScheduledTaskSubscriber::$_table); \ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); + \ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); } } \ No newline at end of file From b3aae566d5f243612dd98708404b23c8d93221e9 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 30 Apr 2018 21:49:29 -0400 Subject: [PATCH 28/89] Adds cron scheduler unit tests for automatic emails --- tests/unit/Cron/Workers/SchedulerTest.php | 54 ++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/tests/unit/Cron/Workers/SchedulerTest.php b/tests/unit/Cron/Workers/SchedulerTest.php index 38b4109f5f..3c2b03a03e 100644 --- a/tests/unit/Cron/Workers/SchedulerTest.php +++ b/tests/unit/Cron/Workers/SchedulerTest.php @@ -571,6 +571,58 @@ class SchedulerTest extends \MailPoetTest { $scheduler->process(); } + function testItProcessesScheduledAutomaticEmailWhenSendingToUser() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC, Newsletter::STATUS_SCHEDULED); + $task = SendingTask::create(); + $task->newsletter_id = $newsletter->id; + $task->status = SendingQueue::STATUS_SCHEDULED; + $task->scheduled_at = Carbon::now()->subDay(1)->toDateTimeString(); + $task->save(); + + // scheduled task should exist + $task = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); + expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); + expect($task->newsletter_id)->equals($newsletter->id); + + // task should have its status set to null (i.e., sending) + $scheduler = new Scheduler(); + $scheduler->process(); + $task = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); + expect($task->status)->null(); + } + + function testItProcessesScheduledAutomaticEmailWhenSendingToSegment() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC, Newsletter::STATUS_SCHEDULED); + $segment = $this->_createSegment(); + $subscriber = $this->_createSubscriber(); + $segment_subscriber = $this->_createSubscriberSegment($subscriber->id, $segment->id); + $options = array('sendTo' => 'segment', 'segment' => $segment->id); + foreach($options as $option => $value) { + $newsletter_option_field = $this->_createNewsletterOptionField($option, Newsletter::TYPE_AUTOMATIC); + $newsletter_option = $this->_createNewsletterOption($newsletter_option_field->id, $newsletter->id, $value); + } + $task = SendingTask::create(); + $task->newsletter_id = $newsletter->id; + $task->status = SendingQueue::STATUS_SCHEDULED; + $task->scheduled_at = Carbon::now()->subDay(1)->toDateTimeString(); + $task->save(); + + // scheduled task should exist + $task = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); + expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); + expect($task->newsletter_id)->equals($newsletter->id); + + // task should have its status set to null (i.e., sending) + $scheduler = new Scheduler(); + $scheduler->process(); + $task = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); + expect($task->status)->null(); + // task should have 1 subscriber added from segment + $subscribers = $task->subscribers()->findMany(); + expect($subscribers)->count(1); + expect($subscribers[0]->id)->equals($subscriber->id); + } + function testItUpdatesUpdateTime() { $originalUpdated = Carbon::createFromTimestamp(current_time('timestamp'))->subHours(5)->toDateTimeString(); $newsletter = $this->_createNewsletter(Newsletter::TYPE_WELCOME, Newsletter::STATUS_DRAFT); @@ -699,4 +751,4 @@ class SchedulerTest extends \MailPoetTest { \ORM::raw_execute('TRUNCATE ' . Segment::$_table); \ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table); } -} +} \ No newline at end of file From 9aa796681ac736b2ecc694aa1f993b571368f327 Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 1 May 2018 22:07:01 -0400 Subject: [PATCH 29/89] Processes stats for automatic emails --- lib/Models/Newsletter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index e80c685d15..d9d0db62d1 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -535,7 +535,7 @@ class Newsletter extends Model { $result = array(); foreach($statisticsExprs as $name => $statisticsExpr) { - if($this->type !== self::TYPE_WELCOME) { + if(!in_array($this->type, array(self::TYPE_WELCOME, self::TYPE_AUTOMATIC))) { $row = $statisticsExpr->whereRaw('`queue_id` = ?', array($this->queue['id']))->findOne(); } else { $row = $statisticsExpr From 4611a7ea74df52398b2d130ff6d7f8a257cbf72c Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 19 May 2018 17:00:31 -0400 Subject: [PATCH 30/89] Updates method names --- lib/Newsletter/Scheduler/Scheduler.php | 83 +++++++++---------- .../Newsletter/Scheduler/SchedulerTest.php | 30 +++---- 2 files changed, 56 insertions(+), 57 deletions(-) diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index f7ee0d3dc3..57b51faa62 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -30,7 +30,7 @@ class Scheduler { ->where('post_id', $post_id) ->findOne(); if($post === false) { - self::createPostNotificationQueue($newsletter); + self::createPostNotificationSendingTask($newsletter); } } } @@ -42,7 +42,7 @@ class Scheduler { if($newsletter->event === 'segment' && in_array($newsletter->segment, $segments) ) { - self::createWelcomeNotificationQueue($newsletter, $subscriber_id); + self::createWelcomeNotificationSendingTask($newsletter, $subscriber_id); } } } @@ -53,7 +53,7 @@ class Scheduler { foreach($newsletters as $newsletter) { if($newsletter->event !== $event) continue; if(is_callable($scheduling_condition) && !$scheduling_condition($newsletter)) continue; - self::createAutomaticEmailQueue($newsletter, $subscriber_id, $meta); + self::createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta); } } @@ -79,49 +79,49 @@ class Scheduler { if($newsletter->role === self::WORDPRESS_ALL_ROLES || in_array($newsletter->role, $wp_user['roles']) ) { - self::createWelcomeNotificationQueue($newsletter, $subscriber_id); + self::createWelcomeNotificationSendingTask($newsletter, $subscriber_id); } } } } - static function createWelcomeNotificationQueue($newsletter, $subscriber_id) { + static function createWelcomeNotificationSendingTask($newsletter, $subscriber_id) { $previously_scheduled_notification = SendingQueue::joinWithSubscribers() ->where('queues.newsletter_id', $newsletter->id) ->where('subscribers.subscriber_id', $subscriber_id) ->findOne(); if(!empty($previously_scheduled_notification)) return; - $queue = SendingTask::create(); - $queue->newsletter_id = $newsletter->id; - $queue->setSubscribers(array($subscriber_id)); - $queue->status = SendingQueue::STATUS_SCHEDULED; - $queue->priority = SendingQueue::PRIORITY_HIGH; - $queue->scheduled_at = self::getScheduledTimeForWelcomeNotificationOrAutomaticEmail( + $sending_task = SendingTask::create(); + $sending_task->newsletter_id = $newsletter->id; + $sending_task->setSubscribers(array($subscriber_id)); + $sending_task->status = SendingQueue::STATUS_SCHEDULED; + $sending_task->priority = SendingQueue::PRIORITY_HIGH; + $sending_task->scheduled_at = self::getScheduledTimeWithDelay( $newsletter->afterTimeType, $newsletter->afterTimeNumber ); - return $queue->save(); + return $sending_task->save(); } - static function createAutomaticEmailQueue($newsletter, $subscriber_id, $meta) { - $queue = SendingTask::create(); - $queue->newsletter_id = $newsletter->id; + static function createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta) { + $sending_task = SendingTask::create(); + $sending_task->newsletter_id = $newsletter->id; if($newsletter->sendTo === 'user' && $subscriber_id) { - $queue->setSubscribers(array($subscriber_id)); + $sending_task->setSubscribers(array($subscriber_id)); } if($meta) { - $queue->__set('meta', $meta); + $sending_task->__set('meta', $meta); } - $queue->status = SendingQueue::STATUS_SCHEDULED; - $queue->priority = SendingQueue::PRIORITY_MEDIUM; - $queue->scheduled_at = self::getScheduledTimeForWelcomeNotificationOrAutomaticEmail( + $sending_task->status = SendingQueue::STATUS_SCHEDULED; + $sending_task->priority = SendingQueue::PRIORITY_MEDIUM; + $sending_task->scheduled_at = self::getScheduledTimeWithDelay( $newsletter->afterTimeType, $newsletter->afterTimeNumber ); - return $queue->save(); + return $sending_task->save(); } - static function createPostNotificationQueue($newsletter) { + static function createPostNotificationSendingTask($newsletter) { $existing_notification_history = Newsletter::where('parent_id', $newsletter->id) ->where('type', Newsletter::TYPE_NOTIFICATION_HISTORY) ->where('status', Newsletter::STATUS_SENDING) @@ -129,7 +129,6 @@ class Scheduler { if($existing_notification_history) { return; } - $next_run_date = self::getNextRunDate($newsletter->schedule); if(!$next_run_date) return; // do not schedule duplicate queues for the same time @@ -137,12 +136,12 @@ class Scheduler { ->where('tasks.scheduled_at', $next_run_date) ->findOne(); if($existing_queue) return; - $queue = SendingTask::create(); - $queue->newsletter_id = $newsletter->id; - $queue->status = SendingQueue::STATUS_SCHEDULED; - $queue->scheduled_at = $next_run_date; - $queue->save(); - return $queue; + $sending_task = SendingTask::create(); + $sending_task->newsletter_id = $newsletter->id; + $sending_task->status = SendingQueue::STATUS_SCHEDULED; + $sending_task->scheduled_at = $next_run_date; + $sending_task->save(); + return $sending_task; } static function processPostNotificationSchedule($newsletter) { @@ -209,19 +208,7 @@ class Scheduler { return $previous_run_date; } - static function getNewsletters($type, $group = false) { - return Newsletter::getPublished() - ->filter('filterType', $type, $group) - ->filter('filterStatus', Newsletter::STATUS_ACTIVE) - ->filter('filterWithOptions') - ->findMany(); - } - - static function formatDatetimeString($datetime_string) { - return Carbon::parse($datetime_string)->format('Y-m-d H:i:s'); - } - - static function getScheduledTimeForWelcomeNotificationOrAutomaticEmail($after_time_type, $after_time_number) { + static function getScheduledTimeWithDelay($after_time_type, $after_time_number) { $current_time = Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')); switch($after_time_type) { case 'hours': @@ -234,4 +221,16 @@ class Scheduler { return $current_time; } } + + static function getNewsletters($type, $group = false) { + return Newsletter::getPublished() + ->filter('filterType', $type, $group) + ->filter('filterStatus', Newsletter::STATUS_ACTIVE) + ->filter('filterWithOptions') + ->findMany(); + } + + static function formatDatetimeString($datetime_string) { + return Carbon::parse($datetime_string)->format('Y-m-d H:i:s'); + } } \ No newline at end of file diff --git a/tests/unit/Newsletter/Scheduler/SchedulerTest.php b/tests/unit/Newsletter/Scheduler/SchedulerTest.php index 9c3954340f..3b99903280 100644 --- a/tests/unit/Newsletter/Scheduler/SchedulerTest.php +++ b/tests/unit/Newsletter/Scheduler/SchedulerTest.php @@ -75,12 +75,12 @@ class SchedulerTest extends \MailPoetTest { ->equals('2016-04-20 16:00:00'); } - function testItCreatesPostNotificationQueueRecord() { + function testItCreatesPostNotificationSendingTask() { $newsletter = $this->_createNewsletter(); $newsletter->schedule = '* 5 * * *'; // new queue record should be created - $queue = Scheduler::createPostNotificationQueue($newsletter); + $queue = Scheduler::createPostNotificationSendingTask($newsletter); expect(SendingQueue::findMany())->count(1); expect($queue->newsletter_id)->equals($newsletter->id); expect($queue->status)->equals(SendingQueue::STATUS_SCHEDULED); @@ -88,11 +88,11 @@ class SchedulerTest extends \MailPoetTest { expect($queue->priority)->equals(SendingQueue::PRIORITY_MEDIUM); // duplicate queue record should not be created - Scheduler::createPostNotificationQueue($newsletter); + Scheduler::createPostNotificationSendingTask($newsletter); expect(SendingQueue::findMany())->count(1); } - function testItDoesNotCreateDuplicateWelcomeNotificationQueueRecords() { + function testItDoesNotCreateDuplicateWelcomeNotificationSendingTasks() { $newsletter = (object)array( 'id' => 1, 'afterTimeNumber' => 2, @@ -105,15 +105,15 @@ class SchedulerTest extends \MailPoetTest { $existing_queue->save(); // queue is not scheduled - Scheduler::createWelcomeNotificationQueue($newsletter, $existing_subscriber); + Scheduler::createWelcomeNotificationSendingTask($newsletter, $existing_subscriber); expect(SendingQueue::findMany())->count(1); // queue is not scheduled - Scheduler::createWelcomeNotificationQueue($newsletter, 1); + Scheduler::createWelcomeNotificationSendingTask($newsletter, 1); expect(SendingQueue::findMany())->count(2); } - function testItCreatesWelcomeNotificationQueueRecord() { + function testItCreatesWelcomeNotificationSendingTask() { $newsletter = (object)array( 'id' => 1, 'afterTimeNumber' => 2 @@ -121,7 +121,7 @@ class SchedulerTest extends \MailPoetTest { // queue is scheduled delivery in 2 hours $newsletter->afterTimeType = 'hours'; - Scheduler::createWelcomeNotificationQueue($newsletter, $subscriber_id = 1); + Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1); $queue = SendingQueue::findTaskByNewsletterId(1) ->findOne(); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); @@ -133,7 +133,7 @@ class SchedulerTest extends \MailPoetTest { // queue is scheduled for delivery in 2 days $newsletter->afterTimeType = 'days'; - Scheduler::createWelcomeNotificationQueue($newsletter, $subscriber_id = 1); + Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); $queue = SendingQueue::findTaskByNewsletterId(1) ->findOne(); @@ -145,7 +145,7 @@ class SchedulerTest extends \MailPoetTest { // queue is scheduled for delivery in 2 weeks $newsletter->afterTimeType = 'weeks'; - Scheduler::createWelcomeNotificationQueue($newsletter, $subscriber_id = 1); + Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); $queue = SendingQueue::findTaskByNewsletterId(1) ->findOne(); @@ -157,7 +157,7 @@ class SchedulerTest extends \MailPoetTest { // queue is scheduled for immediate delivery $newsletter->afterTimeType = null; - Scheduler::createWelcomeNotificationQueue($newsletter, $subscriber_id = 1); + Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); $queue = SendingQueue::findTaskByNewsletterId(1) ->findOne(); @@ -454,7 +454,7 @@ class SchedulerTest extends \MailPoetTest { ->equals('2017-01-01 13:01:00'); } - function testItCreatesAutomaticEmailQueueRecordWithSubscriberAndMeta() { + function testItCreatesAutomaticEmailSendingTaskWithSubscriberAndMeta() { $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); $this->_createNewsletterOptions( $newsletter->id, @@ -471,7 +471,7 @@ class SchedulerTest extends \MailPoetTest { $subscriber->save(); $meta = array('some' => 'value'); - Scheduler::createAutomaticEmailQueue($newsletter, $subscriber->id, $meta); + Scheduler::createAutomaticEmailSendingTask($newsletter, $subscriber->id, $meta); // new queue record should be created with meta data $queue = SendingQueue::where('newsletter_id', $newsletter->id)->findOne(); expect($queue->getMeta())->equals($meta); @@ -489,7 +489,7 @@ class SchedulerTest extends \MailPoetTest { expect($subscribers[0]->id)->equals($subscriber->id); } - function testItCreatesAutomaticEmailQueueRecord() { + function testItCreatesAutomaticEmailSendingTask() { $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); $this->_createNewsletterOptions( $newsletter->id, @@ -502,7 +502,7 @@ class SchedulerTest extends \MailPoetTest { ); $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); - Scheduler::createAutomaticEmailQueue($newsletter, $subscriber = null, $meta = null); + Scheduler::createAutomaticEmailSendingTask($newsletter, $subscriber = null, $meta = null); // new queue record should be created without meta $queue = SendingQueue::where('newsletter_id', $newsletter->id)->findOne(); expect($queue->getMeta())->isEmpty(); From 8f758b11e18c980809a60d9e56ee4a943490b62e Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 20 May 2018 19:29:30 -0400 Subject: [PATCH 31/89] Splits large tests into smaller ones --- .../Newsletter/Scheduler/SchedulerTest.php | 167 ++++++++++++++---- 1 file changed, 129 insertions(+), 38 deletions(-) diff --git a/tests/unit/Newsletter/Scheduler/SchedulerTest.php b/tests/unit/Newsletter/Scheduler/SchedulerTest.php index 3b99903280..c278f43bb8 100644 --- a/tests/unit/Newsletter/Scheduler/SchedulerTest.php +++ b/tests/unit/Newsletter/Scheduler/SchedulerTest.php @@ -113,7 +113,7 @@ class SchedulerTest extends \MailPoetTest { expect(SendingQueue::findMany())->count(2); } - function testItCreatesWelcomeNotificationSendingTask() { + function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInHours() { $newsletter = (object)array( 'id' => 1, 'afterTimeNumber' => 2 @@ -130,6 +130,13 @@ class SchedulerTest extends \MailPoetTest { expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i')) ->equals($current_time->addHours(2)->format('Y-m-d H:i')); $this->_after(); + } + + function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInDays() { + $newsletter = (object)array( + 'id' => 1, + 'afterTimeNumber' => 2 + ); // queue is scheduled for delivery in 2 days $newsletter->afterTimeType = 'days'; @@ -142,6 +149,13 @@ class SchedulerTest extends \MailPoetTest { expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i')) ->equals($current_time->addDays(2)->format('Y-m-d H:i')); $this->_after(); + } + + function testItCreatesWelcomeNotificationSendingTaskScheduledToSendInWeeks() { + $newsletter = (object)array( + 'id' => 1, + 'afterTimeNumber' => 2 + ); // queue is scheduled for delivery in 2 weeks $newsletter->afterTimeType = 'weeks'; @@ -154,13 +168,19 @@ class SchedulerTest extends \MailPoetTest { expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i')) ->equals($current_time->addWeeks(2)->format('Y-m-d H:i')); $this->_after(); + } + + function testItCreatesWelcomeNotificationSendingTaskScheduledToSendImmediately() { + $newsletter = (object)array( + 'id' => 1, + 'afterTimeNumber' => 2 + ); // queue is scheduled for immediate delivery $newsletter->afterTimeType = null; Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); - $queue = SendingQueue::findTaskByNewsletterId(1) - ->findOne(); + $queue = SendingQueue::findTaskByNewsletterId(1)->findOne(); expect($queue->id)->greaterOrEquals(1); expect($queue->priority)->equals(SendingQueue::PRIORITY_HIGH); expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i')) @@ -361,10 +381,10 @@ class SchedulerTest extends \MailPoetTest { ->equals($current_time->addDay()->format('Y-m-d H:i')); } - function testItProcessesPostNotificationSchedule() { + function testItProcessesPostNotificationScheduledForDailyDelivery() { $newsletter_option_field = NewsletterOptionField::create(); $newsletter_option_field->name = 'schedule'; - $newsletter_option_field->newsletter_type = Newsletter::TYPE_WELCOME; + $newsletter_option_field->newsletter_type = Newsletter::TYPE_NOTIFICATION; $newsletter_option_field->save(); // daily notification is scheduled at 14:00 @@ -383,6 +403,13 @@ class SchedulerTest extends \MailPoetTest { $current_time = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) expect(Scheduler::getNextRunDate($newsletter_option->value, $current_time)) ->equals('2017-01-01 14:00:00'); + } + + function testItProcessesPostNotificationScheduledForWeeklyDelivery() { + $newsletter_option_field = NewsletterOptionField::create(); + $newsletter_option_field->name = 'schedule'; + $newsletter_option_field->newsletter_type = Newsletter::TYPE_NOTIFICATION; + $newsletter_option_field->save(); // weekly notification is scheduled every Tuesday at 14:00 $newsletter = (object)array( @@ -394,13 +421,19 @@ class SchedulerTest extends \MailPoetTest { 'timeOfDay' => 50400 // 2 p.m. ); Scheduler::processPostNotificationSchedule($newsletter); - $current_time = Carbon::createFromTimestamp(current_time('timestamp')); $newsletter_option = NewsletterOption::where('newsletter_id', $newsletter->id) ->where('option_field_id', $newsletter_option_field->id) ->findOne(); $current_time = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) expect(Scheduler::getNextRunDate($newsletter_option->value, $current_time)) ->equals('2017-01-03 14:00:00'); + } + + function testItProcessesPostNotificationScheduledForMonthlyDeliveryOnSpecificDay() { + $newsletter_option_field = NewsletterOptionField::create(); + $newsletter_option_field->name = 'schedule'; + $newsletter_option_field->newsletter_type = Newsletter::TYPE_NOTIFICATION; + $newsletter_option_field->save(); // monthly notification is scheduled every 20th day at 14:00 $newsletter = (object)array( @@ -409,7 +442,7 @@ class SchedulerTest extends \MailPoetTest { 'monthDay' => 19, // 20th (count starts from 0) 'nthWeekDay' => null, 'weekDay' => null, - 'timeOfDay' => 50400 // 2 p.m. + 'timeOfDay' => 50400// 2 p.m. ); Scheduler::processPostNotificationSchedule($newsletter); $newsletter_option = NewsletterOption::where('newsletter_id', $newsletter->id) @@ -418,6 +451,13 @@ class SchedulerTest extends \MailPoetTest { $current_time = 1483275600; // Sunday, 1 January 2017 @ 1:00pm (UTC) expect(Scheduler::getNextRunDate($newsletter_option->value, $current_time)) ->equals('2017-01-19 14:00:00'); + } + + function testItProcessesPostNotificationScheduledForMonthlyDeliveryOnLastWeekDay() { + $newsletter_option_field = NewsletterOptionField::create(); + $newsletter_option_field->name = 'schedule'; + $newsletter_option_field->newsletter_type = Newsletter::TYPE_NOTIFICATION; + $newsletter_option_field->save(); // monthly notification is scheduled every last Saturday at 14:00 $newsletter = (object)array( @@ -426,7 +466,7 @@ class SchedulerTest extends \MailPoetTest { 'monthDay' => null, 'nthWeekDay' => 'L', // L = last 'weekDay' => Carbon::SATURDAY, - 'timeOfDay' => 50400 // 2 p.m. + 'timeOfDay' => 50400// 2 p.m. ); Scheduler::processPostNotificationSchedule($newsletter); $newsletter_option = NewsletterOption::where('newsletter_id', $newsletter->id) @@ -435,6 +475,13 @@ class SchedulerTest extends \MailPoetTest { $current_time = 1485694800; // Sunday, 29 January 2017 @ 1:00pm (UTC) expect(Scheduler::getNextRunDate($newsletter_option->value, $current_time)) ->equals('2017-02-25 14:00:00'); + } + + function testItProcessesPostNotificationScheduledForImmediateDelivery() { + $newsletter_option_field = NewsletterOptionField::create(); + $newsletter_option_field->name = 'schedule'; + $newsletter_option_field->newsletter_type = Newsletter::TYPE_NOTIFICATION; + $newsletter_option_field->save(); // notification is scheduled immediately (next minute) $newsletter = (object)array( @@ -454,7 +501,38 @@ class SchedulerTest extends \MailPoetTest { ->equals('2017-01-01 13:01:00'); } - function testItCreatesAutomaticEmailSendingTaskWithSubscriberAndMeta() { + function testItCreatesScheduledAutomaticEmailSendingTaskForUser() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + $subscriber = Subscriber::create(); + $subscriber->hydrate(Fixtures::get('subscriber_template')); + $subscriber->save(); + + Scheduler::createAutomaticEmailSendingTask($newsletter, $subscriber->id, $meta = null); + // new scheduled task should be created + $task = SendingTask::getByNewsletterId($newsletter->id); + $current_time = Carbon::createFromTimestamp(current_time('timestamp')); + expect($task->id)->greaterOrEquals(1); + expect($task->priority)->equals(SendingQueue::PRIORITY_MEDIUM); + expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); + expect(Carbon::parse($task->scheduled_at)->format('Y-m-d H:i')) + ->equals($current_time->addHours(2)->format('Y-m-d H:i')); + // task should have 1 associated user + $subscribers = $task->subscribers()->findMany(); + expect($subscribers)->count(1); + expect($subscribers[0]->id)->equals($subscriber->id); + } + + function testItAddsMetaToSendingQueueWhenCreatingAutomaticEmailSendingTask() { $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); $this->_createNewsletterOptions( $newsletter->id, @@ -475,21 +553,9 @@ class SchedulerTest extends \MailPoetTest { // new queue record should be created with meta data $queue = SendingQueue::where('newsletter_id', $newsletter->id)->findOne(); expect($queue->getMeta())->equals($meta); - // new scheduled task should be created with 1 subscriber - $task = $queue->getTasks()->findOne(); - $current_time = Carbon::createFromTimestamp(current_time('timestamp')); - expect($task->id)->greaterOrEquals(1); - expect($task->priority)->equals(SendingQueue::PRIORITY_MEDIUM); - expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); - expect(Carbon::parse($task->scheduled_at)->format('Y-m-d H:i')) - ->equals($current_time->addHours(2)->format('Y-m-d H:i')); - // task should have 1 subscriber - $subscribers = $task->subscribers()->findMany(); - expect($subscribers)->count(1); - expect($subscribers[0]->id)->equals($subscriber->id); } - function testItCreatesAutomaticEmailSendingTask() { + function testItCreatesAutomaticEmailSendingTaskForSegment() { $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); $this->_createNewsletterOptions( $newsletter->id, @@ -503,11 +569,8 @@ class SchedulerTest extends \MailPoetTest { $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); Scheduler::createAutomaticEmailSendingTask($newsletter, $subscriber = null, $meta = null); - // new queue record should be created without meta - $queue = SendingQueue::where('newsletter_id', $newsletter->id)->findOne(); - expect($queue->getMeta())->isEmpty(); // new scheduled task should be created - $task = $queue->getTasks()->findOne(); + $task = SendingTask::getByNewsletterId($newsletter->id); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); expect($task->id)->greaterOrEquals(1); expect($task->priority)->equals(SendingQueue::PRIORITY_MEDIUM); @@ -519,7 +582,45 @@ class SchedulerTest extends \MailPoetTest { expect($subscribers)->count(0); } - function testItSchedulesAutomaticEmailOnlyWhenItMatchesCondition() { + function testItDoesNotScheduleAutomaticEmailWhenGroupDoesNotMatch() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'group' => 'some_group', + 'event' => 'some_event', + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + + // email should not be scheduled when group is not matched + Scheduler::scheduleAutomaticEmail('group_does_not_exist', 'some_event'); + expect(SendingQueue::findMany())->count(0); + } + + function testItDoesNotScheduleAutomaticEmailWhenEventDoesNotMatch() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'group' => 'some_group', + 'event' => 'some_event', + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + + // email should not be scheduled when event is not matched + Scheduler::scheduleAutomaticEmail('some_group', 'event_does_not_exist'); + expect(SendingQueue::findMany())->count(0); + } + + function testItSchedulesAutomaticEmailWhenConditionMatches() { $newsletter_1 = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); $this->_createNewsletterOptions( $newsletter_1->id, @@ -547,22 +648,12 @@ class SchedulerTest extends \MailPoetTest { $condition = function($email) { return $email->sendTo === 'segment'; }; - $meta = array('some' => 'value'); - - // email should not be scheduled when group is not matched - Scheduler::scheduleAutomaticEmail('group_does_not_exist', 'some_event'); - expect(SendingQueue::findMany())->count(0); - - // email should not be scheduled when event is not matched - Scheduler::scheduleAutomaticEmail('some_group', 'event_does_not_exist'); - expect(SendingQueue::findMany())->count(0); // email should only be scheduled if it matches condition ("send to segment") - Scheduler::scheduleAutomaticEmail('some_group', 'some_event', $condition, $subscriber_id = null, $meta); + Scheduler::scheduleAutomaticEmail('some_group', 'some_event', $condition); $result = SendingQueue::findMany(); expect($result)->count(1); expect($result[0]->newsletter_id)->equals($newsletter_2->id); - expect($result[0]->getMeta())->equals($meta); // scheduled task should be created $task = $result[0]->getTasks()->findOne(); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); From 6d74ba8bb0e517729d26360a3b78424c0f8c2b76 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 20 May 2018 19:52:56 -0400 Subject: [PATCH 32/89] Validates that subscriber exists when processing automatic email --- lib/Cron/Workers/Scheduler.php | 9 ++++++ tests/unit/Cron/Workers/SchedulerTest.php | 35 ++++++++++++++++++++--- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index 2122e3b322..1516b8e8cd 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -111,6 +111,15 @@ class Scheduler { $queue->delete(); return false; } + } else { + $subscribers = $queue->getSubscribers(); + $subscriber = (!empty($subscribers) && is_array($subscribers)) ? + Subscriber::findOne($subscribers[0]) : + false; + if(!$subscriber) { + $queue->delete(); + return false; + } } $queue->status = null; diff --git a/tests/unit/Cron/Workers/SchedulerTest.php b/tests/unit/Cron/Workers/SchedulerTest.php index 3c2b03a03e..f88eebd850 100644 --- a/tests/unit/Cron/Workers/SchedulerTest.php +++ b/tests/unit/Cron/Workers/SchedulerTest.php @@ -573,24 +573,51 @@ class SchedulerTest extends \MailPoetTest { function testItProcessesScheduledAutomaticEmailWhenSendingToUser() { $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC, Newsletter::STATUS_SCHEDULED); + $subscriber = $this->_createSubscriber(); $task = SendingTask::create(); $task->newsletter_id = $newsletter->id; $task->status = SendingQueue::STATUS_SCHEDULED; $task->scheduled_at = Carbon::now()->subDay(1)->toDateTimeString(); + $task->setSubscribers(array($subscriber->id)); $task->save(); // scheduled task should exist - $task = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); + $task = SendingTask::getByNewsletterId($newsletter->id); expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); expect($task->newsletter_id)->equals($newsletter->id); + expect($task->getSubscribers())->equals(array($subscriber->id)); // task should have its status set to null (i.e., sending) $scheduler = new Scheduler(); $scheduler->process(); - $task = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); + $task = SendingTask::getByNewsletterId($newsletter->id); expect($task->status)->null(); } + function testItDeletesScheduledAutomaticEmailWhenUserDoesNotExist() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC, Newsletter::STATUS_SCHEDULED); + $subscriber = $this->_createSubscriber(); + $task = SendingTask::create(); + $task->newsletter_id = $newsletter->id; + $task->status = SendingQueue::STATUS_SCHEDULED; + $task->scheduled_at = Carbon::now()->subDay(1)->toDateTimeString(); + $task->setSubscribers(array($subscriber->id)); + $task->save(); + $subscriber->delete(); + + // scheduled task should exist + $task = SendingTask::getByNewsletterId($newsletter->id); + expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); + expect($task->newsletter_id)->equals($newsletter->id); + expect($task->getSubscribers())->equals(array($subscriber->id)); + + // task should be deleted + $scheduler = new Scheduler(); + $scheduler->process(); + $task = SendingTask::getByNewsletterId($newsletter->id); + expect($task)->false(); + } + function testItProcessesScheduledAutomaticEmailWhenSendingToSegment() { $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC, Newsletter::STATUS_SCHEDULED); $segment = $this->_createSegment(); @@ -608,14 +635,14 @@ class SchedulerTest extends \MailPoetTest { $task->save(); // scheduled task should exist - $task = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); + $task = SendingTask::getByNewsletterId($newsletter->id); expect($task->status)->equals(SendingQueue::STATUS_SCHEDULED); expect($task->newsletter_id)->equals($newsletter->id); // task should have its status set to null (i.e., sending) $scheduler = new Scheduler(); $scheduler->process(); - $task = SendingQueue::findTaskByNewsletterId($newsletter->id)->findOne(); + $task = SendingTask::getByNewsletterId($newsletter->id); expect($task->status)->null(); // task should have 1 subscriber added from segment $subscribers = $task->subscribers()->findMany(); From 77d2f0224b601872c9efa02ffb3c136a7e699209 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sun, 20 May 2018 21:53:47 -0400 Subject: [PATCH 33/89] Fixes ESLint rules --- .../js/src/newsletters/types/automatic_emails/event.jsx | 6 +++++- .../newsletters/types/automatic_emails/events_list.jsx | 9 +++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/assets/js/src/newsletters/types/automatic_emails/event.jsx b/assets/js/src/newsletters/types/automatic_emails/event.jsx index 752390f7e9..c5180802c5 100644 --- a/assets/js/src/newsletters/types/automatic_emails/event.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/event.jsx @@ -58,8 +58,12 @@ class AutomaticEmailEvent extends React.PureComponent { } } +AutomaticEmailEvent.defaultProps = { + premium: false, +}; + AutomaticEmailEvent.propTypes = { - premium: PropTypes.bool.isRequired, + premium: PropTypes.bool, eventsConfigurator: PropTypes.func.isRequired, event: PropTypes.shape({ slug: PropTypes.string.isRequired, diff --git a/assets/js/src/newsletters/types/automatic_emails/events_list.jsx b/assets/js/src/newsletters/types/automatic_emails/events_list.jsx index 6093359875..4e088ef96a 100644 --- a/assets/js/src/newsletters/types/automatic_emails/events_list.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/events_list.jsx @@ -54,17 +54,18 @@ class AutomaticEmailEventsList extends React.Component { } AutomaticEmailEventsList.propTypes = { - route: PropTypes.shape({ data: PropTypes.shape({ - email: PropTypes.string.isRequired, + email: PropTypes.shape({ + title: PropTypes.string.isRequired, + slug: PropTypes.string.isRequired, + premium: PropTypes.bool, + }).isRequired, }).isRequired, }).isRequired, - router: PropTypes.shape({ push: PropTypes.func.isRequired, }).isRequired, - }; module.exports = AutomaticEmailEventsList; From ca1be42ab8a8a729c66e02c873771ec0a8c0460a Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 21 May 2018 11:20:37 -0400 Subject: [PATCH 34/89] Prevent breaking search when server does not return an object --- assets/js/src/form/fields/selection.jsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/assets/js/src/form/fields/selection.jsx b/assets/js/src/form/fields/selection.jsx index 0d75fa1593..0576fbed59 100644 --- a/assets/js/src/form/fields/selection.jsx +++ b/assets/js/src/form/fields/selection.jsx @@ -108,10 +108,11 @@ const Selection = React.createClass({ }; }, processResults: function processResults(response) { - return { - results: response.data.map(item => ( - { id: item.id || item.value, text: item.name || item.text } - )), + return { results: (!_.has(response, 'data')) ? + [] : + response.data.map(item => + ({ id: item.id || item.value, text: item.name || item.text }) + ), }; }, }, From 20dbc3c74b54436948afb54bb9f7db4367750f7d Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 21 May 2018 11:37:53 -0400 Subject: [PATCH 35/89] Adds WooCommerce teaser --- lib/Config/Menu.php | 51 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 68573a21ed..485d703f38 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -581,7 +581,56 @@ class Menu { $data['tracking_enabled'] = Setting::getValue('tracking.enabled'); $data['premium_plugin_active'] = License::getLicense(); - $data['automatic_emails'] = array(); + $data['automatic_emails'] = array( + array( + 'slug' => 'woocommerce', + 'premium' => true, + 'title' => __('WooCommerce', 'mailpoet'), + 'description' => __('Automatically send an email when there is a new WooCommerce product, order and some other action takes place.', 'mailpoet'), + 'events' => array( + array( + 'slug' => 'woocommerce_abandoned_shopping_cart', + 'title' => __('Abandoned Shopping Cart', 'mailpoet'), + 'description' => __('Send an email to logged-in visitors who have items in their shopping carts but left your website without checking out. Can convert up to 5% of abandoned carts.', 'mailpoet'), + 'soon' => true, + 'badge' => array( + 'text' => __('Must-have', 'mailpoet'), + 'style' => 'red' + ) + ), + array( + 'slug' => 'woocommerce_big_spender', + 'title' => __('Big Spender', 'mailpoet'), + 'description' => __('Let MailPoet send an email to customers who have spent a certain amount to thank them, possibly with a coupon.', 'mailpoet'), + 'soon' => true, + 'badge' => array( + 'text' => __('Smart to have', 'mailpoet'), + 'style' => 'teal' + ) + ), + array( + 'slug' => 'woocommerce_first_purchase', + 'title' => __('First Purchase', 'mailpoet'), + 'description' => __('Let MailPoet send an email to customers who make their first purchase.', 'mailpoet'), + 'badge' => array( + 'text' => __('Must-have', 'mailpoet'), + 'style' => 'red' + ) + ), + array( + 'slug' => 'woocommerce_product_purchased_in_category', + 'title' => __('Purchased In This Category', 'mailpoet'), + 'description' => __('Let MailPoet send an email to customers who purchase a product from a specific category.', 'mailpoet'), + 'soon' => true + ), + array( + 'slug' => 'woocommerce_product_purchased', + 'title' => __('Purchased This Product', 'mailpoet'), + 'description' => __('Let MailPoet send an email to customers who purchase a specific product.', 'mailpoet'), + ) + ) + ) + ); $data['is_new_user'] = $this->isNewUser(); From fff6c966d8112582567f2034648dbdabff7b1565 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 21 May 2018 12:00:07 -0400 Subject: [PATCH 36/89] Marks WooCommerce group as beta --- assets/js/src/newsletters/types.jsx | 2 + .../types/automatic_emails/event.jsx | 2 +- .../types/automatic_emails/events_list.jsx | 2 +- .../js/src/newsletters/types/woocommerce.jsx | 148 ------------------ lib/Config/Menu.php | 1 + 5 files changed, 5 insertions(+), 150 deletions(-) delete mode 100644 assets/js/src/newsletters/types/woocommerce.jsx diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index f8ae2b9969..d0070db44a 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -48,6 +48,8 @@ const NewsletterTypes = React.createClass({ return _.map(window.mailpoet_automatic_emails, (automaticEmail) => { const email = automaticEmail; const onClick = _.partial(this.setupNewsletter, automaticEmail.slug); + email.title = (email.beta) ? + `${email.title} (${MailPoet.I18n.t('beta')})` : email.title; email.action = (() => (
-

{event.title} {event.soon ? `(${MailPoet.I18n.t('soon').toLowerCase()})` : ''}

+

{event.title} {event.soon ? `(${MailPoet.I18n.t('soon')})` : ''}

{event.badge ? ( {event.badge.text} diff --git a/assets/js/src/newsletters/types/automatic_emails/events_list.jsx b/assets/js/src/newsletters/types/automatic_emails/events_list.jsx index 4e088ef96a..f09d31ad95 100644 --- a/assets/js/src/newsletters/types/automatic_emails/events_list.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/events_list.jsx @@ -42,7 +42,7 @@ class AutomaticEmailEventsList extends React.Component { return (

- {heading} ({MailPoet.I18n.t('beta').toLowerCase()}) + {heading}

diff --git a/assets/js/src/newsletters/types/woocommerce.jsx b/assets/js/src/newsletters/types/woocommerce.jsx deleted file mode 100644 index 8ad71f13a4..0000000000 --- a/assets/js/src/newsletters/types/woocommerce.jsx +++ /dev/null @@ -1,148 +0,0 @@ -import React from 'react'; -import MailPoet from 'mailpoet'; -import Breadcrumb from 'newsletters/breadcrumb.jsx'; - -const WooCommerceAutomaticEmail = React.createClass({ - contextTypes: { - router: React.PropTypes.object.isRequired, - }, - setupNewsletter: function setupNewsletter(type) { - if (type !== undefined) { - this.context.router.push(`/new/${type}`); - MailPoet.trackEvent('Emails > Type selected', { - 'MailPoet Free version': window.mailpoet_version, - 'Email type': type, - }); - } - }, - createNewsletter: function createNewsletter(type) { - MailPoet.trackEvent('Emails > Type selected', { - 'MailPoet Free version': window.mailpoet_version, - 'Email type': type, - }); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'newsletters', - action: 'create', - data: { - type, - subject: MailPoet.I18n.t('draftNewsletterTitle'), - }, - }).done((response) => { - this.context.router.push(`/template/${response.data.id}`); - }).fail((response) => { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(error => error.message), - { scroll: true } - ); - } - }); - }, - render: function render() { - const types = [ - { - id: 'woocommerce', - title: MailPoet.I18n.t('wooCommerceEventAbandonedCartTitle'), - description: MailPoet.I18n.t('wooCommerceEventAbandonedCartDescription'), - badge: { - text: MailPoet.I18n.t('wooCommerceEventAbandonedCartBadge'), - style: 'red', - }, - }, - { - id: 'woocommerce', - title: MailPoet.I18n.t('wooCommerceEventFirstPurchaseTitle'), - description: MailPoet.I18n.t('wooCommerceEventFirstPurchaseDescription'), - badge: { - text: MailPoet.I18n.t('wooCommerceEventFirstPurchaseBadge'), - style: 'yellow', - }, - }, - { - id: 'woocommerce', - title: MailPoet.I18n.t('wooCommerceEventPurchasedProductTitle'), - description: MailPoet.I18n.t('wooCommerceEventPurchasedProductDescription'), - }, - { - id: 'woocommerce', - title: MailPoet.I18n.t('wooCommerceEventPurchasedInCategoryTitle'), - description: MailPoet.I18n.t('wooCommerceEventPurchasedInCategoryDescription'), - soon: true, - }, - { - id: 'woocommerce', - title: MailPoet.I18n.t('wooCommerceEventBigSpenderTitle'), - description: MailPoet.I18n.t('wooCommerceEventBigSpenderDescription'), - soon: true, - badge: { - text: MailPoet.I18n.t('wooCommerceEventSmartToHaveBadge'), - style: 'teal', - }, - }, - ]; - - const steps = [ - { - name: 'type', - label: MailPoet.I18n.t('selectType'), - link: '/new', - }, - { - name: 'events', - label: MailPoet.I18n.t('wooCommerceBreadcrumbsEvents'), - }, - { - name: 'conditions', - label: MailPoet.I18n.t('wooCommerceBreadcrumbsConditions'), - }, - { - name: 'template', - label: MailPoet.I18n.t('template'), - }, - { - name: 'editor', - label: MailPoet.I18n.t('designer'), - }, - { - name: 'send', - label: MailPoet.I18n.t('send'), - }, - ]; - - return ( -
- ); - }, -}); - -module.exports = WooCommerceAutomaticEmail; diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 485d703f38..8ffc870bf0 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -584,6 +584,7 @@ class Menu { $data['automatic_emails'] = array( array( 'slug' => 'woocommerce', + 'beta' => true, 'premium' => true, 'title' => __('WooCommerce', 'mailpoet'), 'description' => __('Automatically send an email when there is a new WooCommerce product, order and some other action takes place.', 'mailpoet'), From 04d676f9e3830775d6478d2ba81eff9d137b7e50 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 21 May 2018 13:19:06 -0400 Subject: [PATCH 37/89] Fixes test after rebase --- tests/unit/Models/NewsletterTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/Models/NewsletterTest.php b/tests/unit/Models/NewsletterTest.php index ed89f5c928..9dffe756df 100644 --- a/tests/unit/Models/NewsletterTest.php +++ b/tests/unit/Models/NewsletterTest.php @@ -1,6 +1,7 @@ status)->equals(ScheduledTask::STATUS_PAUSED); } - function testUnpausesTasksWhenPostNotificationIsEnabled() { + function testUnpausesTaskWhenPostNotificationIsEnabled() { $newsletter = Newsletter::createOrUpdate(array( 'type' => Newsletter::TYPE_NOTIFICATION )); From 581e1303d0658fc94eb16682ac836b552ac250fb Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 28 May 2018 14:07:07 -0400 Subject: [PATCH 38/89] Display action link for each event if defined --- .../newsletters/types/automatic_emails/event.jsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/assets/js/src/newsletters/types/automatic_emails/event.jsx b/assets/js/src/newsletters/types/automatic_emails/event.jsx index dfdb8792b4..8d551f4d33 100644 --- a/assets/js/src/newsletters/types/automatic_emails/event.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/event.jsx @@ -6,6 +6,8 @@ import PropTypes from 'prop-types'; class AutomaticEmailEvent extends React.PureComponent { render() { const event = this.props.event; + const disabled = event.soon; + let action; if (this.props.premium) { @@ -17,9 +19,16 @@ class AutomaticEmailEvent extends React.PureComponent { {MailPoet.I18n.t('premiumFeatureLink')} ); + } if (event.actionButtonLink && event.actionButtonTitle) { + action = ( + + {event.actionButtonTitle} + + ); } else { - const disabled = event.soon; - action = ( Date: Mon, 11 Jun 2018 13:48:59 -0400 Subject: [PATCH 39/89] Adds missing import after merge conflict resolution --- lib/Cron/Workers/Scheduler.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index 1516b8e8cd..304c447de1 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -6,6 +6,7 @@ use Carbon\Carbon; use MailPoet\Cron\CronHelper; use MailPoet\Models\Newsletter; use MailPoet\Models\ScheduledTask; +use MailPoet\Models\Segment; use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Segments\SubscribersFinder; From 71fed489ec8cddb748004c21eb3250a28f183f7c Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Tue, 12 Jun 2018 10:13:49 +0100 Subject: [PATCH 40/89] Improve error reporting in API [MAILPOET-1290] --- lib/API/MP/v1/API.php | 20 ++++++- lib/Models/Subscriber.php | 2 +- lib/Newsletter/Scheduler/Scheduler.php | 6 +- lib/Router/Endpoints/CronDaemon.php | 2 +- tests/unit/API/MP/APITest.php | 59 ++++++++++++++++++- .../Newsletter/Scheduler/SchedulerTest.php | 5 +- 6 files changed, 85 insertions(+), 9 deletions(-) diff --git a/lib/API/MP/v1/API.php b/lib/API/MP/v1/API.php index 8724206f0b..8c7d5a512c 100644 --- a/lib/API/MP/v1/API.php +++ b/lib/API/MP/v1/API.php @@ -7,6 +7,7 @@ use MailPoet\Models\Subscriber; use MailPoet\Models\SubscriberSegment; use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Subscribers\Source; +use MailPoet\Tasks\Sending; if(!defined('ABSPATH')) exit; @@ -186,7 +187,12 @@ class API { // send confirmation email if($send_confirmation_email && $new_subscriber->status === Subscriber::STATUS_UNCONFIRMED) { - $this->_sendConfirmationEmail($new_subscriber); + $result = $this->_sendConfirmationEmail($new_subscriber); + if(!$result && $new_subscriber->getErrors()) { + throw new \Exception( + __(sprintf('Subscriber added, but confirmation email failed to send: %s', strtolower(implode(', ', $new_subscriber->getErrors()))), 'mailpoet') + ); + } } // schedule welcome email(s) @@ -242,6 +248,16 @@ class API { } protected function _scheduleWelcomeNotification(Subscriber $subscriber, array $segments) { - return Scheduler::scheduleSubscriberWelcomeNotification($subscriber->id, $segments); + $result = Scheduler::scheduleSubscriberWelcomeNotification($subscriber->id, $segments); + if(is_array($result)) { + foreach($result as $queue) { + if($queue instanceof Sending && $queue->getErrors()) { + throw new \Exception( + __(sprintf('Subscriber added, but welcome email failed to send: %s', strtolower(implode(', ', $queue->getErrors()))), 'mailpoet') + ); + } + } + } + return $result; } } diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index 632596b9ac..fd96ab71ac 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -904,4 +904,4 @@ class Subscriber extends Model { ->orderByAsc('name') ->findArray(); } -} \ No newline at end of file +} diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index 57b51faa62..4edfcf3064 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -38,13 +38,15 @@ class Scheduler { static function scheduleSubscriberWelcomeNotification($subscriber_id, $segments) { $newsletters = self::getNewsletters(Newsletter::TYPE_WELCOME); if(empty($newsletters)) return false; + $result = array(); foreach($newsletters as $newsletter) { if($newsletter->event === 'segment' && in_array($newsletter->segment, $segments) ) { - self::createWelcomeNotificationSendingTask($newsletter, $subscriber_id); + $result[] = self::createWelcomeNotificationSendingTask($newsletter, $subscriber_id); } } + return $result; } static function scheduleAutomaticEmail($group, $event, $scheduling_condition = false, $subscriber_id = false, $meta = false) { @@ -233,4 +235,4 @@ class Scheduler { static function formatDatetimeString($datetime_string) { return Carbon::parse($datetime_string)->format('Y-m-d H:i:s'); } -} \ No newline at end of file +} diff --git a/lib/Router/Endpoints/CronDaemon.php b/lib/Router/Endpoints/CronDaemon.php index 626e82c010..f99f872af8 100644 --- a/lib/Router/Endpoints/CronDaemon.php +++ b/lib/Router/Endpoints/CronDaemon.php @@ -40,4 +40,4 @@ class CronDaemon { $queue = new Daemon(); $queue->ping(); } -} \ No newline at end of file +} diff --git a/tests/unit/API/MP/APITest.php b/tests/unit/API/MP/APITest.php index 95fb312198..1966e3d393 100644 --- a/tests/unit/API/MP/APITest.php +++ b/tests/unit/API/MP/APITest.php @@ -2,13 +2,16 @@ namespace MailPoet\Test\API\MP; +use AspectMock\Test as Mock; use Codeception\Util\Fixtures; use Codeception\Util\Stub; use MailPoet\API\API; use MailPoet\Models\CustomField; +use MailPoet\Models\ScheduledTask; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; +use MailPoet\Tasks\Sending; class APITest extends \MailPoetTest { const VERSION = 'v1'; @@ -298,6 +301,12 @@ class APITest extends \MailPoetTest { } function testItSubscribesToSegmentsWhenAddingSubscriber() { + $API = Stub::makeEmptyExcept( + new \MailPoet\API\MP\v1\API(), + 'addSubscriber', + array( + '_sendConfirmationEmail' => Stub::once() + ), $this); $segment = Segment::createOrUpdate( array( 'name' => 'Default', @@ -308,7 +317,7 @@ class APITest extends \MailPoetTest { 'email' => 'test@example.com' ); - $result = API::MP(self::VERSION)->addSubscriber($subscriber, array($segment->id)); + $result = $API->addSubscriber($subscriber, array($segment->id)); expect($result['id'])->greaterThan(0); expect($result['email'])->equals($subscriber['email']); expect($result['subscriptions'][0]['segment_id'])->equals($segment->id); @@ -329,6 +338,30 @@ class APITest extends \MailPoetTest { $API->addSubscriber($subscriber, $segments); } + function testItThrowsIfWelcomeEmailFails() { + $task = ScheduledTask::create(); + $task->type = 'sending'; + $task->setError("Big Error"); + $sendingStub = Sending::create($task, SendingQueue::create()); + Mock::double('MailPoet\Newsletter\Scheduler\Scheduler', array( + 'scheduleSubscriberWelcomeNotification' => array($sendingStub), + )); + $segment = Segment::createOrUpdate( + array( + 'name' => 'Default', + 'type' => Segment::TYPE_DEFAULT + ) + ); + $API = new \MailPoet\API\MP\v1\API(); + $subscriber = array( + 'email' => 'test@example.com', + 'status' => Subscriber::STATUS_SUBSCRIBED + ); + $segments = array($segment->id()); + $this->setExpectedException('\Exception'); + $API->addSubscriber($subscriber, $segments, array('schedule_welcome_email' => true, 'send_confirmation_email' => false)); + } + function testItDoesNotScheduleWelcomeNotificationAfterAddingSubscriberIfStatusIsNotSubscribed() { $API = Stub::makeEmptyExcept( new \MailPoet\API\MP\v1\API(), @@ -373,6 +406,29 @@ class APITest extends \MailPoetTest { $API->addSubscriber($subscriber, $segments); } + function testItThrowsWhenConfirmationEmailFailsToSend() { + $API = Stub::makeEmptyExcept( + new \MailPoet\API\MP\v1\API(), + 'addSubscriber', + array( + '_sendConfirmationEmail' => function($subscriber) { + $subscriber->setError('Big Error'); + return false; + }, + ), $this); + $segment = Segment::createOrUpdate( + array( + 'name' => 'Default', + 'type' => Segment::TYPE_DEFAULT + ) + ); + $subscriber = array( + 'email' => 'test@example.com' + ); + $this->setExpectedException('\Exception', 'Subscriber added, but confirmation email failed to send: big error'); + $API->addSubscriber($subscriber, array($segment->id), array('send_confirmation_email' => true)); + } + function testItDoesNotSendConfirmationEmailAfterAddingSubscriberWhenOptionIsSet() { $API = Stub::makeEmptyExcept( new \MailPoet\API\MP\v1\API(), @@ -562,6 +618,7 @@ class APITest extends \MailPoetTest { } function _after() { + Mock::clean(); \ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); \ORM::raw_execute('TRUNCATE ' . CustomField::$_table); \ORM::raw_execute('TRUNCATE ' . Segment::$_table); diff --git a/tests/unit/Newsletter/Scheduler/SchedulerTest.php b/tests/unit/Newsletter/Scheduler/SchedulerTest.php index c278f43bb8..da02fd679d 100644 --- a/tests/unit/Newsletter/Scheduler/SchedulerTest.php +++ b/tests/unit/Newsletter/Scheduler/SchedulerTest.php @@ -250,7 +250,7 @@ class SchedulerTest extends \MailPoetTest { ); // queue is created and scheduled for delivery one day later - Scheduler::scheduleSubscriberWelcomeNotification( + $result = Scheduler::scheduleSubscriberWelcomeNotification( $subscriber_id = 10, $segments = array( 3, @@ -263,6 +263,7 @@ class SchedulerTest extends \MailPoetTest { ->findOne(); expect(Carbon::parse($queue->scheduled_at)->format('Y-m-d H:i')) ->equals($current_time->addDay()->format('Y-m-d H:i')); + expect($result[0]->id())->equals($queue->id()); } function itDoesNotScheduleAnythingWhenNewsletterDoesNotExist() { @@ -795,4 +796,4 @@ class SchedulerTest extends \MailPoetTest { \ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table); \ORM::raw_execute('TRUNCATE ' . Subscriber::$_table); } -} \ No newline at end of file +} From 3290df3bb8eb3eee141be1a537bfb6101ad179ec Mon Sep 17 00:00:00 2001 From: "Fred. P" Date: Tue, 12 Jun 2018 14:12:11 +0200 Subject: [PATCH 41/89] Broken woocommerce mail thumbnails [MAILPOET-1414] --- assets/css/src/box.styl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/assets/css/src/box.styl b/assets/css/src/box.styl index 14ef074e16..181fcfb3c5 100644 --- a/assets/css/src/box.styl +++ b/assets/css/src/box.styl @@ -96,6 +96,7 @@ $box-description-font-size = $box-description-line-height height: auto width: 100% +.woocommerce .mailpoet_thumbnail, .mailpoet_boxes .mailpoet_newsletter_types .mailpoet_thumbnail border: 1px solid #ccc width: $box-height @@ -146,6 +147,11 @@ $box-description-font-size = $box-description-line-height border-radius: 3px; transition: opacity .1s ease-in-out; +.mailpoet_boxes.woocommerce .mailpoet_description + h3 + font-size: 17px + line-height: 1.2 + .mailpoet_boxes .mailpoet_description float:left width: 258px From 7e843b5fdf51cf011f1bddbf53aae6b77850c3b1 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Tue, 12 Jun 2018 14:57:17 +0100 Subject: [PATCH 42/89] Show a survey on plugin deactivation [MAILPOET-1386] --- lib/Config/DeactivationSurvey.php | 51 +++++++++++++++++++++++++++++ lib/Config/Initializer.php | 6 ++++ views/deactivationSurvey/css.html | 34 +++++++++++++++++++ views/deactivationSurvey/index.html | 11 +++++++ views/deactivationSurvey/js.html | 27 +++++++++++++++ 5 files changed, 129 insertions(+) create mode 100644 lib/Config/DeactivationSurvey.php create mode 100644 views/deactivationSurvey/css.html create mode 100644 views/deactivationSurvey/index.html create mode 100644 views/deactivationSurvey/js.html diff --git a/lib/Config/DeactivationSurvey.php b/lib/Config/DeactivationSurvey.php new file mode 100644 index 0000000000..28a06cbb00 --- /dev/null +++ b/lib/Config/DeactivationSurvey.php @@ -0,0 +1,51 @@ +renderer = $renderer; + } + + public function init() { + add_action('admin_print_scripts', array($this, 'js'), 20); + add_action('admin_print_scripts', array($this, 'css')); + add_action('admin_footer', array($this, 'modal')); + } + + private function shouldShow() { + if(!function_exists('get_current_screen')) { + return false; + } + $screen = get_current_screen(); + if(!is_object($screen)) { + return false; + } + return (in_array(get_current_screen()->id, array('plugins', 'plugins-network'), true)); + } + + public function js() { + if(!$this->shouldShow()) { + return; + } + echo $this->renderer->render('deactivationSurvey/js.html'); + } + + public function css() { + if(!$this->shouldShow()) { + return; + } + echo $this->renderer->render('deactivationSurvey/css.html'); + } + + public function modal() { + if(!$this->shouldShow()) { + return; + } + echo $this->renderer->render('deactivationSurvey/index.html'); + } +} diff --git a/lib/Config/Initializer.php b/lib/Config/Initializer.php index b8e662c91e..8d9a31ae57 100644 --- a/lib/Config/Initializer.php +++ b/lib/Config/Initializer.php @@ -145,6 +145,7 @@ class Initializer { $this->setupPages(); $this->setupPHPVersionWarnings(); + $this->setupDeactivationSurvey(); do_action('mailpoet_initialized', MAILPOET_VERSION); } catch(\Exception $e) { @@ -301,4 +302,9 @@ class Initializer { } return WPNotice::displayError($exception); } + + function setupDeactivationSurvey() { + $survey = new DeactivationSurvey($this->renderer); + $survey->init(); + } } diff --git a/views/deactivationSurvey/css.html b/views/deactivationSurvey/css.html new file mode 100644 index 0000000000..3c11057df9 --- /dev/null +++ b/views/deactivationSurvey/css.html @@ -0,0 +1,34 @@ + diff --git a/views/deactivationSurvey/index.html b/views/deactivationSurvey/index.html new file mode 100644 index 0000000000..2e22919d2f --- /dev/null +++ b/views/deactivationSurvey/index.html @@ -0,0 +1,11 @@ + diff --git a/views/deactivationSurvey/js.html b/views/deactivationSurvey/js.html new file mode 100644 index 0000000000..64c8921592 --- /dev/null +++ b/views/deactivationSurvey/js.html @@ -0,0 +1,27 @@ + From 0545e48f8ed6c87d4340b010f93ec5829d9dd336 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Tue, 12 Jun 2018 17:09:26 +0200 Subject: [PATCH 43/89] Updates changelog and bumps up release version --- mailpoet.php | 4 +- package-lock.json | 2177 +++++++++++++++++++++++---------------------- readme.txt | 10 +- 3 files changed, 1100 insertions(+), 1091 deletions(-) diff --git a/mailpoet.php b/mailpoet.php index 24b5dd8533..813bd4f1aa 100644 --- a/mailpoet.php +++ b/mailpoet.php @@ -4,7 +4,7 @@ if(!defined('ABSPATH')) exit; /* * Plugin Name: MailPoet 3 (New) - * Version: 3.7.5 + * Version: 3.7.6 * Plugin URI: http://www.mailpoet.com * Description: Create and send newsletters, post notifications and welcome emails from your WordPress. * Author: MailPoet @@ -20,7 +20,7 @@ if(!defined('ABSPATH')) exit; */ $mailpoet_plugin = array( - 'version' => '3.7.5', + 'version' => '3.7.6', 'filename' => __FILE__, 'path' => dirname(__FILE__), 'autoloader' => dirname(__FILE__) . '/vendor/autoload.php', diff --git a/package-lock.json b/package-lock.json index 8e85822b47..d5b7ccea48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "dev": true }, "WP-JS-Hooks": { - "version": "github:carldanley/WP-JS-Hooks#36b53ee6a56de37849456b67205c9784a00118b1" + "version": "github:carldanley/WP-JS-Hooks#36b53ee6a56de37849456b67205c9784a00118b1", + "from": "github:carldanley/WP-JS-Hooks" }, "abab": { "version": "1.0.4", @@ -35,7 +36,7 @@ "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "dev": true, "requires": { - "acorn": "5.5.3" + "acorn": "^5.0.0" }, "dependencies": { "acorn": { @@ -52,7 +53,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -69,8 +70,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ajv-keywords": { @@ -84,9 +85,9 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "almond": { @@ -100,7 +101,7 @@ "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", "dev": true, "requires": { - "stable": "0.1.6" + "stable": "~0.1.3" } }, "amd-inject-loader": { @@ -138,8 +139,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "argparse": { @@ -148,7 +149,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "aria-query": { @@ -166,7 +167,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -193,8 +194,8 @@ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-union": { @@ -203,7 +204,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -241,9 +242,9 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -335,9 +336,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -346,52 +347,52 @@ "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", "dev": true, "requires": { - "babel-plugin-constant-folding": "1.0.1", - "babel-plugin-dead-code-elimination": "1.0.2", - "babel-plugin-eval": "1.0.1", - "babel-plugin-inline-environment-variables": "1.0.1", - "babel-plugin-jscript": "1.0.4", - "babel-plugin-member-expression-literals": "1.0.1", - "babel-plugin-property-literals": "1.0.1", - "babel-plugin-proto-to-assign": "1.0.4", - "babel-plugin-react-constant-elements": "1.0.3", - "babel-plugin-react-display-name": "1.0.3", - "babel-plugin-remove-console": "1.0.1", - "babel-plugin-remove-debugger": "1.0.1", - "babel-plugin-runtime": "1.0.7", - "babel-plugin-undeclared-variables-check": "1.0.2", - "babel-plugin-undefined-to-void": "1.1.6", - "babylon": "5.8.38", - "bluebird": "2.11.0", - "chalk": "1.1.3", - "convert-source-map": "1.5.0", - "core-js": "1.2.7", - "debug": "2.6.9", - "detect-indent": "3.0.1", - "esutils": "2.0.2", - "fs-readdir-recursive": "0.1.2", - "globals": "6.4.1", - "home-or-tmp": "1.0.0", - "is-integer": "1.0.7", + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", "js-tokens": "1.0.1", - "json5": "0.4.0", - "lodash": "3.10.1", - "minimatch": "2.0.10", - "output-file-sync": "1.1.2", - "path-exists": "1.0.0", - "path-is-absolute": "1.0.1", - "private": "0.1.8", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", "regenerator": "0.8.40", - "regexpu": "1.3.0", - "repeating": "1.1.3", - "resolve": "1.4.0", - "shebang-regex": "1.0.0", - "slash": "1.0.0", - "source-map": "0.5.7", - "source-map-support": "0.2.10", - "to-fast-properties": "1.0.3", - "trim-right": "1.0.1", - "try-resolve": "1.0.1" + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" }, "dependencies": { "js-tokens": { @@ -414,9 +415,9 @@ "integrity": "sha1-d/4o2OYNDwVrHBvKJbhJTNqrnHY=", "dev": true, "requires": { - "babel-core": "5.8.38", - "loader-utils": "0.2.17", - "object-assign": "3.0.0" + "babel-core": "^5.4.0", + "loader-utils": "^0.2.9", + "object-assign": "^3.0.0" }, "dependencies": { "object-assign": { @@ -475,7 +476,7 @@ "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", "dev": true, "requires": { - "lodash": "3.10.1" + "lodash": "^3.9.3" } }, "babel-plugin-react-constant-elements": { @@ -514,7 +515,7 @@ "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", "dev": true, "requires": { - "leven": "1.0.2" + "leven": "^1.0.2" } }, "babel-plugin-undefined-to-void": { @@ -534,7 +535,7 @@ "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz", "integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=", "requires": { - "underscore": "1.8.3" + "underscore": ">=1.8.3" } }, "backbone.marionette": { @@ -542,7 +543,7 @@ "resolved": "https://registry.npmjs.org/backbone.marionette/-/backbone.marionette-3.2.0.tgz", "integrity": "sha1-yY0UaYQ0TsZFMQOsf6GYcFnjjeE=", "requires": { - "backbone.radio": "2.0.0" + "backbone.radio": "^2.0.0" } }, "backbone.radio": { @@ -555,8 +556,8 @@ "resolved": "https://registry.npmjs.org/backbone.supermodel/-/backbone.supermodel-1.2.0.tgz", "integrity": "sha1-a/BpwjqvDMtjtkupMj+J00oNEZQ=", "requires": { - "backbone": "1.1.2", - "underscore": "1.5.2" + "backbone": "~1.1.0", + "underscore": "~1.5.2" }, "dependencies": { "backbone": { @@ -564,7 +565,7 @@ "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.1.2.tgz", "integrity": "sha1-wsBMZr+HJo+4LBd6zr7/fTe6by0=", "requires": { - "underscore": "1.5.2" + "underscore": ">=1.5.0" } }, "underscore": { @@ -598,7 +599,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "big.js": { @@ -636,7 +637,7 @@ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "brace-expansion": { @@ -645,7 +646,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -655,9 +656,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "breakable": { @@ -684,12 +685,12 @@ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -698,9 +699,9 @@ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -709,9 +710,9 @@ "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { @@ -720,8 +721,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -730,13 +731,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -745,7 +746,7 @@ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", "dev": true, "requires": { - "pako": "0.2.9" + "pako": "~0.2.0" } }, "buffer": { @@ -754,9 +755,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-xor": { @@ -783,7 +784,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -808,8 +809,8 @@ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chai": { @@ -834,11 +835,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "charenc": { @@ -853,15 +854,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "cipher-base": { @@ -870,8 +871,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "circular-json": { @@ -891,7 +892,7 @@ "integrity": "sha512-M1Li5yLHECcN2MahoreuODul5LkjohJGFxLPTjl3j1ttKrF5rgjZET1SJduuqxLAuT1gAPOdkhg03qcaaU1KeA==", "dev": true, "requires": { - "rimraf": "2.6.2" + "rimraf": "^2.6.1" } }, "cli-cursor": { @@ -900,7 +901,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-width": { @@ -914,8 +915,8 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -955,7 +956,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -970,15 +971,15 @@ "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", "dev": true, "requires": { - "commander": "2.11.0", - "detective": "4.5.0", - "glob": "5.0.15", - "graceful-fs": "4.1.11", - "iconv-lite": "0.4.19", - "mkdirp": "0.5.1", - "private": "0.1.8", - "q": "1.5.1", - "recast": "0.11.23" + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" }, "dependencies": { "esprima": { @@ -994,9 +995,9 @@ "dev": true, "requires": { "ast-types": "0.9.6", - "esprima": "3.1.3", - "private": "0.1.8", - "source-map": "0.5.7" + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" } }, "source-map": { @@ -1019,9 +1020,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "console-browserify": { @@ -1030,7 +1031,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -1067,8 +1068,8 @@ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -1077,11 +1078,11 @@ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -1090,12 +1091,12 @@ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.1", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "create-react-class": { @@ -1103,9 +1104,9 @@ "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "cross-env": { @@ -1114,8 +1115,8 @@ "integrity": "sha512-GSiNTbvTU3pXzewRKGP0Y+rVP2CzifY2pqSEdtHzLLj41pRdkrgY7e4uSnBoR/pmYaqZr/lwwjg/Q4kNX30hWQ==", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "is-windows": "1.0.2" + "cross-spawn": "^5.1.0", + "is-windows": "^1.0.0" } }, "cross-spawn": { @@ -1124,9 +1125,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypt": { @@ -1141,7 +1142,7 @@ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -1150,7 +1151,7 @@ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -1161,17 +1162,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "css-line-break": { @@ -1179,7 +1180,7 @@ "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-1.0.1.tgz", "integrity": "sha1-GfIGOjPpX7KDG4ZEbAuAwYivRQo=", "requires": { - "base64-arraybuffer": "0.1.5" + "base64-arraybuffer": "^0.1.5" } }, "css-parse": { @@ -1200,7 +1201,7 @@ "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "dev": true, "requires": { - "cssom": "0.3.2" + "cssom": "0.3.x" } }, "d": { @@ -1209,7 +1210,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.35" + "es5-ext": "^0.10.9" } }, "damerau-levenshtein": { @@ -1224,7 +1225,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "data-urls": { @@ -1233,9 +1234,9 @@ "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", "dev": true, "requires": { - "abab": "1.0.4", - "whatwg-mimetype": "2.1.0", - "whatwg-url": "6.4.1" + "abab": "^1.0.4", + "whatwg-mimetype": "^2.0.0", + "whatwg-url": "^6.4.0" } }, "date-now": { @@ -1284,8 +1285,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "defined": { @@ -1300,16 +1301,16 @@ "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", "dev": true, "requires": { - "alter": "0.2.0", - "ast-traverse": "0.1.1", - "breakable": "1.0.0", - "esprima-fb": "15001.1001.0-dev-harmony-fb", - "simple-fmt": "0.1.0", - "simple-is": "0.2.0", - "stringmap": "0.2.2", - "stringset": "0.2.1", - "tryor": "0.1.2", - "yargs": "3.27.0" + "alter": "~0.2.0", + "ast-traverse": "~0.1.1", + "breakable": "~1.0.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "simple-fmt": "~0.1.0", + "simple-is": "~0.2.0", + "stringmap": "~0.2.2", + "stringset": "~0.2.1", + "tryor": "~0.1.2", + "yargs": "~3.27.0" } }, "del": { @@ -1318,13 +1319,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -1339,8 +1340,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "detect-indent": { @@ -1349,9 +1350,9 @@ "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "minimist": "1.2.0", - "repeating": "1.1.3" + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" }, "dependencies": { "minimist": { @@ -1368,8 +1369,8 @@ "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", "dev": true, "requires": { - "acorn": "4.0.13", - "defined": "1.0.0" + "acorn": "^4.0.3", + "defined": "^1.0.0" } }, "diff": { @@ -1384,9 +1385,9 @@ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "doctrine": { @@ -1395,8 +1396,8 @@ "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, "dom-serializer": { @@ -1404,8 +1405,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -1432,7 +1433,7 @@ "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "webidl-conversions": "4.0.2" + "webidl-conversions": "^4.0.2" } }, "domhandler": { @@ -1440,7 +1441,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -1448,8 +1449,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "ecc-jsbn": { @@ -1459,7 +1460,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "elliptic": { @@ -1468,13 +1469,13 @@ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emoji-regex": { @@ -1494,7 +1495,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.13" } }, "enhanced-resolve": { @@ -1503,9 +1504,9 @@ "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.2.0", - "tapable": "0.1.10" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" } }, "entities": { @@ -1519,7 +1520,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -1528,7 +1529,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -1537,11 +1538,11 @@ "integrity": "sha1-aQgpoHyuNrIi5/2bdcDQVz6yUic=", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -1550,9 +1551,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es5-ext": { @@ -1561,8 +1562,8 @@ "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" } }, "es6-iterator": { @@ -1571,9 +1572,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -1582,12 +1583,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-set": { @@ -1596,11 +1597,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -1609,8 +1610,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -1619,10 +1620,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-string-regexp": { @@ -1637,11 +1638,11 @@ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "dev": true, "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { @@ -1665,10 +1666,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { @@ -1677,41 +1678,41 @@ "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.6.9", - "doctrine": "2.0.0", - "escope": "3.6.0", - "espree": "3.5.1", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.6", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.1", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" }, "dependencies": { "glob": { @@ -1720,12 +1721,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "globals": { @@ -1746,7 +1747,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "user-home": { @@ -1755,7 +1756,7 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } } } @@ -1766,7 +1767,7 @@ "integrity": "sha512-m0q9fiMBzDAIbirlGnpJNWToIhdhJmXXnMG+IFflYzzod9231ZhtmGKegKg8E9T8F1YuVaDSU1FnCm5b9iXVhQ==", "dev": true, "requires": { - "eslint-config-airbnb-base": "11.3.2" + "eslint-config-airbnb-base": "^11.3.0" } }, "eslint-config-airbnb-base": { @@ -1775,7 +1776,7 @@ "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", "dev": true, "requires": { - "eslint-restricted-globals": "0.1.1" + "eslint-restricted-globals": "^0.1.1" } }, "eslint-import-resolver-node": { @@ -1784,8 +1785,8 @@ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { - "debug": "2.6.9", - "resolve": "1.7.1" + "debug": "^2.6.9", + "resolve": "^1.5.0" }, "dependencies": { "resolve": { @@ -1794,7 +1795,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } } } @@ -1805,17 +1806,17 @@ "integrity": "sha512-b6JxR57ruiMxq2tIu4T/SrYED5RKJfeBEs8u3+JWF+O2RxDmFpUH84c5uS1T5qiP0K4r0SL7CXhvd41hXdDlAg==", "dev": true, "requires": { - "array-find": "1.0.0", - "debug": "2.6.9", - "enhanced-resolve": "0.9.1", - "find-root": "0.1.2", - "has": "1.0.1", - "interpret": "1.0.4", - "is-absolute": "0.2.6", - "lodash.get": "3.7.0", - "node-libs-browser": "2.1.0", - "resolve": "1.4.0", - "semver": "5.5.0" + "array-find": "^1.0.0", + "debug": "^2.6.8", + "enhanced-resolve": "~0.9.0", + "find-root": "^0.1.1", + "has": "^1.0.1", + "interpret": "^1.0.0", + "is-absolute": "^0.2.3", + "lodash.get": "^3.7.0", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.2.0", + "semver": "^5.3.0" } }, "eslint-module-utils": { @@ -1824,8 +1825,8 @@ "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "dev": true, "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" } }, "eslint-plugin-import": { @@ -1834,16 +1835,16 @@ "integrity": "sha1-Fa7qN6Z0mdhI6OmBgG1GJ7VQOBY=", "dev": true, "requires": { - "contains-path": "0.1.0", - "debug": "2.6.9", + "contains-path": "^0.1.0", + "debug": "^2.6.8", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.2.0", - "has": "1.0.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0", - "resolve": "1.7.1" + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" }, "dependencies": { "doctrine": { @@ -1852,8 +1853,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, "lodash": { @@ -1868,7 +1869,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "resolve": { @@ -1877,7 +1878,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } } } @@ -1888,13 +1889,13 @@ "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", "dev": true, "requires": { - "aria-query": "0.7.0", - "array-includes": "3.0.3", + "aria-query": "^0.7.0", + "array-includes": "^3.0.3", "ast-types-flow": "0.0.7", - "axobject-query": "0.1.0", - "damerau-levenshtein": "1.0.4", - "emoji-regex": "6.5.1", - "jsx-ast-utils": "1.4.1" + "axobject-query": "^0.1.0", + "damerau-levenshtein": "^1.0.0", + "emoji-regex": "^6.1.0", + "jsx-ast-utils": "^1.4.0" } }, "eslint-plugin-react": { @@ -1903,10 +1904,10 @@ "integrity": "sha512-H3ne8ob4Bn6NXSN9N9twsn7t8dyHT5bF/ibQepxIHi6JiPIdC2gXlfYvZYucbdrWio4FxBq7Z4mSauQP+qmMkQ==", "dev": true, "requires": { - "doctrine": "2.1.0", - "has": "1.0.1", - "jsx-ast-utils": "2.0.1", - "prop-types": "15.6.1" + "doctrine": "^2.0.2", + "has": "^1.0.1", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.0" }, "dependencies": { "doctrine": { @@ -1915,7 +1916,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "jsx-ast-utils": { @@ -1924,7 +1925,7 @@ "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "dev": true, "requires": { - "array-includes": "3.0.3" + "array-includes": "^3.0.3" } } } @@ -1941,8 +1942,8 @@ "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", "dev": true, "requires": { - "acorn": "5.1.2", - "acorn-jsx": "3.0.1" + "acorn": "^5.1.1", + "acorn-jsx": "^3.0.0" }, "dependencies": { "acorn": { @@ -1965,7 +1966,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -1974,8 +1975,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" } }, "estraverse": { @@ -1996,8 +1997,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "events": { @@ -2012,8 +2013,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "exit-hook": { @@ -2028,7 +2029,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -2037,7 +2038,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.4" + "fill-range": "^2.1.0" } }, "exports-loader": { @@ -2046,8 +2047,8 @@ "integrity": "sha1-1w/GEhl1s1/BKDDPUnVL4nQPyIY=", "dev": true, "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.7" + "loader-utils": "^1.0.2", + "source-map": "0.5.x" }, "dependencies": { "json5": { @@ -2062,9 +2063,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "source-map": { @@ -2093,7 +2094,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "extsprintf": { @@ -2125,13 +2126,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.17" + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.9" } }, "figures": { @@ -2140,8 +2141,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-entry-cache": { @@ -2150,8 +2151,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-saver": { @@ -2171,11 +2172,11 @@ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-root": { @@ -2190,8 +2191,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "path-exists": { @@ -2200,7 +2201,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } } } @@ -2211,7 +2212,7 @@ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", "dev": true, "requires": { - "glob": "5.0.15" + "glob": "~5.0.0" } }, "flat-cache": { @@ -2220,10 +2221,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "for-in": { @@ -2238,7 +2239,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -2259,9 +2260,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "formatio": { @@ -2270,7 +2271,7 @@ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", "dev": true, "requires": { - "samsam": "1.1.3" + "samsam": "~1.1" } }, "fs-extra": { @@ -2279,11 +2280,11 @@ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, "fs-readdir-recursive": { @@ -2305,8 +2306,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.6.39" + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" }, "dependencies": { "abbrev": { @@ -2321,8 +2322,8 @@ "dev": true, "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { @@ -2342,8 +2343,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -2387,7 +2388,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { @@ -2395,7 +2396,7 @@ "bundled": true, "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { @@ -2403,7 +2404,7 @@ "bundled": true, "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { @@ -2411,7 +2412,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" } }, @@ -2442,7 +2443,7 @@ "bundled": true, "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -2465,7 +2466,7 @@ "bundled": true, "dev": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { @@ -2474,7 +2475,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2523,7 +2524,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -2549,9 +2550,9 @@ "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fs.realpath": { @@ -2564,10 +2565,10 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -2576,9 +2577,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { @@ -2587,14 +2588,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "getpass": { @@ -2603,7 +2604,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2619,12 +2620,12 @@ "bundled": true, "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-fs": { @@ -2644,8 +2645,8 @@ "dev": true, "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has-unicode": { @@ -2659,10 +2660,10 @@ "bundled": true, "dev": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -2676,9 +2677,9 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { @@ -2686,8 +2687,8 @@ "bundled": true, "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2706,7 +2707,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-typedarray": { @@ -2732,7 +2733,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "jsbn": { @@ -2753,7 +2754,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -2798,7 +2799,7 @@ "bundled": true, "dev": true, "requires": { - "mime-db": "1.27.0" + "mime-db": "~1.27.0" } }, "minimatch": { @@ -2806,7 +2807,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "1.1.7" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -2834,17 +2835,17 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { @@ -2853,8 +2854,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -2863,10 +2864,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -2891,7 +2892,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -2912,8 +2913,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -2950,10 +2951,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -2969,13 +2970,13 @@ "bundled": true, "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "request": { @@ -2984,28 +2985,28 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { @@ -3013,7 +3014,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -3044,7 +3045,7 @@ "bundled": true, "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { @@ -3053,15 +3054,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -3077,9 +3078,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -3087,7 +3088,7 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "stringstream": { @@ -3101,7 +3102,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3115,9 +3116,9 @@ "bundled": true, "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -3126,14 +3127,14 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { @@ -3142,7 +3143,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -3151,7 +3152,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -3192,7 +3193,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -3220,7 +3221,7 @@ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.0" } }, "get-stdin": { @@ -3235,7 +3236,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -3244,11 +3245,11 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -3257,8 +3258,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -3267,7 +3268,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "globals": { @@ -3282,12 +3283,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "glob": { @@ -3296,12 +3297,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "minimatch": { @@ -3310,7 +3311,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -3333,10 +3334,10 @@ "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", "dev": true, "requires": { - "findup-sync": "0.3.0", - "grunt-known-options": "1.1.0", - "nopt": "3.0.6", - "resolve": "1.1.7" + "findup-sync": "~0.3.0", + "grunt-known-options": "~1.1.0", + "nopt": "~3.0.6", + "resolve": "~1.1.0" }, "dependencies": { "resolve": { @@ -3358,10 +3359,10 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "source-map": { @@ -3369,7 +3370,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -3386,8 +3387,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" }, "dependencies": { "ajv": { @@ -3396,10 +3397,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } } } @@ -3410,7 +3411,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -3419,7 +3420,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -3434,8 +3435,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -3444,8 +3445,8 @@ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "hawk": { @@ -3454,10 +3455,10 @@ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "history": { @@ -3465,10 +3466,10 @@ "resolved": "https://registry.npmjs.org/history/-/history-1.13.1.tgz", "integrity": "sha1-HQZk5mfwMdV1fvc+ge+Ee+s67c0=", "requires": { - "deep-equal": "1.0.1", - "invariant": "2.2.2", - "qs": "4.0.0", - "warning": "2.1.0" + "deep-equal": "^1.0.0", + "invariant": "^2.0.0", + "qs": "^4.0.0", + "warning": "^2.0.0" } }, "hmac-drbg": { @@ -3477,9 +3478,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -3499,8 +3500,8 @@ "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", "dev": true, "requires": { - "os-tmpdir": "1.0.2", - "user-home": "1.1.1" + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" } }, "hosted-git-info": { @@ -3515,7 +3516,7 @@ "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "html2canvas": { @@ -3531,12 +3532,12 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.1", - "domutils": "1.6.2", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, "http-browserify": { @@ -3545,8 +3546,8 @@ "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", "dev": true, "requires": { - "Base64": "0.2.1", - "inherits": "2.0.3" + "Base64": "~0.2.0", + "inherits": "~2.0.1" } }, "http-signature": { @@ -3555,9 +3556,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -3589,8 +3590,8 @@ "integrity": "sha1-8gS180cCoywdt9SNidXoZ6BEElM=", "dev": true, "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.7" + "loader-utils": "^1.0.2", + "source-map": "^0.5.6" }, "dependencies": { "json5": { @@ -3605,9 +3606,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "source-map": { @@ -3636,8 +3637,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3651,19 +3652,19 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" }, "dependencies": { "lodash": { @@ -3690,7 +3691,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -3705,8 +3706,8 @@ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "dev": true, "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" }, "dependencies": { "is-windows": { @@ -3729,7 +3730,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -3743,7 +3744,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { @@ -3770,7 +3771,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -3791,7 +3792,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -3800,7 +3801,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -3809,7 +3810,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-integer": { @@ -3818,7 +3819,7 @@ "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "is-my-json-valid": { @@ -3827,10 +3828,10 @@ "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-number": { @@ -3839,7 +3840,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-path-cwd": { @@ -3854,7 +3855,7 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "1.0.0" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -3863,7 +3864,7 @@ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-posix-bracket": { @@ -3890,7 +3891,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-relative": { @@ -3899,7 +3900,7 @@ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "dev": true, "requires": { - "is-unc-path": "0.1.2" + "is-unc-path": "^0.1.1" } }, "is-resolvable": { @@ -3908,7 +3909,7 @@ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "tryit": "1.0.3" + "tryit": "^1.0.1" } }, "is-stream": { @@ -3934,7 +3935,7 @@ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "dev": true, "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.0" } }, "is-windows": { @@ -3968,8 +3969,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" } }, "isstream": { @@ -4023,8 +4024,8 @@ "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "dependencies": { "esprima": { @@ -4048,32 +4049,32 @@ "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", "dev": true, "requires": { - "abab": "1.0.4", - "acorn": "5.5.3", - "acorn-globals": "4.1.0", - "array-equal": "1.0.0", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "data-urls": "1.0.0", - "domexception": "1.0.1", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "left-pad": "1.3.0", - "nwmatcher": "1.4.4", + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", "parse5": "4.0.0", - "pn": "1.1.0", - "request": "2.86.0", - "request-promise-native": "1.0.5", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "w3c-hr-time": "1.0.1", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-mimetype": "2.1.0", - "whatwg-url": "6.4.1", - "ws": "4.1.0", - "xml-name-validator": "3.0.0" + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { @@ -4120,7 +4121,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -4141,7 +4142,7 @@ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -4179,7 +4180,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } }, "klaw": { @@ -4188,7 +4189,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "lazy-cache": { @@ -4202,7 +4203,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "left-pad": { @@ -4223,8 +4224,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "load-json-file": { @@ -4233,10 +4234,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "loader-utils": { @@ -4245,10 +4246,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" }, "dependencies": { "json5": { @@ -4265,8 +4266,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -4295,7 +4296,7 @@ "integrity": "sha1-PsXiYGAU9MuX91X+aRTt2L/ADqw=", "dev": true, "requires": { - "lodash.isarray": "3.0.4" + "lodash.isarray": "^3.0.0" } }, "lodash.escaperegexp": { @@ -4314,8 +4315,8 @@ "integrity": "sha1-POaK4skWg7KBzFOUEoMDy/deaR8=", "dev": true, "requires": { - "lodash._baseget": "3.7.2", - "lodash._topath": "3.8.1" + "lodash._baseget": "^3.0.0", + "lodash._topath": "^3.0.0" } }, "lodash.isarray": { @@ -4356,7 +4357,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lru-cache": { @@ -4365,8 +4366,8 @@ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "math-random": { @@ -4381,9 +4382,9 @@ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", "dev": true, "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.5" + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" } }, "md5.js": { @@ -4392,8 +4393,8 @@ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "memory-fs": { @@ -4408,19 +4409,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "miller-rabin": { @@ -4429,8 +4430,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime-db": { @@ -4445,7 +4446,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "minimalistic-assert": { @@ -4466,7 +4467,7 @@ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.0.0" } }, "minimist": { @@ -4505,7 +4506,7 @@ "growl": "1.8.1", "jade": "0.26.3", "mkdirp": "0.5.0", - "supports-color": "1.2.1" + "supports-color": "~1.2.0" }, "dependencies": { "commander": { @@ -4535,9 +4536,9 @@ "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", "dev": true, "requires": { - "graceful-fs": "2.0.3", - "inherits": "2.0.3", - "minimatch": "0.2.14" + "graceful-fs": "~2.0.0", + "inherits": "2", + "minimatch": "~0.2.11" } }, "graceful-fs": { @@ -4558,8 +4559,8 @@ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "lru-cache": "2", + "sigmund": "~1.0.0" } }, "minimist": { @@ -4635,8 +4636,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "node-libs-browser": { @@ -4645,28 +4646,28 @@ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.8.2", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.10", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -4676,7 +4677,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "pako": { @@ -4691,7 +4692,7 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } } } @@ -4702,7 +4703,7 @@ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "normalize-package-data": { @@ -4711,10 +4712,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -4723,7 +4724,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "number-is-nan": { @@ -4761,8 +4762,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "once": { @@ -4771,7 +4772,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -4785,8 +4786,8 @@ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, "optionator": { @@ -4795,12 +4796,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" }, "dependencies": { "wordwrap": { @@ -4829,7 +4830,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -4844,9 +4845,9 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" } }, "p-limit": { @@ -4855,7 +4856,7 @@ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -4864,7 +4865,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -4890,11 +4891,11 @@ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-glob": { @@ -4903,10 +4904,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -4915,7 +4916,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse5": { @@ -4929,7 +4930,7 @@ "resolved": "https://registry.npmjs.org/parsleyjs/-/parsleyjs-2.8.1.tgz", "integrity": "sha1-oEq/kcIUZHXm1NVAS0WUCtb7uKQ=", "requires": { - "jquery": "3.3.1" + "jquery": ">=1.8.0" } }, "path-browserify": { @@ -4968,7 +4969,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "pbkdf2": { @@ -4977,11 +4978,11 @@ "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "dev": true, "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.1", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pbkdf2-compat": { @@ -5014,7 +5015,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -5023,7 +5024,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "pluralize": { @@ -5078,7 +5079,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "prop-types": { @@ -5086,9 +5087,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "prr": { @@ -5109,11 +5110,11 @@ "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { @@ -5138,8 +5139,8 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -5160,9 +5161,9 @@ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { @@ -5185,7 +5186,7 @@ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -5194,8 +5195,8 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "react": { @@ -5203,9 +5204,9 @@ "resolved": "https://registry.npmjs.org/react/-/react-15.4.2.tgz", "integrity": "sha1-QfeZGyYYU5K6m66WyIiefgGDl+8=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.4", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0" } }, "react-confirm-alert": { @@ -5218,9 +5219,9 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.4.2.tgz", "integrity": "sha1-AVNj8FsKH9Uq6e/dOgBg2QaVII8=", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.1", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.0" } }, "react-html-parser": { @@ -5228,7 +5229,7 @@ "resolved": "https://registry.npmjs.org/react-html-parser/-/react-html-parser-1.0.3.tgz", "integrity": "sha1-KDWPDMEe7jv0kPirbJwxvSyAZ5A=", "requires": { - "htmlparser2": "3.9.2" + "htmlparser2": "^3.9.0" } }, "react-router": { @@ -5236,13 +5237,13 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-3.0.5.tgz", "integrity": "sha1-w7eHN1gEWou8lWKu9P9LyMznwTY=", "requires": { - "create-react-class": "15.6.2", - "history": "3.3.0", - "hoist-non-react-statics": "1.2.0", - "invariant": "2.2.2", - "loose-envify": "1.3.1", - "prop-types": "15.6.1", - "warning": "3.0.0" + "create-react-class": "^15.5.1", + "history": "^3.0.0", + "hoist-non-react-statics": "^1.2.0", + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "prop-types": "^15.5.6", + "warning": "^3.0.0" }, "dependencies": { "history": { @@ -5250,10 +5251,10 @@ "resolved": "https://registry.npmjs.org/history/-/history-3.3.0.tgz", "integrity": "sha1-/O3M6PEpdTcVRdc1RhAzV5ptrpw=", "requires": { - "invariant": "2.2.2", - "loose-envify": "1.3.1", - "query-string": "4.3.4", - "warning": "3.0.0" + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "query-string": "^4.2.2", + "warning": "^3.0.0" } }, "warning": { @@ -5261,7 +5262,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } } } @@ -5271,10 +5272,10 @@ "resolved": "https://registry.npmjs.org/react-string-replace/-/react-string-replace-0.3.4.tgz", "integrity": "sha1-vxBm2xvzPCIhFh32sGtMIpDeYLc=", "requires": { - "lodash.escaperegexp": "4.1.2", - "lodash.flatten": "4.4.0", - "lodash.isregexp": "4.0.1", - "lodash.isstring": "4.0.1" + "lodash.escaperegexp": "^4.1.1", + "lodash.flatten": "^4.2.0", + "lodash.isregexp": "^4.0.1", + "lodash.isstring": "^4.0.1" } }, "react-tooltip": { @@ -5282,8 +5283,8 @@ "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-3.5.1.tgz", "integrity": "sha512-jbyNaG5EgC3YhlD1+UWtlN++tbfLMKy/dP+SKFKxlTXCqKelN2KJSqfSXJ4u5I5nhRmK4eD8BnU0vEBNhHzQGQ==", "requires": { - "classnames": "2.2.5", - "prop-types": "15.6.1" + "classnames": "^2.2.5", + "prop-types": "^15.6.0" } }, "read-pkg": { @@ -5292,9 +5293,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -5303,8 +5304,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { "find-up": { @@ -5313,7 +5314,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -5323,13 +5324,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -5338,10 +5339,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" }, "dependencies": { "minimatch": { @@ -5350,7 +5351,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -5361,8 +5362,8 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", "mute-stream": "0.0.5" } }, @@ -5373,9 +5374,9 @@ "dev": true, "requires": { "ast-types": "0.8.12", - "esprima-fb": "15001.1001.0-dev-harmony-fb", - "private": "0.1.8", - "source-map": "0.5.7" + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "source-map": "~0.5.0" }, "dependencies": { "ast-types": { @@ -5398,7 +5399,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "^1.1.6" } }, "regenerate": { @@ -5413,12 +5414,12 @@ "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", "dev": true, "requires": { - "commoner": "0.10.8", - "defs": "1.1.1", - "esprima-fb": "15001.1001.0-dev-harmony-fb", - "private": "0.1.8", + "commoner": "~0.10.3", + "defs": "~1.1.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", "recast": "0.10.33", - "through": "2.3.8" + "through": "~2.3.8" } }, "regex-cache": { @@ -5427,7 +5428,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regexpu": { @@ -5436,11 +5437,11 @@ "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", "dev": true, "requires": { - "esprima": "2.7.3", - "recast": "0.10.33", - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "esprima": "^2.6.0", + "recast": "^0.10.10", + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" }, "dependencies": { "esprima": { @@ -5463,7 +5464,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } }, "remove-trailing-separator": { @@ -5489,7 +5490,7 @@ "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -5498,27 +5499,27 @@ "integrity": "sha512-BQZih67o9r+Ys94tcIW4S7Uu8pthjrQVxhsZ/weOwHbDfACxvIyvnAbzFQxjy1jMtvFSzv5zf4my6cZsJBbVzw==", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.1", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" }, "dependencies": { "qs": { @@ -5535,7 +5536,7 @@ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.13.1" }, "dependencies": { "lodash": { @@ -5553,8 +5554,8 @@ "dev": true, "requires": { "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.4" + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" } }, "require-uncached": { @@ -5563,8 +5564,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve": { @@ -5573,7 +5574,7 @@ "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-from": { @@ -5588,8 +5589,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "right-align": { @@ -5597,7 +5598,7 @@ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -5606,7 +5607,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" }, "dependencies": { "glob": { @@ -5615,12 +5616,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "minimatch": { @@ -5629,7 +5630,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -5640,8 +5641,8 @@ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-async": { @@ -5650,7 +5651,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.3.0" } }, "rx-lite": { @@ -5681,8 +5682,8 @@ "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.5.tgz", "integrity": "sha1-eqxQaSVhmFs007guxV4ib4lg1Ao=", "requires": { - "almond": "0.3.3", - "jquery-mousewheel": "3.1.13" + "almond": "~0.3.1", + "jquery-mousewheel": "~3.1.13" } }, "semver": { @@ -5708,8 +5709,8 @@ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shebang-command": { @@ -5718,7 +5719,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -5733,9 +5734,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.0.4", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" }, "dependencies": { "glob": { @@ -5744,12 +5745,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "minimatch": { @@ -5758,7 +5759,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -5789,7 +5790,7 @@ "requires": { "formatio": "1.1.1", "lolex": "1.1.0", - "util": "0.10.3" + "util": ">=0.10.3 <1" } }, "sinon-chai": { @@ -5816,7 +5817,7 @@ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "source-list-map": { @@ -5831,7 +5832,7 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } }, "source-map-support": { @@ -5849,7 +5850,7 @@ "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -5860,8 +5861,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -5876,8 +5877,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -5903,14 +5904,14 @@ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "stable": { @@ -5931,8 +5932,8 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { @@ -5941,11 +5942,11 @@ "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" }, "dependencies": { "process-nextick-args": { @@ -5960,13 +5961,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -5975,7 +5976,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -5991,9 +5992,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -6001,7 +6002,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringmap": { @@ -6022,7 +6023,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -6043,12 +6044,12 @@ "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", "dev": true, "requires": { - "css-parse": "1.7.0", - "debug": "2.6.9", - "glob": "7.0.6", - "mkdirp": "0.5.1", - "sax": "0.5.8", - "source-map": "0.1.43" + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" }, "dependencies": { "glob": { @@ -6057,12 +6058,12 @@ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "minimatch": { @@ -6071,7 +6072,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -6094,12 +6095,12 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", "slice-ansi": "0.0.4", - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -6126,8 +6127,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -6136,7 +6137,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -6165,7 +6166,7 @@ "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", "dev": true, "requires": { - "process": "0.11.10" + "process": "~0.11.0" } }, "tinymce": { @@ -6191,7 +6192,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tr46": { @@ -6200,7 +6201,7 @@ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { @@ -6247,7 +6248,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -6263,7 +6264,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -6289,9 +6290,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "source-map": { @@ -6312,9 +6313,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -6394,8 +6395,8 @@ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "velocity-animate": { @@ -6403,7 +6404,7 @@ "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.2.3.tgz", "integrity": "sha1-+LfGb++c/VrPpgXN8K3KjjAttyg=", "requires": { - "jquery": "3.2.1" + "jquery": ">= 1.4.3" }, "dependencies": { "jquery": { @@ -6419,9 +6420,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "vm-browserify": { @@ -6439,7 +6440,7 @@ "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "dev": true, "requires": { - "browser-process-hrtime": "0.1.2" + "browser-process-hrtime": "^0.1.2" } }, "warning": { @@ -6447,7 +6448,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz", "integrity": "sha1-ISINnGOvx3qMkhEeARr3Bc4MaQE=", "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "watchpack": { @@ -6456,9 +6457,9 @@ "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", "dev": true, "requires": { - "async": "0.9.2", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" + "async": "^0.9.0", + "chokidar": "^1.0.0", + "graceful-fs": "^4.1.2" }, "dependencies": { "async": { @@ -6481,21 +6482,21 @@ "integrity": "sha1-KgMdZhiYOcxcvyxo+AVm2i4U/04=", "dev": true, "requires": { - "async": "1.5.2", - "clone": "1.0.4", - "enhanced-resolve": "0.9.1", - "esprima": "2.7.3", - "interpret": "0.6.6", - "loader-utils": "0.2.17", - "memory-fs": "0.3.0", - "mkdirp": "0.5.1", - "node-libs-browser": "0.6.0", - "optimist": "0.6.1", - "supports-color": "3.2.3", - "tapable": "0.1.10", - "uglify-js": "2.6.4", - "watchpack": "0.2.9", - "webpack-core": "0.6.9" + "async": "^1.3.0", + "clone": "^1.0.2", + "enhanced-resolve": "~0.9.0", + "esprima": "^2.5.0", + "interpret": "^0.6.4", + "loader-utils": "^0.2.11", + "memory-fs": "~0.3.0", + "mkdirp": "~0.5.0", + "node-libs-browser": ">= 0.4.0 <=0.6.0", + "optimist": "~0.6.0", + "supports-color": "^3.1.0", + "tapable": "~0.1.8", + "uglify-js": "~2.6.0", + "watchpack": "^0.2.1", + "webpack-core": "~0.6.0" }, "dependencies": { "constants-browserify": { @@ -6545,8 +6546,8 @@ "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "node-libs-browser": { @@ -6555,28 +6556,28 @@ "integrity": "sha1-JEgG1E0xngSLyGB7XMTq+aKdLjw=", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", + "assert": "^1.1.1", + "browserify-zlib": "~0.1.4", + "buffer": "^4.9.0", + "console-browserify": "^1.1.0", "constants-browserify": "0.0.1", - "crypto-browserify": "3.2.8", - "domain-browser": "1.1.7", - "events": "1.1.1", - "http-browserify": "1.7.0", + "crypto-browserify": "~3.2.6", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "http-browserify": "^1.3.2", "https-browserify": "0.0.0", - "os-browserify": "0.1.2", + "os-browserify": "~0.1.2", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "1.1.14", - "stream-browserify": "1.0.0", - "string_decoder": "0.10.31", - "timers-browserify": "1.4.2", + "process": "^0.11.0", + "punycode": "^1.2.4", + "querystring-es3": "~0.2.0", + "readable-stream": "^1.1.13", + "stream-browserify": "^1.0.0", + "string_decoder": "~0.10.25", + "timers-browserify": "^1.0.1", "tty-browserify": "0.0.0", - "url": "0.10.3", - "util": "0.10.3", + "url": "~0.10.1", + "util": "~0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -6586,10 +6587,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } } } @@ -6624,8 +6625,8 @@ "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" + "inherits": "~2.0.1", + "readable-stream": "^1.0.27-1" }, "dependencies": { "readable-stream": { @@ -6634,10 +6635,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } } } @@ -6654,7 +6655,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } }, "uglify-js": { @@ -6663,10 +6664,10 @@ "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", "dev": true, "requires": { - "async": "0.2.10", - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "async": { @@ -6707,9 +6708,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -6721,8 +6722,8 @@ "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", "dev": true, "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" }, "dependencies": { "source-map": { @@ -6731,7 +6732,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -6742,8 +6743,8 @@ "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", "dev": true, "requires": { - "fs-extra": "0.30.0", - "lodash": "3.10.1" + "fs-extra": "^0.30.0", + "lodash": ">=3.5 <5" } }, "webpack-md5-hash": { @@ -6752,7 +6753,7 @@ "integrity": "sha1-2fGJnq1mRFndi2sMkmrHHPvXvHo=", "dev": true, "requires": { - "md5": "2.2.1" + "md5": "^2.0.0" } }, "whatwg-encoding": { @@ -6781,9 +6782,9 @@ "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==", "dev": true, "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "which": { @@ -6792,7 +6793,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "window-size": { @@ -6818,7 +6819,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "ws": { @@ -6827,8 +6828,8 @@ "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "dev": true, "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, "xml-name-validator": { @@ -6861,12 +6862,12 @@ "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "os-locale": "1.4.0", - "window-size": "0.1.4", - "y18n": "3.2.1" + "camelcase": "^1.2.1", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" } } } diff --git a/readme.txt b/readme.txt index 89f675d35f..6f7bdd34b3 100644 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Tags: newsletter, email, welcome email, post notification, autoresponder, signup Requires at least: 4.7 Tested up to: 4.9 Requires PHP: 5.6 -Stable tag: 3.7.5 +Stable tag: 3.7.6 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html @@ -118,6 +118,14 @@ Stop by our [support site](https://www.mailpoet.com/support). == Changelog == += 3.7.6 - 2018-06-12 = +* Fixed: Woocommerce email template thumbnail overflowing over content. +* Fixed: Newsletters created before 3.7.4 now follow featured image display rules implemented in latest release; +* Fixed: form subscription success message is now displayed only upon form submission. Thanks, Mariener; +* Fixed: it is now possible to delete smaller content rows; +* Improved: welcome emails to unconfirmed subscribers not to block sending. Thanks, Donald! +* Improved: layout for welcome and update pages. + = 3.7.5 - 2018-06-05 = * Added: align images left or right of posts excerpts; * Fixed: post content block image alignment issues. From 2ad9ebf1d3f0b177a54604ef0f364a32b042d658 Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 12 Jun 2018 19:15:30 -0400 Subject: [PATCH 44/89] Uses full font-family name in element styles --- lib/Newsletter/Renderer/StylesHelper.php | 1 + tests/unit/Newsletter/RendererTest.php | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/Newsletter/Renderer/StylesHelper.php b/lib/Newsletter/Renderer/StylesHelper.php index 37b14a6838..4aadf36772 100644 --- a/lib/Newsletter/Renderer/StylesHelper.php +++ b/lib/Newsletter/Renderer/StylesHelper.php @@ -41,6 +41,7 @@ class StylesHelper { static function getStyles($data, $type, $ignore_specific_styles = false) { $styles = array_map(function($attribute, $style) use ($ignore_specific_styles) { if(!$ignore_specific_styles || !in_array($attribute, $ignore_specific_styles)) { + $style = StylesHelper::applyFontFamily($attribute, $style); return StylesHelper::translateCSSAttribute($attribute) . ': ' . $style . ' !important;'; } }, array_keys($data[$type]), $data[$type]); diff --git a/tests/unit/Newsletter/RendererTest.php b/tests/unit/Newsletter/RendererTest.php index aeb2980daf..a600fa2e3c 100644 --- a/tests/unit/Newsletter/RendererTest.php +++ b/tests/unit/Newsletter/RendererTest.php @@ -346,6 +346,18 @@ class RendererTest extends \MailPoetTest { )->equals(1); } + function testItUsesFullFontFamilyNameInElementStyles() { + $newsletter = $this->newsletter['body']; + $template = $newsletter['content']['blocks'][0]['blocks'][0]['blocks'][5]; + $template['styles']['block']['fontFamily'] = 'Lucida'; + $DOM = $this->DOM_parser->parseStr(Button::render($template, $columnCount = 1)); + expect( + preg_match( + '/font-family: \'Lucida Sans Unicode\', \'Lucida Grande\', sans-serif/', + $DOM('a.mailpoet_button', 0)->attr('style')) + )->equals(1); + } + function testItRendersSocialIcons() { $newsletter = $this->newsletter['body']; $template = $newsletter['content']['blocks'][0]['blocks'][0]['blocks'][6]; From 683e9c9fa1b14bdbb7f144e658611774ffa95fbb Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 09:28:53 +0100 Subject: [PATCH 45/89] Update eslint Only indentation updated in this commit --- assets/js/src/admin.js | 12 +- assets/js/src/ajax.js | 16 +- assets/js/src/common/thumbnail.jsx | 4 +- assets/js/src/date.js | 16 +- assets/js/src/form/fields/checkbox.jsx | 2 +- assets/js/src/form/fields/radio.jsx | 2 +- assets/js/src/form/fields/select.jsx | 2 +- assets/js/src/form/fields/text.jsx | 8 +- assets/js/src/form/form.jsx | 4 +- assets/js/src/form_editor/form_editor.js | 2 +- assets/js/src/handlebars_helpers.js | 4 +- assets/js/src/i18n.js | 2 +- assets/js/src/listing/bulk_actions.jsx | 2 +- assets/js/src/listing/filters.jsx | 10 +- assets/js/src/listing/groups.jsx | 4 +- assets/js/src/listing/listing.jsx | 160 +- assets/js/src/modal.js | 174 +- .../behaviors/ContainerDropZoneBehavior.js | 2 +- .../behaviors/DraggableBehavior.js | 16 +- .../behaviors/ResizableBehavior.js | 22 +- .../behaviors/TextEditorBehavior.js | 10 +- .../blocks/automatedLatestContent.js | 2 +- .../blocks/automatedLatestContentLayout.js | 2 +- .../js/src/newsletter_editor/blocks/posts.js | 2 +- .../src/newsletter_editor/components/save.js | 2 +- .../newsletter_editor/components/sidebar.js | 2 +- .../js/src/newsletter_editor/initializer.jsx | 86 +- .../js/src/newsletters/listings/heading.jsx | 4 +- assets/js/src/newsletters/listings/mixins.jsx | 26 +- .../src/newsletters/listings/notification.jsx | 32 +- .../js/src/newsletters/listings/welcome.jsx | 4 +- assets/js/src/newsletters/send.jsx | 46 +- assets/js/src/newsletters/send/standard.jsx | 2 +- assets/js/src/newsletters/types.jsx | 2 +- .../types/automatic_emails/event.jsx | 2 +- .../types/automatic_emails/events_list.jsx | 2 +- .../newsletters/types/welcome/scheduling.jsx | 6 +- assets/js/src/num.js | 10 +- assets/js/src/public.js | 28 +- assets/js/src/segments/list.jsx | 10 +- assets/js/src/settings/tabs.js | 4 +- assets/js/src/subscribers/form.jsx | 16 +- .../js/src/subscribers/importExport/export.js | 268 +- .../js/src/subscribers/importExport/import.js | 2168 ++++++++--------- assets/js/src/subscribers/list.jsx | 16 +- package-lock.json | 1021 ++++---- package.json | 4 +- .../blocks/automatedLatestContent.spec.js | 2 +- .../blocks/container.spec.js | 4 +- .../components/communication.spec.js | 8 +- 50 files changed, 2104 insertions(+), 2151 deletions(-) diff --git a/assets/js/src/admin.js b/assets/js/src/admin.js index 4a73c898f2..25e1999441 100644 --- a/assets/js/src/admin.js +++ b/assets/js/src/admin.js @@ -1,12 +1,12 @@ define('admin', [ 'jquery' ], - function admin(jQuery) { - jQuery(function adminDomReady($) { - // dom ready - $(function domReady() { +function admin(jQuery) { + jQuery(function adminDomReady($) { + // dom ready + $(function domReady() { - }); }); - } + }); +} ); diff --git a/assets/js/src/ajax.js b/assets/js/src/ajax.js index c686c59e57..f1df900f7e 100644 --- a/assets/js/src/ajax.js +++ b/assets/js/src/ajax.js @@ -70,15 +70,15 @@ define('ajax', ['mailpoet', 'jquery', 'underscore'], function ajax(mp, jQuery, _ // ajax request deferred = jQuery.post( - this.options.url, - params, - null, - 'json' - ).then(function resultHandler(data) { - return data; - }, _.partial(requestFailed, MailPoet.I18n.t('ajaxFailedErrorMessage'))); + this.options.url, + params, + null, + 'json' + ).then(function resultHandler(data) { + return data; + }, _.partial(requestFailed, MailPoet.I18n.t('ajaxFailedErrorMessage'))); - // clear options + // clear options this.options = {}; return deferred; diff --git a/assets/js/src/common/thumbnail.jsx b/assets/js/src/common/thumbnail.jsx index f79117be66..8ce2e923fd 100644 --- a/assets/js/src/common/thumbnail.jsx +++ b/assets/js/src/common/thumbnail.jsx @@ -69,8 +69,8 @@ export const fromNewsletter = data => action: 'showPreview', data: json, }).done(response => fromUrl(response.meta.preview_url) - .then(resolve) - .catch(reject) + .then(resolve) + .catch(reject) ).fail(response => reject(response.errors)); }); diff --git a/assets/js/src/date.js b/assets/js/src/date.js index 12383cc1f5..fe8f651056 100644 --- a/assets/js/src/date.js +++ b/assets/js/src/date.js @@ -7,7 +7,7 @@ define('date', mp, jQuery, Moment -) { + ) { 'use strict'; var MailPoet = mp; @@ -22,21 +22,21 @@ define('date', init: function init(opts) { var options = opts || {}; - // set UTC offset + // set UTC offset if ( - options.offset === undefined + options.offset === undefined && window.mailpoet_date_offset !== undefined - ) { + ) { options.offset = window.mailpoet_date_offset; } - // set date format + // set date format if ( - options.format === undefined + options.format === undefined && window.mailpoet_date_format !== undefined - ) { + ) { options.format = window.mailpoet_date_format; } - // merge options + // merge options this.options = jQuery.extend({}, this.defaults, options); return this; diff --git a/assets/js/src/form/fields/checkbox.jsx b/assets/js/src/form/fields/checkbox.jsx index 3bc2c68134..8149addaf4 100644 --- a/assets/js/src/form/fields/checkbox.jsx +++ b/assets/js/src/form/fields/checkbox.jsx @@ -29,7 +29,7 @@ const FormFieldCheckbox = React.createClass({ { this.props.field.values[value] }

- ) + ) ); return ( diff --git a/assets/js/src/form/fields/radio.jsx b/assets/js/src/form/fields/radio.jsx index 9bdfa79b67..f640fc9b4d 100644 --- a/assets/js/src/form/fields/radio.jsx +++ b/assets/js/src/form/fields/radio.jsx @@ -22,7 +22,7 @@ const FormFieldRadio = React.createClass({ { this.props.field.values[value] }

- ) + ) ); return ( diff --git a/assets/js/src/form/fields/select.jsx b/assets/js/src/form/fields/select.jsx index 9022235c6a..f2014ae3df 100644 --- a/assets/js/src/form/fields/select.jsx +++ b/assets/js/src/form/fields/select.jsx @@ -54,7 +54,7 @@ const FormFieldSelect = React.createClass({ > { this.props.field.values[value] } - ) + ) ); return ( diff --git a/assets/js/src/form/fields/text.jsx b/assets/js/src/form/fields/text.jsx index 1bd3546983..0a042139d6 100644 --- a/assets/js/src/form/fields/text.jsx +++ b/assets/js/src/form/fields/text.jsx @@ -33,14 +33,14 @@ const FormFieldText = React.createClass({ type="text" disabled={ (this.props.field.disabled !== undefined) - ? this.props.field.disabled(this.props.item) - : false + ? this.props.field.disabled(this.props.item) + : false } className={className} size={ (this.props.field.size !== 'auto' && this.props.field.size > 0) - ? this.props.field.size - : false + ? this.props.field.size + : false } name={name} id={id} diff --git a/assets/js/src/form/form.jsx b/assets/js/src/form/form.jsx index deded4a187..a2e6a46c6d 100644 --- a/assets/js/src/form/form.jsx +++ b/assets/js/src/form/form.jsx @@ -213,8 +213,8 @@ const Form = React.createClass({ className={formClasses} onSubmit={ (this.props.onSubmit !== undefined) - ? this.props.onSubmit - : this.handleSubmit + ? this.props.onSubmit + : this.handleSubmit } > { errors } diff --git a/assets/js/src/form_editor/form_editor.js b/assets/js/src/form_editor/form_editor.js index e72950e2b6..38a0fe1668 100644 --- a/assets/js/src/form_editor/form_editor.js +++ b/assets/js/src/form_editor/form_editor.js @@ -596,7 +596,7 @@ WysijaForm = { WysijaForm.toolbar.left + window.$(WysijaForm.options.container).getDimensions().width + 15 - , 10); + , 10); } }, setToolbarPosition: function () { diff --git a/assets/js/src/handlebars_helpers.js b/assets/js/src/handlebars_helpers.js index 13fc65dc33..447e57940a 100644 --- a/assets/js/src/handlebars_helpers.js +++ b/assets/js/src/handlebars_helpers.js @@ -101,11 +101,11 @@ define('handlebars_helpers', ['handlebars'], function (Handlebars) { lines = value.trim().split('\n'); - // remove header & footer + // remove header & footer lines.shift(); lines.pop(); - // return concatenated lines + // return concatenated lines return lines.join(''); }); diff --git a/assets/js/src/i18n.js b/assets/js/src/i18n.js index c8d76f42f7..afe27df814 100644 --- a/assets/js/src/i18n.js +++ b/assets/js/src/i18n.js @@ -3,7 +3,7 @@ define('i18n', 'mailpoet' ], function i18n( mp -) { + ) { 'use strict'; var MailPoet = mp; diff --git a/assets/js/src/listing/bulk_actions.jsx b/assets/js/src/listing/bulk_actions.jsx index 6dc78802cc..e905d13d07 100644 --- a/assets/js/src/listing/bulk_actions.jsx +++ b/assets/js/src/listing/bulk_actions.jsx @@ -96,7 +96,7 @@ const ListingBulkActions = React.createClass({ value={action.name} key={`action-${action.name}`} >{ action.label } - )) } + )) } !( - filters[filter].length === 0 + filters[filter].length === 0 || ( filters[filter].length === 1 && !filters[filter][0].value ) - )); + )); }, componentDidUpdate: function componentDidUpdate() { const selectedFilters = this.props.filter; @@ -36,7 +36,7 @@ const ListingFilters = React.createClass({ .trigger('change'); } } - ); + ); }, render: function render() { const filters = this.props.filters; @@ -52,9 +52,9 @@ const ListingFilters = React.createClass({ value={option.value} key={`filter-option-${option.value}`} >{ option.label } - )) } + )) } - )); + )); let button; diff --git a/assets/js/src/listing/groups.jsx b/assets/js/src/listing/groups.jsx index 097948da46..226175f34a 100644 --- a/assets/js/src/listing/groups.jsx +++ b/assets/js/src/listing/groups.jsx @@ -19,8 +19,8 @@ class ListingGroups extends React.Component { } const classes = classNames( - { current: (group.name === this.props.group) } - ); + { current: (group.name === this.props.group) } + ); return (
  • diff --git a/assets/js/src/listing/listing.jsx b/assets/js/src/listing/listing.jsx index 915dd53f1e..464b6e48ba 100644 --- a/assets/js/src/listing/listing.jsx +++ b/assets/js/src/listing/listing.jsx @@ -66,70 +66,70 @@ const ListingItem = React.createClass({ if (customActions.length > 0) { let isFirst = true; itemActions = customActions - .filter(action => action.display === undefined || action.display(this.props.item)) - .map((action, index) => { - let customAction = null; + .filter(action => action.display === undefined || action.display(this.props.item)) + .map((action, index) => { + let customAction = null; - if (action.name === 'trash') { - customAction = ( - - {(!isFirst) ? ' | ' : ''} - this.handleTrashItem(this.props.item.id)} + if (action.name === 'trash') { + customAction = ( + + {(!isFirst) ? ' | ' : ''} + this.handleTrashItem(this.props.item.id)} + > + {MailPoet.I18n.t('moveToTrash')} + + + ); + } else if (action.refresh) { + customAction = ( + - {MailPoet.I18n.t('moveToTrash')} - - - ); - } else if (action.refresh) { - customAction = ( - - {(!isFirst) ? ' | ' : ''} - { action.link(this.props.item) } - - ); - } else if (action.link) { - customAction = ( - - {(!isFirst) ? ' | ' : ''} - { action.link(this.props.item) } - - ); - } else { - customAction = ( - - {(!isFirst) ? ' | ' : ''} - action.onClick(this.props.item, this.props.onRefreshItems) - : false - } - >{ action.label } - - ); - } + {(!isFirst) ? ' | ' : ''} + { action.link(this.props.item) } + + ); + } else if (action.link) { + customAction = ( + + {(!isFirst) ? ' | ' : ''} + { action.link(this.props.item) } + + ); + } else { + customAction = ( + + {(!isFirst) ? ' | ' : ''} + action.onClick(this.props.item, this.props.onRefreshItems) + : false + } + >{ action.label } + + ); + } - if (customAction !== null && isFirst === true) { - isFirst = false; - } + if (customAction !== null && isFirst === true) { + isFirst = false; + } - return customAction; - }); + return customAction; + }); } else { itemActions = ( @@ -228,39 +228,39 @@ const ListingItems = React.createClass({ ); } const selectAllClasses = classNames( - 'mailpoet_select_all', + 'mailpoet_select_all', { mailpoet_hidden: ( - this.props.selection === false + this.props.selection === false || (this.props.count <= this.props.limit) - ), + ), } - ); + ); return ( { - (this.props.selection !== 'all') + (this.props.selection !== 'all') ? MailPoet.I18n.t('selectAllLabel') : MailPoet.I18n.t('selectedAllLabel').replace( '%d', this.props.count ) - } + }   { - (this.props.selection !== 'all') + (this.props.selection !== 'all') ? MailPoet.I18n.t('selectAllLink') : MailPoet.I18n.t('clearSelection') - } + } @@ -326,7 +326,7 @@ const Listing = React.createClass({ }, initWithParams: function initWithParams(params) { const state = this.getInitialState(); - // check for url params + // check for url params if (params.splat) { params.splat.split('/').forEach((param) => { const [key, value] = this.getParam(param); @@ -380,15 +380,15 @@ const Listing = React.createClass({ if (this.props.location) { const params = Object.keys(this.state) .filter(key => ( - [ - 'group', - 'filter', - 'search', - 'page', - 'sort_by', - 'sort_order', - ].indexOf(key) !== -1 - )) + [ + 'group', + 'filter', + 'search', + 'page', + 'sort_by', + 'sort_order', + ].indexOf(key) !== -1 + )) .map((key) => { let value = this.state[key]; if (value === Object(value)) { diff --git a/assets/js/src/modal.js b/assets/js/src/modal.js index 139ec47578..4b17fa2383 100644 --- a/assets/js/src/modal.js +++ b/assets/js/src/modal.js @@ -181,9 +181,9 @@ define('modal', ['mailpoet', 'jquery'], }, initOverlay: function () { if (jQuery('#mailpoet_modal_overlay').length === 0) { - // insert overlay into the DOM + // insert overlay into the DOM jQuery('body').append(this.templates.overlay); - // insert loading indicator into overlay + // insert loading indicator into overlay jQuery('#mailpoet_modal_overlay').append(this.templates.loading); } return this; @@ -191,10 +191,10 @@ define('modal', ['mailpoet', 'jquery'], toggleOverlay: function (toggle) { if (toggle === true) { jQuery('#mailpoet_modal_overlay') - .removeClass('mailpoet_overlay_hidden'); + .removeClass('mailpoet_overlay_hidden'); } else { jQuery('#mailpoet_modal_overlay') - .addClass('mailpoet_overlay_hidden'); + .addClass('mailpoet_overlay_hidden'); } return this; @@ -250,60 +250,60 @@ define('modal', ['mailpoet', 'jquery'], }, loadTemplate: function () { if (this.subpanels.length > 0) { - // hide panel + // hide panel jQuery('.mailpoet_' + this.options.type + '_wrapper').hide(); - // add sub panel wrapper + // add sub panel wrapper jQuery('#mailpoet_' + this.options.type) - .append(this.templates.subpanel); + .append(this.templates.subpanel); - // add sub panel content + // add sub panel content jQuery('.mailpoet_' + this.options.type + '_body').last() - .html(this.subpanels[(this.subpanels.length - 1)].element); + .html(this.subpanels[(this.subpanels.length - 1)].element); - // focus on sub panel + // focus on sub panel if (this.options.focus) { this.focus(); } } else if (this.options.element) { jQuery('.mailpoet_' + this.options.type + '_body').empty(); jQuery('.mailpoet_' + this.options.type + '_body') - .append(this.options.element); + .append(this.options.element); } else { jQuery('.mailpoet_' + this.options.type + '_body') - .html( - this.options.body_template( - this.options.data - ) - ); + .html( + this.options.body_template( + this.options.data + ) + ); } return this; }, loadUrl: function () { if (this.options.method === 'get') { - // make ajax request + // make ajax request jQuery.getJSON(this.options.url, - function (data) { - this.options.data = jQuery.extend({}, this.options.data, data); - // load template using fetched data - this.loadTemplate(); - // show modal window - this.showModal(); - }.bind(this) - ); + function (data) { + this.options.data = jQuery.extend({}, this.options.data, data); + // load template using fetched data + this.loadTemplate(); + // show modal window + this.showModal(); + }.bind(this) + ); } else if (this.options.method === 'post') { - // make ajax request + // make ajax request jQuery.post(this.options.url, JSON.stringify(this.options.params), - function (data) { - this.options.data = jQuery.extend({}, this.options.data, data); - // load template using fetched data - this.loadTemplate(); - // show modal window - this.showModal(); - }.bind(this), - 'json' - ); + function (data) { + this.options.data = jQuery.extend({}, this.options.data, data); + // load template using fetched data + this.loadTemplate(); + // show modal window + this.showModal(); + }.bind(this), + 'json' + ); } return this; @@ -311,18 +311,18 @@ define('modal', ['mailpoet', 'jquery'], setDimensions: function () { switch (this.options.type) { case 'popup': - // set popup dimensions + // set popup dimensions jQuery('#mailpoet_popup').css({ width: this.options.width, height: this.options.height }); - // set popup wrapper height + // set popup wrapper height jQuery('#mailpoet_popup_wrapper').css({ height: this.options.height }); break; case 'panel': - // set dimensions + // set dimensions if (this.options.position === 'right') { jQuery('#mailpoet_panel').css({ width: this.options.width, @@ -365,7 +365,7 @@ define('modal', ['mailpoet', 'jquery'], break; case 'panel': setTimeout(function () { - // set position of popup depending on screen dimensions. + // set position of popup depending on screen dimensions. if (this.options.position === 'right') { jQuery('#mailpoet_panel').css({ marginRight: 0 @@ -383,22 +383,22 @@ define('modal', ['mailpoet', 'jquery'], return this; }, showModal: function () { - // set modal dimensions + // set modal dimensions this.setDimensions(); - // remember the previously focused element + // remember the previously focused element this.prevFocus = jQuery(':focus'); - // show popup + // show popup jQuery('#mailpoet_' + this.options.type).show(); - // display overlay + // display overlay this.showOverlay(); - // set modal position + // set modal position this.setPosition(); - // add class on highlighted elements + // add class on highlighted elements if (this.options.highlight !== null) { if (this.options.highlight.length > 0) { this.highlightOn(this.options.highlight); @@ -409,10 +409,10 @@ define('modal', ['mailpoet', 'jquery'], this.focus(); } - // set popup as opened + // set popup as opened this.opened = true; - // trigger init event if specified + // trigger init event if specified if (this.options.onInit !== null) { this.options.onInit(this); } @@ -423,9 +423,9 @@ define('modal', ['mailpoet', 'jquery'], if (this.options.type === 'popup') { jQuery('#mailpoet_' + this.options.type).focus(); } else { - // panel and subpanel + // panel and subpanel jQuery('#mailpoet_' + this.options.type + ' .mailpoet_panel_wrapper') - .filter(':visible').focus(); + .filter(':visible').focus(); } return this; }, @@ -435,17 +435,17 @@ define('modal', ['mailpoet', 'jquery'], }, highlightOff: function () { jQuery('.mailpoet_modal_highlight') - .removeClass('mailpoet_modal_highlight'); + .removeClass('mailpoet_modal_highlight'); return this; }, hideModal: function () { - // set modal as closed + // set modal as closed this.opened = false; - // hide modal + // hide modal jQuery('#mailpoet_' + this.options.type).hide(); - // remove class on highlighted elements + // remove class on highlighted elements this.highlightOff(); return this; @@ -459,46 +459,46 @@ define('modal', ['mailpoet', 'jquery'], return this; }, popup: function (opts) { - // get options + // get options var options = opts || {}; - // set modal type + // set modal type options.type = 'popup'; - // set overlay state + // set overlay state options.overlay = options.overlay || true; - // initialize modal + // initialize modal this.init(options); - // open modal + // open modal this.open(); return this; }, panel: function (opts) { - // get options + // get options var options = opts || {}; - // reset subpanels + // reset subpanels this.subpanels = []; - // set modal type + // set modal type options.type = 'panel'; - // set overlay state + // set overlay state options.overlay = options.overlay || false; - // set highlighted element + // set highlighted element options.highlight = options.highlight || null; - // set modal dimensions + // set modal dimensions options.width = options.width || '40%'; options.height = options.height || 'auto'; - // initialize modal + // initialize modal this.init(options); - // open modal + // open modal this.open(); return this; }, subpanel: function (options) { if (this.opened === false) { - // if no panel is already opened, let's create one instead + // if no panel is already opened, let's create one instead this.panel(options); } else { - // if a panel is already opened, add a sub panel to it + // if a panel is already opened, add a sub panel to it this.subpanels.push(options); this.loadTemplate(); } @@ -506,7 +506,7 @@ define('modal', ['mailpoet', 'jquery'], return this; }, loading: function (toggle) { - // make sure the overlay is initialized and that it's visible + // make sure the overlay is initialized and that it's visible this.initOverlay(true); if (toggle === true) { @@ -520,32 +520,32 @@ define('modal', ['mailpoet', 'jquery'], showLoading: function () { jQuery('#mailpoet_loading').show(); - // add loading class to overlay + // add loading class to overlay jQuery('#mailpoet_modal_overlay') - .addClass('mailpoet_overlay_loading'); + .addClass('mailpoet_overlay_loading'); return this; }, hideLoading: function () { jQuery('#mailpoet_loading').hide(); - // remove loading class from overlay + // remove loading class from overlay jQuery('#mailpoet_modal_overlay') - .removeClass('mailpoet_overlay_loading'); + .removeClass('mailpoet_overlay_loading'); return this; }, open: function () { - // load template if specified + // load template if specified if (this.options.template !== null) { - // check if a url was specified to get extra data + // check if a url was specified to get extra data if (this.options.url !== null) { this.loadUrl(); } else { - // load template + // load template this.loadTemplate(); - // show modal window + // show modal window this.showModal(); } } else { @@ -585,7 +585,7 @@ define('modal', ['mailpoet', 'jquery'], destroy: function () { this.hideOverlay(); - // remove extra modal + // remove extra modal if (jQuery('#mailpoet_' + this.options.type).length > 0) { jQuery('#mailpoet_' + this.options.type).remove(); } @@ -598,16 +598,16 @@ define('modal', ['mailpoet', 'jquery'], if (this.isLocked() === true) { return this; } if (this.subpanels.length > 0) { - // close subpanel + // close subpanel jQuery('.mailpoet_' + this.options.type + '_wrapper').last().remove(); - // show previous panel + // show previous panel jQuery('.mailpoet_' + this.options.type + '_wrapper').last().show(); - // remove last subpanels + // remove last subpanels this.subpanels.pop(); - // focus on previous panel + // focus on previous panel if (this.options.focus) { this.focus(); } @@ -615,21 +615,21 @@ define('modal', ['mailpoet', 'jquery'], return this; } - // remove event handlers + // remove event handlers this.removeEvents(); - // hide modal window + // hide modal window this.hideModal(); - // destroy modal element + // destroy modal element this.destroy(); - // restore the previously focused element + // restore the previously focused element if (this.prevFocus !== undefined) { this.prevFocus.focus(); } - // reset options + // reset options this.options = { onSuccess: null, onCancel: null diff --git a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js index aeb24584ca..8e2347f2dd 100644 --- a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js @@ -426,7 +426,7 @@ define([ position: 'before' }; } - // Second half of the element + // Second half of the element return { index: index, position: 'after' diff --git a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js index 512de5bb6c..cfb405e609 100644 --- a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js @@ -119,16 +119,16 @@ define([ } } }) - .preventDefault('auto') - .styleCursor(false) - .actionChecker(function actionChecker(pointer, event, action) { + .preventDefault('auto') + .styleCursor(false) + .actionChecker(function actionChecker(pointer, event, action) { // Disable dragging with right click - if (event.button !== 0) { - return null; - } + if (event.button !== 0) { + return null; + } - return action; - }); + return action; + }); if (this.options.drop !== undefined) { interactable.getDropModel = this.options.drop; diff --git a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js index 4e7144044b..f22a355d82 100644 --- a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js @@ -54,17 +54,17 @@ define([ bottom: (typeof this.options.resizeHandleSelector === 'string') ? this.view.$(this.options.resizeHandleSelector).get(0) : this.options.resizeHandleSelector } }) - .on('resizestart', function () { // eslint-disable-line func-names - that.isBeingResized = true; - that.$el.addClass('mailpoet_resize_active'); - }).on('resizemove', function (event) { // eslint-disable-line func-names - var onResize = that.options.onResize.bind(that); - return onResize(event); - }) - .on('resizeend', function () { // eslint-disable-line func-names - that.isBeingResized = null; - that.$el.removeClass('mailpoet_resize_active'); - }); + .on('resizestart', function () { // eslint-disable-line func-names + that.isBeingResized = true; + that.$el.addClass('mailpoet_resize_active'); + }).on('resizemove', function (event) { // eslint-disable-line func-names + var onResize = that.options.onResize.bind(that); + return onResize(event); + }) + .on('resizeend', function () { // eslint-disable-line func-names + that.isBeingResized = null; + that.$el.removeClass('mailpoet_resize_active'); + }); }, showResizeHandle: function () { // eslint-disable-line func-names if (typeof this.options.resizeHandleSelector === 'string') { diff --git a/assets/js/src/newsletter_editor/behaviors/TextEditorBehavior.js b/assets/js/src/newsletter_editor/behaviors/TextEditorBehavior.js index cd16200178..4a5697bed5 100644 --- a/assets/js/src/newsletter_editor/behaviors/TextEditorBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/TextEditorBehavior.js @@ -65,11 +65,11 @@ define([ editor.focus(); if (that._isActivationClick) { editor.selection.setRng( - window.tinymce.dom.RangeUtils.getCaretRangeFromPoint( - e.clientX, - e.clientY, - editor.getDoc() - ) + window.tinymce.dom.RangeUtils.getCaretRangeFromPoint( + e.clientX, + e.clientY, + editor.getDoc() + ) ); that._isActivationClick = false; } diff --git a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js index c240096d2d..77cd50eae0 100644 --- a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js +++ b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js @@ -27,7 +27,7 @@ define([ SuperModel, _, jQuery - ) { +) { 'use strict'; var Module = {}; diff --git a/assets/js/src/newsletter_editor/blocks/automatedLatestContentLayout.js b/assets/js/src/newsletter_editor/blocks/automatedLatestContentLayout.js index 3737ec6f47..1711982278 100644 --- a/assets/js/src/newsletter_editor/blocks/automatedLatestContentLayout.js +++ b/assets/js/src/newsletter_editor/blocks/automatedLatestContentLayout.js @@ -22,7 +22,7 @@ define([ SuperModel, _, jQuery - ) { +) { 'use strict'; var Module = {}; diff --git a/assets/js/src/newsletter_editor/blocks/posts.js b/assets/js/src/newsletter_editor/blocks/posts.js index e7d323bd22..1f8adfd5c7 100644 --- a/assets/js/src/newsletter_editor/blocks/posts.js +++ b/assets/js/src/newsletter_editor/blocks/posts.js @@ -36,7 +36,7 @@ define([ BaseBlock, ButtonBlock, DividerBlock - ) { +) { 'use strict'; var Module = {}; diff --git a/assets/js/src/newsletter_editor/components/save.js b/assets/js/src/newsletter_editor/components/save.js index d9d0c4664f..15c34b6a4e 100644 --- a/assets/js/src/newsletter_editor/components/save.js +++ b/assets/js/src/newsletter_editor/components/save.js @@ -257,7 +257,7 @@ define([ if ((App.getNewsletter().get('type') === 'notification') && contents.indexOf('"type":"automatedLatestContent"') < 0 && contents.indexOf('"type":"automatedLatestContentLayout"') < 0 - ) { + ) { this.showValidationError(MailPoet.I18n.t('automatedLatestContentMissing')); return; } diff --git a/assets/js/src/newsletter_editor/components/sidebar.js b/assets/js/src/newsletter_editor/components/sidebar.js index ce93751b19..56b62c3095 100644 --- a/assets/js/src/newsletter_editor/components/sidebar.js +++ b/assets/js/src/newsletter_editor/components/sidebar.js @@ -17,7 +17,7 @@ define([ SuperModel, _, jQuery - ) { +) { 'use strict'; var Module = {}; diff --git a/assets/js/src/newsletter_editor/initializer.jsx b/assets/js/src/newsletter_editor/initializer.jsx index 9f333d8606..a83b98f25c 100644 --- a/assets/js/src/newsletter_editor/initializer.jsx +++ b/assets/js/src/newsletter_editor/initializer.jsx @@ -32,52 +32,52 @@ const initializeEditor = (config) => { id: getUrlParam('id'), }, }) - .always(() => MailPoet.Modal.loading(false)) - .done((response) => { - const newsletter = response.data; + .always(() => MailPoet.Modal.loading(false)) + .done((response) => { + const newsletter = response.data; - Promise.resolve(Hooks.applyFilters('mailpoet_newsletters_editor_extend_config', config, newsletter)).then((extendedConfig) => { - window.EditorApplication.start({ - newsletter, - config: extendedConfig, - }); - }).catch(() => { - window.EditorApplication.start({ - newsletter, - config, + Promise.resolve(Hooks.applyFilters('mailpoet_newsletters_editor_extend_config', config, newsletter)).then((extendedConfig) => { + window.EditorApplication.start({ + newsletter, + config: extendedConfig, + }); + }).catch(() => { + window.EditorApplication.start({ + newsletter, + config, + }); }); + + renderBreadcrumb(newsletter.type); + + if (newsletter.status === 'sending' && newsletter.queue && newsletter.queue.status === null) { + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'sending_queue', + action: 'pause', + data: { + newsletter_id: newsletter.id, + }, + }) + .done(() => MailPoet.Notice.success(MailPoet.I18n.t('newsletterIsPaused'))) + .fail((pauseFailResponse) => { + if (pauseFailResponse.errors.length > 0) { + MailPoet.Notice.error( + pauseFailResponse.errors.map(error => error.message), + { scroll: true, static: true } + ); + } + }); + } + }) + .fail((response) => { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(error => error.message), + { scroll: true, static: true } + ); + } }); - - renderBreadcrumb(newsletter.type); - - if (newsletter.status === 'sending' && newsletter.queue && newsletter.queue.status === null) { - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'sending_queue', - action: 'pause', - data: { - newsletter_id: newsletter.id, - }, - }) - .done(() => MailPoet.Notice.success(MailPoet.I18n.t('newsletterIsPaused'))) - .fail((pauseFailResponse) => { - if (pauseFailResponse.errors.length > 0) { - MailPoet.Notice.error( - pauseFailResponse.errors.map(error => error.message), - { scroll: true, static: true } - ); - } - }); - } - }) - .fail((response) => { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(error => error.message), - { scroll: true, static: true } - ); - } - }); }; Hooks.addAction('mailpoet_newsletters_editor_initialize', initializeEditor); diff --git a/assets/js/src/newsletters/listings/heading.jsx b/assets/js/src/newsletters/listings/heading.jsx index 0577e96b1b..a95a8fdafc 100644 --- a/assets/js/src/newsletters/listings/heading.jsx +++ b/assets/js/src/newsletters/listings/heading.jsx @@ -9,8 +9,8 @@ const ListingHeading = () => ( className="page-title-action" to="/new" onClick={() => MailPoet.trackEvent( - 'Emails > Add New', - { 'MailPoet Free version': window.mailpoet_version } + 'Emails > Add New', + { 'MailPoet Free version': window.mailpoet_version } )} data-automation-id="new_email" > diff --git a/assets/js/src/newsletters/listings/mixins.jsx b/assets/js/src/newsletters/listings/mixins.jsx index b9f44b19c7..547787b8c3 100644 --- a/assets/js/src/newsletters/listings/mixins.jsx +++ b/assets/js/src/newsletters/listings/mixins.jsx @@ -69,14 +69,14 @@ const QueueMixin = { ); } const progressClasses = classNames( - 'mailpoet_progress', - { mailpoet_progress_complete: newsletter.queue.status === 'completed' } - ); + 'mailpoet_progress', + { mailpoet_progress_complete: newsletter.queue.status === 'completed' } + ); // calculate percentage done let percentage = Math.round( - (newsletter.queue.count_processed * 100) / (newsletter.queue.count_total) - ); + (newsletter.queue.count_processed * 100) / (newsletter.queue.count_total) + ); let label; @@ -84,12 +84,12 @@ const QueueMixin = { label = ( { - MailPoet.I18n.t('newsletterQueueCompleted') + MailPoet.I18n.t('newsletterQueueCompleted') .replace('%$1d', parseInt(newsletter.queue.count_processed, 10).toLocaleString()) .replace('%$2d', parseInt(newsletter.queue.count_total, 10).toLocaleString()) - } + } - ); + ); } else { const resumeSendingClick = _.partial(this.resumeSending, newsletter); const pauseSendingClick = _.partial(this.pauseSending, newsletter); @@ -101,7 +101,7 @@ const QueueMixin = { id={`resume_${newsletter.id}`} className="button" style={{ display: (newsletter.queue.status === 'paused') - ? 'inline-block' : 'none' }} + ? 'inline-block' : 'none' }} href="javascript:;" onClick={resumeSendingClick} >{MailPoet.I18n.t('resume')} @@ -109,12 +109,12 @@ const QueueMixin = { id={`pause_${newsletter.id}`} className="button mailpoet_pause" style={{ display: (newsletter.queue.status === null) - ? 'inline-block' : 'none' }} + ? 'inline-block' : 'none' }} href="javascript:;" onClick={pauseSendingClick} >{MailPoet.I18n.t('pause')} - ); + ); } let progressBarWidth = 0; @@ -258,7 +258,7 @@ const StatisticsMixin = { { tooEarlyForStats && (
    {MailPoet.I18n.t('checkBackInHours') - .replace('%$1d', showStatsTimeout - sentHoursAgo)} + .replace('%$1d', showStatsTimeout - sentHoursAgo)}
    ) }
  • @@ -406,7 +406,7 @@ const MailerMixin = { } if (state.meta.mta_log.error.error_code) { mailerErrorNotice += ` ${MailPoet.I18n.t('mailerErrorCode') - .replace('%$1s', state.meta.mta_log.error.error_code)}`; + .replace('%$1s', state.meta.mta_log.error.error_code)}`; } return (
    diff --git a/assets/js/src/newsletters/listings/notification.jsx b/assets/js/src/newsletters/listings/notification.jsx index 7a87ba1513..bde666dcae 100644 --- a/assets/js/src/newsletters/listings/notification.jsx +++ b/assets/js/src/newsletters/listings/notification.jsx @@ -216,34 +216,34 @@ const NewsletterListNotification = React.createClass({ switch (newsletter.options.intervalType) { case 'daily': sendingFrequency = MailPoet.I18n.t('sendDaily').replace( - '%$1s', timeOfDayValues[newsletter.options.timeOfDay] - ); + '%$1s', timeOfDayValues[newsletter.options.timeOfDay] + ); break; case 'weekly': sendingFrequency = MailPoet.I18n.t('sendWeekly').replace( - '%$1s', weekDayValues[newsletter.options.weekDay] - ).replace( - '%$2s', timeOfDayValues[newsletter.options.timeOfDay] - ); + '%$1s', weekDayValues[newsletter.options.weekDay] + ).replace( + '%$2s', timeOfDayValues[newsletter.options.timeOfDay] + ); break; case 'monthly': sendingFrequency = MailPoet.I18n.t('sendMonthly').replace( - '%$1s', monthDayValues[newsletter.options.monthDay] - ).replace( - '%$2s', timeOfDayValues[newsletter.options.timeOfDay] - ); + '%$1s', monthDayValues[newsletter.options.monthDay] + ).replace( + '%$2s', timeOfDayValues[newsletter.options.timeOfDay] + ); break; case 'nthWeekDay': sendingFrequency = MailPoet.I18n.t('sendNthWeekDay').replace( - '%$1s', nthWeekDayValues[newsletter.options.nthWeekDay] - ).replace( - '%$2s', weekDayValues[newsletter.options.weekDay] - ).replace( - '%$3s', timeOfDayValues[newsletter.options.timeOfDay] - ); + '%$1s', nthWeekDayValues[newsletter.options.nthWeekDay] + ).replace( + '%$2s', weekDayValues[newsletter.options.weekDay] + ).replace( + '%$3s', timeOfDayValues[newsletter.options.timeOfDay] + ); break; case 'immediately': diff --git a/assets/js/src/newsletters/listings/welcome.jsx b/assets/js/src/newsletters/listings/welcome.jsx index 6d8684412e..1922c9cb8c 100644 --- a/assets/js/src/newsletters/listings/welcome.jsx +++ b/assets/js/src/newsletters/listings/welcome.jsx @@ -210,8 +210,8 @@ const NewsletterListWelcome = React.createClass({ ); } sendingEvent = MailPoet.I18n.t('welcomeEventSegment').replace( - '%$1s', segment.name - ); + '%$1s', segment.name + ); break; } diff --git a/assets/js/src/newsletters/send.jsx b/assets/js/src/newsletters/send.jsx index 491cd493e8..158b3f9aef 100644 --- a/assets/js/src/newsletters/send.jsx +++ b/assets/js/src/newsletters/send.jsx @@ -109,20 +109,20 @@ const NewsletterSend = React.createClass({ return this.saveNewsletter(e).done(() => { this.setState({ loading: true }); }) - .done((response) => { - switch (response.data.type) { - case 'notification': - case 'welcome': - return this.activateNewsletter(response); - default: - return this.sendNewsletter(response); - } - }) - .fail((err) => { - this.showError(err); - this.setState({ loading: false }); - MailPoet.Modal.loading(false); - }); + .done((response) => { + switch (response.data.type) { + case 'notification': + case 'welcome': + return this.activateNewsletter(response); + default: + return this.sendNewsletter(response); + } + }) + .fail((err) => { + this.showError(err); + this.setState({ loading: false }); + MailPoet.Modal.loading(false); + }); }, sendNewsletter: function sendNewsletter(newsletter) { return MailPoet.Ajax.post( @@ -242,12 +242,12 @@ const NewsletterSend = React.createClass({ } }); }) - .fail((err) => { - this.showError(err); - }) - .always(() => { - this.setState({ loading: false }); - }); + .fail((err) => { + this.showError(err); + }) + .always(() => { + this.setState({ loading: false }); + }); } return false; }, @@ -289,8 +289,8 @@ const NewsletterSend = React.createClass({ 'status', 'updated_at', 'type', ]; const newsletterData = _.omit( - data, - IGNORED_NEWSLETTER_PROPERTIES + data, + IGNORED_NEWSLETTER_PROPERTIES ); return MailPoet.Ajax.post({ @@ -363,7 +363,7 @@ const NewsletterSend = React.createClass({ onClick={this.handleResume} value={MailPoet.I18n.t('resume')} /> - : + : { timeOfDayItems[value] } - ) + ) ); return ( diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index d0070db44a..d45155d6ae 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -155,7 +155,7 @@ const NewsletterTypes = React.createClass({
    - ), this)} + ), this)}
    ); diff --git a/assets/js/src/newsletters/types/automatic_emails/event.jsx b/assets/js/src/newsletters/types/automatic_emails/event.jsx index 8d551f4d33..5ea3e53b9b 100644 --- a/assets/js/src/newsletters/types/automatic_emails/event.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/event.jsx @@ -53,7 +53,7 @@ class AutomaticEmailEvent extends React.PureComponent { {event.badge.text} - ) : '' + ) : '' }

    {event.description}

    diff --git a/assets/js/src/newsletters/types/automatic_emails/events_list.jsx b/assets/js/src/newsletters/types/automatic_emails/events_list.jsx index f09d31ad95..03c45e49c4 100644 --- a/assets/js/src/newsletters/types/automatic_emails/events_list.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/events_list.jsx @@ -25,7 +25,7 @@ class AutomaticEmailEventsList extends React.Component { key={index} eventsConfigurator={this.eventsConfigurator} /> - ) + ) ); return ( diff --git a/assets/js/src/newsletters/types/welcome/scheduling.jsx b/assets/js/src/newsletters/types/welcome/scheduling.jsx index 17d9b0d4fd..764d25fcd8 100644 --- a/assets/js/src/newsletters/types/welcome/scheduling.jsx +++ b/assets/js/src/newsletters/types/welcome/scheduling.jsx @@ -111,9 +111,9 @@ const WelcomeScheduling = React.createClass({ }).fail((response) => { if (response.errors.length > 0) { MailPoet.Notice.error( - response.errors.map(error => error.message), - { scroll: true } - ); + response.errors.map(error => error.message), + { scroll: true } + ); } }); }, diff --git a/assets/js/src/num.js b/assets/js/src/num.js index a26a0cfacd..ef55cf7186 100644 --- a/assets/js/src/num.js +++ b/assets/js/src/num.js @@ -3,7 +3,7 @@ define('num', 'mailpoet' ], function ( // eslint-disable-line func-names mp -) { + ) { 'use strict'; var MailPoet = mp; @@ -12,10 +12,10 @@ define('num', var precision = precisionOpts || 0; var factor = Math.pow(10, precision); return (Math.round(num * factor) / factor) - .toLocaleString( - undefined, - { minimumFractionDigits: precision, maximumFractionDigits: precision } - ); + .toLocaleString( + undefined, + { minimumFractionDigits: precision, maximumFractionDigits: precision } + ); } }; }); diff --git a/assets/js/src/public.js b/assets/js/src/public.js index f82089f7c0..787da900b6 100644 --- a/assets/js/src/public.js +++ b/assets/js/src/public.js @@ -64,43 +64,43 @@ function ( // eslint-disable-line func-names data: formData.data }).fail(function (response) { // eslint-disable-line func-names form.find('.mailpoet_validate_error').html( - response.errors.map(function (error) { // eslint-disable-line func-names - return error.message; - }).join('
    ') - ).show(); + response.errors.map(function (error) { // eslint-disable-line func-names + return error.message; + }).join('
    ') + ).show(); }).done(function (response) { // eslint-disable-line func-names if (window.grecaptcha && formData.recaptcha) { window.grecaptcha.reset(formData.recaptcha); } return response; }).done(function (response) { // eslint-disable-line func-names - // successfully subscribed + // successfully subscribed if ( - response.meta !== undefined + response.meta !== undefined && response.meta.redirect_url !== undefined - ) { - // go to page + ) { + // go to page window.location.href = response.meta.redirect_url; } else { - // display success message + // display success message form.find('.mailpoet_validate_success').show(); } - // reset form + // reset form form.trigger('reset'); - // reset validation + // reset validation parsley.reset(); // reset captcha if (window.grecaptcha && formData.recaptcha) { window.grecaptcha.reset(formData.recaptcha); } - // resize iframe + // resize iframe if ( - window.frameElement !== null + window.frameElement !== null && MailPoet !== undefined && MailPoet.Iframe - ) { + ) { MailPoet.Iframe.autoSize(window.frameElement); } }); diff --git a/assets/js/src/segments/list.jsx b/assets/js/src/segments/list.jsx index 8eca51ebfe..32856d153c 100644 --- a/assets/js/src/segments/list.jsx +++ b/assets/js/src/segments/list.jsx @@ -118,14 +118,14 @@ const itemActions = [ }, }).done((response) => { MailPoet.Notice.success( - MailPoet.I18n.t('listDuplicated').replace('%$1s', response.data.name) - ); + MailPoet.I18n.t('listDuplicated').replace('%$1s', response.data.name) + ); refresh(); }).fail((response) => { MailPoet.Notice.error( - response.errors.map(error => error.message), - { scroll: true } - ); + response.errors.map(error => error.message), + { scroll: true } + ); }), display: function display(segment) { return (segment.type !== 'wp_users'); diff --git a/assets/js/src/settings/tabs.js b/assets/js/src/settings/tabs.js index efba9f17a0..c40fcbfde1 100644 --- a/assets/js/src/settings/tabs.js +++ b/assets/js/src/settings/tabs.js @@ -39,8 +39,8 @@ define( // toggle SPF (hidden if the sending method is MailPoet) jQuery('#mailpoet_mta_spf')[ (group === 'mailpoet') - ? 'hide' - : 'show' + ? 'hide' + : 'show' ](); // hide sending methods diff --git a/assets/js/src/subscribers/form.jsx b/assets/js/src/subscribers/form.jsx index 063742b08c..0a4e2ff258 100644 --- a/assets/js/src/subscribers/form.jsx +++ b/assets/js/src/subscribers/form.jsx @@ -149,15 +149,15 @@ function beforeFormContent(subscriber) { return (

    { ReactStringReplace( - MailPoet.I18n.t('WPUserEditNotice'), - /\[link\](.*?)\[\/link\]/g, - (match, i) => ( - { match } - ) + MailPoet.I18n.t('WPUserEditNotice'), + /\[link\](.*?)\[\/link\]/g, + (match, i) => ( + { match } ) + ) }

    ); diff --git a/assets/js/src/subscribers/importExport/export.js b/assets/js/src/subscribers/importExport/export.js index 1266609c2b..e1f017411c 100644 --- a/assets/js/src/subscribers/importExport/export.js +++ b/assets/js/src/subscribers/importExport/export.js @@ -5,149 +5,149 @@ define( 'mailpoet', 'handlebars' ], - function exportSubscribers( - _, - jQuery, - MailPoet, - Handlebars - ) { - if (!jQuery('#mailpoet_subscribers_export').length) { - return; - } - jQuery(document).ready(function documentReady() { - var segmentsContainerElement; - var subscriberFieldsContainerElement; - var nextStepButton; - var renderSegmentsAndFields; - var subscribersExportTemplate; - if (!window.exportData.segments) { - return; - } - subscribersExportTemplate = + function exportSubscribers( + _, + jQuery, + MailPoet, + Handlebars + ) { + if (!jQuery('#mailpoet_subscribers_export').length) { + return; + } + jQuery(document).ready(function documentReady() { + var segmentsContainerElement; + var subscriberFieldsContainerElement; + var nextStepButton; + var renderSegmentsAndFields; + var subscribersExportTemplate; + if (!window.exportData.segments) { + return; + } + subscribersExportTemplate = Handlebars.compile(jQuery('#mailpoet_subscribers_export_template').html()); - // render template - jQuery('#mailpoet_subscribers_export > div.inside').html(subscribersExportTemplate(window.exportData)); + // render template + jQuery('#mailpoet_subscribers_export > div.inside').html(subscribersExportTemplate(window.exportData)); - function toggleNextStepButton(condition) { - var disabled = 'button-disabled'; - if (condition === 'on') { - nextStepButton.removeClass(disabled); - } else { - nextStepButton.addClass(disabled); - } - } + function toggleNextStepButton(condition) { + var disabled = 'button-disabled'; + if (condition === 'on') { + nextStepButton.removeClass(disabled); + } else { + nextStepButton.addClass(disabled); + } + } - // define reusable variables - segmentsContainerElement = jQuery('#export_lists'); - subscriberFieldsContainerElement = jQuery('#export_columns'); - nextStepButton = jQuery('a.mailpoet_export_process'); - renderSegmentsAndFields = function renderSegmentsFields(container, data) { - if (container.data('select2')) { - container - .html('') - .select2('destroy'); - } - container - .select2({ - data: data, - width: '20em', - templateResult: function templateResult(item) { - return (item.subscriberCount > 0) - ? item.name + ' (' + parseInt(item.subscriberCount, 10).toLocaleString() + ')' - : item.name; - }, - templateSelection: function templateSelection(item) { - return (item.subscriberCount > 0) - ? item.name + ' (' + parseInt(item.subscriberCount, 10).toLocaleString() + ')' - : item.name; - } - }) - .on('select2:selecting', function onSelect2Selecting(selectEvent) { - var selectElement = this; - var selectedOptionId = selectEvent.params.args.data.id; - var fieldsToExclude = [ - 'select', - 'deselect' - ]; - var allOptions; - if (_.contains(fieldsToExclude, selectedOptionId)) { - selectEvent.preventDefault(); - if (selectedOptionId === 'deselect') { - jQuery(selectElement).val('').trigger('change'); - } else { - allOptions = []; - _.each(container.find('option'), function eachOption(field) { - if (!_.contains(fieldsToExclude, field.value)) { - allOptions.push(field.value); - } - }); - jQuery(selectElement).val(allOptions).trigger('change'); - } - jQuery(selectElement).select2('close'); - } - }) - .on('change', function onCHange() { - if ((window.exportData.segments && segmentsContainerElement.select2('data').length && subscriberFieldsContainerElement.select2('data').length) + // define reusable variables + segmentsContainerElement = jQuery('#export_lists'); + subscriberFieldsContainerElement = jQuery('#export_columns'); + nextStepButton = jQuery('a.mailpoet_export_process'); + renderSegmentsAndFields = function renderSegmentsFields(container, data) { + if (container.data('select2')) { + container + .html('') + .select2('destroy'); + } + container + .select2({ + data: data, + width: '20em', + templateResult: function templateResult(item) { + return (item.subscriberCount > 0) + ? item.name + ' (' + parseInt(item.subscriberCount, 10).toLocaleString() + ')' + : item.name; + }, + templateSelection: function templateSelection(item) { + return (item.subscriberCount > 0) + ? item.name + ' (' + parseInt(item.subscriberCount, 10).toLocaleString() + ')' + : item.name; + } + }) + .on('select2:selecting', function onSelect2Selecting(selectEvent) { + var selectElement = this; + var selectedOptionId = selectEvent.params.args.data.id; + var fieldsToExclude = [ + 'select', + 'deselect' + ]; + var allOptions; + if (_.contains(fieldsToExclude, selectedOptionId)) { + selectEvent.preventDefault(); + if (selectedOptionId === 'deselect') { + jQuery(selectElement).val('').trigger('change'); + } else { + allOptions = []; + _.each(container.find('option'), function eachOption(field) { + if (!_.contains(fieldsToExclude, field.value)) { + allOptions.push(field.value); + } + }); + jQuery(selectElement).val(allOptions).trigger('change'); + } + jQuery(selectElement).select2('close'); + } + }) + .on('change', function onCHange() { + if ((window.exportData.segments && segmentsContainerElement.select2('data').length && subscriberFieldsContainerElement.select2('data').length) || (!window.exportData.segments && subscriberFieldsContainerElement.select2('data').length) - ) { - toggleNextStepButton('on'); - } else { - toggleNextStepButton('off'); - } - }); - }; + ) { + toggleNextStepButton('on'); + } else { + toggleNextStepButton('off'); + } + }); + }; - renderSegmentsAndFields(subscriberFieldsContainerElement, window.subscriberFieldsSelect2); - renderSegmentsAndFields(segmentsContainerElement, window.segments); + renderSegmentsAndFields(subscriberFieldsContainerElement, window.subscriberFieldsSelect2); + renderSegmentsAndFields(segmentsContainerElement, window.segments); - subscriberFieldsContainerElement.val([ - 'email', - 'first_name', - 'last_name', - 'list_status', - 'global_status' - ]).trigger('change'); + subscriberFieldsContainerElement.val([ + 'email', + 'first_name', + 'last_name', + 'list_status', + 'global_status' + ]).trigger('change'); - nextStepButton.click(function nextClick() { - var exportFormat; - if (jQuery(this).hasClass('button-disabled')) { - return; - } - MailPoet.Modal.loading(true); - exportFormat = jQuery(':radio[name="option_format"]:checked').val(); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'ImportExport', - action: 'processExport', - data: JSON.stringify({ - export_format_option: exportFormat, - segments: (window.exportData.segments) ? segmentsContainerElement.val() : false, - subscriber_fields: subscriberFieldsContainerElement.val() - }) - }).always(function always() { - MailPoet.Modal.loading(false); - }).done(function done(response) { - var resultMessage = MailPoet.I18n.t('exportMessage') - .replace('%1$s', '' + parseInt(response.data.totalExported, 133).toLocaleString() + '') - .replace('[link]', '') - .replace('[/link]', ''); - jQuery('#export_result_notice').html('

    ' + resultMessage + '

    ').show(); - window.location.href = response.data.exportFileURL; - MailPoet.trackEvent('Subscribers export completed', { - 'Total exported': response.data.totalExported, - 'File Format': exportFormat, - 'MailPoet Free version': window.mailpoet_version - }); - }).fail(function fail(response) { - if (response.errors.length > 0) { - MailPoet.Notice.error( + nextStepButton.click(function nextClick() { + var exportFormat; + if (jQuery(this).hasClass('button-disabled')) { + return; + } + MailPoet.Modal.loading(true); + exportFormat = jQuery(':radio[name="option_format"]:checked').val(); + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'ImportExport', + action: 'processExport', + data: JSON.stringify({ + export_format_option: exportFormat, + segments: (window.exportData.segments) ? segmentsContainerElement.val() : false, + subscriber_fields: subscriberFieldsContainerElement.val() + }) + }).always(function always() { + MailPoet.Modal.loading(false); + }).done(function done(response) { + var resultMessage = MailPoet.I18n.t('exportMessage') + .replace('%1$s', '' + parseInt(response.data.totalExported, 133).toLocaleString() + '') + .replace('[link]', '') + .replace('[/link]', ''); + jQuery('#export_result_notice').html('

    ' + resultMessage + '

    ').show(); + window.location.href = response.data.exportFileURL; + MailPoet.trackEvent('Subscribers export completed', { + 'Total exported': response.data.totalExported, + 'File Format': exportFormat, + 'MailPoet Free version': window.mailpoet_version + }); + }).fail(function fail(response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( response.errors.map(function mapError(error) { return error.message; }), { scroll: true } ); - } - }); - }); - }); - }); + } + }); + }); + }); + }); diff --git a/assets/js/src/subscribers/importExport/import.js b/assets/js/src/subscribers/importExport/import.js index 2a96f26b41..087bed22ef 100644 --- a/assets/js/src/subscribers/importExport/import.js +++ b/assets/js/src/subscribers/importExport/import.js @@ -10,885 +10,283 @@ define( 'asyncqueue', 'moment' ], - function ( - Backbone, - _, - jQuery, - MailPoet, - Handlebars, - Papa, - AsyncQueue, - Moment - ) { - if (!jQuery('#mailpoet_subscribers_import').length) { - return; - } - jQuery(document).ready(function () { - var router; - jQuery('input[name="select_method"]').attr('checked', false); - // configure router - router = new (Backbone.Router.extend({ - routes: { - '': 'home', - step1: 'step1', - step2: 'step2', - step3: 'step3' - }, - home: function () { - this.navigate('step1', { trigger: true }); - } - }))(); - - function showCurrentStep() { - MailPoet.Notice.hide(); - MailPoet.Modal.loading(false); - jQuery('#mailpoet_subscribers_import > div[id^="step"]').hide(); - jQuery(location.hash).show(); + function ( + Backbone, + _, + jQuery, + MailPoet, + Handlebars, + Papa, + AsyncQueue, + Moment + ) { + if (!jQuery('#mailpoet_subscribers_import').length) { + return; + } + jQuery(document).ready(function () { + var router; + jQuery('input[name="select_method"]').attr('checked', false); + // configure router + router = new (Backbone.Router.extend({ + routes: { + '': 'home', + step1: 'step1', + step2: 'step2', + step3: 'step3' + }, + home: function () { + this.navigate('step1', { trigger: true }); } + }))(); - /* + function showCurrentStep() { + MailPoet.Notice.hide(); + MailPoet.Modal.loading(false); + jQuery('#mailpoet_subscribers_import > div[id^="step"]').hide(); + jQuery(location.hash).show(); + } + + /* * STEP 1 (upload or copy/paste) */ - router.on('route:step1', function () { - var methodProcessContainerTemplate; - var currentStepE; - var methodSelectionElement; - var pasteInputElement; - var pasteInputPlaceholderElement; - var pasteProcessButtonElement; - var mailChimpKeyInputElement; - var mailChimpKeyVerifyButtonElement; - var mailChimpListsContainerElement; - var mailChimpProcessButtonElement; - var uploadElement; - var uploadProcessButtonElement; - // set or reset temporary validation rule on all columns - window.mailpoetColumns = jQuery.map(window.mailpoetColumns, function (column) { - var col = column; - col.validation_rule = false; - return col; - }); + router.on('route:step1', function () { + var methodProcessContainerTemplate; + var currentStepE; + var methodSelectionElement; + var pasteInputElement; + var pasteInputPlaceholderElement; + var pasteProcessButtonElement; + var mailChimpKeyInputElement; + var mailChimpKeyVerifyButtonElement; + var mailChimpListsContainerElement; + var mailChimpProcessButtonElement; + var uploadElement; + var uploadProcessButtonElement; + // set or reset temporary validation rule on all columns + window.mailpoetColumns = jQuery.map(window.mailpoetColumns, function (column) { + var col = column; + col.validation_rule = false; + return col; + }); - if (typeof (window.importData.step1) !== 'undefined') { - showCurrentStep(); - return; - } + if (typeof (window.importData.step1) !== 'undefined') { + showCurrentStep(); + return; + } - // render process button for each method - methodProcessContainerTemplate = + // render process button for each method + methodProcessContainerTemplate = Handlebars.compile(jQuery('#method_process_template').html()); - jQuery('.mailpoet_method_process').html(methodProcessContainerTemplate()); + jQuery('.mailpoet_method_process').html(methodProcessContainerTemplate()); - // define reusable variables - currentStepE = jQuery(location.hash); - methodSelectionElement = jQuery('#select_method'); - pasteInputElement = jQuery('#paste_input'); - pasteInputPlaceholderElement = + // define reusable variables + currentStepE = jQuery(location.hash); + methodSelectionElement = jQuery('#select_method'); + pasteInputElement = jQuery('#paste_input'); + pasteInputPlaceholderElement = pasteInputElement.data('placeholder').replace(/\\n/g, '\n'); - pasteProcessButtonElement = + pasteProcessButtonElement = jQuery('#method_paste > div.mailpoet_method_process') .find('a.mailpoet_process'); - mailChimpKeyInputElement = jQuery('#mailchimp_key'); - mailChimpKeyVerifyButtonElement = jQuery('#mailchimp_key_verify'); - mailChimpListsContainerElement = jQuery('#mailchimp_lists'); - mailChimpProcessButtonElement = jQuery('#method_mailchimp > div.mailpoet_method_process') - .find('a.mailpoet_process'); - uploadElement = jQuery('#file_local'); - uploadProcessButtonElement = + mailChimpKeyInputElement = jQuery('#mailchimp_key'); + mailChimpKeyVerifyButtonElement = jQuery('#mailchimp_key_verify'); + mailChimpListsContainerElement = jQuery('#mailchimp_lists'); + mailChimpProcessButtonElement = jQuery('#method_mailchimp > div.mailpoet_method_process') + .find('a.mailpoet_process'); + uploadElement = jQuery('#file_local'); + uploadProcessButtonElement = jQuery('#method_file > div.mailpoet_method_process') .find('a.mailpoet_process'); - // define method change behavior - methodSelectionElement.change(function () { - var availableMethods = jQuery(':radio[name="select_method"]'); - var selectedMethod = availableMethods.index(availableMethods.filter(':checked')); - MailPoet.Notice.hide(); - // hide all methods - currentStepE.find('.inside') - .children('div[id^="method_"]') - .hide(); - // show selected method - currentStepE.find('.inside') - .children('div[id^="method_"]:eq(' + selectedMethod + ')') - .show() - .find('table') - .show(); - }); + // define method change behavior + methodSelectionElement.change(function () { + var availableMethods = jQuery(':radio[name="select_method"]'); + var selectedMethod = availableMethods.index(availableMethods.filter(':checked')); + MailPoet.Notice.hide(); + // hide all methods + currentStepE.find('.inside') + .children('div[id^="method_"]') + .hide(); + // show selected method + currentStepE.find('.inside') + .children('div[id^="method_"]:eq(' + selectedMethod + ')') + .show() + .find('table') + .show(); + }); - // start step 1 - showCurrentStep(); + // start step 1 + showCurrentStep(); - function toggleNextStepButton(element, condition) { - var disabled = 'button-disabled'; - if (condition === 'on') { - element.closest('table a').removeClass(disabled); - return; - } - element.closest('table a').addClass(disabled); + function toggleNextStepButton(element, condition) { + var disabled = 'button-disabled'; + if (condition === 'on') { + element.closest('table a').removeClass(disabled); + return; } + element.closest('table a').addClass(disabled); + } - function parseCSV(isFile) { - var processedSubscribers = []; - var parsedEmails = []; - var duplicateEmails = []; - var invalidEmails = []; - var emailColumnPosition = null; - var columnCount = null; - var isHeaderFound = false; - var advancedOptionHeader = true; - var advancedOptionDelimiter = ''; - var advancedOptionNewline = ''; - var advancedOptionComments = false; - // trim spaces, commas, periods, - // single/double quotes and convert to lowercase - var detectAndCleanupEmail = function (emailString) { - var test; - // decode HTML entities - var email = jQuery('
    ').html(emailString).text(); - email = email - .toLowerCase() - // left/right trim spaces, punctuation (e.g., " 'email@email.com'; ") - // right trim non-printable characters (e.g., "email@email.com�") - .replace(/^["';.,\s]+|[^\x20-\x7E]+$|["';.,_\s]+$/g, '') - // remove spaces (e.g., "email @ email . com") - // remove urlencoded characters - .replace(/\s+|%\d+|,+/g, ''); - // detect e-mails that will be otherwise rejected by email regex - test = /<(.*?)>/.exec(email); - if (test) { - // is the email inside angle brackets (e.g., 'some@email.com ')? - email = test[1].trim(); - } - test = /mailto:(?:\s+)?(.*)/.exec(email); - if (test) { - // is the email in 'mailto:email' format? - email = test[1].trim(); - } + function parseCSV(isFile) { + var processedSubscribers = []; + var parsedEmails = []; + var duplicateEmails = []; + var invalidEmails = []; + var emailColumnPosition = null; + var columnCount = null; + var isHeaderFound = false; + var advancedOptionHeader = true; + var advancedOptionDelimiter = ''; + var advancedOptionNewline = ''; + var advancedOptionComments = false; + // trim spaces, commas, periods, + // single/double quotes and convert to lowercase + var detectAndCleanupEmail = function (emailString) { + var test; + // decode HTML entities + var email = jQuery('
    ').html(emailString).text(); + email = email + .toLowerCase() + // left/right trim spaces, punctuation (e.g., " 'email@email.com'; ") + // right trim non-printable characters (e.g., "email@email.com�") + .replace(/^["';.,\s]+|[^\x20-\x7E]+$|["';.,_\s]+$/g, '') + // remove spaces (e.g., "email @ email . com") + // remove urlencoded characters + .replace(/\s+|%\d+|,+/g, ''); + // detect e-mails that will be otherwise rejected by email regex + test = /<(.*?)>/.exec(email); + if (test) { + // is the email inside angle brackets (e.g., 'some@email.com ')? + email = test[1].trim(); + } + test = /mailto:(?:\s+)?(.*)/.exec(email); + if (test) { + // is the email in 'mailto:email' format? + email = test[1].trim(); + } - // validate email - if (!window.mailpoet_email_regex.test(email)) { - return false; - } - return email; - }; + // validate email + if (!window.mailpoet_email_regex.test(email)) { + return false; + } + return email; + }; - return { - skipEmptyLines: true, - delimiter: advancedOptionDelimiter, - newline: advancedOptionNewline, - comments: advancedOptionComments, - error: function () { - MailPoet.Notice.hide(); - MailPoet.Notice.error(MailPoet.I18n.t('dataProcessingError')); - }, - complete: function (CSV) { - var email; - var emailAddress; - var rowData; - var rowColumnCount; - var errorNotice; - Object.keys(CSV.data).forEach(function csvDataEach(rowCount) { - rowData = CSV.data[rowCount].map(function (el) { - return el.trim(); - }); - rowColumnCount = rowData.length; - // set the number of row elements based on the first non-empty row - if (columnCount === null) { - columnCount = rowColumnCount; - } - // Process the row with the following assumptions: - // 1. Each row should contain the same number of elements - // 2. There should be at least 1 valid (as per HTML5 e-mail regex) - // e-mail address on each row EXCEPT when the header option is set to true - // 3. Duplicate addresses are skipped - if (rowColumnCount === columnCount) { - // determine position of email address inside an array; this is - // done once and then email regex is run just on that element for each row - if (emailColumnPosition === null) { - Object.keys(rowData).forEach(function rowDataEach(column) { - emailAddress = detectAndCleanupEmail(rowData[column]); - if (emailColumnPosition === null - && window.mailpoet_email_regex.test(emailAddress)) { - emailColumnPosition = column; - // add current e-mail to an object index - parsedEmails[emailAddress] = true; - rowData[column] = emailAddress; - processedSubscribers[emailAddress] = rowData; - } - }); + return { + skipEmptyLines: true, + delimiter: advancedOptionDelimiter, + newline: advancedOptionNewline, + comments: advancedOptionComments, + error: function () { + MailPoet.Notice.hide(); + MailPoet.Notice.error(MailPoet.I18n.t('dataProcessingError')); + }, + complete: function (CSV) { + var email; + var emailAddress; + var rowData; + var rowColumnCount; + var errorNotice; + Object.keys(CSV.data).forEach(function csvDataEach(rowCount) { + rowData = CSV.data[rowCount].map(function (el) { + return el.trim(); + }); + rowColumnCount = rowData.length; + // set the number of row elements based on the first non-empty row + if (columnCount === null) { + columnCount = rowColumnCount; + } + // Process the row with the following assumptions: + // 1. Each row should contain the same number of elements + // 2. There should be at least 1 valid (as per HTML5 e-mail regex) + // e-mail address on each row EXCEPT when the header option is set to true + // 3. Duplicate addresses are skipped + if (rowColumnCount === columnCount) { + // determine position of email address inside an array; this is + // done once and then email regex is run just on that element for each row + if (emailColumnPosition === null) { + Object.keys(rowData).forEach(function rowDataEach(column) { + emailAddress = detectAndCleanupEmail(rowData[column]); if (emailColumnPosition === null + && window.mailpoet_email_regex.test(emailAddress)) { + emailColumnPosition = column; + // add current e-mail to an object index + parsedEmails[emailAddress] = true; + rowData[column] = emailAddress; + processedSubscribers[emailAddress] = rowData; + } + }); + if (emailColumnPosition === null && advancedOptionHeader && parseInt(rowCount, 10) === 0) { - isHeaderFound = true; - processedSubscribers[0] = rowData; - } - } else if (rowData[emailColumnPosition] !== '') { - email = detectAndCleanupEmail(rowData[emailColumnPosition]); - if (_.has(parsedEmails, email)) { - duplicateEmails.push(email); - } else if (!window.mailpoet_email_regex.test(email)) { - invalidEmails.push(rowData[emailColumnPosition]); - } else { - // if we haven't yet processed this e-mail and it passed - // the regex test, then process the row - parsedEmails[email] = true; - rowData[emailColumnPosition] = email; - processedSubscribers[email] = rowData; - } + isHeaderFound = true; + processedSubscribers[0] = rowData; + } + } else if (rowData[emailColumnPosition] !== '') { + email = detectAndCleanupEmail(rowData[emailColumnPosition]); + if (_.has(parsedEmails, email)) { + duplicateEmails.push(email); + } else if (!window.mailpoet_email_regex.test(email)) { + invalidEmails.push(rowData[emailColumnPosition]); + } else { + // if we haven't yet processed this e-mail and it passed + // the regex test, then process the row + parsedEmails[email] = true; + rowData[emailColumnPosition] = email; + processedSubscribers[email] = rowData; } } - }); - // reindex array to avoid non-numeric indices - processedSubscribers = _.values(processedSubscribers); - // if the header options is set, there should be at least - // 2 data rows, otherwise at least 1 data row - if ( - processedSubscribers && + } + }); + // reindex array to avoid non-numeric indices + processedSubscribers = _.values(processedSubscribers); + // if the header options is set, there should be at least + // 2 data rows, otherwise at least 1 data row + if ( + processedSubscribers && ( (isHeaderFound && processedSubscribers.length >= 2) || (!isHeaderFound && processedSubscribers.length >= 1) ) - ) { - // since we assume that the header line is always present, we need - // to detect the header by checking if it contains a valid e-mail address - window.importData.step1 = { - header: (!window.mailpoet_email_regex.test( - processedSubscribers[0][emailColumnPosition]) - ) ? processedSubscribers.shift() : null, - subscribers: processedSubscribers, - subscribersCount: processedSubscribers.length, - duplicate: duplicateEmails, - invalid: invalidEmails - }; - MailPoet.trackEvent('Subscribers import started', { - source: isFile ? 'file upload' : 'pasted data', - 'MailPoet Free version': window.mailpoet_version - }); - router.navigate('step2', { trigger: true }); - } else { - MailPoet.Modal.loading(false); - errorNotice = MailPoet.I18n.t('noValidRecords'); - errorNotice = errorNotice.replace('[link]', MailPoet.I18n.t('csvKBLink')); - errorNotice = errorNotice.replace('[/link]', ''); - MailPoet.Notice.error(errorNotice); - } - } - }; - } - - function displayMailChimpLists(data) { - var listSelectElement = mailChimpListsContainerElement.find('select'); - if (listSelectElement.data('select2')) { - listSelectElement.select2('data', data); - listSelectElement.trigger('change'); - } else { - listSelectElement - .select2({ - data: data, - width: '20em', - templateResult: function (item) { - return item.name; - }, - templateSelection: function (item) { - return item.name; - } - }) - .change(function () { - if (jQuery(this).val() !== null) { - toggleNextStepButton(mailChimpProcessButtonElement, 'on'); - } else { - toggleNextStepButton(mailChimpProcessButtonElement, 'off'); - } - }) - .trigger('change'); - } - mailChimpListsContainerElement.show(); - } - - /* - * Paste - */ - pasteInputElement - .attr('value', pasteInputPlaceholderElement).css('color', '#999') - .focus(function () { - if (jQuery(this).val() === pasteInputPlaceholderElement) { - jQuery(this).attr('value', '').css('color', '#222'); - } - }) - .blur(function () { - if (jQuery(this).val() === '') { - jQuery(this).attr('value', pasteInputPlaceholderElement).css('color', '#999'); - } - }) - .keyup(function () { - toggleNextStepButton( - pasteProcessButtonElement, - (this.value.trim() !== '') ? 'on' : 'off' - ); - }); - - pasteProcessButtonElement.click(function () { - var pasteSize = encodeURI(pasteInputElement.val()).split(/%..|./).length - 1; - MailPoet.Notice.hide(); - // get an approximate size of textarea paste in bytes - if (pasteSize > window.maxPostSizeBytes) { - MailPoet.Notice.error(MailPoet.I18n.t('maxPostSizeNotice')); - return; - } - // delay loading indicator for 10ms or else it's just too fast :) - MailPoet.Modal.loading(true); - setTimeout(function () { - Papa.parse(pasteInputElement.val(), parseCSV(false)); - }, 10); - }); - - /* - * CSV file - */ - uploadElement.change(function () { - var ext = this.value.match(/[^.]+$/); - MailPoet.Notice.hide(); - if (ext === null || ext[0].toLowerCase() !== 'csv') { - this.value = ''; - MailPoet.Notice.error(MailPoet.I18n.t('wrongFileFormat')); - } - - toggleNextStepButton( - uploadProcessButtonElement, - (this.value.trim() !== '') ? 'on' : 'off' - ); - }); - - uploadProcessButtonElement.click(function () { - if (uploadElement.val().trim() !== '') { - // delay loading indicator for 10ms or else it's just too fast :) - MailPoet.Modal.loading(true); - setTimeout(function () { - uploadElement.parse({ - config: parseCSV(true) - }); - }, 10); - } - }); - - /* - * MailChimp - */ - mailChimpKeyInputElement.keyup(function () { - if (this.value.trim() === '' - || !/[a-zA-Z0-9]{32}-/.exec(this.value.trim())) { - mailChimpListsContainerElement.hide(); - jQuery('.mailpoet_mailchimp-key-status') - .html('') - .removeClass('mailpoet_mailchimp-ok mailpoet_mailchimp-error'); - toggleNextStepButton(mailChimpProcessButtonElement, 'off'); - } - }); - - mailChimpKeyVerifyButtonElement.click(function () { - MailPoet.Modal.loading(true); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'importExport', - action: 'getMailChimpLists', - data: { - api_key: mailChimpKeyInputElement.val() - } - }).always(function () { - MailPoet.Modal.loading(false); - }).done(function (response) { - jQuery('.mailpoet_mailchimp-key-status') - .html('') - .removeClass() - .addClass('mailpoet_mailchimp-key-status mailpoet_mailchimp-ok'); - if (response.data.length === 0) { - jQuery('.mailpoet_mailchimp-key-status').html(MailPoet.I18n.t('noMailChimpLists')); - mailChimpListsContainerElement.hide(); - toggleNextStepButton(mailChimpProcessButtonElement, 'off'); - } else { - displayMailChimpLists(response.data); - } - }).fail(function (response) { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { scroll: true } - ); - } - }); - }); - - mailChimpProcessButtonElement.click(function () { - if (mailChimpProcessButtonElement.closest('table a').hasClass('button-disabled')) { - return; - } - MailPoet.Modal.loading(true); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'importExport', - action: 'getMailChimpSubscribers', - data: { - api_key: mailChimpKeyInputElement.val(), - lists: mailChimpListsContainerElement.find('select').val() - } - }).always(function () { - MailPoet.Modal.loading(false); - }).done(function (response) { - window.importData.step1 = response.data; - MailPoet.trackEvent('Subscribers import started', { - source: 'MailChimp', - 'MailPoet Free version': window.mailpoet_version - }); - router.navigate('step2', { trigger: true }); - }).fail(function (response) { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { scroll: true } - ); - } - }); - }); - }); - - router.on('route:step2', function () { - var nextStepButton; - var previousStepButton; - var subscribers; - var subscribersDataTemplate; - var subscribersDataTemplatePartial; - var subscribersDataParseResultsTemplate; - var segmentSelectElement; - var maxRowsToShow; - var filler; - var fillerArray; - var fillerPosition; - var importResults; - var duplicates; - if (typeof (window.importData.step1) === 'undefined') { - router.navigate('step1', { trigger: true }); - return; - } - // define reusable variables - nextStepButton = jQuery('#step2_process'); - previousStepButton = jQuery('#return_to_step1'); - // create a copy of subscribers object for further manipulation - subscribers = jQuery.extend(true, {}, window.importData.step1); - subscribersDataTemplate = Handlebars.compile(jQuery('#subscribers_data_template').html()); - subscribersDataTemplatePartial = Handlebars.compile(jQuery('#subscribers_data_template_partial').html()); - subscribersDataParseResultsTemplate = Handlebars.compile(jQuery('#subscribers_data_parse_results_template').html()); - segmentSelectElement = jQuery('#mailpoet_segments_select'); - maxRowsToShow = 10; - filler = '. . .'; - // create an array of filler data with the same number of - // elements as in the subscribers' data row - fillerArray = Array.apply( - null, - new Array(subscribers.subscribers[0].length) - ).map(String.prototype.valueOf, filler); - - showCurrentStep(); - - function toggleNextStepButton(condition) { - var disabled = 'button-disabled'; - if (condition === 'on') { - nextStepButton.removeClass(disabled); - return; - } - nextStepButton.addClass(disabled); - } - - // hide previous statistics/import results - jQuery('#subscribers_data_parse_results:visible').html(''); - jQuery('#subscribers_data_import_results:visible').hide(); - - // show parse statistics if any duplicate/invalid records were found - if (subscribers.invalid.length || subscribers.duplicate.length) { - // count repeating e-mails inside duplicate array and present them in - // 'email (xN)' format - duplicates = {}; - subscribers.duplicate.forEach(function (subscriberEmail) { - duplicates[subscriberEmail] = (duplicates[subscriberEmail] || 0) + 1; - }); - subscribers.duplicate = []; - Object.keys(duplicates).forEach(function emailDuplicates(email) { - if (duplicates[email] > 1) { - subscribers.duplicate.push(email + ' (x' + duplicates[email] + ')'); - } else { - subscribers.duplicate.push(email); - } - }); - - importResults = { - notice: MailPoet.I18n.t('importNoticeSkipped').replace( - '%1$s', - '' + (subscribers.invalid.length + subscribers.duplicate.length) + '' - ), - invalid: (subscribers.invalid.length) - ? MailPoet.I18n.t('importNoticeInvalid') - .replace('%1$s', '' + subscribers.invalid.length.toLocaleString() + '') - .replace('%2$s', subscribers.invalid.join(', ')) - : null, - duplicate: (subscribers.duplicate.length) - ? MailPoet.I18n.t('importNoticeDuplicate') - .replace('%1$s', '' + subscribers.duplicate.length + '') - .replace('%2$s', subscribers.duplicate.join(', ')) - : null - }; - jQuery('#subscribers_data_parse_results').html( - subscribersDataParseResultsTemplate(importResults) - ); - } - - jQuery('.mailpoet_subscribers_data_parse_results_details_show') - .click(function () { - var details = jQuery('.mailpoet_subscribers_data_parse_results_details'); - jQuery(details).toggle(); - this.text = - (jQuery(details).is(':visible')) - ? MailPoet.I18n.t('hideDetails') - : MailPoet.I18n.t('showDetails'); - }); - - // show available segments - if (window.mailpoetSegments.length) { - jQuery('.mailpoet_segments').show(); - } else { - jQuery('.mailpoet_no_segments').show(); - } - - function enableSegmentSelection(segments) { - if (segmentSelectElement.data('select2')) { - segmentSelectElement - .html('') - .select2('destroy'); - toggleNextStepButton('off'); - } - segmentSelectElement - .select2({ - data: segments, - width: '20em', - templateResult: function (item) { - var i = item; - i.subscriberCount = parseInt(i.subscriberCount, 10); - return i.name + ' (' + i.subscriberCount.toLocaleString() + ')'; - }, - templateSelection: function (item) { - var i = item; - i.subscriberCount = parseInt(i.subscriberCount, 10); - return i.name + ' (' + i.subscriberCount.toLocaleString() + ')'; - } - }) - .change(function () { - var segmentSelectionNotice = jQuery('[data-id="notice_segmentSelection"]'); - if (!this.value) { - if (!segmentSelectionNotice.length) { - MailPoet.Notice.error(MailPoet.I18n.t('segmentSelectionRequired'), { - static: true, - scroll: true, - id: 'notice_segmentSelection', - hideClose: true - }); - } - toggleNextStepButton('off'); - } else { - jQuery('[data-id="notice_segmentSelection"]').remove(); - if (!jQuery('.mailpoet_notice.error:visible').length) { - toggleNextStepButton('on'); - } - } - }); - } - - jQuery('.mailpoet_create_segment').click(function () { - MailPoet.Modal.popup({ - title: MailPoet.I18n.t('addNewList'), - template: jQuery('#new_segment_template').html() - }); - jQuery('#new_segment_name').keypress(function (e) { - if (e.which === 13) { - jQuery('#new_segment_process').click(); - } - }); - jQuery('#new_segment_process').click(function () { - var segmentName = jQuery('#new_segment_name').val().trim(); - var segmentDescription = jQuery('#new_segment_description').val().trim(); - - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'ImportExport', - action: 'addSegment', - data: { - name: segmentName, - description: segmentDescription - } - }).done(function (response) { - var selectedValues; - window.mailpoetSegments.push({ - id: response.data.id, - name: response.data.name, - subscriberCount: 0 - }); - - selectedValues = segmentSelectElement.val(); - if (selectedValues === null) { - selectedValues = [response.data.id]; - } else { - selectedValues.push(response.data.id); - } - - enableSegmentSelection(window.mailpoetSegments); - segmentSelectElement.val(selectedValues).trigger('change'); - jQuery('.mailpoet_segments:hidden').show(); - jQuery('.mailpoet_no_segments:visible').hide(); - MailPoet.Modal.close(); - }).fail(function (response) { - if (response.errors.length > 0) { - MailPoet.Notice.hide(); - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { positionAfter: '#new_segment_name' } - ); - } - }); - }); - jQuery('#new_segment_cancel').click(function () { - MailPoet.Modal.close(); - }); - }); - - // register partial template that will contain subscribers data - Handlebars.registerPartial( - 'subscribers_data_template_partial', - subscribersDataTemplatePartial - ); - - // autodetect column types - Handlebars.registerHelper( - 'show_and_match_columns', - function (helperSubscribers, options) { - var displayedColumns = []; - var displayedColumnsIds = []; - var columnData; - var columnId; - var headerName; - var headerNameMatch; - // go through all elements of the first row in subscribers data - Object - .keys(helperSubscribers.subscribers[0]) - .forEach(function helperSubscribersLoop(i) { - columnData = helperSubscribers.subscribers[0][i]; - columnId = 'ignore'; // set default column type - // if the column is not undefined and has a valid e-mail, set type as email - if (columnData % 1 !== 0 && window.mailpoet_email_regex.test(columnData)) { - columnId = 'email'; - } else if (helperSubscribers.header) { - headerName = helperSubscribers.header[i]; - headerNameMatch = window.mailpoetColumns.map(function (el) { - return el.name; - }).indexOf(headerName); - // set column type using header - if (headerNameMatch !== -1) { - columnId = window.mailpoetColumns[headerNameMatch].id; - } else if (headerName) { // set column type using header name - if (/first|first name|given name/i.test(headerName)) { - columnId = 'first_name'; - } else if (/last|last name/i.test(headerName)) { - columnId = 'last_name'; - } - } - } - // make sure the column id has not been previously selected - // (e.g., subscriber_first_name shouldn't be autodetected twice), - // except for "ignore" - columnId = - (columnId !== 'ignore' - && displayedColumnsIds.indexOf(columnId) === -1) - ? columnId - : 'ignore'; - displayedColumns[i] = { column_id: columnId }; - displayedColumnsIds.push(columnId); - }); - return options.fn(displayedColumns); - }); - - // sanitize unsafe data - Handlebars.registerHelper('sanitize_data', function (data) { - return (data instanceof Handlebars.SafeString) ? - data : - new Handlebars.SafeString(Handlebars.Utils.escapeExpression(data)); - }); - - // start array index from 1 - Handlebars.registerHelper('calculate_index', function (rawIndex) { - var index = parseInt(rawIndex, 10); - // display filler data (e.g., ellipsis) if we've reached the maximum number of rows and - // subscribers count is greater than the maximum number of rows we're displaying - if (index === maxRowsToShow && subscribers.subscribersCount > (maxRowsToShow + 1)) { - fillerPosition = index; - return filler; - } else if (index === (subscribers.subscribers.length - 1)) { - // if we're on the last line, show the total count of subscribers data - return subscribers.subscribersCount.toLocaleString(); - } - return index + 1; - }); - - // reduce subscribers object if the total length is greater than the - // maximum number of defined rows - if (subscribers.subscribersCount > (maxRowsToShow + 1)) { - subscribers.subscribers.splice( - maxRowsToShow, subscribers.subscribersCount - (maxRowsToShow + 1), - fillerArray - ); - } - - // filter subscribers' data to detect dates, emails, etc. - function filterSubscribers() { - var subscribersClone = jQuery.extend(true, {}, subscribers); - var preventNextStep = false; - var displayedColumns; - jQuery( - '[data-id="notice_invalidEmail"], [data-id="notice_invalidDate"]') - .remove(); - displayedColumns = jQuery.map( - jQuery('.mailpoet_subscribers_column_data_match'), function (element, elementIndex) { - var columnId = jQuery(element).data('column-id'); - var validationRule = jQuery(element).data('validation-rule'); - jQuery(element).val(columnId).trigger('change'); - return { - id: columnId, - index: elementIndex, - validationRule: validationRule, - element: element + ) { + // since we assume that the header line is always present, we need + // to detect the header by checking if it contains a valid e-mail address + window.importData.step1 = { + header: (!window.mailpoet_email_regex.test( + processedSubscribers[0][emailColumnPosition]) + ) ? processedSubscribers.shift() : null, + subscribers: processedSubscribers, + subscribersCount: processedSubscribers.length, + duplicate: duplicateEmails, + invalid: invalidEmails }; - }); - // iterate through the object of mailpoet columns - jQuery.map(window.mailpoetColumns, function (column) { - var firstRowData; - var validationRule; - var testedFormat; - var allowedDateFormats; - // check if the column id matches the selected id of one of the - // subscriber's data columns - var matchedColumn = _.find( - displayedColumns, - function (data) { return data.id === column.id; } - ); - // EMAIL filter: if the first value in the column doesn't have a valid - // email, hide the next button - if (column.id === 'email') { - if (!window.mailpoet_email_regex.test( - subscribersClone.subscribers[0][matchedColumn.index]) - ) { - preventNextStep = true; - if (!jQuery('[data-id="notice_invalidEmail"]').length) { - MailPoet.Notice.error(MailPoet.I18n.t('columnContainsInvalidElement'), { - static: true, - scroll: true, - hideClose: true, - id: 'invalidEmail' - }); - } - } else { - MailPoet.Notice.hide('invalidEmail'); - } - } - // DATE filter: if column type is date, check if we can recognize it - if (column.type === 'date' && matchedColumn) { - allowedDateFormats = [ - Moment.ISO_8601, - 'YYYY/MM/DD', - 'MM/DD/YYYY', - 'DD/MM/YYYY', - 'YYYY/MM/DD', - 'YYYY/DD/MM', - 'MM/YYYY', - 'YYYY/MM', - 'YYYY' - ]; - firstRowData = subscribersClone.subscribers[0][matchedColumn.index]; - validationRule = false; - // check if date exists - if (firstRowData.trim() === '') { - subscribersClone.subscribers[0][matchedColumn.index] = - '' - + MailPoet.I18n.t('emptyFirstRowDate') - + ' '; - preventNextStep = true; - } else { - Object.keys(allowedDateFormats).forEach(function allowedDateFormatsLoop(format) { - testedFormat = allowedDateFormats[format]; - if (Moment(firstRowData, testedFormat, true).isValid()) { - validationRule = (typeof (testedFormat) === 'function') ? - 'datetime' : - testedFormat; - // set validation on the column element - jQuery(matchedColumn.element).data('validation-rule', validationRule); - return; - } - if (validationRule === 'datetime') { - validationRule = Moment.ISO_8601; - } - }); - } - jQuery.map(subscribersClone.subscribers, function (dataSubscribers, index) { - var data = dataSubscribers; - var rowData = data[matchedColumn.index]; - var date = Moment(rowData, testedFormat, true); - if (index === fillerPosition || rowData.trim() === '') return; - // validate date - if (date.isValid()) { - data[matchedColumn.index] = new Handlebars.SafeString( - Handlebars.Utils.escapeExpression(data[matchedColumn.index]) - + '' - + MailPoet.Date.format(date) - + ' ' - ); - } else { - data[matchedColumn.index] = new Handlebars.SafeString( - Handlebars.Utils.escapeExpression(data[matchedColumn.index]) - + '' - + (new Handlebars.SafeString(MailPoet.I18n.t('dateMatchError'))) - + ' ' - ); - preventNextStep = true; - } + MailPoet.trackEvent('Subscribers import started', { + source: isFile ? 'file upload' : 'pasted data', + 'MailPoet Free version': window.mailpoet_version }); - if (preventNextStep && !jQuery('.mailpoet_invalidDate').length) { - MailPoet.Notice.error(MailPoet.I18n.t('columnContainsInvalidDate'), { - static: true, - scroll: true, - hideClose: true, - id: 'invalidDate' - }); - } + router.navigate('step2', { trigger: true }); + } else { + MailPoet.Modal.loading(false); + errorNotice = MailPoet.I18n.t('noValidRecords'); + errorNotice = errorNotice.replace('[link]', MailPoet.I18n.t('csvKBLink')); + errorNotice = errorNotice.replace('[/link]', ''); + MailPoet.Notice.error(errorNotice); } - }); - // refresh table with susbcribers' data - jQuery('#subscribers_data > table > tbody') - .html(subscribersDataTemplatePartial(subscribersClone)); - - if (preventNextStep) { - toggleNextStepButton('off'); - } else if (!jQuery('.mailpoet_notice.error:visible').length - && segmentSelectElement.val()) { - toggleNextStepButton('on'); } - } + }; + } - // render template - jQuery('#subscribers_data > table').html(subscribersDataTemplate(subscribers)); - - // filter displayed data - jQuery('select.mailpoet_subscribers_column_data_match') + function displayMailChimpLists(data) { + var listSelectElement = mailChimpListsContainerElement.find('select'); + if (listSelectElement.data('select2')) { + listSelectElement.select2('data', data); + listSelectElement.trigger('change'); + } else { + listSelectElement .select2({ - data: window.mailpoetColumnsSelect2, - width: '15em', + data: data, + width: '20em', templateResult: function (item) { return item.name; }, @@ -896,275 +294,877 @@ define( return item.name; } }) - .on('select2:selecting', function (selectEvent) { - var selectElement = this; - var selectedOptionId = selectEvent.params.args.data.id; - // CREATE CUSTOM FIELD - if (selectedOptionId === 'create') { - selectEvent.preventDefault(); - jQuery(selectElement).select2('close'); - MailPoet.Modal.popup({ - title: MailPoet.I18n.t('addNewField'), - template: jQuery('#form_template_field_form').html() - }); - jQuery('#form_field_new').parsley().on('form:submit', function () { - // get data - var data = jQuery(this.$element).mailpoetSerializeObject(); - - // save custom field - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'customFields', - action: 'save', - data: data - }).done(function (response) { - var newColumnData = { - id: response.data.id, - name: response.data.name, - type: response.data.type, - params: response.data.params, - custom: true - }; - // if this is the first custom column, create an "optgroup" - if (window.mailpoetColumnsSelect2.length === 2) { - window.mailpoetColumnsSelect2.push({ - name: MailPoet.I18n.t('userColumns'), - children: [] - }); - } - window.mailpoetColumnsSelect2[2].children.push(newColumnData); - window.mailpoetColumns.push(newColumnData); - jQuery('select.mailpoet_subscribers_column_data_match') - .each(function () { - jQuery(this) - .html('') - .select2('destroy') - .select2({ - data: window.mailpoetColumnsSelect2, - width: '15em', - templateResult: function (item) { - return item.name; - }, - templateSelection: function (item) { - return item.name; - } - }); - }); - jQuery(selectElement).data('column-id', newColumnData.id); - jQuery(selectElement).data('validation-rule', false); - filterSubscribers(); - // close popup - MailPoet.Modal.close(); - }).fail(function (response) { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { positionAfter: '#field_name' } - ); - } - }); - return false; - }); + .change(function () { + if (jQuery(this).val() !== null) { + toggleNextStepButton(mailChimpProcessButtonElement, 'on'); } else { - // CHANGE COLUMN - // check for duplicate values in all select options - jQuery('select.mailpoet_subscribers_column_data_match') - .each(function () { - var element = this; - var elementId = jQuery(element).val(); - // if another column has the same value and it's not an 'ignore', - // prompt user - if (elementId === selectedOptionId - && elementId !== 'ignore') { - if (confirm(MailPoet.I18n.t('selectedValueAlreadyMatched') + ' ' + MailPoet.I18n.t('confirmCorrespondingColumn'))) { // eslint-disable-line no-alert - jQuery(element).data('column-id', 'ignore'); - } else { - selectEvent.preventDefault(); - jQuery(selectElement).select2('close'); - } - } - }); + toggleNextStepButton(mailChimpProcessButtonElement, 'off'); } }) - .on('select2:select', function (selectEvent) { - var selectElement = this; - var selectedOptionId = selectEvent.params.data.id; - jQuery(selectElement).data('column-id', selectedOptionId); - filterSubscribers(); - }); + .trigger('change'); + } + mailChimpListsContainerElement.show(); + } - previousStepButton.off().on('click', function () { - router.navigate('step1', { trigger: true }); + /* + * Paste + */ + pasteInputElement + .attr('value', pasteInputPlaceholderElement).css('color', '#999') + .focus(function () { + if (jQuery(this).val() === pasteInputPlaceholderElement) { + jQuery(this).attr('value', '').css('color', '#222'); + } + }) + .blur(function () { + if (jQuery(this).val() === '') { + jQuery(this).attr('value', pasteInputPlaceholderElement).css('color', '#999'); + } + }) + .keyup(function () { + toggleNextStepButton( + pasteProcessButtonElement, + (this.value.trim() !== '') ? 'on' : 'off' + ); }); - nextStepButton.off().on('click', function () { - var columns = {}; - var queue = new jQuery.AsyncQueue(); - var batchNumber = 0; - var batchSize = 2000; - var timestamp = Date.now() / 1000; - var clickImportResults = { - created: 0, - updated: 0, - errors: [], - segments: [] - }; - var clickSubscribers; - var splitSubscribers; + pasteProcessButtonElement.click(function () { + var pasteSize = encodeURI(pasteInputElement.val()).split(/%..|./).length - 1; + MailPoet.Notice.hide(); + // get an approximate size of textarea paste in bytes + if (pasteSize > window.maxPostSizeBytes) { + MailPoet.Notice.error(MailPoet.I18n.t('maxPostSizeNotice')); + return; + } + // delay loading indicator for 10ms or else it's just too fast :) + MailPoet.Modal.loading(true); + setTimeout(function () { + Papa.parse(pasteInputElement.val(), parseCSV(false)); + }, 10); + }); - if (jQuery(this).hasClass('button-disabled')) { - return; - } + /* + * CSV file + */ + uploadElement.change(function () { + var ext = this.value.match(/[^.]+$/); + MailPoet.Notice.hide(); + if (ext === null || ext[0].toLowerCase() !== 'csv') { + this.value = ''; + MailPoet.Notice.error(MailPoet.I18n.t('wrongFileFormat')); + } + + toggleNextStepButton( + uploadProcessButtonElement, + (this.value.trim() !== '') ? 'on' : 'off' + ); + }); + + uploadProcessButtonElement.click(function () { + if (uploadElement.val().trim() !== '') { + // delay loading indicator for 10ms or else it's just too fast :) MailPoet.Modal.loading(true); - splitSubscribers = function (localSubscribers, size) { - return localSubscribers.reduce(function (res, item, index) { - if (index % size === 0) { - res.push([]); - } - res[res.length - 1].push(item); - return res; - }, []); - }; - clickSubscribers = splitSubscribers(window.importData.step1.subscribers, batchSize); - - _.each(jQuery('select.mailpoet_subscribers_column_data_match'), - function (column, columnIndex) { - var columnId = jQuery(column).data('column-id'); - var validationRule = jQuery(column).data('validation-rule'); - if (columnId === 'ignore') { - return; - } - columns[columnId] = { index: columnIndex, validation_rule: validationRule }; + setTimeout(function () { + uploadElement.parse({ + config: parseCSV(true) }); + }, 10); + } + }); - _.each(clickSubscribers, function () { - queue.add(function (addQueue) { - addQueue.pause(); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'ImportExport', - action: 'processImport', - data: JSON.stringify({ - columns: columns, - subscribers: clickSubscribers[batchNumber], - timestamp: timestamp, - segments: segmentSelectElement.val(), - updateSubscribers: (jQuery(':radio[name="subscriber_update_option"]:checked').val() === 'yes') - }) - }).done(function (response) { - clickImportResults.created += response.data.created; - clickImportResults.updated += response.data.updated; - clickImportResults.segments = response.data.segments; - clickImportResults.added_to_segment_with_welcome_notification = - response.data.added_to_segment_with_welcome_notification; - addQueue.run(); - }).fail(function (response) { - MailPoet.Modal.loading(false); - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { scroll: true } - ); - } - }); - batchNumber += 1; - }); + /* + * MailChimp + */ + mailChimpKeyInputElement.keyup(function () { + if (this.value.trim() === '' + || !/[a-zA-Z0-9]{32}-/.exec(this.value.trim())) { + mailChimpListsContainerElement.hide(); + jQuery('.mailpoet_mailchimp-key-status') + .html('') + .removeClass('mailpoet_mailchimp-ok mailpoet_mailchimp-error'); + toggleNextStepButton(mailChimpProcessButtonElement, 'off'); + } + }); + + mailChimpKeyVerifyButtonElement.click(function () { + MailPoet.Modal.loading(true); + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'importExport', + action: 'getMailChimpLists', + data: { + api_key: mailChimpKeyInputElement.val() + } + }).always(function () { + MailPoet.Modal.loading(false); + }).done(function (response) { + jQuery('.mailpoet_mailchimp-key-status') + .html('') + .removeClass() + .addClass('mailpoet_mailchimp-key-status mailpoet_mailchimp-ok'); + if (response.data.length === 0) { + jQuery('.mailpoet_mailchimp-key-status').html(MailPoet.I18n.t('noMailChimpLists')); + mailChimpListsContainerElement.hide(); + toggleNextStepButton(mailChimpProcessButtonElement, 'off'); + } else { + displayMailChimpLists(response.data); + } + }).fail(function (response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { scroll: true } + ); + } + }); + }); + + mailChimpProcessButtonElement.click(function () { + if (mailChimpProcessButtonElement.closest('table a').hasClass('button-disabled')) { + return; + } + MailPoet.Modal.loading(true); + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'importExport', + action: 'getMailChimpSubscribers', + data: { + api_key: mailChimpKeyInputElement.val(), + lists: mailChimpListsContainerElement.find('select').val() + } + }).always(function () { + MailPoet.Modal.loading(false); + }).done(function (response) { + window.importData.step1 = response.data; + MailPoet.trackEvent('Subscribers import started', { + source: 'MailChimp', + 'MailPoet Free version': window.mailpoet_version }); + router.navigate('step2', { trigger: true }); + }).fail(function (response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { scroll: true } + ); + } + }); + }); + }); - queue.run(); + router.on('route:step2', function () { + var nextStepButton; + var previousStepButton; + var subscribers; + var subscribersDataTemplate; + var subscribersDataTemplatePartial; + var subscribersDataParseResultsTemplate; + var segmentSelectElement; + var maxRowsToShow; + var filler; + var fillerArray; + var fillerPosition; + var importResults; + var duplicates; + if (typeof (window.importData.step1) === 'undefined') { + router.navigate('step1', { trigger: true }); + return; + } + // define reusable variables + nextStepButton = jQuery('#step2_process'); + previousStepButton = jQuery('#return_to_step1'); + // create a copy of subscribers object for further manipulation + subscribers = jQuery.extend(true, {}, window.importData.step1); + subscribersDataTemplate = Handlebars.compile(jQuery('#subscribers_data_template').html()); + subscribersDataTemplatePartial = Handlebars.compile(jQuery('#subscribers_data_template_partial').html()); + subscribersDataParseResultsTemplate = Handlebars.compile(jQuery('#subscribers_data_parse_results_template').html()); + segmentSelectElement = jQuery('#mailpoet_segments_select'); + maxRowsToShow = 10; + filler = '. . .'; + // create an array of filler data with the same number of + // elements as in the subscribers' data row + fillerArray = Array.apply( + null, + new Array(subscribers.subscribers[0].length) + ).map(String.prototype.valueOf, filler); - queue.onComplete(function () { - MailPoet.Modal.loading(false); - if ( - clickImportResults.errors.length > 0 - && !clickImportResults.updated - && !clickImportResults.created - ) { - MailPoet.Notice.error(_.flatten(clickImportResults.errors) - ); - } else { - window.mailpoetSegments = clickImportResults.segments; - clickImportResults.segments = _.map(segmentSelectElement.select2('data'), - function (data) { - return data.name; + showCurrentStep(); + + function toggleNextStepButton(condition) { + var disabled = 'button-disabled'; + if (condition === 'on') { + nextStepButton.removeClass(disabled); + return; + } + nextStepButton.addClass(disabled); + } + + // hide previous statistics/import results + jQuery('#subscribers_data_parse_results:visible').html(''); + jQuery('#subscribers_data_import_results:visible').hide(); + + // show parse statistics if any duplicate/invalid records were found + if (subscribers.invalid.length || subscribers.duplicate.length) { + // count repeating e-mails inside duplicate array and present them in + // 'email (xN)' format + duplicates = {}; + subscribers.duplicate.forEach(function (subscriberEmail) { + duplicates[subscriberEmail] = (duplicates[subscriberEmail] || 0) + 1; + }); + subscribers.duplicate = []; + Object.keys(duplicates).forEach(function emailDuplicates(email) { + if (duplicates[email] > 1) { + subscribers.duplicate.push(email + ' (x' + duplicates[email] + ')'); + } else { + subscribers.duplicate.push(email); + } + }); + + importResults = { + notice: MailPoet.I18n.t('importNoticeSkipped').replace( + '%1$s', + '' + (subscribers.invalid.length + subscribers.duplicate.length) + '' + ), + invalid: (subscribers.invalid.length) + ? MailPoet.I18n.t('importNoticeInvalid') + .replace('%1$s', '' + subscribers.invalid.length.toLocaleString() + '') + .replace('%2$s', subscribers.invalid.join(', ')) + : null, + duplicate: (subscribers.duplicate.length) + ? MailPoet.I18n.t('importNoticeDuplicate') + .replace('%1$s', '' + subscribers.duplicate.length + '') + .replace('%2$s', subscribers.duplicate.join(', ')) + : null + }; + jQuery('#subscribers_data_parse_results').html( + subscribersDataParseResultsTemplate(importResults) + ); + } + + jQuery('.mailpoet_subscribers_data_parse_results_details_show') + .click(function () { + var details = jQuery('.mailpoet_subscribers_data_parse_results_details'); + jQuery(details).toggle(); + this.text = + (jQuery(details).is(':visible')) + ? MailPoet.I18n.t('hideDetails') + : MailPoet.I18n.t('showDetails'); + }); + + // show available segments + if (window.mailpoetSegments.length) { + jQuery('.mailpoet_segments').show(); + } else { + jQuery('.mailpoet_no_segments').show(); + } + + function enableSegmentSelection(segments) { + if (segmentSelectElement.data('select2')) { + segmentSelectElement + .html('') + .select2('destroy'); + toggleNextStepButton('off'); + } + segmentSelectElement + .select2({ + data: segments, + width: '20em', + templateResult: function (item) { + var i = item; + i.subscriberCount = parseInt(i.subscriberCount, 10); + return i.name + ' (' + i.subscriberCount.toLocaleString() + ')'; + }, + templateSelection: function (item) { + var i = item; + i.subscriberCount = parseInt(i.subscriberCount, 10); + return i.name + ' (' + i.subscriberCount.toLocaleString() + ')'; + } + }) + .change(function () { + var segmentSelectionNotice = jQuery('[data-id="notice_segmentSelection"]'); + if (!this.value) { + if (!segmentSelectionNotice.length) { + MailPoet.Notice.error(MailPoet.I18n.t('segmentSelectionRequired'), { + static: true, + scroll: true, + id: 'notice_segmentSelection', + hideClose: true }); - window.importData.step2 = clickImportResults; - enableSegmentSelection(window.mailpoetSegments); - router.navigate('step3', { trigger: true }); + } + toggleNextStepButton('off'); + } else { + jQuery('[data-id="notice_segmentSelection"]').remove(); + if (!jQuery('.mailpoet_notice.error:visible').length) { + toggleNextStepButton('on'); + } + } + }); + } + + jQuery('.mailpoet_create_segment').click(function () { + MailPoet.Modal.popup({ + title: MailPoet.I18n.t('addNewList'), + template: jQuery('#new_segment_template').html() + }); + jQuery('#new_segment_name').keypress(function (e) { + if (e.which === 13) { + jQuery('#new_segment_process').click(); + } + }); + jQuery('#new_segment_process').click(function () { + var segmentName = jQuery('#new_segment_name').val().trim(); + var segmentDescription = jQuery('#new_segment_description').val().trim(); + + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'ImportExport', + action: 'addSegment', + data: { + name: segmentName, + description: segmentDescription + } + }).done(function (response) { + var selectedValues; + window.mailpoetSegments.push({ + id: response.data.id, + name: response.data.name, + subscriberCount: 0 + }); + + selectedValues = segmentSelectElement.val(); + if (selectedValues === null) { + selectedValues = [response.data.id]; + } else { + selectedValues.push(response.data.id); + } + + enableSegmentSelection(window.mailpoetSegments); + segmentSelectElement.val(selectedValues).trigger('change'); + jQuery('.mailpoet_segments:hidden').show(); + jQuery('.mailpoet_no_segments:visible').hide(); + MailPoet.Modal.close(); + }).fail(function (response) { + if (response.errors.length > 0) { + MailPoet.Notice.hide(); + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { positionAfter: '#new_segment_name' } + ); } }); }); - - filterSubscribers(); - enableSegmentSelection(window.mailpoetSegments); + jQuery('#new_segment_cancel').click(function () { + MailPoet.Modal.close(); + }); }); - router.on('route:step3', function () { - var subscribersDataImportResultsTemplate; - var exportMenuElement; - var importResults; - if (typeof (window.importData.step2) === 'undefined') { - router.navigate('step2', { trigger: true }); + // register partial template that will contain subscribers data + Handlebars.registerPartial( + 'subscribers_data_template_partial', + subscribersDataTemplatePartial + ); + + // autodetect column types + Handlebars.registerHelper( + 'show_and_match_columns', + function (helperSubscribers, options) { + var displayedColumns = []; + var displayedColumnsIds = []; + var columnData; + var columnId; + var headerName; + var headerNameMatch; + // go through all elements of the first row in subscribers data + Object + .keys(helperSubscribers.subscribers[0]) + .forEach(function helperSubscribersLoop(i) { + columnData = helperSubscribers.subscribers[0][i]; + columnId = 'ignore'; // set default column type + // if the column is not undefined and has a valid e-mail, set type as email + if (columnData % 1 !== 0 && window.mailpoet_email_regex.test(columnData)) { + columnId = 'email'; + } else if (helperSubscribers.header) { + headerName = helperSubscribers.header[i]; + headerNameMatch = window.mailpoetColumns.map(function (el) { + return el.name; + }).indexOf(headerName); + // set column type using header + if (headerNameMatch !== -1) { + columnId = window.mailpoetColumns[headerNameMatch].id; + } else if (headerName) { // set column type using header name + if (/first|first name|given name/i.test(headerName)) { + columnId = 'first_name'; + } else if (/last|last name/i.test(headerName)) { + columnId = 'last_name'; + } + } + } + // make sure the column id has not been previously selected + // (e.g., subscriber_first_name shouldn't be autodetected twice), + // except for "ignore" + columnId = + (columnId !== 'ignore' + && displayedColumnsIds.indexOf(columnId) === -1) + ? columnId + : 'ignore'; + displayedColumns[i] = { column_id: columnId }; + displayedColumnsIds.push(columnId); + }); + return options.fn(displayedColumns); + }); + + // sanitize unsafe data + Handlebars.registerHelper('sanitize_data', function (data) { + return (data instanceof Handlebars.SafeString) ? + data : + new Handlebars.SafeString(Handlebars.Utils.escapeExpression(data)); + }); + + // start array index from 1 + Handlebars.registerHelper('calculate_index', function (rawIndex) { + var index = parseInt(rawIndex, 10); + // display filler data (e.g., ellipsis) if we've reached the maximum number of rows and + // subscribers count is greater than the maximum number of rows we're displaying + if (index === maxRowsToShow && subscribers.subscribersCount > (maxRowsToShow + 1)) { + fillerPosition = index; + return filler; + } else if (index === (subscribers.subscribers.length - 1)) { + // if we're on the last line, show the total count of subscribers data + return subscribers.subscribersCount.toLocaleString(); + } + return index + 1; + }); + + // reduce subscribers object if the total length is greater than the + // maximum number of defined rows + if (subscribers.subscribersCount > (maxRowsToShow + 1)) { + subscribers.subscribers.splice( + maxRowsToShow, subscribers.subscribersCount - (maxRowsToShow + 1), + fillerArray + ); + } + + // filter subscribers' data to detect dates, emails, etc. + function filterSubscribers() { + var subscribersClone = jQuery.extend(true, {}, subscribers); + var preventNextStep = false; + var displayedColumns; + jQuery( + '[data-id="notice_invalidEmail"], [data-id="notice_invalidDate"]') + .remove(); + displayedColumns = jQuery.map( + jQuery('.mailpoet_subscribers_column_data_match'), function (element, elementIndex) { + var columnId = jQuery(element).data('column-id'); + var validationRule = jQuery(element).data('validation-rule'); + jQuery(element).val(columnId).trigger('change'); + return { + id: columnId, + index: elementIndex, + validationRule: validationRule, + element: element + }; + }); + // iterate through the object of mailpoet columns + jQuery.map(window.mailpoetColumns, function (column) { + var firstRowData; + var validationRule; + var testedFormat; + var allowedDateFormats; + // check if the column id matches the selected id of one of the + // subscriber's data columns + var matchedColumn = _.find( + displayedColumns, + function (data) { return data.id === column.id; } + ); + // EMAIL filter: if the first value in the column doesn't have a valid + // email, hide the next button + if (column.id === 'email') { + if (!window.mailpoet_email_regex.test( + subscribersClone.subscribers[0][matchedColumn.index]) + ) { + preventNextStep = true; + if (!jQuery('[data-id="notice_invalidEmail"]').length) { + MailPoet.Notice.error(MailPoet.I18n.t('columnContainsInvalidElement'), { + static: true, + scroll: true, + hideClose: true, + id: 'invalidEmail' + }); + } + } else { + MailPoet.Notice.hide('invalidEmail'); + } + } + // DATE filter: if column type is date, check if we can recognize it + if (column.type === 'date' && matchedColumn) { + allowedDateFormats = [ + Moment.ISO_8601, + 'YYYY/MM/DD', + 'MM/DD/YYYY', + 'DD/MM/YYYY', + 'YYYY/MM/DD', + 'YYYY/DD/MM', + 'MM/YYYY', + 'YYYY/MM', + 'YYYY' + ]; + firstRowData = subscribersClone.subscribers[0][matchedColumn.index]; + validationRule = false; + // check if date exists + if (firstRowData.trim() === '') { + subscribersClone.subscribers[0][matchedColumn.index] = + '' + + MailPoet.I18n.t('emptyFirstRowDate') + + ' '; + preventNextStep = true; + } else { + Object.keys(allowedDateFormats).forEach(function allowedDateFormatsLoop(format) { + testedFormat = allowedDateFormats[format]; + if (Moment(firstRowData, testedFormat, true).isValid()) { + validationRule = (typeof (testedFormat) === 'function') ? + 'datetime' : + testedFormat; + // set validation on the column element + jQuery(matchedColumn.element).data('validation-rule', validationRule); + return; + } + if (validationRule === 'datetime') { + validationRule = Moment.ISO_8601; + } + }); + } + jQuery.map(subscribersClone.subscribers, function (dataSubscribers, index) { + var data = dataSubscribers; + var rowData = data[matchedColumn.index]; + var date = Moment(rowData, testedFormat, true); + if (index === fillerPosition || rowData.trim() === '') return; + // validate date + if (date.isValid()) { + data[matchedColumn.index] = new Handlebars.SafeString( + Handlebars.Utils.escapeExpression(data[matchedColumn.index]) + + '' + + MailPoet.Date.format(date) + + ' ' + ); + } else { + data[matchedColumn.index] = new Handlebars.SafeString( + Handlebars.Utils.escapeExpression(data[matchedColumn.index]) + + '' + + (new Handlebars.SafeString(MailPoet.I18n.t('dateMatchError'))) + + ' ' + ); + preventNextStep = true; + } + }); + if (preventNextStep && !jQuery('.mailpoet_invalidDate').length) { + MailPoet.Notice.error(MailPoet.I18n.t('columnContainsInvalidDate'), { + static: true, + scroll: true, + hideClose: true, + id: 'invalidDate' + }); + } + } + }); + // refresh table with susbcribers' data + jQuery('#subscribers_data > table > tbody') + .html(subscribersDataTemplatePartial(subscribersClone)); + + if (preventNextStep) { + toggleNextStepButton('off'); + } else if (!jQuery('.mailpoet_notice.error:visible').length + && segmentSelectElement.val()) { + toggleNextStepButton('on'); + } + } + + // render template + jQuery('#subscribers_data > table').html(subscribersDataTemplate(subscribers)); + + // filter displayed data + jQuery('select.mailpoet_subscribers_column_data_match') + .select2({ + data: window.mailpoetColumnsSelect2, + width: '15em', + templateResult: function (item) { + return item.name; + }, + templateSelection: function (item) { + return item.name; + } + }) + .on('select2:selecting', function (selectEvent) { + var selectElement = this; + var selectedOptionId = selectEvent.params.args.data.id; + // CREATE CUSTOM FIELD + if (selectedOptionId === 'create') { + selectEvent.preventDefault(); + jQuery(selectElement).select2('close'); + MailPoet.Modal.popup({ + title: MailPoet.I18n.t('addNewField'), + template: jQuery('#form_template_field_form').html() + }); + jQuery('#form_field_new').parsley().on('form:submit', function () { + // get data + var data = jQuery(this.$element).mailpoetSerializeObject(); + + // save custom field + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'customFields', + action: 'save', + data: data + }).done(function (response) { + var newColumnData = { + id: response.data.id, + name: response.data.name, + type: response.data.type, + params: response.data.params, + custom: true + }; + // if this is the first custom column, create an "optgroup" + if (window.mailpoetColumnsSelect2.length === 2) { + window.mailpoetColumnsSelect2.push({ + name: MailPoet.I18n.t('userColumns'), + children: [] + }); + } + window.mailpoetColumnsSelect2[2].children.push(newColumnData); + window.mailpoetColumns.push(newColumnData); + jQuery('select.mailpoet_subscribers_column_data_match') + .each(function () { + jQuery(this) + .html('') + .select2('destroy') + .select2({ + data: window.mailpoetColumnsSelect2, + width: '15em', + templateResult: function (item) { + return item.name; + }, + templateSelection: function (item) { + return item.name; + } + }); + }); + jQuery(selectElement).data('column-id', newColumnData.id); + jQuery(selectElement).data('validation-rule', false); + filterSubscribers(); + // close popup + MailPoet.Modal.close(); + }).fail(function (response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { positionAfter: '#field_name' } + ); + } + }); + return false; + }); + } else { + // CHANGE COLUMN + // check for duplicate values in all select options + jQuery('select.mailpoet_subscribers_column_data_match') + .each(function () { + var element = this; + var elementId = jQuery(element).val(); + // if another column has the same value and it's not an 'ignore', + // prompt user + if (elementId === selectedOptionId + && elementId !== 'ignore') { + if (confirm(MailPoet.I18n.t('selectedValueAlreadyMatched') + ' ' + MailPoet.I18n.t('confirmCorrespondingColumn'))) { // eslint-disable-line no-alert + jQuery(element).data('column-id', 'ignore'); + } else { + selectEvent.preventDefault(); + jQuery(selectElement).select2('close'); + } + } + }); + } + }) + .on('select2:select', function (selectEvent) { + var selectElement = this; + var selectedOptionId = selectEvent.params.data.id; + jQuery(selectElement).data('column-id', selectedOptionId); + filterSubscribers(); + }); + + previousStepButton.off().on('click', function () { + router.navigate('step1', { trigger: true }); + }); + + nextStepButton.off().on('click', function () { + var columns = {}; + var queue = new jQuery.AsyncQueue(); + var batchNumber = 0; + var batchSize = 2000; + var timestamp = Date.now() / 1000; + var clickImportResults = { + created: 0, + updated: 0, + errors: [], + segments: [] + }; + var clickSubscribers; + var splitSubscribers; + + if (jQuery(this).hasClass('button-disabled')) { return; } - - showCurrentStep(); - - if (window.importData.step2.errors.length > 0) { - MailPoet.Notice.error(_.flatten(window.importData.step2.errors)); - } - - MailPoet.trackEvent('Subscribers import finished', { - 'Subscribers created': window.importData.step2.created, - 'Subscribers updated': window.importData.step2.updated, - 'MailPoet Free version': window.mailpoet_version - }); - - // display statistics - subscribersDataImportResultsTemplate = - Handlebars.compile(jQuery('#subscribers_data_import_results_template').html()); - exportMenuElement = jQuery('span.mailpoet_export'); - importResults = { - created: (window.importData.step2.created) - ? MailPoet.I18n.t('subscribersCreated') - .replace('%1$s', '' + window.importData.step2.created.toLocaleString() + '') - .replace('%2$s', '"' + window.importData.step2.segments.join('", "') + '"') - : false, - updated: (window.importData.step2.updated) - ? MailPoet.I18n.t('subscribersUpdated') - .replace('%1$s', '' + window.importData.step2.updated.toLocaleString() + '') - .replace('%2$s', '"' + window.importData.step2.segments.join('", "') + '"') - : false, - no_action: (!window.importData.step2.created && !window.importData.step2.updated), - added_to_segment_with_welcome_notification: - window.importData.step2.added_to_segment_with_welcome_notification + MailPoet.Modal.loading(true); + splitSubscribers = function (localSubscribers, size) { + return localSubscribers.reduce(function (res, item, index) { + if (index % size === 0) { + res.push([]); + } + res[res.length - 1].push(item); + return res; + }, []); }; + clickSubscribers = splitSubscribers(window.importData.step1.subscribers, batchSize); - jQuery('#subscribers_data_import_results') - .html(subscribersDataImportResultsTemplate(importResults)) - .show(); + _.each(jQuery('select.mailpoet_subscribers_column_data_match'), + function (column, columnIndex) { + var columnId = jQuery(column).data('column-id'); + var validationRule = jQuery(column).data('validation-rule'); + if (columnId === 'ignore') { + return; + } + columns[columnId] = { index: columnIndex, validation_rule: validationRule }; + }); - jQuery('a.mailpoet_import_again').off().click(function () { - jQuery('#subscribers_data_import_results').hide(); - router.navigate('step1', { trigger: true }); + _.each(clickSubscribers, function () { + queue.add(function (addQueue) { + addQueue.pause(); + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'ImportExport', + action: 'processImport', + data: JSON.stringify({ + columns: columns, + subscribers: clickSubscribers[batchNumber], + timestamp: timestamp, + segments: segmentSelectElement.val(), + updateSubscribers: (jQuery(':radio[name="subscriber_update_option"]:checked').val() === 'yes') + }) + }).done(function (response) { + clickImportResults.created += response.data.created; + clickImportResults.updated += response.data.updated; + clickImportResults.segments = response.data.segments; + clickImportResults.added_to_segment_with_welcome_notification = + response.data.added_to_segment_with_welcome_notification; + addQueue.run(); + }).fail(function (response) { + MailPoet.Modal.loading(false); + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { scroll: true } + ); + } + }); + batchNumber += 1; + }); }); - jQuery('a.mailpoet_view_subscribers').off().click(function () { - window.location.href = 'admin.php?page=mailpoet-subscribers'; + queue.run(); + + queue.onComplete(function () { + MailPoet.Modal.loading(false); + if ( + clickImportResults.errors.length > 0 + && !clickImportResults.updated + && !clickImportResults.created + ) { + MailPoet.Notice.error(_.flatten(clickImportResults.errors) + ); + } else { + window.mailpoetSegments = clickImportResults.segments; + clickImportResults.segments = _.map(segmentSelectElement.select2('data'), + function (data) { + return data.name; + }); + window.importData.step2 = clickImportResults; + enableSegmentSelection(window.mailpoetSegments); + router.navigate('step3', { trigger: true }); + } }); - - // if new subscribers were created and the export menu item is hidden - // (it's shown only when there are subscribers), display it - if (importResults.created && exportMenuElement.not(':visible')) { - exportMenuElement.show(); - } - - // reset previous step's data so that coming back to this step is prevented - window.importData.step2 = undefined; }); - if (!Backbone.History.started) { - Backbone.history.start(); - } + filterSubscribers(); + enableSegmentSelection(window.mailpoetSegments); }); + + router.on('route:step3', function () { + var subscribersDataImportResultsTemplate; + var exportMenuElement; + var importResults; + if (typeof (window.importData.step2) === 'undefined') { + router.navigate('step2', { trigger: true }); + return; + } + + showCurrentStep(); + + if (window.importData.step2.errors.length > 0) { + MailPoet.Notice.error(_.flatten(window.importData.step2.errors)); + } + + MailPoet.trackEvent('Subscribers import finished', { + 'Subscribers created': window.importData.step2.created, + 'Subscribers updated': window.importData.step2.updated, + 'MailPoet Free version': window.mailpoet_version + }); + + // display statistics + subscribersDataImportResultsTemplate = + Handlebars.compile(jQuery('#subscribers_data_import_results_template').html()); + exportMenuElement = jQuery('span.mailpoet_export'); + importResults = { + created: (window.importData.step2.created) + ? MailPoet.I18n.t('subscribersCreated') + .replace('%1$s', '' + window.importData.step2.created.toLocaleString() + '') + .replace('%2$s', '"' + window.importData.step2.segments.join('", "') + '"') + : false, + updated: (window.importData.step2.updated) + ? MailPoet.I18n.t('subscribersUpdated') + .replace('%1$s', '' + window.importData.step2.updated.toLocaleString() + '') + .replace('%2$s', '"' + window.importData.step2.segments.join('", "') + '"') + : false, + no_action: (!window.importData.step2.created && !window.importData.step2.updated), + added_to_segment_with_welcome_notification: + window.importData.step2.added_to_segment_with_welcome_notification + }; + + jQuery('#subscribers_data_import_results') + .html(subscribersDataImportResultsTemplate(importResults)) + .show(); + + jQuery('a.mailpoet_import_again').off().click(function () { + jQuery('#subscribers_data_import_results').hide(); + router.navigate('step1', { trigger: true }); + }); + + jQuery('a.mailpoet_view_subscribers').off().click(function () { + window.location.href = 'admin.php?page=mailpoet-subscribers'; + }); + + // if new subscribers were created and the export menu item is hidden + // (it's shown only when there are subscribers), display it + if (importResults.created && exportMenuElement.not(':visible')) { + exportMenuElement.show(); + } + + // reset previous step's data so that coming back to this step is prevented + window.importData.step2 = undefined; + }); + + if (!Backbone.History.started) { + Backbone.history.start(); + } }); + }); diff --git a/assets/js/src/subscribers/list.jsx b/assets/js/src/subscribers/list.jsx index 870e28f684..b0a419694f 100644 --- a/assets/js/src/subscribers/list.jsx +++ b/assets/js/src/subscribers/list.jsx @@ -128,8 +128,8 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleSubscribersMovedToList') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) - .replace('%$2s', response.meta.segment) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$2s', response.meta.segment) ); }, }, @@ -160,8 +160,8 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleSubscribersAddedToList') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) - .replace('%$2s', response.meta.segment) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$2s', response.meta.segment) ); }, }, @@ -192,8 +192,8 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleSubscribersRemovedFromList') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) - .replace('%$2s', response.meta.segment) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$2s', response.meta.segment) ); }, }, @@ -203,7 +203,7 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleSubscribersRemovedFromAllLists') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) ); }, }, @@ -213,7 +213,7 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleConfirmationEmailsSent') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) ); }, }, diff --git a/package-lock.json b/package-lock.json index d5b7ccea48..accf29cb4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,19 +65,21 @@ } }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, "align-text": { @@ -116,9 +118,9 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { @@ -144,9 +146,9 @@ } }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" @@ -679,6 +681,12 @@ "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", "dev": true }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -760,6 +768,12 @@ "isarray": "^1.0.0" } }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -842,6 +856,12 @@ "supports-color": "^2.0.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -896,12 +916,12 @@ } }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -939,17 +959,26 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "codemirror": { "version": "5.37.0", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.37.0.tgz", "integrity": "sha512-dQaayDJCLU4UJcwg2RM44oFrs0dMNndTp6qxQJF6XI71l1xN3RB4IqiKES0b0rccbARbrD/UBB4t8DNknfaOTw==" }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -1015,11 +1044,12 @@ "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" @@ -1204,15 +1234,6 @@ "cssom": "0.3.x" } }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, "damerau-levenshtein": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", @@ -1374,9 +1395,9 @@ } }, "diff": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz", - "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { @@ -1391,13 +1412,12 @@ } }, "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" } }, "dom-serializer": { @@ -1556,76 +1576,6 @@ "is-symbol": "^1.0.1" } }, - "es5-ext": { - "version": "0.10.35", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", - "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", - "dev": true, - "requires": { - "es6-iterator": "~2.0.1", - "es6-symbol": "~3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1660,61 +1610,87 @@ } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", - "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", "esquery": "^1.0.0", - "estraverse": "^4.2.0", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", + "inquirer": "^3.0.6", "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "table": "4.0.2", + "text-table": "~0.2.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -1730,15 +1706,21 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "minimatch": { @@ -1750,13 +1732,22 @@ "brace-expansion": "^1.1.7" } }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" } } } @@ -1936,20 +1927,36 @@ "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", "dev": true }, - "espree": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", - "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "acorn": "^5.1.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", "acorn-jsx": "^3.0.0" }, "dependencies": { "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", + "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", "dev": true } } @@ -1961,22 +1968,21 @@ "dev": true }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { "estraverse": "^4.0.0" } }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "^4.1.0", - "object-assign": "^4.0.1" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -1991,16 +1997,6 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -2017,12 +2013,6 @@ "safe-buffer": "^5.1.1" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -2088,6 +2078,17 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -2136,13 +2137,12 @@ } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -3209,21 +3209,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -3323,9 +3314,9 @@ "dev": true }, "growl": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", - "integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "grunt-cli": { @@ -3461,6 +3452,12 @@ "sntp": "2.x.x" } }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, "history": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/history/-/history-1.13.1.tgz", @@ -3579,9 +3576,9 @@ "dev": true }, "ignore": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.6.tgz", - "integrity": "sha512-HrxmNxKTGZ9a3uAl/FNG66Sdt0G9L4TtMbbUQjP1WhGmSj0FOyHvSgx7623aGJvXfPOur8MwmarlHT+37jmzlw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, "imports-loader": { @@ -3647,31 +3644,82 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "figures": "^1.3.5", + "external-editor": "^2.0.4", + "figures": "^2.0.0", "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", "through": "^2.3.6" }, "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -3796,13 +3844,10 @@ } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-glob": { "version": "2.0.1", @@ -3822,18 +3867,6 @@ "is-finite": "^1.0.0" } }, - "is-my-json-valid": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -3850,18 +3883,18 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { "is-path-inside": "^1.0.0" } }, "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { "path-is-inside": "^1.0.1" @@ -3879,10 +3912,10 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, "is-regex": { @@ -3904,13 +3937,10 @@ } }, "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "^1.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true }, "is-stream": { "version": "1.1.0", @@ -3979,30 +4009,6 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "dev": true, - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "dev": true - } - } - }, "jquery": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", @@ -4019,9 +4025,9 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4031,7 +4037,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true } } @@ -4115,14 +4121,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -4145,18 +4148,6 @@ "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4449,6 +4440,12 @@ "mime-db": "~1.33.0" } }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -4493,102 +4490,76 @@ } }, "mocha": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.2.1.tgz", - "integrity": "sha1-BKL4rrFJ/lAXfgCn710IxjnpEms=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { - "commander": "2.3.0", - "debug": "2.0.0", - "diff": "1.0.8", - "escape-string-regexp": "1.0.2", - "glob": "3.2.3", - "growl": "1.8.1", - "jade": "0.26.3", - "mkdirp": "0.5.0", - "supports-color": "~1.2.0" + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" }, "dependencies": { "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, "debug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.0.0.tgz", - "integrity": "sha1-ib2d9nMrUSVrxnBTQrugLtEhMe8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.6.2" + "ms": "2.0.0" } }, - "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", - "dev": true - }, "glob": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", - "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "graceful-fs": "~2.0.0", + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", "inherits": "2", - "minimatch": "~0.2.11" + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", - "dev": true - }, "supports-color": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.1.tgz", - "integrity": "sha1-Eu4hUHCGzZjBBY2ewPSsR2t687I=", - "dev": true + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -4604,9 +4575,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "nan": { @@ -4776,10 +4747,13 @@ } }, "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } }, "optimist": { "version": "0.6.1", @@ -4818,12 +4792,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -5028,9 +4996,9 @@ } }, "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "pn": { @@ -5069,9 +5037,9 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, "promise": { @@ -5356,17 +5324,6 @@ } } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, "recast": { "version": "0.10.33", "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", @@ -5393,15 +5350,6 @@ } } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", @@ -5431,6 +5379,12 @@ "is-equal-shallow": "^0.1.3" } }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "regexpu": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", @@ -5584,13 +5538,13 @@ "dev": true }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "right-align": { @@ -5646,20 +5600,29 @@ } }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "once": "^1.3.0" + "is-promise": "^2.1.0" } }, "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -5728,46 +5691,10 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "simple-fmt": { @@ -5806,10 +5733,13 @@ "dev": true }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } }, "sntp": { "version": "2.1.0", @@ -5987,14 +5917,30 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "string_decoder": { @@ -6090,54 +6036,58 @@ "dev": true }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" + "has-flag": "^3.0.0" } } } @@ -6174,6 +6124,15 @@ "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-4.5.6.tgz", "integrity": "sha1-Os2bUVMx2vP/TM2B1UTpFjDtDhs=" }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -6224,12 +6183,6 @@ "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", "dev": true }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, "tryor": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", diff --git a/package.json b/package.json index c950eb13e6..3e22878aea 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "chai-jq": "0.0.8", "clean-webpack-plugin": "^0.1.19", "cross-env": "^5.1.5", - "eslint": "^3.19.0", + "eslint": "^4.19.1", "eslint-config-airbnb": "^15.0.1", "eslint-import-resolver-webpack": "^0.8.4", "eslint-plugin-import": "^2.11.0", @@ -59,7 +59,7 @@ "imports-loader": "~0.7.1", "jsdom": "^11.10.0", "json-loader": "^0.5.7", - "mocha": "2.2.1", + "mocha": "^5.2.0", "nib": "~1.1.2", "sinon": "1.14.1", "sinon-chai": "2.7.0", diff --git a/tests/javascript/newsletter_editor/blocks/automatedLatestContent.spec.js b/tests/javascript/newsletter_editor/blocks/automatedLatestContent.spec.js index 12236fdf36..57625d1a23 100644 --- a/tests/javascript/newsletter_editor/blocks/automatedLatestContent.spec.js +++ b/tests/javascript/newsletter_editor/blocks/automatedLatestContent.spec.js @@ -15,7 +15,7 @@ define([ ContainerBlock, AutomatedLatestContentInjector, Communication - ) { +) { var EditorApplication = App; var CommunicationComponent = Communication; diff --git a/tests/javascript/newsletter_editor/blocks/container.spec.js b/tests/javascript/newsletter_editor/blocks/container.spec.js index c4f08c0cb5..ef0e7ebfe9 100644 --- a/tests/javascript/newsletter_editor/blocks/container.spec.js +++ b/tests/javascript/newsletter_editor/blocks/container.spec.js @@ -109,8 +109,8 @@ define([ expect(model.get('blocks').at(0).get('blocks')).to.have.length(2); expect( model.get('blocks').at(0) - .get('blocks').at(1) - .get('someField') + .get('blocks').at(1) + .get('someField') ).to.equal('some text 2'); }); }); diff --git a/tests/javascript/newsletter_editor/components/communication.spec.js b/tests/javascript/newsletter_editor/components/communication.spec.js index 1be1e77b13..63e353f42a 100644 --- a/tests/javascript/newsletter_editor/components/communication.spec.js +++ b/tests/javascript/newsletter_editor/components/communication.spec.js @@ -215,8 +215,8 @@ define([ var deferred = jQuery.Deferred(); deferred.resolve({ data: [ - { post_title: 'title 1' }, - { post_title: 'post title 2' } + { post_title: 'title 1' }, + { post_title: 'post title 2' } ] }); return deferred; @@ -286,8 +286,8 @@ define([ var deferred = jQuery.Deferred(); deferred.resolve({ data: [ - { type: 'text', text: 'something' }, - { type: 'text', text: 'something else' } + { type: 'text', text: 'something' }, + { type: 'text', text: 'something else' } ] }); return deferred; From 9a11d4cc8223370a830cac6953f6f96e1157f6bd Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 10:57:40 +0100 Subject: [PATCH 46/89] Update babel --- .babelrc | 5 + package-lock.json | 1549 +++++++++++++++++++++++++++++---------------- package.json | 8 +- webpack.config.js | 5 +- 4 files changed, 1005 insertions(+), 562 deletions(-) create mode 100644 .babelrc diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000000..b620691f50 --- /dev/null +++ b/.babelrc @@ -0,0 +1,5 @@ +{ + "presets":[ + "es2015", "react", "stage-2" + ] +} diff --git a/package-lock.json b/package-lock.json index accf29cb4a..b02e695809 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,12 +24,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - }, "acorn-globals": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", @@ -97,15 +91,6 @@ "resolved": "https://registry.npmjs.org/almond/-/almond-0.3.3.tgz", "integrity": "sha1-oOfJWsdiTWQXtElLHmi/9pMWiiA=" }, - "alter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", - "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", - "dev": true, - "requires": { - "stable": "~0.1.3" - } - }, "amd-inject-loader": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/amd-inject-loader/-/amd-inject-loader-0.5.0.tgz", @@ -126,14 +111,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "anymatch": { "version": "1.3.2", @@ -270,18 +253,6 @@ "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", "dev": true }, - "ast-traverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", - "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=", - "dev": true - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -336,7 +307,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -344,63 +314,75 @@ } }, "babel-core": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", - "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-plugin-constant-folding": "^1.0.1", - "babel-plugin-dead-code-elimination": "^1.0.2", - "babel-plugin-eval": "^1.0.1", - "babel-plugin-inline-environment-variables": "^1.0.1", - "babel-plugin-jscript": "^1.0.4", - "babel-plugin-member-expression-literals": "^1.0.1", - "babel-plugin-property-literals": "^1.0.1", - "babel-plugin-proto-to-assign": "^1.0.3", - "babel-plugin-react-constant-elements": "^1.0.3", - "babel-plugin-react-display-name": "^1.0.3", - "babel-plugin-remove-console": "^1.0.1", - "babel-plugin-remove-debugger": "^1.0.1", - "babel-plugin-runtime": "^1.0.7", - "babel-plugin-undeclared-variables-check": "^1.0.2", - "babel-plugin-undefined-to-void": "^1.1.6", - "babylon": "^5.8.38", - "bluebird": "^2.9.33", - "chalk": "^1.0.0", - "convert-source-map": "^1.1.0", - "core-js": "^1.0.0", - "debug": "^2.1.1", - "detect-indent": "^3.0.0", - "esutils": "^2.0.0", - "fs-readdir-recursive": "^0.1.0", - "globals": "^6.4.0", - "home-or-tmp": "^1.0.0", - "is-integer": "^1.0.4", - "js-tokens": "1.0.1", - "json5": "^0.4.0", - "lodash": "^3.10.0", - "minimatch": "^2.0.3", - "output-file-sync": "^1.1.0", - "path-exists": "^1.0.0", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", - "regenerator": "0.8.40", - "regexpu": "^1.3.0", - "repeating": "^1.1.2", - "resolve": "^1.1.6", - "shebang-regex": "^1.0.0", + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", "slash": "^1.0.0", - "source-map": "^0.5.0", - "source-map-support": "^0.2.10", - "to-fast-properties": "^1.0.0", - "trim-right": "^1.0.0", - "try-resolve": "^1.0.0" + "source-map": "^0.5.7" }, "dependencies": { - "js-tokens": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", - "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "source-map": { @@ -411,126 +393,843 @@ } } }, - "babel-loader": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-5.4.2.tgz", - "integrity": "sha1-d/4o2OYNDwVrHBvKJbhJTNqrnHY=", + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "dev": true, "requires": { - "babel-core": "^5.4.0", - "loader-utils": "^0.2.9", - "object-assign": "^3.0.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" }, "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-loader": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", + "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "loader-utils": "^0.2.16", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true } } }, - "babel-plugin-constant-folding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", - "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=", - "dev": true - }, - "babel-plugin-dead-code-elimination": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", - "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=", - "dev": true - }, - "babel-plugin-eval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", - "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=", - "dev": true - }, - "babel-plugin-inline-environment-variables": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", - "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=", - "dev": true - }, - "babel-plugin-jscript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", - "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=", - "dev": true - }, - "babel-plugin-member-expression-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", - "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=", - "dev": true - }, - "babel-plugin-property-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", - "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=", - "dev": true - }, - "babel-plugin-proto-to-assign": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", - "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", - "dev": true, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "lodash": "^3.9.3" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + } } }, - "babel-plugin-react-constant-elements": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", - "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=", - "dev": true - }, - "babel-plugin-react-display-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", - "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=", - "dev": true - }, - "babel-plugin-remove-console": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", - "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=", - "dev": true - }, - "babel-plugin-remove-debugger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", - "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=", - "dev": true - }, - "babel-plugin-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", - "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=", - "dev": true - }, - "babel-plugin-undeclared-variables-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", - "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", - "dev": true, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "requires": { - "leven": "^1.0.2" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } } }, - "babel-plugin-undefined-to-void": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", - "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=", - "dev": true + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + } + } }, "babylon": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", - "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", - "dev": true + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "backbone": { "version": "1.3.3", @@ -621,12 +1320,6 @@ "resolved": "https://registry.npmjs.org/blob-tmp/-/blob-tmp-1.0.0.tgz", "integrity": "sha1-3oJJHiIv8TVMd6k+6OTqLIlUQnM=" }, - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true - }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -663,12 +1356,6 @@ "repeat-element": "^1.1.2" } }, - "breakable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", - "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=", - "dev": true - }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -757,6 +1444,15 @@ "pako": "~0.2.0" } }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -812,6 +1508,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, + "caniuse-lite": { + "version": "1.0.30000853", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000853.tgz", + "integrity": "sha512-vMrE8BED4MJC9IhDJKP8ok6bJUfn5+YHvxwXMYfiPqQOJ3r2B9ihcArlUnXu6yPWf7b3jHqiEBwXZEbrbiFUqg==" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -847,7 +1548,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -988,55 +1688,12 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", - "dev": true, - "requires": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1077,9 +1734,9 @@ "dev": true }, "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, "core-js": { @@ -1270,7 +1927,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -1310,30 +1966,6 @@ "object-keys": "^1.0.8" } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "defs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", - "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", - "dev": true, - "requires": { - "alter": "~0.2.0", - "ast-traverse": "~0.1.1", - "breakable": "~1.0.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2", - "yargs": "~3.27.0" - } - }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -1366,32 +1998,12 @@ } }, "detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "detective": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", - "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", - "dev": true, - "requires": { - "acorn": "^4.0.3", - "defined": "^1.0.0" + "repeating": "^2.0.0" } }, "diff": { @@ -1483,6 +2095,11 @@ "jsbn": "~0.1.0" } }, + "electron-to-chromium": { + "version": "1.3.48", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", + "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=" + }, "elliptic": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", @@ -1579,8 +2196,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.9.1", @@ -1961,12 +2577,6 @@ } } }, - "esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", - "dev": true - }, "esquery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", @@ -1994,8 +2604,7 @@ "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "events": { "version": "1.1.1", @@ -2179,6 +2788,17 @@ "repeat-string": "^1.5.2" } }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, "find-root": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/find-root/-/find-root-0.1.2.tgz", @@ -2287,12 +2907,6 @@ "rimraf": "^2.2.8" } }, - "fs-readdir-recursive": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", - "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3215,12 +3829,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -3263,10 +3871,9 @@ } }, "globals": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", - "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", - "dev": true + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "globby": { "version": "5.0.0", @@ -3409,7 +4016,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3492,13 +4098,13 @@ "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" }, "home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-tmpdir": "^1.0.1", - "user-home": "^1.1.1" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "hosted-git-info": { @@ -3742,12 +4348,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, "is-absolute": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", @@ -3858,15 +4458,6 @@ "is-extglob": "^1.0.0" } }, - "is-integer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", - "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -4098,9 +4689,9 @@ } }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, "json-loader": { @@ -4134,9 +4725,9 @@ "dev": true }, "json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, "jsonfile": { @@ -4188,27 +4779,12 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", "dev": true }, - "leven": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", - "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", - "dev": true - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4571,8 +5147,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "mute-stream": { "version": "0.0.7", @@ -4792,14 +5367,11 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-tmpdir": { "version": "1.0.2", @@ -4807,17 +5379,6 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", @@ -4907,12 +5468,6 @@ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, - "path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5022,8 +5577,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process": { "version": "0.11.10", @@ -5091,12 +5645,6 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, "qs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", @@ -5324,50 +5872,24 @@ } } }, - "recast": { - "version": "0.10.33", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", - "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", - "dev": true, - "requires": { - "ast-types": "0.8.12", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "ast-types": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", - "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" }, - "regenerator": { - "version": "0.8.40", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", - "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", - "dev": true, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "requires": { - "commoner": "~0.10.3", - "defs": "~1.1.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "recast": "0.10.33", - "through": "~2.3.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -5385,40 +5907,34 @@ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", "dev": true }, - "regexpu": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", - "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", - "dev": true, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "requires": { - "esprima": "^2.6.0", - "recast": "^0.10.10", "regenerate": "^1.2.1", "regjsgen": "^0.2.0", "regjsparser": "^0.1.4" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - } } }, "regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" }, "regjsparser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, "requires": { "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } } }, "remove-trailing-separator": { @@ -5439,9 +5955,9 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { "is-finite": "^1.0.0" @@ -5652,8 +6168,7 @@ "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "set-immediate-shim": { "version": "1.0.1", @@ -5697,18 +6212,6 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "simple-fmt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", - "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", - "dev": true - }, - "simple-is": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", - "dev": true - }, "sinon": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.14.1.tgz", @@ -5766,22 +6269,19 @@ } }, "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.1.32" + "source-map": "^0.5.6" }, "dependencies": { "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -5844,12 +6344,6 @@ "tweetnacl": "~0.14.0" } }, - "stable": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", - "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=", - "dev": true - }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -5951,23 +6445,10 @@ "safe-buffer": "~5.1.0" } }, - "stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", - "dev": true - }, - "stringset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", - "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6026,8 +6507,7 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "symbol-tree": { "version": "3.2.2", @@ -6142,8 +6622,7 @@ "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, "tough-cookie": { "version": "2.3.4", @@ -6177,18 +6656,6 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "try-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", - "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", - "dev": true - }, - "tryor": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", - "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", - "dev": true - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -6308,12 +6775,6 @@ } } }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -6749,12 +7210,6 @@ "isexe": "^2.0.0" } }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -6797,31 +7252,11 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true - }, - "yargs": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", - "dev": true, - "requires": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } } } } diff --git a/package.json b/package.json index 3e22878aea..816222d541 100644 --- a/package.json +++ b/package.json @@ -40,9 +40,11 @@ "velocity-animate": "1.2.3" }, "devDependencies": { - "amd-inject-loader": "~0.5.0", - "babel-core": "^5.8.22", - "babel-loader": "^5.3.2", + "babel-core": "6.26.3", + "babel-loader": "6.4.1", + "babel-preset-es2015": "6.24.1", + "babel-preset-react": "6.24.1", + "babel-preset-stage-2": "6.24.1", "chai": "2.2.0", "chai-jq": "0.0.8", "clean-webpack-plugin": "^0.1.19", diff --git a/webpack.config.js b/webpack.config.js index d680dc205c..668007452f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -50,12 +50,13 @@ var baseConfig = { ], module: { preLoaders: [ - { test: /\.json$/, loader: "json-loader" }, + { test: /\.json$/, loader: 'json-loader' }, ], loaders: [ { test: /\.jsx$/, - loader: 'babel-loader' + exclude: /node_modules/, + loader: 'babel-loader', }, { test: /form_editor\.js$/, From 729d950e4e0b554f20a763e74e4cd2077c78601a Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 11:10:03 +0100 Subject: [PATCH 47/89] Return back amd loader --- package-lock.json | 182 +++++++++++++++++++++++++--------------------- package.json | 1 + 2 files changed, 102 insertions(+), 81 deletions(-) diff --git a/package-lock.json b/package-lock.json index b02e695809..9bfc03fe1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,12 +111,14 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "anymatch": { "version": "1.3.2", @@ -307,6 +309,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -408,6 +411,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, "requires": { "babel-helper-explode-assignable-expression": "^6.24.1", "babel-runtime": "^6.22.0", @@ -429,6 +433,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, "requires": { "babel-helper-hoist-variables": "^6.24.1", "babel-runtime": "^6.22.0", @@ -440,6 +445,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, "requires": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.26.0", @@ -450,7 +456,8 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true } } }, @@ -458,6 +465,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-traverse": "^6.24.1", @@ -480,6 +488,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, "requires": { "babel-helper-get-function-arity": "^6.24.1", "babel-runtime": "^6.22.0", @@ -492,6 +501,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" @@ -501,6 +511,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" @@ -510,6 +521,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" @@ -519,6 +531,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", @@ -528,7 +541,8 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true } } }, @@ -536,6 +550,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, "requires": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", @@ -548,6 +563,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, "requires": { "babel-helper-optimise-call-expression": "^6.24.1", "babel-messages": "^6.23.0", @@ -583,6 +599,7 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -591,6 +608,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -598,7 +616,8 @@ "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true }, "babel-plugin-syntax-async-generators": { "version": "6.13.0", @@ -627,7 +646,8 @@ "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true }, "babel-plugin-syntax-flow": { "version": "6.18.0", @@ -650,7 +670,8 @@ "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true }, "babel-plugin-transform-async-generator-functions": { "version": "6.24.1", @@ -667,6 +688,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, "requires": { "babel-helper-remap-async-to-generator": "^6.24.1", "babel-plugin-syntax-async-functions": "^6.8.0", @@ -702,6 +724,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -710,6 +733,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -718,6 +742,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", @@ -729,7 +754,8 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true } } }, @@ -737,6 +763,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, "requires": { "babel-helper-define-map": "^6.24.1", "babel-helper-function-name": "^6.24.1", @@ -753,6 +780,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" @@ -762,6 +790,7 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -770,6 +799,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" @@ -779,6 +809,7 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -787,6 +818,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, "requires": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", @@ -797,6 +829,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -805,6 +838,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, "requires": { "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", "babel-runtime": "^6.22.0", @@ -815,6 +849,7 @@ "version": "6.26.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, "requires": { "babel-plugin-transform-strict-mode": "^6.24.1", "babel-runtime": "^6.26.0", @@ -826,6 +861,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, "requires": { "babel-helper-hoist-variables": "^6.24.1", "babel-runtime": "^6.22.0", @@ -836,6 +872,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, "requires": { "babel-plugin-transform-es2015-modules-amd": "^6.24.1", "babel-runtime": "^6.22.0", @@ -846,6 +883,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, "requires": { "babel-helper-replace-supers": "^6.24.1", "babel-runtime": "^6.22.0" @@ -855,6 +893,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, "requires": { "babel-helper-call-delegate": "^6.24.1", "babel-helper-get-function-arity": "^6.24.1", @@ -868,6 +907,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" @@ -877,6 +917,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -885,6 +926,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, "requires": { "babel-helper-regex": "^6.24.1", "babel-runtime": "^6.22.0", @@ -895,6 +937,7 @@ "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -903,6 +946,7 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -911,6 +955,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, "requires": { "babel-helper-regex": "^6.24.1", "babel-runtime": "^6.22.0", @@ -921,6 +966,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, "requires": { "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", "babel-plugin-syntax-exponentiation-operator": "^6.8.0", @@ -991,6 +1037,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, "requires": { "regenerator-transform": "^0.10.0" } @@ -999,48 +1046,12 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, "babel-preset-es2015": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", @@ -1154,6 +1165,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -1162,7 +1174,8 @@ "core-js": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true } } }, @@ -1170,6 +1183,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-traverse": "^6.26.0", @@ -1181,7 +1195,8 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true } } }, @@ -1189,6 +1204,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-messages": "^6.23.0", @@ -1204,7 +1220,8 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true } } }, @@ -1212,6 +1229,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, "requires": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", @@ -1222,14 +1240,16 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true } } }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true }, "backbone": { "version": "1.3.3", @@ -1444,15 +1464,6 @@ "pako": "~0.2.0" } }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -1508,11 +1519,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, - "caniuse-lite": { - "version": "1.0.30000853", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000853.tgz", - "integrity": "sha512-vMrE8BED4MJC9IhDJKP8ok6bJUfn5+YHvxwXMYfiPqQOJ3r2B9ihcArlUnXu6yPWf7b3jHqiEBwXZEbrbiFUqg==" - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1548,6 +1554,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -1927,6 +1934,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -2095,11 +2103,6 @@ "jsbn": "~0.1.0" } }, - "electron-to-chromium": { - "version": "1.3.48", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", - "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=" - }, "elliptic": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", @@ -2196,7 +2199,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.9.1", @@ -2604,7 +2608,8 @@ "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "events": { "version": "1.1.1", @@ -3873,7 +3878,8 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true }, "globby": { "version": "5.0.0", @@ -4016,6 +4022,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5147,7 +5154,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "mute-stream": { "version": "0.0.7", @@ -5577,7 +5585,8 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true }, "process": { "version": "0.11.10", @@ -5875,17 +5884,20 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, "regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, "requires": { "babel-runtime": "^6.18.0", "babel-types": "^6.19.0", @@ -5911,6 +5923,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, "requires": { "regenerate": "^1.2.1", "regjsgen": "^0.2.0", @@ -5920,12 +5933,14 @@ "regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true }, "regjsparser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -5933,7 +5948,8 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true } } }, @@ -6168,7 +6184,8 @@ "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true }, "set-immediate-shim": { "version": "1.0.1", @@ -6449,6 +6466,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6507,7 +6525,8 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "symbol-tree": { "version": "3.2.2", @@ -6622,7 +6641,8 @@ "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true }, "tough-cookie": { "version": "2.3.4", diff --git a/package.json b/package.json index 816222d541..ba73f85fe4 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "velocity-animate": "1.2.3" }, "devDependencies": { + "amd-inject-loader": "~0.5.0", "babel-core": "6.26.3", "babel-loader": "6.4.1", "babel-preset-es2015": "6.24.1", From a0818b3b9f3e34d14e1fa39f6c10ad52fea5c1c6 Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 07:44:26 -0400 Subject: [PATCH 48/89] Added function to test standard newsletter creation, fixed two typos in comments of previous file. --- tests/acceptance/NewsletterCreationCest.php | 46 +++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/tests/acceptance/NewsletterCreationCest.php b/tests/acceptance/NewsletterCreationCest.php index f6a850273c..e0c57ba05e 100644 --- a/tests/acceptance/NewsletterCreationCest.php +++ b/tests/acceptance/NewsletterCreationCest.php @@ -29,14 +29,14 @@ class NewsletterCreationCest { $I->seeInCurrentUrl('#/template'); $I->click($post_notification_template); - // step 3 - design newsletter (update subject) + // step 4 - design newsletter (update subject) $title_element = '[data-automation-id=\'newsletter_title\']'; $I->waitForElement($title_element); $I->seeInCurrentUrl('mailpoet-newsletter-editor'); $I->fillField($title_element, $newsletter_title); $I->click('Next'); - // step 4 - activate + // step 5 - activate $search_field_element = 'input.select2-search__field'; $I->waitForElement($search_field_element); $I->seeInCurrentUrl('#/send'); @@ -50,4 +50,44 @@ class NewsletterCreationCest { $I->see("Send immediately if there's new content to WordPress Users.", $newsletter_listing_element); $I->wait(20); } -} \ No newline at end of file +function createStandardNewsletter(\AcceptanceTester $I) { + + $I->wantTo('Create and configure standard newsletter'); + + $newsletter_title = 'Testing Newsletter ' . \MailPoet\Util\Security::generateRandomString(); + + $I->login(); + $I->amOnMailpoetPage('Emails'); + $I->click('[data-automation-id=\'new_email\']'); + + // step 1 - select notification type + $I->seeInCurrentUrl('#/new'); + $I->click('[data-automation-id=\'create_standard\']'); + + // step 2 - select template + $standard_template = '[data-automation-id=\'select_template_0\']'; + $I->waitForElement($standard_template); + $I->see('Newsletters', ['css' => 'a.current']); + $I->seeInCurrentUrl('#/template'); + $I->click($standard_template); + + // step 3 - design newsletter (update subject) + $title_element = '[data-automation-id=\'newsletter_title\']'; + $I->waitForElement($title_element); + $I->seeInCurrentUrl('mailpoet-newsletter-editor'); + $I->fillField($title_element, $newsletter_title); + $I->click('Next'); + + // step 4 - Choose list and send + $I->waitForText('Final Step: Last Details'); + $I->seeInCurrentUrl('mailpoet-newsletters#/send/'); + $search_field_element = 'input.select2-search__field'; + $I->fillField($search_field_element, 'WordPress Users'); + $I->pressKey($search_field_element, \WebDriverKeys::ENTER); + $I->click('Next'); + $I->waitForElement($newsletter_listing_element); + $I->see($newsletter_title, $newsletter_listing_element); + $I->click('Next'); + $I->wait(20); + } +} From 0c2085864e51971f3eff5f1406be8a61b3ff277d Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 08:06:53 -0400 Subject: [PATCH 49/89] Fixed a step that said click next when I meant click send. --- tests/acceptance/NewsletterCreationCest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/acceptance/NewsletterCreationCest.php b/tests/acceptance/NewsletterCreationCest.php index e0c57ba05e..075602ee16 100644 --- a/tests/acceptance/NewsletterCreationCest.php +++ b/tests/acceptance/NewsletterCreationCest.php @@ -84,10 +84,9 @@ function createStandardNewsletter(\AcceptanceTester $I) { $search_field_element = 'input.select2-search__field'; $I->fillField($search_field_element, 'WordPress Users'); $I->pressKey($search_field_element, \WebDriverKeys::ENTER); - $I->click('Next'); + $I->click('Send'); $I->waitForElement($newsletter_listing_element); $I->see($newsletter_title, $newsletter_listing_element); - $I->click('Next'); $I->wait(20); } } From 0ea6afb38aec36f7f97210fa001cc672a91ccdc8 Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 08:22:52 -0400 Subject: [PATCH 50/89] defined a variable like a boss, which I had not previously done --- tests/acceptance/NewsletterCreationCest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/acceptance/NewsletterCreationCest.php b/tests/acceptance/NewsletterCreationCest.php index 075602ee16..d624747207 100644 --- a/tests/acceptance/NewsletterCreationCest.php +++ b/tests/acceptance/NewsletterCreationCest.php @@ -85,6 +85,7 @@ function createStandardNewsletter(\AcceptanceTester $I) { $I->fillField($search_field_element, 'WordPress Users'); $I->pressKey($search_field_element, \WebDriverKeys::ENTER); $I->click('Send'); + $newsletter_listing_element = '[data-automation-id="listing_item_' . basename($I->getCurrentUrl()) . '"]'; $I->waitForElement($newsletter_listing_element); $I->see($newsletter_title, $newsletter_listing_element); $I->wait(20); From 8393bac51b66818923ab2fd7760003739c799a10 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 13:33:27 +0100 Subject: [PATCH 51/89] Upgrade to webpack 2 --- .babelrc | 2 +- package-lock.json | 2500 +++++++++++++++++++++++++++------------------ package.json | 2 +- webpack.config.js | 89 +- 4 files changed, 1569 insertions(+), 1024 deletions(-) diff --git a/.babelrc b/.babelrc index b620691f50..5afce70373 100644 --- a/.babelrc +++ b/.babelrc @@ -1,5 +1,5 @@ { - "presets":[ + "presets": [ "es2015", "react", "stage-2" ] } diff --git a/package-lock.json b/package-lock.json index 9bfc03fe1f..375ab1a4d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,12 +2,6 @@ "requires": true, "lockfileVersion": 1, "dependencies": { - "Base64": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", - "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", - "dev": true - }, "WP-JS-Hooks": { "version": "github:carldanley/WP-JS-Hooks#36b53ee6a56de37849456b67205c9784a00118b1", "from": "github:carldanley/WP-JS-Hooks" @@ -24,6 +18,29 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "acorn": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", + "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, "acorn-globals": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", @@ -121,13 +138,13 @@ "dev": true }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "argparse": { @@ -149,13 +166,10 @@ } }, "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", @@ -163,6 +177,12 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", @@ -201,9 +221,9 @@ "dev": true }, "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "arrify": { @@ -255,6 +275,12 @@ "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -284,6 +310,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1302,6 +1334,67 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", @@ -1366,14 +1459,32 @@ } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "brorand": { @@ -1455,15 +1566,6 @@ "parse-asn1": "^5.0.0" } }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "~0.2.0" - } - }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -1499,6 +1601,23 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -1576,20 +1695,23 @@ "dev": true }, "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "dev": true, "requires": { - "anymatch": "^1.3.0", + "anymatch": "^2.0.0", "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", + "braces": "^2.3.0", + "fsevents": "^1.1.2", + "glob-parent": "^3.1.0", "inherits": "^2.0.1", "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "readdirp": "^2.0.0", + "upath": "^1.0.0" } }, "cipher-base": { @@ -1608,6 +1730,29 @@ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "classnames": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", @@ -1654,23 +1799,33 @@ } } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "codemirror": { "version": "5.37.0", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.37.0.tgz", "integrity": "sha512-dQaayDJCLU4UJcwg2RM44oFrs0dMNndTp6qxQJF6XI71l1xN3RB4IqiKES0b0rccbARbrD/UBB4t8DNknfaOTw==" }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", @@ -1701,6 +1856,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1746,6 +1907,12 @@ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", @@ -1944,6 +2111,12 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -1974,6 +2147,53 @@ "object-keys": "^1.0.8" } }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -2628,21 +2848,38 @@ } }, "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "exports-loader": { @@ -2692,6 +2929,27 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -2704,12 +2962,74 @@ } }, "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "extsprintf": { @@ -2774,23 +3094,27 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "find-cache-dir": { @@ -2858,15 +3182,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -2899,6 +3214,15 @@ "samsam": "~1.1" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -2919,39 +3243,29 @@ "dev": true }, "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, "optional": true, "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.39" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true @@ -2966,88 +3280,22 @@ "readable-stream": "^2.0.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { "version": "1.0.0", "bundled": true, "dev": true }, - "caseless": { - "version": "0.12.0", + "brace-expansion": { + "version": "1.1.11", "bundled": true, "dev": true, - "optional": true + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true @@ -3057,14 +3305,6 @@ "bundled": true, "dev": true }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "concat-map": { "version": "0.0.1", "bundled": true, @@ -3078,35 +3318,11 @@ "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, "dev": true, "optional": true, @@ -3115,16 +3331,11 @@ } }, "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true, "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, "delegates": { "version": "1.0.0", "bundled": true, @@ -3132,74 +3343,25 @@ "optional": true }, "detect-libc": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true, "dev": true, "optional": true }, - "ecc-jsbn": { - "version": "0.1.1", + "fs-minipass": { + "version": "1.2.5", "bundled": true, "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" + "minipass": "^2.2.1" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } + "optional": true }, "gauge": { "version": "2.7.4", @@ -3217,27 +3379,11 @@ "wide-align": "^1.1.0" } }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, "glob": { "version": "7.1.2", "bundled": true, "dev": true, + "optional": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3247,64 +3393,35 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, "has-unicode": { "version": "2.0.1", "bundled": true, "dev": true, "optional": true }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", + "iconv-lite": { + "version": "0.4.21", "bundled": true, "dev": true, "optional": true, "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, + "optional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3316,7 +3433,7 @@ "dev": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -3329,98 +3446,12 @@ "number-is-nan": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, "dev": true, "optional": true }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "~1.27.0" - } - }, "minimatch": { "version": "3.0.4", "bundled": true, @@ -3434,6 +3465,24 @@ "bundled": true, "dev": true }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, "mkdirp": { "version": "0.5.1", "bundled": true, @@ -3448,23 +3497,33 @@ "dev": true, "optional": true }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, "node-pre-gyp": { - "version": "0.6.39", + "version": "0.10.0", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", - "hawk": "3.1.3", "mkdirp": "^0.5.1", + "needle": "^2.2.0", "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", "rc": "^1.1.7", - "request": "2.81.0", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" + "tar": "^4" } }, "nopt": { @@ -3477,8 +3536,24 @@ "osenv": "^0.1.4" } }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, "dev": true, "optional": true, @@ -3494,12 +3569,6 @@ "bundled": true, "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, "object-assign": { "version": "4.1.1", "bundled": true, @@ -3527,7 +3596,7 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "dev": true, "optional": true, @@ -3539,38 +3608,22 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.0", "bundled": true, "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "~0.4.0", + "deep-extend": "^0.5.1", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -3585,64 +3638,48 @@ } }, "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.81.0", + "version": "2.3.6", "bundled": true, "dev": true, "optional": true, "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, "dev": true, + "optional": true, "requires": { "glob": "^7.0.5" } }, "safe-buffer": { - "version": "5.0.1", + "version": "5.1.1", "bundled": true, "dev": true }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, "semver": { - "version": "5.3.0", + "version": "5.5.0", "bundled": true, "dev": true, "optional": true @@ -3659,39 +3696,6 @@ "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, "string-width": { "version": "1.0.2", "bundled": true, @@ -3703,19 +3707,14 @@ } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, @@ -3731,81 +3730,26 @@ "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.4.0", + "version": "4.4.1", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, "dev": true, "optional": true }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, "wide-align": { "version": "1.1.2", "bundled": true, @@ -3819,6 +3763,11 @@ "version": "1.0.2", "bundled": true, "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true } } }, @@ -3834,6 +3783,18 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -3856,23 +3817,25 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } }, "globals": { @@ -4033,6 +3996,38 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", @@ -4150,16 +4145,6 @@ "readable-stream": "^2.0.2" } }, - "http-browserify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", - "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", - "dev": true, - "requires": { - "Base64": "~0.2.0", - "inherits": "~2.0.1" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -4355,6 +4340,12 @@ "loose-envify": "^1.0.0" } }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, "is-absolute": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", @@ -4373,6 +4364,15 @@ } } }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4408,25 +4408,38 @@ "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", "dev": true }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "is-extendable": { @@ -4436,9 +4449,9 @@ "dev": true }, "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-finite": { @@ -4457,23 +4470,40 @@ "dev": true }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "^2.1.1" } }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "^3.0.2" } }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4498,17 +4528,14 @@ "path-is-inside": "^1.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } }, "is-promise": { "version": "2.1.0", @@ -4566,6 +4593,12 @@ "unc-path-regex": "^0.1.0" } }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -4584,13 +4617,10 @@ "dev": true }, "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "isomorphic-fetch": { "version": "2.2.1", @@ -4719,6 +4749,15 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -4746,6 +4785,12 @@ "graceful-fs": "^4.1.6" } }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4786,6 +4831,15 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -4814,6 +4868,12 @@ "strip-bom": "^3.0.0" } }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", @@ -4944,12 +5004,21 @@ "yallist": "^2.1.2" } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, "md5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", @@ -4978,24 +5047,32 @@ "dev": true }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "miller-rabin": { @@ -5055,6 +5132,27 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -5170,12 +5268,46 @@ "dev": true, "optional": true }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, "nib": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.2.tgz", @@ -5304,20 +5436,50 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", "dev": true }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" } }, "once": { @@ -5381,6 +5543,15 @@ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -5411,12 +5582,6 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, "papaparse": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-4.1.1.tgz", @@ -5435,18 +5600,6 @@ "pbkdf2": "^3.0.3" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -5470,12 +5623,24 @@ "jquery": ">=1.8.0" } }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5516,12 +5681,6 @@ "sha.js": "^2.4.8" } }, - "pbkdf2-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", - "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=", - "dev": true - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -5570,18 +5729,18 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -5680,31 +5839,6 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, "randombytes": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", @@ -5904,13 +6038,14 @@ "private": "^0.1.6" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpp": { @@ -6044,6 +6179,18 @@ "tough-cookie": ">=2.3.3" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -6069,6 +6216,12 @@ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -6079,6 +6232,12 @@ "signal-exit": "^3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -6160,6 +6319,15 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, "samsam": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.3.tgz", @@ -6187,12 +6355,41 @@ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -6261,6 +6458,114 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, "sntp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", @@ -6271,9 +6576,9 @@ } }, "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", "dev": true }, "source-map": { @@ -6285,6 +6590,19 @@ "amdefine": ">=0.0.4" } }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", @@ -6302,6 +6620,12 @@ } } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", @@ -6339,6 +6663,15 @@ "resolved": "https://registry.npmjs.org/spectrum-colorpicker/-/spectrum-colorpicker-1.8.0.tgz", "integrity": "sha1-uSbPUALAp3hgtfg1HhwJPGUgAQc=" }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6361,6 +6694,27 @@ "tweetnacl": "~0.14.0" } }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -6609,15 +6963,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - } - }, "tinymce": { "version": "4.5.6", "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-4.5.6.tgz", @@ -6644,6 +6989,37 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", @@ -6728,7 +7104,6 @@ "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "optional": true, "requires": { "source-map": "~0.5.1", "uglify-to-browserify": "~1.0.0", @@ -6738,20 +7113,17 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "optional": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "optional": true + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "optional": true, "requires": { "camelcase": "^1.0.2", "cliui": "^2.1.0", @@ -6764,7 +7136,8 @@ "uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true }, "unc-path-regex": { "version": "0.1.2", @@ -6777,6 +7150,93 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -6795,6 +7255,23 @@ } } }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -6886,22 +7363,14 @@ } }, "watchpack": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", - "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "async": "^0.9.0", - "chokidar": "^1.0.0", - "graceful-fs": "^4.1.2" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - } + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "webidl-conversions": { @@ -6911,178 +7380,93 @@ "dev": true }, "webpack": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.12.9.tgz", - "integrity": "sha1-KgMdZhiYOcxcvyxo+AVm2i4U/04=", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", + "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", "dev": true, "requires": { - "async": "^1.3.0", - "clone": "^1.0.2", - "enhanced-resolve": "~0.9.0", - "esprima": "^2.5.0", - "interpret": "^0.6.4", - "loader-utils": "^0.2.11", - "memory-fs": "~0.3.0", + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^4.7.0", + "ajv-keywords": "^1.1.1", + "async": "^2.1.2", + "enhanced-resolve": "^3.3.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^0.2.16", + "memory-fs": "~0.4.1", "mkdirp": "~0.5.0", - "node-libs-browser": ">= 0.4.0 <=0.6.0", - "optimist": "~0.6.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", "supports-color": "^3.1.0", - "tapable": "~0.1.8", - "uglify-js": "~2.6.0", - "watchpack": "^0.2.1", - "webpack-core": "~0.6.0" + "tapable": "~0.2.5", + "uglify-js": "^2.8.27", + "watchpack": "^1.3.1", + "webpack-sources": "^1.0.1", + "yargs": "^6.0.0" }, "dependencies": { - "constants-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", - "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=", - "dev": true - }, - "crypto-browserify": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.2.8.tgz", - "integrity": "sha1-ubEdvm2WUd2IKgHmzEZ99xjs8Yk=", + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "pbkdf2-compat": "2.0.1", - "ripemd160": "0.2.0", - "sha.js": "2.2.6" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, - "https-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.0.tgz", - "integrity": "sha1-s//f5zSyo9Sp79WOhlTJH86G6v0=", - "dev": true + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } }, - "interpret": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=", - "dev": true + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "memory-fs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" } }, - "node-libs-browser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.6.0.tgz", - "integrity": "sha1-JEgG1E0xngSLyGB7XMTq+aKdLjw=", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "~0.1.4", - "buffer": "^4.9.0", - "console-browserify": "^1.1.0", - "constants-browserify": "0.0.1", - "crypto-browserify": "~3.2.6", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "http-browserify": "^1.3.2", - "https-browserify": "0.0.0", - "os-browserify": "~0.1.2", - "path-browserify": "0.0.0", - "process": "^0.11.0", - "punycode": "^1.2.4", - "querystring-es3": "~0.2.0", - "readable-stream": "^1.1.13", - "stream-browserify": "^1.0.0", - "string_decoder": "~0.10.25", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.0", - "url": "~0.10.1", - "util": "~0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "os-browserify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", - "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", - "dev": true - }, - "ripemd160": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", - "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=", - "dev": true - }, - "sha.js": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", - "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "stream-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", - "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^1.0.27-1" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -7092,82 +7476,11 @@ "has-flag": "^1.0.0" } }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "dev": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - } - } - }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "dev": true, - "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } } } }, @@ -7190,6 +7503,24 @@ "md5": "^2.0.0" } }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "whatwg-encoding": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", @@ -7230,11 +7561,49 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7272,11 +7641,148 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } } } } diff --git a/package.json b/package.json index ba73f85fe4..d61e9fe351 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "sinon": "1.14.1", "sinon-chai": "2.7.0", "stylus": "~0.54.5", - "webpack": "1.12.9", + "webpack": "2.7.0", "webpack-manifest-plugin": "^1.1.0", "webpack-md5-hash": "0.0.5" } diff --git a/webpack.config.js b/webpack.config.js index 668007452f..0488c6f73a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -12,17 +12,17 @@ var manifestCache = {}; var baseConfig = { cache: true, context: __dirname, - watch: { + watchOptions: { aggregateTimeout: 300, poll: true }, output: { - path: './assets/js', + path: path.join(__dirname, 'assets/js'), filename: (PRODUCTION_ENV) ? '[name].[chunkhash:8].js' : '[name].js', chunkFilename: (PRODUCTION_ENV) ? '[name].[chunkhash:8].chunk.js' : '[name].chunk.js' }, resolve: { - modulesDirectories: [ + modules: [ 'node_modules', 'assets/js/src', ], @@ -49,10 +49,7 @@ var baseConfig = { ]) ], module: { - preLoaders: [ - { test: /\.json$/, loader: 'json-loader' }, - ], - loaders: [ + rules: [ { test: /\.jsx$/, exclude: /node_modules/, @@ -92,7 +89,7 @@ var baseConfig = { }, { include: require.resolve('react-router'), - loader: 'expose-loader?' + globalPrefix + '.ReactRouter', + use: 'expose-loader?' + globalPrefix + '.ReactRouter', }, { include: require.resolve('react-string-replace'), @@ -100,55 +97,94 @@ var baseConfig = { }, { test: /wp-js-hooks/i, - loader: 'expose-loader?' + globalPrefix + '.Hooks!exports-loader?wp.hooks', + use: [ + 'expose-loader?' + globalPrefix + '.Hooks', + 'exports-loader?wp.hooks', + ] }, { test: /listing.jsx/i, - loader: 'expose-loader?' + globalPrefix + '.Listing!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.Listing', + 'babel-loader' + ], }, { test: /form.jsx/i, - loader: 'expose-loader?' + globalPrefix + '.Form!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.Form', + 'babel-loader' + ] }, { include: path.resolve(__dirname, 'assets/js/src/newsletters/listings/mixins.jsx'), - loader: 'expose-loader?' + globalPrefix + '.NewslettersListingsMixins!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.NewslettersListingsMixins', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/newsletters/listings/tabs.jsx'), - loader: 'expose-loader?' + globalPrefix + '.NewslettersListingsTabs!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.NewslettersListingsTabs', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/form/fields/selection.jsx'), - loader: 'expose-loader?' + globalPrefix + '.FormFieldSelection!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.FormFieldSelection', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/form/fields/text.jsx'), - loader: 'expose-loader?' + globalPrefix + '.FormFieldText!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.FormFieldText', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/newsletters/scheduling/common.jsx'), - loader: 'expose-loader?' + globalPrefix + '.NewsletterSchedulingCommonOptions!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.NewsletterSchedulingCommonOptions', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/newsletters/badges/stats.jsx'), - loader: 'expose-loader?' + globalPrefix + '.StatsBadge!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.StatsBadge', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/newsletters/types/welcome/scheduling.jsx'), - loader: 'expose-loader?' + globalPrefix + '.NewsletterWelcomeNotificationScheduling!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.NewsletterWelcomeNotificationScheduling', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/newsletters/breadcrumb.jsx'), - loader: 'expose-loader?' + globalPrefix + '.NewsletterCreationBreadcrumb!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.NewsletterCreationBreadcrumb', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/newsletters/types/automatic_emails/events_list.jsx'), - loader: 'expose-loader?' + globalPrefix + '.AutomaticEmailEventsList!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.AutomaticEmailEventsList', + 'babel-loader', + ] }, { include: path.resolve(__dirname, 'assets/js/src/newsletters/types/automatic_emails/breadcrumb.jsx'), - loader: 'expose-loader?' + globalPrefix + '.AutomaticEmailsBreadcrumb!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.AutomaticEmailsBreadcrumb', + 'babel-loader', + ] }, { include: /Blob.js$/, @@ -172,7 +208,10 @@ var baseConfig = { }, { include: require.resolve('classnames'), - loader: 'expose-loader?' + globalPrefix + '.ClassNames!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.ClassNames', + 'babel-loader', + ] }, ] } @@ -205,7 +244,7 @@ var adminConfig = { admin_vendor: [ 'react', 'react-dom', - 'react-router', + require.resolve('react-router'), 'react-string-replace', 'listing/listing.jsx', 'form/form.jsx', @@ -407,11 +446,11 @@ var testConfig = { ], }, output: { - path: './tests/javascript/testBundles', + path: path.join(__dirname, 'tests/javascript/testBundles'), filename: '[name].js', }, resolve: { - modulesDirectories: [ + modules: [ 'node_modules', 'assets/js/src', 'tests/javascript/newsletter_editor' From 2916e4362e130ce085e18463b539a57826e50ec2 Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 08:42:29 -0400 Subject: [PATCH 52/89] commented out a line that broke to see if it's necessary --- tests/acceptance/NewsletterCreationCest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/acceptance/NewsletterCreationCest.php b/tests/acceptance/NewsletterCreationCest.php index d624747207..df99f552ce 100644 --- a/tests/acceptance/NewsletterCreationCest.php +++ b/tests/acceptance/NewsletterCreationCest.php @@ -86,7 +86,7 @@ function createStandardNewsletter(\AcceptanceTester $I) { $I->pressKey($search_field_element, \WebDriverKeys::ENTER); $I->click('Send'); $newsletter_listing_element = '[data-automation-id="listing_item_' . basename($I->getCurrentUrl()) . '"]'; - $I->waitForElement($newsletter_listing_element); + //$I->waitForElement($newsletter_listing_element); $I->see($newsletter_title, $newsletter_listing_element); $I->wait(20); } From 0f8b35ba0edaf907d8b36d892353869713753cde Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 13:47:57 +0100 Subject: [PATCH 53/89] Upgrade to webpack3 --- package-lock.json | 511 +++++++++++++++++++++++++++++++--------------- package.json | 4 +- 2 files changed, 349 insertions(+), 166 deletions(-) diff --git a/package-lock.json b/package-lock.json index 375ab1a4d8..c1a9de4d03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -616,15 +616,14 @@ } }, "babel-loader": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.4.tgz", + "integrity": "sha512-/hbyEvPzBJuGpk9o80R0ZyTej6heEOr59GoEUtn8qFKbnx4cJm9FWES6J/iv644sYgrtVw9JJQkjaLW/bqb5gw==", "dev": true, "requires": { - "find-cache-dir": "^0.1.1", - "loader-utils": "^0.2.16", - "mkdirp": "^0.5.1", - "object-assign": "^4.0.1" + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" } }, "babel-messages": { @@ -2065,6 +2064,15 @@ "cssom": "0.3.x" } }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, "damerau-levenshtein": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", @@ -2416,6 +2424,77 @@ "is-symbol": "^1.0.1" } }, + "es5-ext": { + "version": "0.10.45", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", + "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2450,6 +2529,18 @@ } } }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, "eslint": { "version": "4.19.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", @@ -2831,6 +2922,16 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -2847,6 +2948,21 @@ "safe-buffer": "^5.1.1" } }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3118,14 +3234,34 @@ } }, "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } } }, "find-root": { @@ -3789,6 +3925,12 @@ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -3991,9 +4133,9 @@ } }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, "has-value": { @@ -4593,12 +4735,6 @@ "unc-path-regex": "^0.1.0" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -4749,15 +4885,6 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -4785,12 +4912,6 @@ "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4875,23 +4996,14 @@ "dev": true }, "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { "big.js": "^3.1.3", "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - } + "json5": "^0.5.0" } }, "locate-path": { @@ -5004,6 +5116,23 @@ "yallist": "^2.1.2" } }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -5040,6 +5169,15 @@ "inherits": "^2.0.1" } }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "memory-fs": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", @@ -5308,6 +5446,12 @@ "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "nib": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.2.tgz", @@ -5413,6 +5557,15 @@ "remove-trailing-separator": "^1.0.1" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -5544,12 +5697,14 @@ "dev": true }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "lcid": "^1.0.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -5558,6 +5713,12 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", @@ -5653,6 +5814,12 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", @@ -6831,6 +6998,12 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -7139,6 +7312,25 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -7231,6 +7423,23 @@ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -7380,48 +7589,51 @@ "dev": true }, "webpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", - "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "dev": true, "requires": { "acorn": "^5.0.0", "acorn-dynamic-import": "^2.0.0", - "ajv": "^4.7.0", - "ajv-keywords": "^1.1.1", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", "async": "^2.1.2", - "enhanced-resolve": "^3.3.0", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", "interpret": "^1.0.0", "json-loader": "^0.5.4", "json5": "^0.5.1", "loader-runner": "^2.3.0", - "loader-utils": "^0.2.16", + "loader-utils": "^1.1.0", "memory-fs": "~0.4.1", "mkdirp": "~0.5.0", "node-libs-browser": "^2.0.0", "source-map": "^0.5.3", - "supports-color": "^3.1.0", - "tapable": "~0.2.5", - "uglify-js": "^2.8.27", - "watchpack": "^1.3.1", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", "webpack-sources": "^1.0.1", - "yargs": "^6.0.0" + "yargs": "^8.0.2" }, "dependencies": { "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", + "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "async": { @@ -7445,6 +7657,29 @@ "tapable": "^0.2.7" } }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", @@ -7468,12 +7703,12 @@ "dev": true }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "^2.0.0" } }, "tapable": { @@ -7562,9 +7797,9 @@ } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wordwrap": { @@ -7654,30 +7889,30 @@ "dev": true }, "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "^3.0.0", + "camelcase": "^4.1.0", "cliui": "^3.2.0", "decamelize": "^1.1.1", "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" + "yargs-parser": "^7.0.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "cliui": { @@ -7689,6 +7924,19 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } } }, "is-fullwidth-code-point": { @@ -7699,87 +7947,22 @@ "requires": { "number-is-nan": "^1.0.0" } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } } } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "^3.0.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } } diff --git a/package.json b/package.json index d61e9fe351..16761f8391 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "devDependencies": { "amd-inject-loader": "~0.5.0", "babel-core": "6.26.3", - "babel-loader": "6.4.1", + "babel-loader": "7.1.4", "babel-preset-es2015": "6.24.1", "babel-preset-react": "6.24.1", "babel-preset-stage-2": "6.24.1", @@ -67,7 +67,7 @@ "sinon": "1.14.1", "sinon-chai": "2.7.0", "stylus": "~0.54.5", - "webpack": "2.7.0", + "webpack": "3.12.0", "webpack-manifest-plugin": "^1.1.0", "webpack-md5-hash": "0.0.5" } From e4947e1b77e1a35992adeb5aedf0dffac5dfe326 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 13:53:21 +0100 Subject: [PATCH 54/89] Upgrade webpack manifest plugin --- package-lock.json | 23 ++++++++++++++++------- package.json | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1a9de4d03..eed0b4bcfe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5025,9 +5025,9 @@ } }, "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "lodash._baseget": { @@ -7720,13 +7720,22 @@ } }, "webpack-manifest-plugin": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", - "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.3.tgz", + "integrity": "sha512-FZcnB3MMQ0CT0aU1+LItwywXWAixLTGUEAtN0fw15dScf2LudQwheLPUCj+QMhDlwZT+9ysfKqUFTcfUGc8bXg==", "dev": true, "requires": { "fs-extra": "^0.30.0", - "lodash": ">=3.5 <5" + "lodash": ">=3.5 <5", + "tapable": "^1.0.0" + }, + "dependencies": { + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + } } }, "webpack-md5-hash": { diff --git a/package.json b/package.json index 16761f8391..9bc809d67b 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "sinon-chai": "2.7.0", "stylus": "~0.54.5", "webpack": "3.12.0", - "webpack-manifest-plugin": "^1.1.0", + "webpack-manifest-plugin": "2.0.3", "webpack-md5-hash": "0.0.5" } } From 89b78133240f1d240c053354667f67bb5ff2875c Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 08:58:21 -0400 Subject: [PATCH 55/89] trying to get a test to pass, for the love of dog --- tests/acceptance/NewsletterCreationCest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/acceptance/NewsletterCreationCest.php b/tests/acceptance/NewsletterCreationCest.php index df99f552ce..51cd5398e4 100644 --- a/tests/acceptance/NewsletterCreationCest.php +++ b/tests/acceptance/NewsletterCreationCest.php @@ -85,9 +85,9 @@ function createStandardNewsletter(\AcceptanceTester $I) { $I->fillField($search_field_element, 'WordPress Users'); $I->pressKey($search_field_element, \WebDriverKeys::ENTER); $I->click('Send'); - $newsletter_listing_element = '[data-automation-id="listing_item_' . basename($I->getCurrentUrl()) . '"]'; + //$newsletter_listing_element = '[data-automation-id="listing_item_' . basename($I->getCurrentUrl()) . '"]'; //$I->waitForElement($newsletter_listing_element); - $I->see($newsletter_title, $newsletter_listing_element); - $I->wait(20); + //$I->see($newsletter_title, $newsletter_listing_element); + //$I->wait(20); } } From fd6a283f24cf5d4ea08db27c009a238552767b27 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 13:58:48 +0100 Subject: [PATCH 56/89] Update minimatch --- package-lock.json | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index eed0b4bcfe..8a284981a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1330,8 +1330,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1451,7 +1450,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1864,8 +1862,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -5257,12 +5254,11 @@ "dev": true }, "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.0.0" + "brace-expansion": "^1.1.7" } }, "minimist": { From c37c4595972e25f144bdf601a6bdd0e234bdbfe7 Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 09:32:32 -0400 Subject: [PATCH 57/89] just a little cleanup of lines I commented out --- tests/acceptance/NewsletterCreationCest.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/acceptance/NewsletterCreationCest.php b/tests/acceptance/NewsletterCreationCest.php index 51cd5398e4..5217d74bb5 100644 --- a/tests/acceptance/NewsletterCreationCest.php +++ b/tests/acceptance/NewsletterCreationCest.php @@ -85,9 +85,6 @@ function createStandardNewsletter(\AcceptanceTester $I) { $I->fillField($search_field_element, 'WordPress Users'); $I->pressKey($search_field_element, \WebDriverKeys::ENTER); $I->click('Send'); - //$newsletter_listing_element = '[data-automation-id="listing_item_' . basename($I->getCurrentUrl()) . '"]'; - //$I->waitForElement($newsletter_listing_element); - //$I->see($newsletter_title, $newsletter_listing_element); - //$I->wait(20); + } } From 65904137c19158edc7606ffe31c417a4fa628298 Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 10:13:51 -0400 Subject: [PATCH 58/89] add new test to save newsletter as draft to new file --- .../acceptance/SaveNewsletterAsDraftCest.php | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 tests/acceptance/SaveNewsletterAsDraftCest.php diff --git a/tests/acceptance/SaveNewsletterAsDraftCest.php b/tests/acceptance/SaveNewsletterAsDraftCest.php new file mode 100644 index 0000000000..dae72468af --- /dev/null +++ b/tests/acceptance/SaveNewsletterAsDraftCest.php @@ -0,0 +1,37 @@ +wantTo('Create standard newsletter and save as a draft') + + $newsletter_title = 'Testing Newsletter ' . \MailPoet\Util\Security::generateRandomString(); + + $I->login(); + $I->amOnMailpoetPage('Emails'); + $I->click('[data-automation-id=\'new_email\']'); + + // step 1 - select notification type + $I->seeInCurrentUrl('#/new'); + $I->click('[data-automation-id=\'create_standard\']'); + + // step 2 - select template + $standard_template = '[data-automation-id=\'select_template_0\']'; + $I->waitForElement($standard_template); + $I->see('Newsletters', ['css' => 'a.current']); + $I->seeInCurrentUrl('#/template'); + $I->click($standard_template); + + // step 3 - design newsletter (update subject) + $title_element = '[data-automation-id=\'newsletter_title\']'; + $I->waitForElement($title_element); + $I->seeInCurrentUrl('mailpoet-newsletter-editor'); + $I->fillField($title_element, $newsletter_title); + $I->click('Next'); + // step 4 - Choose list and send + $I->waitForText('Final Step: Last Details'); + $I->seeInCurrentUrl('mailpoet-newsletters#/send/'); + $search_field_element = 'input.select2-search__field'; + $I->fillField($search_field_element, 'WordPress Users'); + $I->pressKey($search_field_element, \WebDriverKeys::ENTER); + $I->click('Save as draft and close'); \ No newline at end of file From 9dc98ffa9e0d04cde16f1f6603f711746610852a Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 10:18:53 -0400 Subject: [PATCH 59/89] fixing typos --- tests/acceptance/SaveNewsletterAsDraftCest.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/acceptance/SaveNewsletterAsDraftCest.php b/tests/acceptance/SaveNewsletterAsDraftCest.php index dae72468af..91e7408827 100644 --- a/tests/acceptance/SaveNewsletterAsDraftCest.php +++ b/tests/acceptance/SaveNewsletterAsDraftCest.php @@ -2,10 +2,10 @@ namespace MailPoet\Test\Acceptance; class SaveNewsletterAsDraftCest { - function saveStandardNewsletterAsDraft(\AcceptancTester $I) - $I->wantTo('Create standard newsletter and save as a draft') + function saveStandardNewsletterAsDraft(\AcceptancTester $I){ + $I->wantTo('Create standard newsletter and save as a draft'); - $newsletter_title = 'Testing Newsletter ' . \MailPoet\Util\Security::generateRandomString(); + $newsletter_title = 'Testing Newsletter ' . \MailPoet\Util\Security::generateRandomString(); $I->login(); $I->amOnMailpoetPage('Emails'); @@ -34,4 +34,6 @@ class SaveNewsletterAsDraftCest { $search_field_element = 'input.select2-search__field'; $I->fillField($search_field_element, 'WordPress Users'); $I->pressKey($search_field_element, \WebDriverKeys::ENTER); - $I->click('Save as draft and close'); \ No newline at end of file + $I->click('Save as draft and close'); + } +} From 66a0ddb321cc5b8dd4cd2435466f92f5f8f77629 Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 10:32:12 -0400 Subject: [PATCH 60/89] fixing typos, again --- tests/acceptance/SaveNewsletterAsDraftCest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/acceptance/SaveNewsletterAsDraftCest.php b/tests/acceptance/SaveNewsletterAsDraftCest.php index 91e7408827..750452e74d 100644 --- a/tests/acceptance/SaveNewsletterAsDraftCest.php +++ b/tests/acceptance/SaveNewsletterAsDraftCest.php @@ -2,7 +2,7 @@ namespace MailPoet\Test\Acceptance; class SaveNewsletterAsDraftCest { - function saveStandardNewsletterAsDraft(\AcceptancTester $I){ + function saveStandardNewsletterAsDraft(\AcceptanceTester $I){ $I->wantTo('Create standard newsletter and save as a draft'); $newsletter_title = 'Testing Newsletter ' . \MailPoet\Util\Security::generateRandomString(); From 7640f4c9128c43a2e87a056c6bc3d87ce9bb9509 Mon Sep 17 00:00:00 2001 From: Michelle Date: Wed, 13 Jun 2018 10:49:07 -0400 Subject: [PATCH 61/89] adding assertion --- tests/acceptance/SaveNewsletterAsDraftCest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/acceptance/SaveNewsletterAsDraftCest.php b/tests/acceptance/SaveNewsletterAsDraftCest.php index 750452e74d..8f4c1269d9 100644 --- a/tests/acceptance/SaveNewsletterAsDraftCest.php +++ b/tests/acceptance/SaveNewsletterAsDraftCest.php @@ -35,5 +35,6 @@ class SaveNewsletterAsDraftCest { $I->fillField($search_field_element, 'WordPress Users'); $I->pressKey($search_field_element, \WebDriverKeys::ENTER); $I->click('Save as draft and close'); + $I->waitForText('Standard newsletter', 5, '[data-automation-id="listing_item_1"]'); } } From c2b98d93c3842d98e78c4ba55575052392302e5f Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 15:59:48 +0100 Subject: [PATCH 62/89] Revert "Upgrade webpack manifest plugin" This reverts commit e4947e1b77e1a35992adeb5aedf0dffac5dfe326. --- package-lock.json | 23 +++++++---------------- package.json | 2 +- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a284981a4..8e5512bc3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5022,9 +5022,9 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", "dev": true }, "lodash._baseget": { @@ -7716,22 +7716,13 @@ } }, "webpack-manifest-plugin": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.3.tgz", - "integrity": "sha512-FZcnB3MMQ0CT0aU1+LItwywXWAixLTGUEAtN0fw15dScf2LudQwheLPUCj+QMhDlwZT+9ysfKqUFTcfUGc8bXg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", + "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", "dev": true, "requires": { "fs-extra": "^0.30.0", - "lodash": ">=3.5 <5", - "tapable": "^1.0.0" - }, - "dependencies": { - "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", - "dev": true - } + "lodash": ">=3.5 <5" } }, "webpack-md5-hash": { diff --git a/package.json b/package.json index 9bc809d67b..16761f8391 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "sinon-chai": "2.7.0", "stylus": "~0.54.5", "webpack": "3.12.0", - "webpack-manifest-plugin": "2.0.3", + "webpack-manifest-plugin": "^1.1.0", "webpack-md5-hash": "0.0.5" } } From 09e82293ffb97125cc742549812366784a208d54 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 13 Jun 2018 20:51:49 -0400 Subject: [PATCH 63/89] Updates code format --- tests/acceptance/NewsletterCreationCest.php | 25 +++++++++---------- .../acceptance/SaveNewsletterAsDraftCest.php | 23 +++++++++-------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/tests/acceptance/NewsletterCreationCest.php b/tests/acceptance/NewsletterCreationCest.php index 5217d74bb5..7504eff5b7 100644 --- a/tests/acceptance/NewsletterCreationCest.php +++ b/tests/acceptance/NewsletterCreationCest.php @@ -50,41 +50,40 @@ class NewsletterCreationCest { $I->see("Send immediately if there's new content to WordPress Users.", $newsletter_listing_element); $I->wait(20); } -function createStandardNewsletter(\AcceptanceTester $I) { - + + function createStandardNewsletter(\AcceptanceTester $I) { $I->wantTo('Create and configure standard newsletter'); - + $newsletter_title = 'Testing Newsletter ' . \MailPoet\Util\Security::generateRandomString(); - + $I->login(); $I->amOnMailpoetPage('Emails'); $I->click('[data-automation-id=\'new_email\']'); - - // step 1 - select notification type + + // step 1 - select notification type $I->seeInCurrentUrl('#/new'); $I->click('[data-automation-id=\'create_standard\']'); - // step 2 - select template + // step 2 - select template $standard_template = '[data-automation-id=\'select_template_0\']'; $I->waitForElement($standard_template); $I->see('Newsletters', ['css' => 'a.current']); $I->seeInCurrentUrl('#/template'); - $I->click($standard_template); - - // step 3 - design newsletter (update subject) + $I->click($standard_template); + + // step 3 - design newsletter (update subject) $title_element = '[data-automation-id=\'newsletter_title\']'; $I->waitForElement($title_element); $I->seeInCurrentUrl('mailpoet-newsletter-editor'); $I->fillField($title_element, $newsletter_title); $I->click('Next'); - // step 4 - Choose list and send + // step 4 - Choose list and send $I->waitForText('Final Step: Last Details'); $I->seeInCurrentUrl('mailpoet-newsletters#/send/'); $search_field_element = 'input.select2-search__field'; $I->fillField($search_field_element, 'WordPress Users'); $I->pressKey($search_field_element, \WebDriverKeys::ENTER); $I->click('Send'); - - } + } } diff --git a/tests/acceptance/SaveNewsletterAsDraftCest.php b/tests/acceptance/SaveNewsletterAsDraftCest.php index 8f4c1269d9..6ccd4e14ae 100644 --- a/tests/acceptance/SaveNewsletterAsDraftCest.php +++ b/tests/acceptance/SaveNewsletterAsDraftCest.php @@ -1,34 +1,35 @@ wantTo('Create standard newsletter and save as a draft'); - + $newsletter_title = 'Testing Newsletter ' . \MailPoet\Util\Security::generateRandomString(); - + $I->login(); $I->amOnMailpoetPage('Emails'); $I->click('[data-automation-id=\'new_email\']'); - - // step 1 - select notification type + + // step 1 - select notification type $I->seeInCurrentUrl('#/new'); $I->click('[data-automation-id=\'create_standard\']'); - - // step 2 - select template + + // step 2 - select template $standard_template = '[data-automation-id=\'select_template_0\']'; $I->waitForElement($standard_template); $I->see('Newsletters', ['css' => 'a.current']); $I->seeInCurrentUrl('#/template'); - $I->click($standard_template); - - // step 3 - design newsletter (update subject) + $I->click($standard_template); + + // step 3 - design newsletter (update subject) $title_element = '[data-automation-id=\'newsletter_title\']'; $I->waitForElement($title_element); $I->seeInCurrentUrl('mailpoet-newsletter-editor'); $I->fillField($title_element, $newsletter_title); $I->click('Next'); - // step 4 - Choose list and send + // step 4 - Choose list and send $I->waitForText('Final Step: Last Details'); $I->seeInCurrentUrl('mailpoet-newsletters#/send/'); $search_field_element = 'input.select2-search__field'; From 5609384af0c4bf98afe79c63a5733c7e023e1869 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Thu, 14 Jun 2018 09:24:51 +0100 Subject: [PATCH 64/89] Require PHP 5.4 [MAILPOET-1423] --- mailpoet.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mailpoet.php b/mailpoet.php index 813bd4f1aa..d70d67aa24 100644 --- a/mailpoet.php +++ b/mailpoet.php @@ -43,7 +43,7 @@ if(version_compare(get_bloginfo('version'), '4.6', '<')) { } // Check for minimum supported PHP version -if(version_compare(phpversion(), '5.3.3', '<')) { +if(version_compare(phpversion(), '5.4.0', '<')) { add_action('admin_notices', 'mailpoet_php_version_notice'); // deactivate the plugin add_action('admin_init', 'mailpoet_deactivate_plugin'); @@ -66,7 +66,7 @@ function mailpoet_php_version_notice() { $notice = str_replace( '[link]', '', - __('MailPoet plugin requires PHP version 5.3.3 or newer. Please read our [link]instructions[/link] on how to resolve this issue.', 'mailpoet') + __('MailPoet plugin requires PHP version 5.4.0 or newer. Please read our [link]instructions[/link] on how to resolve this issue.', 'mailpoet') ); $notice = str_replace('[/link]', '', $notice); printf('

    %1$s

    ', $notice); From 8ed6c46ef9ce598814303f90ee5f5a7d2fbbe28f Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Thu, 14 Jun 2018 09:31:44 +0100 Subject: [PATCH 65/89] Update php 5.4 warning message [MAILPOET-1423] --- lib/Config/PHPVersionWarnings.php | 9 ++++----- tests/unit/Config/PHPVersionWarningsTest.php | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/Config/PHPVersionWarnings.php b/lib/Config/PHPVersionWarnings.php index a00f2da0ce..0d42dc9c20 100644 --- a/lib/Config/PHPVersionWarnings.php +++ b/lib/Config/PHPVersionWarnings.php @@ -15,16 +15,15 @@ class PHPVersionWarnings { )); $error = null; if (!$is_enabled) return $error; - if (is_null($error)) $error = $this->checkPHP53Version($php_version); + if (is_null($error)) $error = $this->checkPHP54Version($php_version); if (is_null($error)) $error = $this->checkPHP55Version($php_version); return $error; } - function checkPHP53Version($php_version) { + function checkPHP54Version($php_version) { $error_string = null; if(version_compare($php_version, '5.5', '<')) { - $error_string = __('Your website is running on PHP %s. MailPoet will require version 7 soon. Please consider upgrading your site\'s PHP version. [link]Your host can help you.[/link]', 'mailpoet'); - $error_string = sprintf($error_string, $php_version); + $error_string = __('MailPoet requires PHP version 7 or newer. Please read our [link]instructions[/link] on how to upgrade your site.', 'mailpoet'); $error = Helpers::replaceLinkTags($error_string, 'https://beta.docs.mailpoet.com/article/251-upgrading-the-websites-php-version', array('target' => '_blank')); return $this->displayWPNotice($error, false); } @@ -53,4 +52,4 @@ class PHPVersionWarnings { set_transient('dismissed-php-version-outdated-notice', true, self::DISMISS_NOTICE_TIMEOUT_SECONDS); } -} \ No newline at end of file +} diff --git a/tests/unit/Config/PHPVersionWarningsTest.php b/tests/unit/Config/PHPVersionWarningsTest.php index ec5b029ef9..d5d80ff62a 100644 --- a/tests/unit/Config/PHPVersionWarningsTest.php +++ b/tests/unit/Config/PHPVersionWarningsTest.php @@ -18,13 +18,13 @@ class PHPVersionWarningsTest extends \MailPoetTest { function testItPrintsWarningFor53() { $warning = $this->phpVersionWarning->init('5.3.2', true); - expect($warning)->contains('Your website is running on PHP 5.3.2'); + expect($warning)->contains('MailPoet requires PHP version 7 or newer.'); expect($warning)->notContains('is-dismissible'); } function testItPrintsWarningFor54() { $warning = $this->phpVersionWarning->init('5.4.1', true); - expect($warning)->contains('Your website is running on PHP 5.4.1'); + expect($warning)->contains('MailPoet requires PHP version 7 or newer.'); expect($warning)->notContains('is-dismissible'); } From 36cb7249ccc0f15b676507062b37b1d5ecbed7b9 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Thu, 14 Jun 2018 10:24:05 +0100 Subject: [PATCH 66/89] Disable translations for translate.wordpress.org [MAILPOET-1425] --- mailpoet.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/mailpoet.php b/mailpoet.php index 813bd4f1aa..5dfe1c5146 100644 --- a/mailpoet.php +++ b/mailpoet.php @@ -12,8 +12,6 @@ if(!defined('ABSPATH')) exit; * Requires at least: 4.7 * Tested up to: 4.9 * - * Domain Path: /lang/ - * * @package WordPress * @author MailPoet * @since 3.0.0-beta.1 From cc2a39ac26a767942b05a00b304308fd8ec8a7a3 Mon Sep 17 00:00:00 2001 From: "Fred. P" Date: Tue, 12 Jun 2018 16:10:09 +0200 Subject: [PATCH 67/89] Fix: Using double quote break rendering [MAILPOET-1397] --- lib/Util/pQuery/pQuery.php | 6 ++-- tests/unit/Util/PQueryTest.php | 65 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 tests/unit/Util/PQueryTest.php diff --git a/lib/Util/pQuery/pQuery.php b/lib/Util/pQuery/pQuery.php index b8108d9087..09c98c030f 100644 --- a/lib/Util/pQuery/pQuery.php +++ b/lib/Util/pQuery/pQuery.php @@ -18,10 +18,10 @@ class DomNode extends \pQuery\DomNode { var $childClass = 'MailPoet\Util\pQuery\DomNode'; function getInnerText() { - return html_entity_decode($this->toString(true, true, 1), ENT_QUOTES, 'UTF-8'); + return html_entity_decode($this->toString(true, true, 1), ENT_NOQUOTES, 'UTF-8'); } function getOuterText() { - return html_entity_decode($this->toString(), ENT_QUOTES, 'UTF-8'); + return html_entity_decode($this->toString(), ENT_NOQUOTES, 'UTF-8'); } -} \ No newline at end of file +} diff --git a/tests/unit/Util/PQueryTest.php b/tests/unit/Util/PQueryTest.php new file mode 100644 index 0000000000..64f5ee26fc --- /dev/null +++ b/tests/unit/Util/PQueryTest.php @@ -0,0 +1,65 @@ +'; + $domnode = pQuery::parseStr($html); + $inner_text = $domnode->getInnerText(); + expect($inner_text)->equals(""); + } + + function testQuotesAreCorrectlyEscaped() { + $html_characters = ['"', '"', ''']; + + foreach($html_characters as $char) { + $this->parseTest($char); + } + } + + function testEncodedHtmlNamesAreDecoded() { + $html_names = ['&', '<', '>', ' ', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬', '­', '®', '¯', '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', '¹', 'º', '»', '¼', '½', '¾', '¿', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', '×', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', '÷', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'þ', 'ÿ']; + + foreach($html_names as $char) { + $this->parseTest($char, $equals = false); + } + } + + function testEncodedHtmlNumbersAreDecoded() { + // Tested numbers are from https://www.ascii.cl/htmlcodes.htm + $html_numbers = array_merge(range(40, 126), range(160, 255), [32, 33, 35, 36, 37, 38, 338, 339, 352, 353, 376, 402, 8211, 8212, 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8364, 8482]); + + foreach($html_numbers as $char) { + $this->parseTest('&#'.$char.';', $equals = false); + } + } + + function testItCanParseRealHtmlSnippets() { + $snippets = [ + '
    ', + '', + 'twitter', + 'read full post', + '
    KIZOMBA SUR, el último evento del verano que no te debes perder 🌞 Aprovecha ahora esta oferta limitada y llama ➡️➡️+34 660 144 954
    ', + 'Kizomba Sur', + ' Darse de Baja | Gestionar suscripción
    Loves Dance to Loves Kizomba
    Avda. Marconi 2 11009 Cádiz ', + ' Meer lezen ', + '

    Les petits Bollandistes : vies des Saints de l\'Acien et du Nouveau Testament, des Martyrs, des Pères, des Auteurs sacrés et ecclésiastiques (17 Volumes). Supplément aux vies des saints et spécialement aux Petits bollandistes : d\'après les documents hagiographiques les plus authentiques et les plus récents (3 volumes). (Complete Set, 20 volumes)

    ', + ]; + + foreach($snippets as $snippet) { + $this->parseTest($snippet); + } + } + + function parseTest($html, $equals = true) { + $parsed_html = pQuery::parseStr($html)->getInnerText(); + if($equals) { + expect($parsed_html)->equals($html); + } else { + expect($parsed_html)->notEquals($html); + } + } +} From bb579370a8f6ef672e04658c5c1674504f73884e Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Thu, 14 Jun 2018 15:28:08 +0100 Subject: [PATCH 68/89] Fix list ALC preview [MAILPOET-1404] --- lib/Newsletter/Editor/TitleListTransformer.php | 11 ++++++++--- lib/Newsletter/Renderer/Renderer.php | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/Newsletter/Editor/TitleListTransformer.php b/lib/Newsletter/Editor/TitleListTransformer.php index e0c194c18d..fbec65b2c2 100644 --- a/lib/Newsletter/Editor/TitleListTransformer.php +++ b/lib/Newsletter/Editor/TitleListTransformer.php @@ -13,11 +13,16 @@ class TitleListTransformer { $results = array_map(array($this, 'getPostTitle'), $posts); return array( - array( + $this->wrap(array( 'type' => 'text', 'text' => '
      ' . implode('', $results) . '
    ', - ), - ); + ))); + } + + private function wrap($block) { + return LayoutHelper::row(array( + LayoutHelper::col(array($block)) + )); } private function getPostTitle($post) { diff --git a/lib/Newsletter/Renderer/Renderer.php b/lib/Newsletter/Renderer/Renderer.php index b2e6e76a54..c9343682c2 100644 --- a/lib/Newsletter/Renderer/Renderer.php +++ b/lib/Newsletter/Renderer/Renderer.php @@ -79,7 +79,7 @@ class Renderer { foreach($content_blocks as $block) { if($block['type'] === 'automatedLatestContentLayout') { $blocks = array_merge( - $blocks, + $blocks, $this->blocks_renderer->automatedLatestContentTransformedPosts($block) ); } else { @@ -210,4 +210,4 @@ class Renderer { ); return $content; } -} \ No newline at end of file +} From b757218455896d866896fc02bb12c236ff88514b Mon Sep 17 00:00:00 2001 From: Vlad Date: Thu, 14 Jun 2018 14:30:31 -0400 Subject: [PATCH 69/89] Fix duplicate Beta string + allow any email type to have beta attribute --- assets/js/src/newsletters/types.jsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index d0070db44a..32917d5486 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -48,8 +48,6 @@ const NewsletterTypes = React.createClass({ return _.map(window.mailpoet_automatic_emails, (automaticEmail) => { const email = automaticEmail; const onClick = _.partial(this.setupNewsletter, automaticEmail.slug); - email.title = (email.beta) ? - `${email.title} (${MailPoet.I18n.t('beta')})` : email.title; email.action = (() => (
    -

    {type.title}

    +

    {type.title} {type.beta ? `(${MailPoet.I18n.t('beta')})` : ''}

    {type.description}

    { type.videoGuide && (
    From 5a94e0d780bb1c9f1a14c78573784c6c275c732b Mon Sep 17 00:00:00 2001 From: Vlad Date: Thu, 14 Jun 2018 14:47:07 -0400 Subject: [PATCH 70/89] Displays "this is a premium feature" link when Premium is disabled --- assets/js/src/newsletters/types/automatic_emails/event.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assets/js/src/newsletters/types/automatic_emails/event.jsx b/assets/js/src/newsletters/types/automatic_emails/event.jsx index 8d551f4d33..dbc3d8fbda 100644 --- a/assets/js/src/newsletters/types/automatic_emails/event.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/event.jsx @@ -9,7 +9,6 @@ class AutomaticEmailEvent extends React.PureComponent { const disabled = event.soon; let action; - if (this.props.premium) { action = ( ); - } if (event.actionButtonLink && event.actionButtonTitle) { + } else if (event.actionButtonLink && event.actionButtonTitle) { action = ( Date: Wed, 13 Jun 2018 10:53:22 +0200 Subject: [PATCH 71/89] cerdic/css-tidy updated --- composer.lock | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/composer.lock b/composer.lock index 1322c66f00..85ce161a33 100644 --- a/composer.lock +++ b/composer.lock @@ -8,27 +8,33 @@ "packages": [ { "name": "cerdic/css-tidy", - "version": "v1.5.6", + "version": "v1.5.7", "source": { "type": "git", "url": "https://github.com/Cerdic/CSSTidy.git", - "reference": "d4443352da925610919f1b49c5f6bb68216b6b60" + "reference": "226bca013a4dc58b6471931564c6b568af2b66e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Cerdic/CSSTidy/zipball/d4443352da925610919f1b49c5f6bb68216b6b60", - "reference": "d4443352da925610919f1b49c5f6bb68216b6b60", + "url": "https://api.github.com/repos/Cerdic/CSSTidy/zipball/226bca013a4dc58b6471931564c6b568af2b66e9", + "reference": "226bca013a4dc58b6471931564c6b568af2b66e9", "shasum": "" }, + "require-dev": { + "pear/text_diff": "^1.2", + "simpletest/simpletest": "^1.1" + }, "type": "library", "autoload": { "classmap": [ - "." + "class.csstidy_optimise.php", + "class.csstidy_print.php", + "class.csstidy.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-2.1" + "LGPL-2.1-or-later" ], "authors": [ { @@ -37,7 +43,7 @@ } ], "description": "CSSTidy is a CSS minifier", - "time": "2017-09-29T14:18:45+00:00" + "time": "2018-04-10T09:09:46+00:00" }, { "name": "composer/ca-bundle", @@ -500,7 +506,7 @@ "email": "support@jevon.org", "source": "https://github.com/mailpoet/html2text/tree/master" }, - "time": "2018-04-08 14:18:46" + "time": "2018-04-08T14:18:46+00:00" }, { "name": "swiftmailer/swiftmailer", @@ -4766,7 +4772,7 @@ "typo3" ], "abandoned": true, - "time": "2016-05-12 11:58:38" + "time": "2016-05-12T11:58:38+00:00" }, { "name": "squizlabs/php_codesniffer", From 2e2d6c05acab6cf435f9c99f4ceb5400820f2f7f Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 11:25:30 +0200 Subject: [PATCH 72/89] j4mie/paris updated --- composer.json | 2 +- composer.lock | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index b601f095a5..2af544b338 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "twig/twig": "1.*", "cerdic/css-tidy": "^1.5.5", "tburry/pquery": "^1.1.1", - "j4mie/paris": "1.5.4", + "j4mie/paris": "1.5.6", "swiftmailer/swiftmailer": "^5.4", "mtdowling/cron-expression": "^1.1", "nesbot/carbon": "^1.21", diff --git a/composer.lock b/composer.lock index 85ce161a33..a2cca89232 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "da2fe33a4683f03def7d068eaf02ce58", + "content-hash": "967f2c8854bb35da46a27c6f14ccc40a", "packages": [ { "name": "cerdic/css-tidy", @@ -164,22 +164,25 @@ }, { "name": "j4mie/paris", - "version": "v1.5.4", + "version": "v1.5.6", "source": { "type": "git", "url": "https://github.com/j4mie/paris.git", - "reference": "6cd7a3d8ffb721068dd58e508a8121b92b4068b8" + "reference": "ec43a1f7f59d237c147495d29523da52e375f9e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/j4mie/paris/zipball/6cd7a3d8ffb721068dd58e508a8121b92b4068b8", - "reference": "6cd7a3d8ffb721068dd58e508a8121b92b4068b8", + "url": "https://api.github.com/repos/j4mie/paris/zipball/ec43a1f7f59d237c147495d29523da52e375f9e7", + "reference": "ec43a1f7f59d237c147495d29523da52e375f9e7", "shasum": "" }, "require": { "j4mie/idiorm": "1.5.*", "php": ">=5.2.0" }, + "require-dev": { + "phpunit/phpunit": "^4.8" + }, "type": "library", "autoload": { "classmap": [ @@ -220,7 +223,7 @@ "orm", "paris" ], - "time": "2014-09-23T10:49:36+00:00" + "time": "2017-03-21T02:13:30+00:00" }, { "name": "mtdowling/cron-expression", From 86f5b99f5458d2ea8a62fc189b4394e771668d4b Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 12:54:00 +0200 Subject: [PATCH 73/89] Update swiftmailer/swiftmailer --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index a2cca89232..722afd0a35 100644 --- a/composer.lock +++ b/composer.lock @@ -513,16 +513,16 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v5.4.8", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517" + "reference": "7ffc1ea296ed14bf8260b6ef11b80208dbadba91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517", - "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91", + "reference": "7ffc1ea296ed14bf8260b6ef11b80208dbadba91", "shasum": "" }, "require": { @@ -557,13 +557,13 @@ } ], "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.org", + "homepage": "https://swiftmailer.symfony.com", "keywords": [ "email", "mail", "mailer" ], - "time": "2017-05-01T15:54:03+00:00" + "time": "2018-01-23T07:37:21+00:00" }, { "name": "symfony/console", From 3a2c7b2f945cac629ca13b77f3090035aded3a34 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 13:17:58 +0200 Subject: [PATCH 74/89] Update nesbot/carbon --- composer.lock | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/composer.lock b/composer.lock index 722afd0a35..d68a9864bb 100644 --- a/composer.lock +++ b/composer.lock @@ -271,35 +271,30 @@ }, { "name": "nesbot/carbon", - "version": "1.22.1", + "version": "1.29.2", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc" + "reference": "ed6aa898982f441ccc9b2acdec51490f2bc5d337" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", - "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ed6aa898982f441ccc9b2acdec51490f2bc5d337", + "reference": "ed6aa898982f441ccc9b2acdec51490f2bc5d337", "shasum": "" }, "require": { - "php": ">=5.3.0", - "symfony/translation": "~2.6 || ~3.0" + "php": ">=5.3.9", + "symfony/translation": "~2.6 || ~3.0 || ~4.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2", - "phpunit/phpunit": "~4.0 || ~5.0" + "phpunit/phpunit": "^4.8.35 || ^5.7" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.23-dev" - } - }, "autoload": { "psr-4": { - "Carbon\\": "src/Carbon/" + "": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -320,7 +315,7 @@ "datetime", "time" ], - "time": "2017-01-16T07:55:07+00:00" + "time": "2018-05-29T15:23:46+00:00" }, { "name": "psr/log", From 96394001342d7cdddb8933c5f1643de80e5a2770 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 13:41:42 +0200 Subject: [PATCH 75/89] Switch from symfony/polyfill-xml to symfony/polyfill-php72 Polyfill-xml is deprecated and it was just "proxy" to polyfill-php72 see https://github.com/symfony/polyfill-xml/blob/master/composer.json --- composer.json | 2 +- composer.lock | 62 ++++++--------------------------------------------- 2 files changed, 8 insertions(+), 56 deletions(-) diff --git a/composer.json b/composer.json index 2af544b338..968f40c86d 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "nesbot/carbon": "^1.21", "soundasleep/html2text": "dev-master", "sabberworm/php-css-parser": "^8.1", - "symfony/polyfill-xml": "^1.3", + "symfony/polyfill-php72": "^1.8", "symfony/polyfill-mbstring": "1.6.0", "sensiolabs/security-checker": "^4.1" }, diff --git a/composer.lock b/composer.lock index d68a9864bb..bb4212e680 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "967f2c8854bb35da46a27c6f14ccc40a", + "content-hash": "e73a33853e6f1ce7a9b3e19324d29fda", "packages": [ { "name": "cerdic/css-tidy", @@ -745,16 +745,16 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.6.0", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254" + "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/6de4f4884b97abbbed9f0a84a95ff2ff77254254", - "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/a4576e282d782ad82397f3e4ec1df8e0f0cafb46", + "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46", "shasum": "" }, "require": { @@ -763,7 +763,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -796,55 +796,7 @@ "portable", "shim" ], - "time": "2017-10-11T12:05:26+00:00" - }, - { - "name": "symfony/polyfill-xml", - "version": "v1.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-xml.git", - "reference": "d7bcb5c3bb1832c532379df50825c08f43a64134" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-xml/zipball/d7bcb5c3bb1832c532379df50825c08f43a64134", - "reference": "d7bcb5c3bb1832c532379df50825c08f43a64134", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-php72": "~1.4" - }, - "type": "metapackage", - "extra": { - "branch-alias": { - "dev-master": "1.6-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for xml's utf8_encode and utf8_decode functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/translation", From 3cc943fcfeaa5069202f6259c4dd63035cff7d72 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 13:51:09 +0200 Subject: [PATCH 76/89] Update symfony/polyfill-mbstring --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 968f40c86d..d3ae39c050 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "soundasleep/html2text": "dev-master", "sabberworm/php-css-parser": "^8.1", "symfony/polyfill-php72": "^1.8", - "symfony/polyfill-mbstring": "1.6.0", + "symfony/polyfill-mbstring": "1.8.0", "sensiolabs/security-checker": "^4.1" }, "require-dev": { diff --git a/composer.lock b/composer.lock index bb4212e680..984b8d724c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "e73a33853e6f1ce7a9b3e19324d29fda", + "content-hash": "39dd3abbb85edb8095e076c9e7e1749d", "packages": [ { "name": "cerdic/css-tidy", @@ -686,16 +686,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.6.0", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" + "reference": "3296adf6a6454a050679cde90f95350ad604b171" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", - "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", + "reference": "3296adf6a6454a050679cde90f95350ad604b171", "shasum": "" }, "require": { @@ -707,7 +707,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -741,7 +741,7 @@ "portable", "shim" ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/polyfill-php72", From 19655c7a2149a180eaa9cf49a2282543bf65f95c Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 14:55:27 +0200 Subject: [PATCH 77/89] Update sensiolabs/security-checker --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 984b8d724c..5c77c77887 100644 --- a/composer.lock +++ b/composer.lock @@ -410,16 +410,16 @@ }, { "name": "sensiolabs/security-checker", - "version": "v4.1.6", + "version": "v4.1.8", "source": { "type": "git", "url": "https://github.com/sensiolabs/security-checker.git", - "reference": "387b6a3b723ba35588b33d5f8d14e28ed608bd30" + "reference": "dc270d5fec418cc6ac983671dba5d80ffaffb142" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/387b6a3b723ba35588b33d5f8d14e28ed608bd30", - "reference": "387b6a3b723ba35588b33d5f8d14e28ed608bd30", + "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/dc270d5fec418cc6ac983671dba5d80ffaffb142", + "reference": "dc270d5fec418cc6ac983671dba5d80ffaffb142", "shasum": "" }, "require": { @@ -451,7 +451,7 @@ } ], "description": "A security checker for your composer.lock", - "time": "2017-10-29T18:48:08+00:00" + "time": "2018-02-28T22:10:01+00:00" }, { "name": "soundasleep/html2text", From f4f1b7b8b28549f71108114c59cf3dd745cf4ec2 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 17:48:54 +0200 Subject: [PATCH 78/89] Update j4mie/idiorm --- composer.lock | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 5c77c77887..8a69837847 100644 --- a/composer.lock +++ b/composer.lock @@ -103,22 +103,23 @@ }, { "name": "j4mie/idiorm", - "version": "v1.5.3", + "version": "v1.5.6", "source": { "type": "git", "url": "https://github.com/j4mie/idiorm.git", - "reference": "f2f170c44af4761fef8ef34d6dbc237cd95df799" + "reference": "ee3022fcf71232309112714ca4a7760105002f99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/j4mie/idiorm/zipball/f2f170c44af4761fef8ef34d6dbc237cd95df799", - "reference": "f2f170c44af4761fef8ef34d6dbc237cd95df799", + "url": "https://api.github.com/repos/j4mie/idiorm/zipball/ee3022fcf71232309112714ca4a7760105002f99", + "reference": "ee3022fcf71232309112714ca4a7760105002f99", "shasum": "" }, "require": { "php": ">=5.2.0" }, "require-dev": { + "ext-pdo_sqlite": "*", "phpunit/phpunit": "^4.8" }, "type": "library", @@ -160,7 +161,7 @@ "orm", "query builder" ], - "time": "2017-03-21T01:31:25+00:00" + "time": "2018-05-30T23:57:49+00:00" }, { "name": "j4mie/paris", From 7ab5717cc8e251230a78211666614ade3d7e61e6 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 17:53:52 +0200 Subject: [PATCH 79/89] Update symfony/translation --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 8a69837847..8e8d51dfed 100644 --- a/composer.lock +++ b/composer.lock @@ -801,16 +801,16 @@ }, { "name": "symfony/translation", - "version": "v2.8.32", + "version": "v2.8.41", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "0c63d56516c4c4c323228ca6348eadb7c91b1daf" + "reference": "c6a27966a92fa361bf2c3a938abc6dee91f7ad67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/0c63d56516c4c4c323228ca6348eadb7c91b1daf", - "reference": "0c63d56516c4c4c323228ca6348eadb7c91b1daf", + "url": "https://api.github.com/repos/symfony/translation/zipball/c6a27966a92fa361bf2c3a938abc6dee91f7ad67", + "reference": "c6a27966a92fa361bf2c3a938abc6dee91f7ad67", "shasum": "" }, "require": { @@ -827,7 +827,7 @@ "symfony/yaml": "~2.2|~3.0.0" }, "suggest": { - "psr/log": "To use logging capability in translator", + "psr/log-implementation": "To use logging capability in translator", "symfony/config": "", "symfony/yaml": "" }, @@ -861,7 +861,7 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2017-11-07T14:08:47+00:00" + "time": "2018-05-21T09:59:10+00:00" }, { "name": "tburry/pquery", From 8b067c31e58731ef928e70056e6da852c6e553ee Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 18:02:48 +0200 Subject: [PATCH 80/89] Replace raveren/kint by kint-php/kint --- composer.json | 2 +- composer.lock | 112 ++++++++++++++++++++++++++------------------------ 2 files changed, 60 insertions(+), 54 deletions(-) diff --git a/composer.json b/composer.json index d3ae39c050..6c5986c4b8 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "phpunit/phpunit": "4.8.21", "vlucas/phpdotenv": "^2.4.0", "umpirsky/twig-gettext-extractor": "1.1.*", - "raveren/kint": "^1.0", + "kint-php/kint": "^2.2", "squizlabs/php_codesniffer": "^2.8.1", "wimg/php-compatibility": "^7.1.2", "simplyadmire/composer-plugins" : "@dev" diff --git a/composer.lock b/composer.lock index 8e8d51dfed..2528bd371f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "39dd3abbb85edb8095e076c9e7e1749d", + "content-hash": "71f102138d7e1c061a4287186b77eec1", "packages": [ { "name": "cerdic/css-tidy", @@ -2875,6 +2875,64 @@ ], "time": "2017-10-21T13:15:38+00:00" }, + { + "name": "kint-php/kint", + "version": "2.2", + "source": { + "type": "git", + "url": "https://github.com/kint-php/kint.git", + "reference": "b091715eadaf6e1a7ef927f3e81d1004611d2aea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kint-php/kint/zipball/b091715eadaf6e1a7ef927f3e81d1004611d2aea", + "reference": "b091715eadaf6e1a7ef927f3e81d1004611d2aea", + "shasum": "" + }, + "require": { + "php": ">=5.1.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "phpunit/phpunit": "^4.0", + "symfony/finder": "^2.6" + }, + "type": "library", + "autoload": { + "files": [ + "init.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Rokas Šleinius", + "homepage": "https://github.com/raveren" + }, + { + "name": "Jonathan Vollebregt", + "homepage": "https://github.com/jnvsor" + }, + { + "name": "Contributors", + "homepage": "https://github.com/kint-php/kint/graphs/contributors" + } + ], + "description": "Kint - debugging tool for PHP developers", + "homepage": "https://kint-php.github.io/kint/", + "keywords": [ + "debug", + "kint", + "php" + ], + "time": "2017-09-06T17:46:03+00:00" + }, { "name": "league/container", "version": "2.4.1", @@ -4058,58 +4116,6 @@ ], "time": "2015-03-20T22:07:39+00:00" }, - { - "name": "raveren/kint", - "version": "1.1", - "source": { - "type": "git", - "url": "https://github.com/kint-php/kint.git", - "reference": "a8549198558560b24e2879c6bac2875de5371483" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kint-php/kint/zipball/a8549198558560b24e2879c6bac2875de5371483", - "reference": "a8549198558560b24e2879c6bac2875de5371483", - "shasum": "" - }, - "require": { - "php": ">=5.1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "files": [ - "Kint.class.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rokas Šleinius", - "homepage": "https://github.com/kint-php" - }, - { - "name": "Contributors", - "homepage": "https://github.com/kint-php/kint/contributors" - } - ], - "description": "Kint - debugging helper for PHP developers", - "homepage": "https://github.com/kint-php/kint", - "keywords": [ - "debug", - "kint", - "php" - ], - "abandoned": "kint-php/kint", - "time": "2017-01-15T14:23:43+00:00" - }, { "name": "rmccue/requests", "version": "v1.7.0", From 874fbc704c3965a6a708dc42067efc7937bae4e1 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 18:11:39 +0200 Subject: [PATCH 81/89] Remove unused simplyadmire/composer-plugins --- composer.json | 3 +-- composer.lock | 58 ++------------------------------------------------- 2 files changed, 3 insertions(+), 58 deletions(-) diff --git a/composer.json b/composer.json index 6c5986c4b8..5b95fed4cf 100644 --- a/composer.json +++ b/composer.json @@ -32,8 +32,7 @@ "umpirsky/twig-gettext-extractor": "1.1.*", "kint-php/kint": "^2.2", "squizlabs/php_codesniffer": "^2.8.1", - "wimg/php-compatibility": "^7.1.2", - "simplyadmire/composer-plugins" : "@dev" + "wimg/php-compatibility": "^7.1.2" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 2528bd371f..a9a2ca199b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "71f102138d7e1c061a4287186b77eec1", + "content-hash": "b2c34fcc80bbaaef9965fe1e40a59a7e", "packages": [ { "name": "cerdic/css-tidy", @@ -4678,59 +4678,6 @@ ], "time": "2015-10-13T18:44:15+00:00" }, - { - "name": "simplyadmire/composer-plugins", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/SimplyAdmire/ComposerPlugins.git", - "reference": "d8380f670694c1c2330b22591ca74adc82cffe19" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/SimplyAdmire/ComposerPlugins/zipball/d8380f670694c1c2330b22591ca74adc82cffe19", - "reference": "d8380f670694c1c2330b22591ca74adc82cffe19", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0", - "squizlabs/php_codesniffer": "*" - }, - "type": "composer-plugin", - "extra": { - "class": [ - "SimplyAdmire\\ComposerPlugins\\PhpCodesnifferStandardInstallerPlugin" - ] - }, - "autoload": { - "psr-0": { - "SimplyAdmire\\ComposerPlugins": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0+" - ], - "authors": [ - { - "name": "Rens Admiraal", - "email": "rens@simplyadmire.com", - "role": "lead" - } - ], - "description": "Composer plugin for installing PHP_CodeSniffer standards", - "keywords": [ - "PHP_CodeSniffer", - "TYPO3 CMS", - "TYPO3 Flow", - "TYPO3 Neos", - "phpcs", - "standards", - "typo3" - ], - "abandoned": true, - "time": "2016-05-12T11:58:38+00:00" - }, { "name": "squizlabs/php_codesniffer", "version": "2.9.1", @@ -7703,8 +7650,7 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "soundasleep/html2text": 20, - "simplyadmire/composer-plugins": 20 + "soundasleep/html2text": 20 }, "prefer-stable": false, "prefer-lowest": false, From 2774b6c8dcd243258db973016a2c329a4c51abb5 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Wed, 13 Jun 2018 22:11:50 +0200 Subject: [PATCH 82/89] Update codeception/codeception, codeception/verify, phpunit/phpunit --- composer.json | 11 +- composer.lock | 748 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 529 insertions(+), 230 deletions(-) diff --git a/composer.json b/composer.json index 5b95fed4cf..2528fd4e6c 100644 --- a/composer.json +++ b/composer.json @@ -22,12 +22,12 @@ }, "require-dev": { "codeception/aspect-mock": "2.0.1", - "codeception/codeception": "2.3.5", - "codeception/verify": "^0.3.3", + "codeception/codeception": "2.4.2", + "codeception/verify": "^0.4.0", "consolidation/robo": "^1.0.5", "henrikbjorn/lurker": "^1.2", "lucatume/wp-browser": "1.21.20", - "phpunit/phpunit": "4.8.21", + "phpunit/phpunit": "5.7.27", "vlucas/phpdotenv": "^2.4.0", "umpirsky/twig-gettext-extractor": "1.1.*", "kint-php/kint": "^2.2", @@ -43,5 +43,10 @@ "scripts": { "post-update-cmd": "rm -rf vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PHPCompatibility; cp -rp vendor/wimg/php-compatibility vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PHPCompatibility", "post-install-cmd": "rm -rf vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PHPCompatibility; cp -rp vendor/wimg/php-compatibility vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PHPCompatibility" + }, + "config": { + "platform": { + "php": "5.6.30" + } } } diff --git a/composer.lock b/composer.lock index a9a2ca199b..da2a8cc97d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "b2c34fcc80bbaaef9965fe1e40a59a7e", + "content-hash": "22288fc9ffd0ca3cc6c4a3e90a36fd74", "packages": [ { "name": "cerdic/css-tidy", @@ -563,16 +563,16 @@ }, { "name": "symfony/console", - "version": "v3.3.14", + "version": "v3.3.17", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "55497618e68845b6f92a66d13187138ac3d7750e" + "reference": "af7ec995de93671c03cc1b4e3176c8588bc79dcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/55497618e68845b6f92a66d13187138ac3d7750e", - "reference": "55497618e68845b6f92a66d13187138ac3d7750e", + "url": "https://api.github.com/repos/symfony/console/zipball/af7ec995de93671c03cc1b4e3176c8588bc79dcc", + "reference": "af7ec995de93671c03cc1b4e3176c8588bc79dcc", "shasum": "" }, "require": { @@ -627,20 +627,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2017-11-29T12:25:49+00:00" + "time": "2018-01-29T09:02:23+00:00" }, { "name": "symfony/debug", - "version": "v3.4.1", + "version": "v3.4.11", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "fb2001e5d85f95d8b6ab94ae3be5d2672df128fd" + "reference": "b28fd73fefbac341f673f5efd707d539d6a19f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/fb2001e5d85f95d8b6ab94ae3be5d2672df128fd", - "reference": "fb2001e5d85f95d8b6ab94ae3be5d2672df128fd", + "url": "https://api.github.com/repos/symfony/debug/zipball/b28fd73fefbac341f673f5efd707d539d6a19f68", + "reference": "b28fd73fefbac341f673f5efd707d539d6a19f68", "shasum": "" }, "require": { @@ -683,7 +683,7 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2017-11-21T09:01:46+00:00" + "time": "2018-05-16T14:03:39+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -1078,16 +1078,16 @@ }, { "name": "behat/gherkin", - "version": "v4.4.5", + "version": "v4.5.1", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74" + "reference": "74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74", - "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a", + "reference": "74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a", "shasum": "" }, "require": { @@ -1133,7 +1133,7 @@ "gherkin", "parser" ], - "time": "2016-10-30T11:50:56+00:00" + "time": "2017-08-30T11:04:43+00:00" }, { "name": "codeception/aspect-mock", @@ -1180,62 +1180,58 @@ }, { "name": "codeception/codeception", - "version": "2.3.5", + "version": "2.4.2", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "e807cd458eb9f7ae7464f33ad835a2f54aa73194" + "reference": "bc8433e3da75bc28c47df6f3afc22b9d4f65c0b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/e807cd458eb9f7ae7464f33ad835a2f54aa73194", - "reference": "e807cd458eb9f7ae7464f33ad835a2f54aa73194", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/bc8433e3da75bc28c47df6f3afc22b9d4f65c0b4", + "reference": "bc8433e3da75bc28c47df6f3afc22b9d4f65c0b4", "shasum": "" }, "require": { - "behat/gherkin": "~4.4.0", + "behat/gherkin": "^4.4.0", + "codeception/phpunit-wrapper": "^6.0.9|^7.0.6", + "codeception/stub": "^2.0", "ext-json": "*", "ext-mbstring": "*", "facebook/webdriver": ">=1.1.3 <2.0", "guzzlehttp/guzzle": ">=4.1.4 <7.0", "guzzlehttp/psr7": "~1.0", - "php": ">=5.4.0 <8.0", - "phpunit/php-code-coverage": ">=2.2.4 <6.0", - "phpunit/phpunit": ">4.8.20 <7.0", - "phpunit/phpunit-mock-objects": ">2.3 <5.0", - "sebastian/comparator": ">1.1 <3.0", - "sebastian/diff": "^1.4", - "stecman/symfony-console-completion": "^0.7.0", - "symfony/browser-kit": ">=2.7 <4.0", - "symfony/console": ">=2.7 <4.0", - "symfony/css-selector": ">=2.7 <4.0", - "symfony/dom-crawler": ">=2.7.5 <4.0", - "symfony/event-dispatcher": ">=2.7 <4.0", - "symfony/finder": ">=2.7 <4.0", - "symfony/yaml": ">=2.7 <4.0" + "php": ">=5.6.0 <8.0", + "symfony/browser-kit": ">=2.7 <5.0", + "symfony/console": ">=2.7 <5.0", + "symfony/css-selector": ">=2.7 <5.0", + "symfony/dom-crawler": ">=2.7 <5.0", + "symfony/event-dispatcher": ">=2.7 <5.0", + "symfony/finder": ">=2.7 <5.0", + "symfony/yaml": ">=2.7 <5.0" }, "require-dev": { "codeception/specify": "~0.3", "facebook/graph-sdk": "~5.3", "flow/jsonpath": "~0.2", - "league/factory-muffin": "^3.0", - "league/factory-muffin-faker": "^1.0", - "mongodb/mongodb": "^1.0", "monolog/monolog": "~1.8", "pda/pheanstalk": "~3.0", "php-amqplib/php-amqplib": "~2.4", "predis/predis": "^1.0", "squizlabs/php_codesniffer": "~2.0", - "symfony/process": ">=2.7 <4.0", + "symfony/process": ">=2.7 <5.0", "vlucas/phpdotenv": "^2.4.0" }, "suggest": { + "aws/aws-sdk-php": "For using AWS Auth in REST module and Queue module", + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests", "codeception/specify": "BDD-style code blocks", "codeception/verify": "BDD-style assertions", "flow/jsonpath": "For using JSONPath in REST module", "league/factory-muffin": "For DataFactory module", "league/factory-muffin-faker": "For Faker support in DataFactory module", "phpseclib/phpseclib": "for SFTP option in FTP Module", + "stecman/symfony-console-completion": "For BASH autocompletion", "symfony/phpunit-bridge": "For phpunit-bridge support" }, "bin": [ @@ -1271,20 +1267,99 @@ "functional testing", "unit testing" ], - "time": "2017-08-10T20:28:02+00:00" + "time": "2018-05-26T22:17:46+00:00" }, { - "name": "codeception/verify", - "version": "0.3.3", + "name": "codeception/phpunit-wrapper", + "version": "6.0.9", "source": { "type": "git", - "url": "https://github.com/Codeception/Verify.git", - "reference": "5d649dda453cd814dadc4bb053060cd2c6bb4b4c" + "url": "https://github.com/Codeception/phpunit-wrapper.git", + "reference": "450f1cfc5f49539c421061e64338f5edb8baad6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Verify/zipball/5d649dda453cd814dadc4bb053060cd2c6bb4b4c", - "reference": "5d649dda453cd814dadc4bb053060cd2c6bb4b4c", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/450f1cfc5f49539c421061e64338f5edb8baad6a", + "reference": "450f1cfc5f49539c421061e64338f5edb8baad6a", + "shasum": "" + }, + "require": { + "phpunit/php-code-coverage": ">=2.2.4 <6.0", + "phpunit/phpunit": ">=4.8.28 <5.0.0 || >=5.6.3 <7.0", + "sebastian/comparator": ">1.1 <3.0", + "sebastian/diff": ">=1.4 <4.0" + }, + "replace": { + "codeception/phpunit-wrapper": "*" + }, + "require-dev": { + "codeception/specify": "*", + "vlucas/phpdotenv": "^2.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\PHPUnit\\": "src\\" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + } + ], + "description": "PHPUnit classes used by Codeception", + "time": "2018-03-31T18:50:01+00:00" + }, + { + "name": "codeception/stub", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "b2eff325d8ff0b824ff659048be7be4e5767d7d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/b2eff325d8ff0b824ff659048be7be4e5767d7d0", + "reference": "b2eff325d8ff0b824ff659048be7be4e5767d7d0", + "shasum": "" + }, + "require": { + "phpunit/phpunit-mock-objects": ">2.3 <7.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8 <8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "time": "2018-05-18T14:33:08+00:00" + }, + { + "name": "codeception/verify", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Verify.git", + "reference": "8a17273017e23a866df3fa2ad2b4182b7ce354f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Verify/zipball/8a17273017e23a866df3fa2ad2b4182b7ce354f0", + "reference": "8a17273017e23a866df3fa2ad2b4182b7ce354f0", "shasum": "" }, "require-dev": { @@ -1307,7 +1382,7 @@ } ], "description": "BDD assertion library for PHPUnit", - "time": "2017-01-09T10:58:51+00:00" + "time": "2017-07-12T16:50:18+00:00" }, { "name": "composer/composer", @@ -2157,34 +2232,39 @@ }, { "name": "facebook/webdriver", - "version": "1.5.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/facebook/php-webdriver.git", - "reference": "86b5ca2f67173c9d34340845dd690149c886a605" + "reference": "bd8c740097eb9f2fc3735250fc1912bc811a954e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/86b5ca2f67173c9d34340845dd690149c886a605", - "reference": "86b5ca2f67173c9d34340845dd690149c886a605", + "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/bd8c740097eb9f2fc3735250fc1912bc811a954e", + "reference": "bd8c740097eb9f2fc3735250fc1912bc811a954e", "shasum": "" }, "require": { "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", "ext-zip": "*", "php": "^5.6 || ~7.0", "symfony/process": "^2.8 || ^3.1 || ^4.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.0", - "guzzle/guzzle": "^3.4.1", - "php-coveralls/php-coveralls": "^1.0.2", + "jakub-onderka/php-parallel-lint": "^0.9.2", + "php-coveralls/php-coveralls": "^2.0", "php-mock/php-mock-phpunit": "^1.1", "phpunit/phpunit": "^5.7", "sebastian/environment": "^1.3.4 || ^2.0 || ^3.0", "squizlabs/php_codesniffer": "^2.6", "symfony/var-dumper": "^3.3 || ^4.0" }, + "suggest": { + "ext-SimpleXML": "For Firefox profile creation" + }, "type": "library", "extra": { "branch-alias": { @@ -2208,7 +2288,7 @@ "selenium", "webdriver" ], - "time": "2017-11-15T11:08:09+00:00" + "time": "2018-05-16T17:37:13+00:00" }, { "name": "goaop/framework", @@ -2373,16 +2453,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.3.0", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", "shasum": "" }, "require": { @@ -2392,7 +2472,7 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.0" }, "suggest": { @@ -2401,7 +2481,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -2434,7 +2514,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -3247,6 +3327,51 @@ ], "time": "2017-07-11T12:54:05+00:00" }, + { + "name": "myclabs/deep-copy", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2017-10-19T19:58:43+00:00" + }, { "name": "nb/oxymel", "version": "v0.1.0", @@ -3535,28 +3660,28 @@ }, { "name": "phpspec/prophecy", - "version": "1.7.3", + "version": "1.7.6", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf" + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", - "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, "require-dev": { "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" }, "type": "library", "extra": { @@ -3594,43 +3719,44 @@ "spy", "stub" ], - "time": "2017-11-24T13:59:53+00:00" + "time": "2018-04-18T13:57:24+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "2.2.4", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", "shasum": "" }, "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^5.6 || ^7.0", + "phpunit/php-file-iterator": "^1.3", + "phpunit/php-text-template": "^1.2", + "phpunit/php-token-stream": "^1.4.2 || ^2.0", + "sebastian/code-unit-reverse-lookup": "^1.0", + "sebastian/environment": "^1.3.2 || ^2.0", + "sebastian/version": "^1.0 || ^2.0" }, "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" + "ext-xdebug": "^2.1.4", + "phpunit/phpunit": "^5.7" }, "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" + "ext-xdebug": "^2.5.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -3656,7 +3782,7 @@ "testing", "xunit" ], - "time": "2015-10-06T15:47:00+00:00" + "time": "2017-04-02T07:44:40+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3846,40 +3972,50 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.21", + "version": "5.7.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "ea76b17bced0500a28098626b84eda12dbcf119c" + "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ea76b17bced0500a28098626b84eda12dbcf119c", - "reference": "ea76b17bced0500a28098626b84eda12dbcf119c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", + "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", "shasum": "" }, "require": { "ext-dom": "*", "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "~1.3", + "php": "^5.6 || ^7.0", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.4", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": ">=1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.1", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", + "sebastian/comparator": "^1.2.4", + "sebastian/diff": "^1.4.3", + "sebastian/environment": "^1.3.4 || ^2.0", + "sebastian/exporter": "~2.0", + "sebastian/global-state": "^1.1", + "sebastian/object-enumerator": "~2.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "^1.0.6|^2.0.1", + "symfony/yaml": "~2.1|~3.0|~4.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, + "require-dev": { + "ext-pdo": "*" }, "suggest": { + "ext-xdebug": "*", "phpunit/php-invoker": "~1.1" }, "bin": [ @@ -3888,7 +4024,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.8.x-dev" + "dev-master": "5.7.x-dev" } }, "autoload": { @@ -3914,30 +4050,33 @@ "testing", "xunit" ], - "time": "2015-12-12T07:45:58+00:00" + "time": "2018-02-01T05:50:59+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.8", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", + "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" + "php": "^5.6 || ^7.0", + "phpunit/php-text-template": "^1.2", + "sebastian/exporter": "^1.2 || ^2.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^5.4" }, "suggest": { "ext-soap": "*" @@ -3945,7 +4084,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "3.2.x-dev" } }, "autoload": { @@ -3970,7 +4109,7 @@ "mock", "xunit" ], - "time": "2015-10-02T06:51:40+00:00" + "time": "2017-06-30T09:13:00+00:00" }, { "name": "psr/container", @@ -4165,6 +4304,51 @@ ], "time": "2016-10-13T00:11:37+00:00" }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, { "name": "sebastian/comparator", "version": "1.2.4", @@ -4283,28 +4467,28 @@ }, { "name": "sebastian/environment", - "version": "1.3.8", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", - "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.6 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.0" + "phpunit/phpunit": "^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -4329,25 +4513,25 @@ "environment", "hhvm" ], - "time": "2016-08-18T05:49:44+00:00" + "time": "2016-11-26T07:53:53+00:00" }, { "name": "sebastian/exporter", - "version": "1.2.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", "shasum": "" }, "require": { "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" + "sebastian/recursion-context": "~2.0" }, "require-dev": { "ext-mbstring": "*", @@ -4356,7 +4540,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -4396,7 +4580,7 @@ "export", "exporter" ], - "time": "2016-06-17T09:04:28+00:00" + "time": "2016-11-19T08:54:04+00:00" }, { "name": "sebastian/global-state", @@ -4450,17 +4634,63 @@ "time": "2015-10-12T03:26:01+00:00" }, { - "name": "sebastian/recursion-context", - "version": "1.0.5", + "name": "sebastian/object-enumerator", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-02-18T15:18:39+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", "shasum": "" }, "require": { @@ -4472,7 +4702,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -4500,23 +4730,73 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-10-03T07:41:43+00:00" + "time": "2016-11-19T07:33:16+00:00" }, { - "name": "sebastian/version", - "version": "1.0.6", + "name": "sebastian/resource-operations", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", "shasum": "" }, + "require": { + "php": ">=5.6.0" + }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28T20:34:47+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -4535,7 +4815,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21T13:59:46+00:00" + "time": "2016-10-03T07:35:21+00:00" }, { "name": "seld/cli-prompt", @@ -4756,63 +5036,18 @@ ], "time": "2017-05-22T02:43:20+00:00" }, - { - "name": "stecman/symfony-console-completion", - "version": "0.7.0", - "source": { - "type": "git", - "url": "https://github.com/stecman/symfony-console-completion.git", - "reference": "5461d43e53092b3d3b9dbd9d999f2054730f4bbb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/stecman/symfony-console-completion/zipball/5461d43e53092b3d3b9dbd9d999f2054730f4bbb", - "reference": "5461d43e53092b3d3b9dbd9d999f2054730f4bbb", - "shasum": "" - }, - "require": { - "php": ">=5.3.2", - "symfony/console": "~2.3 || ~3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Stecman\\Component\\Symfony\\Console\\BashCompletion\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Stephen Holdaway", - "email": "stephen@stecman.co.nz" - } - ], - "description": "Automatic BASH completion for Symfony Console Component based applications.", - "time": "2016-02-24T05:08:54+00:00" - }, { "name": "symfony/browser-kit", - "version": "v3.4.1", + "version": "v3.4.11", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "179522b5f0b5e6d00bb60f38a4d6b29962e4b61b" + "reference": "840bb6f0d5b3701fd768b68adf7193c2d0f98f79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/179522b5f0b5e6d00bb60f38a4d6b29962e4b61b", - "reference": "179522b5f0b5e6d00bb60f38a4d6b29962e4b61b", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/840bb6f0d5b3701fd768b68adf7193c2d0f98f79", + "reference": "840bb6f0d5b3701fd768b68adf7193c2d0f98f79", "shasum": "" }, "require": { @@ -4856,7 +5091,7 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2017-11-07T14:20:24+00:00" + "time": "2018-03-19T22:32:39+00:00" }, { "name": "symfony/config", @@ -4922,16 +5157,16 @@ }, { "name": "symfony/css-selector", - "version": "v3.4.1", + "version": "v3.4.11", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "7134b93e90ea7e7881fcb2da006d21b4c5f31908" + "reference": "d2ce52290b648ae33b5301d09bc14ee378612914" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/7134b93e90ea7e7881fcb2da006d21b4c5f31908", - "reference": "7134b93e90ea7e7881fcb2da006d21b4c5f31908", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d2ce52290b648ae33b5301d09bc14ee378612914", + "reference": "d2ce52290b648ae33b5301d09bc14ee378612914", "shasum": "" }, "require": { @@ -4971,7 +5206,7 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2017-11-05T16:10:10+00:00" + "time": "2018-05-16T12:49:49+00:00" }, { "name": "symfony/dependency-injection", @@ -5045,20 +5280,21 @@ }, { "name": "symfony/dom-crawler", - "version": "v3.4.1", + "version": "v3.4.11", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "7bf68716e400997a291ad42c9f9fe7972e6656d2" + "reference": "201b210fafcdd193c1e45b2994bf7133fb6263e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7bf68716e400997a291ad42c9f9fe7972e6656d2", - "reference": "7bf68716e400997a291ad42c9f9fe7972e6656d2", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/201b210fafcdd193c1e45b2994bf7133fb6263e8", + "reference": "201b210fafcdd193c1e45b2994bf7133fb6263e8", "shasum": "" }, "require": { "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { @@ -5097,7 +5333,7 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2017-11-05T16:10:10+00:00" + "time": "2018-05-01T22:53:27+00:00" }, { "name": "symfony/event-dispatcher", @@ -5210,16 +5446,16 @@ }, { "name": "symfony/finder", - "version": "v3.4.1", + "version": "v3.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "dac8d7db537bac7ad8143eb11360a8c2231f251a" + "reference": "472a92f3df8b247b49ae364275fb32943b9656c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/dac8d7db537bac7ad8143eb11360a8c2231f251a", - "reference": "dac8d7db537bac7ad8143eb11360a8c2231f251a", + "url": "https://api.github.com/repos/symfony/finder/zipball/472a92f3df8b247b49ae364275fb32943b9656c6", + "reference": "472a92f3df8b247b49ae364275fb32943b9656c6", "shasum": "" }, "require": { @@ -5255,7 +5491,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2017-11-05T16:10:10+00:00" + "time": "2018-05-16T08:49:21+00:00" }, { "name": "symfony/form", @@ -5460,6 +5696,61 @@ ], "time": "2017-11-05T15:25:56+00:00" }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-04-30T19:57:29+00:00" + }, { "name": "symfony/polyfill-intl-icu", "version": "v1.6.0", @@ -5520,16 +5811,16 @@ }, { "name": "symfony/process", - "version": "v2.8.32", + "version": "v2.8.41", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d25449e031f600807949aab7cadbf267712f4eee" + "reference": "713952f2ccbcc8342ecdbe1cb313d3e2da8aad28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d25449e031f600807949aab7cadbf267712f4eee", - "reference": "d25449e031f600807949aab7cadbf267712f4eee", + "url": "https://api.github.com/repos/symfony/process/zipball/713952f2ccbcc8342ecdbe1cb313d3e2da8aad28", + "reference": "713952f2ccbcc8342ecdbe1cb313d3e2da8aad28", "shasum": "" }, "require": { @@ -5565,7 +5856,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2017-11-05T15:25:56+00:00" + "time": "2018-05-15T21:17:45+00:00" }, { "name": "symfony/property-access", @@ -5785,16 +6076,16 @@ }, { "name": "symfony/yaml", - "version": "v3.3.14", + "version": "v3.3.17", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "36353762fdca3a0ecdce4640764efc885df979f6" + "reference": "af615970e265543a26ee712c958404eb9b7ac93d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/36353762fdca3a0ecdce4640764efc885df979f6", - "reference": "36353762fdca3a0ecdce4640764efc885df979f6", + "url": "https://api.github.com/repos/symfony/yaml/zipball/af615970e265543a26ee712c958404eb9b7ac93d", + "reference": "af615970e265543a26ee712c958404eb9b7ac93d", "shasum": "" }, "require": { @@ -5836,7 +6127,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2017-12-04T14:51:35+00:00" + "time": "2018-01-20T15:04:53+00:00" }, { "name": "twig/extensions", @@ -5995,16 +6286,16 @@ }, { "name": "webmozart/assert", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", "shasum": "" }, "require": { @@ -6041,7 +6332,7 @@ "check", "validate" ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2018-01-29T19:49:41+00:00" }, { "name": "wimg/php-compatibility", @@ -7657,5 +7948,8 @@ "platform": { "php": ">=5.3.3" }, - "platform-dev": [] + "platform-dev": [], + "platform-overrides": { + "php": "5.6.30" + } } From f1462b5f3ef08edd3ce36562f4ae4217ad990a3c Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Thu, 14 Jun 2018 10:13:10 +0200 Subject: [PATCH 83/89] Update consolidation/robo, lucatume/wp-browser --- composer.json | 4 +- composer.lock | 955 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 645 insertions(+), 314 deletions(-) diff --git a/composer.json b/composer.json index 2528fd4e6c..db4029c922 100644 --- a/composer.json +++ b/composer.json @@ -24,9 +24,9 @@ "codeception/aspect-mock": "2.0.1", "codeception/codeception": "2.4.2", "codeception/verify": "^0.4.0", - "consolidation/robo": "^1.0.5", + "consolidation/robo": "^1.3.0", "henrikbjorn/lurker": "^1.2", - "lucatume/wp-browser": "1.21.20", + "lucatume/wp-browser": "1.21.23", "phpunit/phpunit": "5.7.27", "vlucas/phpdotenv": "^2.4.0", "umpirsky/twig-gettext-extractor": "1.1.*", diff --git a/composer.lock b/composer.lock index da2a8cc97d..cbeb7a8979 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "22288fc9ffd0ca3cc6c4a3e90a36fd74", + "content-hash": "3568eadc55d255e9be1c63f0bf38cf7b", "packages": [ { "name": "cerdic/css-tidy", @@ -47,16 +47,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288" + "reference": "d2c0a83b7533d6912e8d516756ebd34f893e9169" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288", - "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d2c0a83b7533d6912e8d516756ebd34f893e9169", + "reference": "d2c0a83b7533d6912e8d516756ebd34f893e9169", "shasum": "" }, "require": { @@ -65,7 +65,7 @@ "php": "^5.3.2 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5", "psr/log": "^1.0", "symfony/process": "^2.5 || ^3.0 || ^4.0" }, @@ -99,7 +99,7 @@ "ssl", "tls" ], - "time": "2017-11-29T09:37:33+00:00" + "time": "2018-03-29T19:57:20+00:00" }, { "name": "j4mie/idiorm", @@ -984,16 +984,16 @@ "packages-dev": [ { "name": "antecedent/patchwork", - "version": "2.1.6", + "version": "2.1.8", "source": { "type": "git", "url": "https://github.com/antecedent/patchwork.git", - "reference": "91608c0c0b3b0d6b04e5bd11406ae0d5d5f7c26e" + "reference": "3bb81ace3914c220aa273d1c0603d5e1b454c0d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antecedent/patchwork/zipball/91608c0c0b3b0d6b04e5bd11406ae0d5d5f7c26e", - "reference": "91608c0c0b3b0d6b04e5bd11406ae0d5d5f7c26e", + "url": "https://api.github.com/repos/antecedent/patchwork/zipball/3bb81ace3914c220aa273d1c0603d5e1b454c0d7", + "reference": "3bb81ace3914c220aa273d1c0603d5e1b454c0d7", "shasum": "" }, "require": { @@ -1021,7 +1021,7 @@ "runkit", "testing" ], - "time": "2017-11-05T10:37:19+00:00" + "time": "2018-02-19T18:52:50+00:00" }, { "name": "bacon/bacon-string-utils", @@ -1386,35 +1386,38 @@ }, { "name": "composer/composer", - "version": "1.5.5", + "version": "1.6.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "aab6229c9a4b6731f23b36107c39f4007c290b50" + "reference": "b184a92419cc9a9c4c6a09db555a94d441cb11c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/aab6229c9a4b6731f23b36107c39f4007c290b50", - "reference": "aab6229c9a4b6731f23b36107c39f4007c290b50", + "url": "https://api.github.com/repos/composer/composer/zipball/b184a92419cc9a9c4c6a09db555a94d441cb11c9", + "reference": "b184a92419cc9a9c4c6a09db555a94d441cb11c9", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", "composer/semver": "^1.0", - "composer/spdx-licenses": "^1.0", + "composer/spdx-licenses": "^1.2", "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", "php": "^5.3.2 || ^7.0", "psr/log": "^1.0", "seld/cli-prompt": "^1.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0", - "symfony/filesystem": "^2.7 || ^3.0", - "symfony/finder": "^2.7 || ^3.0", - "symfony/process": "^2.7 || ^3.0" + "symfony/console": "^2.7 || ^3.0 || ^4.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0", + "symfony/finder": "^2.7 || ^3.0 || ^4.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0" + }, + "conflict": { + "symfony/console": "2.8.38" }, "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit": "^4.8.35 || ^5.7", "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" }, "suggest": { @@ -1428,7 +1431,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -1459,7 +1462,7 @@ "dependency", "package" ], - "time": "2017-12-01T13:42:57+00:00" + "time": "2018-05-04T09:44:59+00:00" }, { "name": "composer/semver", @@ -1525,23 +1528,23 @@ }, { "name": "composer/spdx-licenses", - "version": "1.1.6", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c" + "reference": "cb17687e9f936acd7e7245ad3890f953770dec1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/2603a0d7ddc00a015deb576fa5297ca43dee6b1c", - "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/cb17687e9f936acd7e7245ad3890f953770dec1b", + "reference": "cb17687e9f936acd7e7245ad3890f953770dec1b", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5", "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" }, "type": "library", @@ -1582,20 +1585,20 @@ "spdx", "validator" ], - "time": "2017-04-03T19:08:52+00:00" + "time": "2018-04-30T10:33:04+00:00" }, { "name": "consolidation/annotated-command", - "version": "2.8.2", + "version": "2.8.4", "source": { "type": "git", "url": "https://github.com/consolidation/annotated-command.git", - "reference": "e97c38717eae23a2bafcf3f09438290eee6ebeb4" + "reference": "651541a0b68318a2a202bda558a676e5ad92223c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/e97c38717eae23a2bafcf3f09438290eee6ebeb4", - "reference": "e97c38717eae23a2bafcf3f09438290eee6ebeb4", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/651541a0b68318a2a202bda558a676e5ad92223c", + "reference": "651541a0b68318a2a202bda558a676e5ad92223c", "shasum": "" }, "require": { @@ -1607,8 +1610,9 @@ "symfony/finder": "^2.5|^3|^4" }, "require-dev": { - "phpunit/phpunit": "^4.8", - "satooshi/php-coveralls": "^1.0.2 | dev-master", + "g1a/composer-test-scenarios": "^2", + "phpunit/phpunit": "^6", + "satooshi/php-coveralls": "^2", "squizlabs/php_codesniffer": "^2.7" }, "type": "library", @@ -1633,32 +1637,37 @@ } ], "description": "Initialize Symfony Console commands from annotated command class methods.", - "time": "2017-11-29T16:23:23+00:00" + "time": "2018-05-25T18:04:25+00:00" }, { "name": "consolidation/config", - "version": "1.0.7", + "version": "1.0.11", "source": { "type": "git", "url": "https://github.com/consolidation/config.git", - "reference": "b59a3b9ea750c21397f26a68fd2e04d9580af42e" + "reference": "ede41d946078e97e7a9513aadc3352f1c26817af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/config/zipball/b59a3b9ea750c21397f26a68fd2e04d9580af42e", - "reference": "b59a3b9ea750c21397f26a68fd2e04d9580af42e", + "url": "https://api.github.com/repos/consolidation/config/zipball/ede41d946078e97e7a9513aadc3352f1c26817af", + "reference": "ede41d946078e97e7a9513aadc3352f1c26817af", "shasum": "" }, "require": { "dflydev/dot-access-data": "^1.1.0", - "grasmash/yaml-expander": "^1.1", + "grasmash/expander": "^1", "php": ">=5.4.0" }, "require-dev": { + "g1a/composer-test-scenarios": "^1", "phpunit/phpunit": "^4", "satooshi/php-coveralls": "^1.0", "squizlabs/php_codesniffer": "2.*", - "symfony/console": "^2.5|^3" + "symfony/console": "^2.5|^3|^4", + "symfony/yaml": "^2.8.11|^3|^4" + }, + "suggest": { + "symfony/yaml": "Required to use Consolidation\\Config\\Loader\\YamlConfigLoader" }, "type": "library", "extra": { @@ -1682,20 +1691,20 @@ } ], "description": "Provide configuration services for a commandline tool.", - "time": "2017-10-25T05:50:10+00:00" + "time": "2018-05-27T01:17:02+00:00" }, { "name": "consolidation/log", - "version": "1.0.5", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/consolidation/log.git", - "reference": "dbc7c535f319a4a2d5a5077738f8eb7c10df8821" + "reference": "dfd8189a771fe047bf3cd669111b2de5f1c79395" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/log/zipball/dbc7c535f319a4a2d5a5077738f8eb7c10df8821", - "reference": "dbc7c535f319a4a2d5a5077738f8eb7c10df8821", + "url": "https://api.github.com/repos/consolidation/log/zipball/dfd8189a771fe047bf3cd669111b2de5f1c79395", + "reference": "dfd8189a771fe047bf3cd669111b2de5f1c79395", "shasum": "" }, "require": { @@ -1704,8 +1713,9 @@ "symfony/console": "^2.8|^3|^4" }, "require-dev": { + "g1a/composer-test-scenarios": "^1", "phpunit/phpunit": "4.*", - "satooshi/php-coveralls": "dev-master", + "satooshi/php-coveralls": "^2", "squizlabs/php_codesniffer": "2.*" }, "type": "library", @@ -1730,20 +1740,20 @@ } ], "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", - "time": "2017-11-29T01:44:16+00:00" + "time": "2018-05-25T18:14:39+00:00" }, { "name": "consolidation/output-formatters", - "version": "3.1.13", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/consolidation/output-formatters.git", - "reference": "3188461e965b32148c8fb85261833b2b72d34b8c" + "reference": "d78ef59aea19d3e2e5a23f90a055155ee78a0ad5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/3188461e965b32148c8fb85261833b2b72d34b8c", - "reference": "3188461e965b32148c8fb85261833b2b72d34b8c", + "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/d78ef59aea19d3e2e5a23f90a055155ee78a0ad5", + "reference": "d78ef59aea19d3e2e5a23f90a055155ee78a0ad5", "shasum": "" }, "require": { @@ -1752,11 +1762,17 @@ "symfony/finder": "^2.5|^3|^4" }, "require-dev": { - "phpunit/phpunit": "^4.8", - "satooshi/php-coveralls": "^1.0.2 | dev-master", + "g1a/composer-test-scenarios": "^2", + "phpunit/phpunit": "^5.7.27", + "satooshi/php-coveralls": "^2", "squizlabs/php_codesniffer": "^2.7", + "symfony/console": "3.2.3", + "symfony/var-dumper": "^2.8|^3|^4", "victorjonsson/markdowndocs": "^1.3" }, + "suggest": { + "symfony/var-dumper": "For using the var_dump formatter" + }, "type": "library", "extra": { "branch-alias": { @@ -1779,48 +1795,52 @@ } ], "description": "Format text by applying transformations provided by plug-in formatters.", - "time": "2017-11-29T15:25:38+00:00" + "time": "2018-05-25T18:02:34+00:00" }, { "name": "consolidation/robo", - "version": "1.1.5", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/consolidation/Robo.git", - "reference": "aea695cebff81d54ed6daf14894738d5dac1c15c" + "reference": "ac563abfadf7cb7314b4e152f2b5033a6c255f6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/Robo/zipball/aea695cebff81d54ed6daf14894738d5dac1c15c", - "reference": "aea695cebff81d54ed6daf14894738d5dac1c15c", + "url": "https://api.github.com/repos/consolidation/Robo/zipball/ac563abfadf7cb7314b4e152f2b5033a6c255f6f", + "reference": "ac563abfadf7cb7314b4e152f2b5033a6c255f6f", "shasum": "" }, "require": { - "consolidation/annotated-command": "^2.8.1", - "consolidation/config": "^1.0.1", + "consolidation/annotated-command": "^2.8.2", + "consolidation/config": "^1.0.10", "consolidation/log": "~1", - "consolidation/output-formatters": "^3.1.5", + "consolidation/output-formatters": "^3.1.13", + "grasmash/yaml-expander": "^1.3", "league/container": "^2.2", "php": ">=5.5.0", - "symfony/console": "~2.8|~3.0", - "symfony/event-dispatcher": "~2.5|~3.0", - "symfony/filesystem": "~2.5|~3.0", - "symfony/finder": "~2.5|~3.0", - "symfony/process": "~2.5|~3.0" + "symfony/console": "^2.8|^3|^4", + "symfony/event-dispatcher": "^2.5|^3|^4", + "symfony/filesystem": "^2.5|^3|^4", + "symfony/finder": "^2.5|^3|^4", + "symfony/process": "^2.5|^3|^4" }, "replace": { "codegyre/robo": "< 1.0" }, "require-dev": { - "codeception/aspect-mock": "~1", - "codeception/base": "^2.2.6", + "codeception/aspect-mock": "^1|^2.1.1", + "codeception/base": "^2.3.7", "codeception/verify": "^0.3.2", - "henrikbjorn/lurker": "~1", + "g1a/composer-test-scenarios": "^2", + "goaop/framework": "~2.1.2", + "goaop/parser-reflection": "^1.1.0", "natxet/cssmin": "3.0.4", + "nikic/php-parser": "^3.1.5", "patchwork/jsqueeze": "~2", "pear/archive_tar": "^1.4.2", "phpunit/php-code-coverage": "~2|~4", - "satooshi/php-coveralls": "~1", + "satooshi/php-coveralls": "^2", "squizlabs/php_codesniffer": "^2.8" }, "suggest": { @@ -1840,9 +1860,6 @@ } }, "autoload": { - "classmap": [ - "scripts/composer/ScriptHandler.php" - ], "psr-4": { "Robo\\": "src" } @@ -1858,7 +1875,7 @@ } ], "description": "Modern task runner", - "time": "2017-10-25T20:41:21+00:00" + "time": "2018-05-27T01:42:53+00:00" }, { "name": "container-interop/container-interop", @@ -2405,27 +2422,75 @@ "time": "2017-09-03T14:59:13+00:00" }, { - "name": "grasmash/yaml-expander", - "version": "1.2.0", + "name": "grasmash/expander", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/grasmash/yaml-expander.git", - "reference": "9ec59ccc7a630eb2637639e8214e70d27675456b" + "url": "https://github.com/grasmash/expander.git", + "reference": "95d6037344a4be1dd5f8e0b0b2571a28c397578f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/grasmash/yaml-expander/zipball/9ec59ccc7a630eb2637639e8214e70d27675456b", - "reference": "9ec59ccc7a630eb2637639e8214e70d27675456b", + "url": "https://api.github.com/repos/grasmash/expander/zipball/95d6037344a4be1dd5f8e0b0b2571a28c397578f", + "reference": "95d6037344a4be1dd5f8e0b0b2571a28c397578f", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^1.1.0", + "php": ">=5.4" + }, + "require-dev": { + "greg-1-anderson/composer-test-scenarios": "^1", + "phpunit/phpunit": "^4|^5.5.4", + "satooshi/php-coveralls": "^1.0.2|dev-master", + "squizlabs/php_codesniffer": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Grasmash\\Expander\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Grasmick" + } + ], + "description": "Expands internal property references in PHP arrays file.", + "time": "2017-12-21T22:14:55+00:00" + }, + { + "name": "grasmash/yaml-expander", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/grasmash/yaml-expander.git", + "reference": "3f0f6001ae707a24f4d9733958d77d92bf9693b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grasmash/yaml-expander/zipball/3f0f6001ae707a24f4d9733958d77d92bf9693b1", + "reference": "3f0f6001ae707a24f4d9733958d77d92bf9693b1", "shasum": "" }, "require": { "dflydev/dot-access-data": "^1.1.0", "php": ">=5.4", - "symfony/yaml": "^2.8.11|^3" + "symfony/yaml": "^2.8.11|^3|^4" }, "require-dev": { + "greg-1-anderson/composer-test-scenarios": "^1", "phpunit/phpunit": "^4.8|^5.5.4", - "satooshi/php-coveralls": "^1.0", + "satooshi/php-coveralls": "^1.0.2|dev-master", "squizlabs/php_codesniffer": "^2.7" }, "type": "library", @@ -2449,7 +2514,7 @@ } ], "description": "Expands internal property references in a yaml file.", - "time": "2017-09-26T16:57:45+00:00" + "time": "2017-12-16T16:06:03+00:00" }, { "name": "guzzlehttp/guzzle", @@ -2634,16 +2699,16 @@ }, { "name": "hautelook/phpass", - "version": "0.3.3", + "version": "0.3.5", "source": { "type": "git", "url": "https://github.com/hautelook/phpass.git", - "reference": "9590c12bf7c92f67f646d7bf2cf6384e7292cc41" + "reference": "b4cbd9b67ed3ef5672ec79d8e0c46d24bd844abd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hautelook/phpass/zipball/9590c12bf7c92f67f646d7bf2cf6384e7292cc41", - "reference": "9590c12bf7c92f67f646d7bf2cf6384e7292cc41", + "url": "https://api.github.com/repos/hautelook/phpass/zipball/b4cbd9b67ed3ef5672ec79d8e0c46d24bd844abd", + "reference": "b4cbd9b67ed3ef5672ec79d8e0c46d24bd844abd", "shasum": "" }, "require": { @@ -2891,16 +2956,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.6", + "version": "5.2.7", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "d283e11b6e14c6f4664cf080415c4341293e5bbd" + "reference": "8560d4314577199ba51bf2032f02cd1315587c23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/d283e11b6e14c6f4664cf080415c4341293e5bbd", - "reference": "d283e11b6e14c6f4664cf080415c4341293e5bbd", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/8560d4314577199ba51bf2032f02cd1315587c23", + "reference": "8560d4314577199ba51bf2032f02cd1315587c23", "shasum": "" }, "require": { @@ -2909,7 +2974,7 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^2.1", "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.22" + "phpunit/phpunit": "^4.8.35" }, "bin": [ "bin/validate-json" @@ -2953,7 +3018,7 @@ "json", "schema" ], - "time": "2017-10-21T13:15:38+00:00" + "time": "2018-02-14T22:26:30+00:00" }, { "name": "kint-php/kint", @@ -3122,16 +3187,16 @@ }, { "name": "lucatume/wp-browser", - "version": "1.21.20", + "version": "1.21.23", "source": { "type": "git", "url": "https://github.com/lucatume/wp-browser.git", - "reference": "74e4cf6e847cccc54cf61ce5f9c758d73554b64f" + "reference": "bd33f4830ea0d2d9c3138dc057175f6c54aa6f3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lucatume/wp-browser/zipball/74e4cf6e847cccc54cf61ce5f9c758d73554b64f", - "reference": "74e4cf6e847cccc54cf61ce5f9c758d73554b64f", + "url": "https://api.github.com/repos/lucatume/wp-browser/zipball/bd33f4830ea0d2d9c3138dc057175f6c54aa6f3e", + "reference": "bd33f4830ea0d2d9c3138dc057175f6c54aa6f3e", "shasum": "" }, "require": { @@ -3180,7 +3245,7 @@ "codeception", "wordpress" ], - "time": "2017-10-10T08:59:17+00:00" + "time": "2017-12-13T16:20:09+00:00" }, { "name": "lucatume/wp-browser-commons", @@ -3229,20 +3294,20 @@ }, { "name": "mikemclin/laravel-wp-password", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/mikemclin/laravel-wp-password.git", - "reference": "3460f1e38dea501c5d0cbe9bff67d043f6821724" + "reference": "84ff1113ff6866cdb0350c176dc3c843383e4819" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mikemclin/laravel-wp-password/zipball/3460f1e38dea501c5d0cbe9bff67d043f6821724", - "reference": "3460f1e38dea501c5d0cbe9bff67d043f6821724", + "url": "https://api.github.com/repos/mikemclin/laravel-wp-password/zipball/84ff1113ff6866cdb0350c176dc3c843383e4819", + "reference": "84ff1113ff6866cdb0350c176dc3c843383e4819", "shasum": "" }, "require": { - "hautelook/phpass": "0.3.3", + "hautelook/phpass": "0.3.*", "illuminate/support": ">=4.0.0", "php": ">=5.3.0" }, @@ -3255,6 +3320,16 @@ "satooshi/php-coveralls": "dev-master" }, "type": "laravel-package", + "extra": { + "laravel": { + "providers": [ + "MikeMcLin\\WpPassword\\WpPasswordProvider" + ], + "aliases": { + "WpPassword": "MikeMcLin\\WpPassword\\Facades\\WpPassword" + } + } + }, "autoload": { "psr-4": { "MikeMcLin\\WpPassword\\": "src/" @@ -3279,7 +3354,7 @@ "password", "wordpress" ], - "time": "2015-02-12T03:09:57+00:00" + "time": "2018-01-11T14:12:02+00:00" }, { "name": "mustache/mustache", @@ -3466,16 +3541,16 @@ }, { "name": "paragonie/random_compat", - "version": "v2.0.11", + "version": "v2.0.15", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" + "reference": "10bcb46e8f3d365170f6de9d05245aa066b81f09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/10bcb46e8f3d365170f6de9d05245aa066b81f09", + "reference": "10bcb46e8f3d365170f6de9d05245aa066b81f09", "shasum": "" }, "require": { @@ -3507,10 +3582,11 @@ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ "csprng", + "polyfill", "pseudorandom", "random" ], - "time": "2017-09-27T21:40:39+00:00" + "time": "2018-06-08T15:26:40+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -4867,23 +4943,23 @@ }, { "name": "seld/jsonlint", - "version": "1.6.2", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "7a30649c67ee0d19faacfd9fa2cfb6cc032d9b19" + "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/7a30649c67ee0d19faacfd9fa2cfb6cc032d9b19", - "reference": "7a30649c67ee0d19faacfd9fa2cfb6cc032d9b19", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/d15f59a67ff805a44c50ea0516d2341740f81a38", + "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38", "shasum": "" }, "require": { "php": "^5.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "bin": [ "bin/jsonlint" @@ -4912,7 +4988,7 @@ "parser", "validator" ], - "time": "2017-11-30T15:34:22+00:00" + "time": "2018-01-24T12:46:19+00:00" }, { "name": "seld/phar-utils", @@ -5095,21 +5171,22 @@ }, { "name": "symfony/config", - "version": "v3.4.1", + "version": "v3.4.11", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "1de51a6c76359897ab32c309934b93d036bccb60" + "reference": "73e055cf2e6467715f187724a0347ea32079967c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/1de51a6c76359897ab32c309934b93d036bccb60", - "reference": "1de51a6c76359897ab32c309934b93d036bccb60", + "url": "https://api.github.com/repos/symfony/config/zipball/73e055cf2e6467715f187724a0347ea32079967c", + "reference": "73e055cf2e6467715f187724a0347ea32079967c", "shasum": "" }, "require": { "php": "^5.5.9|>=7.0.8", - "symfony/filesystem": "~2.8|~3.0|~4.0" + "symfony/filesystem": "~2.8|~3.0|~4.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/dependency-injection": "<3.3", @@ -5117,6 +5194,7 @@ }, "require-dev": { "symfony/dependency-injection": "~3.3|~4.0", + "symfony/event-dispatcher": "~3.3|~4.0", "symfony/finder": "~3.3|~4.0", "symfony/yaml": "~3.0|~4.0" }, @@ -5153,7 +5231,7 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2017-11-19T20:09:36+00:00" + "time": "2018-05-14T16:49:53+00:00" }, { "name": "symfony/css-selector", @@ -5210,16 +5288,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v3.3.14", + "version": "v3.3.17", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "785114bc1a1421aeedf5c7b105f5b62a71e85b98" + "reference": "54243abc4e1a1a15e274e391bd6f7090b44711f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/785114bc1a1421aeedf5c7b105f5b62a71e85b98", - "reference": "785114bc1a1421aeedf5c7b105f5b62a71e85b98", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/54243abc4e1a1a15e274e391bd6f7090b44711f1", + "reference": "54243abc4e1a1a15e274e391bd6f7090b44711f1", "shasum": "" }, "require": { @@ -5227,7 +5305,7 @@ "psr/container": "^1.0" }, "conflict": { - "symfony/config": "<3.3.1", + "symfony/config": "<3.3.7", "symfony/finder": "<3.3", "symfony/yaml": "<3.3" }, @@ -5276,7 +5354,7 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2017-12-04T15:44:12+00:00" + "time": "2018-01-29T09:02:23+00:00" }, { "name": "symfony/dom-crawler", @@ -5397,20 +5475,21 @@ }, { "name": "symfony/filesystem", - "version": "v2.8.32", + "version": "v2.8.41", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "15ceb6736a9eebd0d99f9e05a62296ab6ce1cf2b" + "reference": "1ed4b265550ec43d2ceaa0e9e57b0bc4eeb1b541" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/15ceb6736a9eebd0d99f9e05a62296ab6ce1cf2b", - "reference": "15ceb6736a9eebd0d99f9e05a62296ab6ce1cf2b", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/1ed4b265550ec43d2ceaa0e9e57b0bc4eeb1b541", + "reference": "1ed4b265550ec43d2ceaa0e9e57b0bc4eeb1b541", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.3.9", + "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { @@ -5442,7 +5521,7 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2017-11-19T18:39:05+00:00" + "time": "2018-05-15T21:17:45+00:00" }, { "name": "symfony/finder", @@ -6421,16 +6500,16 @@ }, { "name": "wp-cli/cache-command", - "version": "v1.0.5", + "version": "v1.0.6", "source": { "type": "git", "url": "https://github.com/wp-cli/cache-command.git", - "reference": "9c3d686f103244de4dd51b4c92177983cdc0a4ae" + "reference": "d82cba9effa198f17847dce5771c8fb20c443ffa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/9c3d686f103244de4dd51b4c92177983cdc0a4ae", - "reference": "9c3d686f103244de4dd51b4c92177983cdc0a4ae", + "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/d82cba9effa198f17847dce5771c8fb20c443ffa", + "reference": "d82cba9effa198f17847dce5771c8fb20c443ffa", "shasum": "" }, "require-dev": { @@ -6480,27 +6559,27 @@ "homepage": "https://runcommand.io" } ], - "description": "Manage object and transient caches.", + "description": "Manages object and transient caches.", "homepage": "https://github.com/wp-cli/cache-command", - "time": "2017-11-20T21:06:51+00:00" + "time": "2017-12-14T19:21:19+00:00" }, { "name": "wp-cli/checksum-command", - "version": "v1.0.4", + "version": "v1.0.9", "source": { "type": "git", "url": "https://github.com/wp-cli/checksum-command.git", - "reference": "64a5b2b66aff071d3944b6ad9767adc324bc999f" + "reference": "89a319440651f2867f282339c2223cfe5e9cc3fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/64a5b2b66aff071d3944b6ad9767adc324bc999f", - "reference": "64a5b2b66aff071d3944b6ad9767adc324bc999f", + "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/89a319440651f2867f282339c2223cfe5e9cc3fb", + "reference": "89a319440651f2867f282339c2223cfe5e9cc3fb", "shasum": "" }, "require-dev": { "behat/behat": "~2.5", - "wp-cli/wp-cli": "*" + "wp-cli/wp-cli": "^1.5" }, "type": "wp-cli-package", "extra": { @@ -6509,7 +6588,8 @@ }, "bundled": true, "commands": [ - "checksum core" + "core verify-checksums", + "plugin verify-checksums" ] }, "autoload": { @@ -6533,22 +6613,25 @@ ], "description": "Verifies file integrity by comparing to published checksums.", "homepage": "https://github.com/wp-cli/checksum-command", - "time": "2017-11-20T22:00:52+00:00" + "time": "2018-04-20T07:47:27+00:00" }, { "name": "wp-cli/config-command", - "version": "v1.1.6", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/wp-cli/config-command.git", - "reference": "075b04a9468588377b6e8b14666aa65f952cec14" + "reference": "7bec9b4685b4022ab511630422dd6acccadfca9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/config-command/zipball/075b04a9468588377b6e8b14666aa65f952cec14", - "reference": "075b04a9468588377b6e8b14666aa65f952cec14", + "url": "https://api.github.com/repos/wp-cli/config-command/zipball/7bec9b4685b4022ab511630422dd6acccadfca9b", + "reference": "7bec9b4685b4022ab511630422dd6acccadfca9b", "shasum": "" }, + "require": { + "wp-cli/wp-config-transformer": "^1.2.1" + }, "require-dev": { "behat/behat": "~2.5", "wp-cli/wp-cli": "*" @@ -6561,9 +6644,14 @@ "bundled": true, "commands": [ "config", + "config edit", + "config delete", "config create", "config get", - "config path" + "config has", + "config list", + "config path", + "config set" ] }, "autoload": { @@ -6583,24 +6671,29 @@ "name": "Daniel Bachhuber", "email": "daniel@runcommand.io", "homepage": "https://runcommand.io" + }, + { + "name": "Alain Schlesser", + "email": "alain.schlesser@gmail.com", + "homepage": "https://www.alainschlesser.com" } ], - "description": "Manage the wp-config.php file.", + "description": "Generates and reads the wp-config.php file.", "homepage": "https://github.com/wp-cli/config-command", - "time": "2017-11-20T22:02:20+00:00" + "time": "2018-04-20T08:03:51+00:00" }, { "name": "wp-cli/core-command", - "version": "v1.0.6", + "version": "v1.0.9", "source": { "type": "git", "url": "https://github.com/wp-cli/core-command.git", - "reference": "6662f259f949ab69adb81ff8a1904cf00cd38135" + "reference": "0e825668d2c060c40ec1d7debbee94bc08eec9b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/core-command/zipball/6662f259f949ab69adb81ff8a1904cf00cd38135", - "reference": "6662f259f949ab69adb81ff8a1904cf00cd38135", + "url": "https://api.github.com/repos/wp-cli/core-command/zipball/0e825668d2c060c40ec1d7debbee94bc08eec9b3", + "reference": "0e825668d2c060c40ec1d7debbee94bc08eec9b3", "shasum": "" }, "require-dev": { @@ -6614,6 +6707,7 @@ }, "bundled": true, "commands": [ + "core", "core check-update", "core download", "core install", @@ -6644,22 +6738,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Download, install, update and manage a WordPress install.", + "description": "Downloads, installs, updates, and manages a WordPress installation.", "homepage": "https://github.com/wp-cli/core-command", - "time": "2017-11-21T16:01:01+00:00" + "time": "2018-01-30T06:57:10+00:00" }, { "name": "wp-cli/cron-command", - "version": "v1.0.4", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/wp-cli/cron-command.git", - "reference": "61243923539fd3c25c667140b113aee44ba7c5cd" + "reference": "9da7e36e8f9c14cb171a3c5204cba2865e0ed7ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/61243923539fd3c25c667140b113aee44ba7c5cd", - "reference": "61243923539fd3c25c667140b113aee44ba7c5cd", + "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/9da7e36e8f9c14cb171a3c5204cba2865e0ed7ef", + "reference": "9da7e36e8f9c14cb171a3c5204cba2865e0ed7ef", "shasum": "" }, "require-dev": { @@ -6673,11 +6767,14 @@ }, "bundled": true, "commands": [ + "cron", "cron test", + "cron event", "cron event delete", "cron event list", "cron event run", "cron event schedule", + "cron schedule", "cron schedule list" ] }, @@ -6700,29 +6797,27 @@ "homepage": "https://runcommand.io" } ], - "description": "Manage WP-Cron events and schedules.", + "description": "Tests, runs, and deletes WP-Cron events; manages WP-Cron schedules.", "homepage": "https://github.com/wp-cli/cron-command", - "time": "2017-11-20T22:04:43+00:00" + "time": "2017-12-08T15:09:54+00:00" }, { "name": "wp-cli/db-command", - "version": "v1.3.1", + "version": "v1.3.4", "source": { "type": "git", "url": "https://github.com/wp-cli/db-command.git", - "reference": "f040d08a17794b3ac747fe62ba43671aba6d842c" + "reference": "c9b7a5ef80f08a16cb7710ac8e63fc57a419bb9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/db-command/zipball/f040d08a17794b3ac747fe62ba43671aba6d842c", - "reference": "f040d08a17794b3ac747fe62ba43671aba6d842c", + "url": "https://api.github.com/repos/wp-cli/db-command/zipball/c9b7a5ef80f08a16cb7710ac8e63fc57a419bb9f", + "reference": "c9b7a5ef80f08a16cb7710ac8e63fc57a419bb9f", "shasum": "" }, - "require": { - "wp-cli/wp-cli": "*" - }, "require-dev": { - "behat/behat": "~2.5" + "behat/behat": "~2.5", + "wp-cli/wp-cli": "^1.5" }, "type": "wp-cli-package", "extra": { @@ -6731,6 +6826,7 @@ }, "bundled": true, "commands": [ + "db", "db create", "db drop", "db reset", @@ -6744,7 +6840,8 @@ "db import", "db search", "db tables", - "db size" + "db size", + "db columns" ] }, "autoload": { @@ -6766,28 +6863,85 @@ "homepage": "https://runcommand.io" } ], - "description": "Perform basic database operations using credentials stored in wp-config.php.", + "description": "Performs basic database operations using credentials stored in wp-config.php.", "homepage": "https://github.com/wp-cli/db-command", - "time": "2017-11-21T01:07:32+00:00" + "time": "2018-05-15T15:36:55+00:00" }, { - "name": "wp-cli/entity-command", - "version": "v1.1.3", + "name": "wp-cli/embed-command", + "version": "v1.0.0", "source": { "type": "git", - "url": "https://github.com/wp-cli/entity-command.git", - "reference": "0dfecf23e0211678d2c9c0a7b9c0c09bbaf7cf9e" + "url": "https://github.com/wp-cli/embed-command.git", + "reference": "81319d4243a8dfe096389bf54cdc4fc3dec53497" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/0dfecf23e0211678d2c9c0a7b9c0c09bbaf7cf9e", - "reference": "0dfecf23e0211678d2c9c0a7b9c0c09bbaf7cf9e", + "url": "https://api.github.com/repos/wp-cli/embed-command/zipball/81319d4243a8dfe096389bf54cdc4fc3dec53497", + "reference": "81319d4243a8dfe096389bf54cdc4fc3dec53497", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "^1.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "embed", + "embed fetch", + "embed provider list", + "embed provider match", + "embed handler list", + "embed cache clear", + "embed cache find", + "embed cache trigger" + ] + }, + "autoload": { + "psr-4": { + "WP_CLI\\Embeds\\": "src/" + }, + "files": [ + "embed-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pascal Birchler", + "homepage": "https://pascalbirchler.com/" + } + ], + "description": "Inspects oEmbed providers, clears embed cache, and more.", + "homepage": "https://github.com/wp-cli/embed-command", + "time": "2018-01-22T21:26:48+00:00" + }, + { + "name": "wp-cli/entity-command", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/entity-command.git", + "reference": "bf540e238bffc8c39286b1d16708c9d52866c4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/bf540e238bffc8c39286b1d16708c9d52866c4a5", + "reference": "bf540e238bffc8c39286b1d16708c9d52866c4a5", "shasum": "" }, "require-dev": { "behat/behat": "~2.5", "phpunit/phpunit": "^4.8", - "wp-cli/wp-cli": "*" + "wp-cli/wp-cli": "^1.5" }, "type": "wp-cli-package", "extra": { @@ -6797,29 +6951,153 @@ "bundled": true, "commands": [ "comment", + "comment approve", + "comment count", + "comment create", + "comment delete", + "comment exists", + "comment generate", + "comment get", + "comment list", "comment meta", + "comment meta add", + "comment meta delete", + "comment meta get", + "comment meta list", + "comment meta patch", + "comment meta pluck", + "comment meta update", + "comment recount", + "comment spam", + "comment status", + "comment trash", + "comment unapprove", + "comment unspam", + "comment untrash", + "comment update", "menu", + "menu create", + "menu delete", "menu item", + "menu item add-custom", + "menu item add-post", + "menu item add-term", + "menu item delete", + "menu item list", + "menu item update", + "menu list", "menu location", + "menu location assign", + "menu location list", + "menu location remove", "network meta", + "network meta add", + "network meta delete", + "network meta get", + "network meta list", + "network meta patch", + "network meta pluck", + "network meta update", "option", "option add", "option delete", "option get", "option list", + "option patch", + "option pluck", "option update", "post", + "post create", + "post delete", + "post edit", + "post generate", + "post get", + "post list", "post meta", + "post meta add", + "post meta delete", + "post meta get", + "post meta list", + "post meta patch", + "post meta pluck", + "post meta update", "post term", + "post term add", + "post term list", + "post term remove", + "post term set", + "post update", "post-type", + "post-type get", + "post-type list", "site", + "site activate", + "site archive", + "site create", + "site deactivate", + "site delete", "site empty", + "site list", + "site mature", + "site option", + "site private", + "site public", + "site spam", + "site unarchive", + "site unmature", + "site unspam", "taxonomy", + "taxonomy get", + "taxonomy list", "term", + "term create", + "term delete", + "term generate", + "term get", + "term list", "term meta", + "term meta add", + "term meta delete", + "term meta get", + "term meta list", + "term meta patch", + "term meta pluck", + "term meta update", + "term recount", + "term update", "user", + "user add-cap", + "user add-role", + "user create", + "user delete", + "user generate", + "user get", + "user import-csv", + "user list", + "user list-caps", "user meta", - "user term" + "user meta add", + "user meta delete", + "user meta get", + "user meta list", + "user meta patch", + "user meta pluck", + "user meta update", + "user remove-cap", + "user remove-role", + "user reset-password", + "user session", + "user session destroy", + "user session list", + "user set-role", + "user spam", + "user term", + "user term add", + "user term list", + "user term remove", + "user term set", + "user unspam", + "user update" ] }, "autoload": { @@ -6844,20 +7122,20 @@ ], "description": "Manage WordPress core entities.", "homepage": "https://github.com/wp-cli/entity-command", - "time": "2017-11-21T01:04:50+00:00" + "time": "2018-05-28T19:07:39+00:00" }, { "name": "wp-cli/eval-command", - "version": "v1.0.4", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/wp-cli/eval-command.git", - "reference": "1ea666eafe3eaabf2568511f8e0e6ec708a92ca5" + "reference": "9640d40ab28cd86590396f08f8c382e659f57321" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/1ea666eafe3eaabf2568511f8e0e6ec708a92ca5", - "reference": "1ea666eafe3eaabf2568511f8e0e6ec708a92ca5", + "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/9640d40ab28cd86590396f08f8c382e659f57321", + "reference": "9640d40ab28cd86590396f08f8c382e659f57321", "shasum": "" }, "require": { @@ -6896,30 +7174,30 @@ "homepage": "https://runcommand.io" } ], - "description": "Execute arbitrary PHP code.", + "description": "Executes arbitrary PHP code or files.", "homepage": "https://github.com/wp-cli/eval-command", - "time": "2017-11-21T01:06:56+00:00" + "time": "2017-12-08T14:33:34+00:00" }, { "name": "wp-cli/export-command", - "version": "v1.0.4", + "version": "v1.0.7", "source": { "type": "git", "url": "https://github.com/wp-cli/export-command.git", - "reference": "ec18748184a011ad03d6adcb159148d42c966365" + "reference": "776d33ad6b2ac93c00fded27402ca8e188e7bff0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/export-command/zipball/ec18748184a011ad03d6adcb159148d42c966365", - "reference": "ec18748184a011ad03d6adcb159148d42c966365", + "url": "https://api.github.com/repos/wp-cli/export-command/zipball/776d33ad6b2ac93c00fded27402ca8e188e7bff0", + "reference": "776d33ad6b2ac93c00fded27402ca8e188e7bff0", "shasum": "" }, "require": { - "nb/oxymel": "~0.1.0", - "wp-cli/wp-cli": "*" + "nb/oxymel": "~0.1.0" }, "require-dev": { - "behat/behat": "~2.5" + "behat/behat": "~2.5", + "wp-cli/wp-cli": "^1.5" }, "type": "wp-cli-package", "extra": { @@ -6950,22 +7228,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Export WordPress content to a WXR file.", + "description": "Exports WordPress content to a WXR file.", "homepage": "https://github.com/wp-cli/export-command", - "time": "2017-11-21T01:05:28+00:00" + "time": "2018-04-20T08:10:47+00:00" }, { "name": "wp-cli/extension-command", - "version": "v1.1.7", + "version": "v1.1.10", "source": { "type": "git", "url": "https://github.com/wp-cli/extension-command.git", - "reference": "e0ebb16359cf94c2442873d6390ef9a92f6deea5" + "reference": "3fd9ff469311bb2d6935997bc7d7e9f157fe29e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/e0ebb16359cf94c2442873d6390ef9a92f6deea5", - "reference": "e0ebb16359cf94c2442873d6390ef9a92f6deea5", + "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/3fd9ff469311bb2d6935997bc7d7e9f157fe29e6", + "reference": "3fd9ff469311bb2d6935997bc7d7e9f157fe29e6", "shasum": "" }, "require-dev": { @@ -6979,6 +7257,7 @@ }, "bundled": true, "commands": [ + "plugin", "plugin activate", "plugin deactivate", "plugin delete", @@ -6992,6 +7271,7 @@ "plugin toggle", "plugin uninstall", "plugin update", + "theme", "theme activate", "theme delete", "theme disable", @@ -7000,6 +7280,7 @@ "theme install", "theme is-installed", "theme list", + "theme mod", "theme mod get", "theme mod set", "theme mod remove", @@ -7028,22 +7309,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Manage WordPress plugins and themes.", + "description": "Manages plugins and themes, including installs, activations, and updates.", "homepage": "https://github.com/wp-cli/extension-command", - "time": "2017-11-21T01:06:16+00:00" + "time": "2018-03-02T13:26:40+00:00" }, { "name": "wp-cli/import-command", - "version": "v1.0.5", + "version": "v1.0.7", "source": { "type": "git", "url": "https://github.com/wp-cli/import-command.git", - "reference": "29eb1d55e555a208a23fa03d47ed377531f3a8ba" + "reference": "421fec5bd96671931f2119a89d28bae2f9edeb6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/import-command/zipball/29eb1d55e555a208a23fa03d47ed377531f3a8ba", - "reference": "29eb1d55e555a208a23fa03d47ed377531f3a8ba", + "url": "https://api.github.com/repos/wp-cli/import-command/zipball/421fec5bd96671931f2119a89d28bae2f9edeb6b", + "reference": "421fec5bd96671931f2119a89d28bae2f9edeb6b", "shasum": "" }, "require": { @@ -7081,22 +7362,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Import content from a WXR file.", + "description": "Imports content from a given WXR file.", "homepage": "https://github.com/wp-cli/import-command", - "time": "2017-11-21T00:38:21+00:00" + "time": "2018-04-20T08:07:05+00:00" }, { "name": "wp-cli/language-command", - "version": "v1.0.5", + "version": "v1.0.6", "source": { "type": "git", "url": "https://github.com/wp-cli/language-command.git", - "reference": "b089274b7288bb0ec0ae3fda1a8b74c141c7dee2" + "reference": "2a3d1ce5a722a4d70809619a065087aa933f6209" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/language-command/zipball/b089274b7288bb0ec0ae3fda1a8b74c141c7dee2", - "reference": "b089274b7288bb0ec0ae3fda1a8b74c141c7dee2", + "url": "https://api.github.com/repos/wp-cli/language-command/zipball/2a3d1ce5a722a4d70809619a065087aa933f6209", + "reference": "2a3d1ce5a722a4d70809619a065087aa933f6209", "shasum": "" }, "require-dev": { @@ -7110,6 +7391,7 @@ }, "commands": [ "language", + "language core", "language core activate", "language core install", "language core list", @@ -7137,41 +7419,40 @@ "homepage": "https://runcommand.io" } ], - "description": "Manage language packs.", + "description": "Installs, activates, and manages language packs.", "homepage": "https://github.com/wp-cli/language-command", - "time": "2017-11-21T15:04:33+00:00" + "time": "2017-12-08T17:50:26+00:00" }, { "name": "wp-cli/media-command", - "version": "v1.1.2", + "version": "v1.1.4", "source": { "type": "git", "url": "https://github.com/wp-cli/media-command.git", - "reference": "b067f7ba07f8df34d2f29890ff1f54b19d7635b1" + "reference": "7f8664ba722505446b3ef3dbc6717e8e7f20265c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/media-command/zipball/b067f7ba07f8df34d2f29890ff1f54b19d7635b1", - "reference": "b067f7ba07f8df34d2f29890ff1f54b19d7635b1", + "url": "https://api.github.com/repos/wp-cli/media-command/zipball/7f8664ba722505446b3ef3dbc6717e8e7f20265c", + "reference": "7f8664ba722505446b3ef3dbc6717e8e7f20265c", "shasum": "" }, - "require": { - "wp-cli/wp-cli": "*" - }, "require-dev": { - "behat/behat": "~2.5" + "behat/behat": "~2.5", + "wp-cli/wp-cli": "^1.5" }, "type": "wp-cli-package", "extra": { "branch-alias": { "dev-master": "1.x-dev" }, + "bundled": true, "commands": [ + "media", "media import", "media regenerate", "media image-size" - ], - "bundled": true + ] }, "autoload": { "psr-4": { @@ -7192,9 +7473,9 @@ "homepage": "https://runcommand.io" } ], - "description": "Import new attachments or regenerate existing ones.", + "description": "Imports files as attachments, regenerates thumbnails, or lists registered image sizes.", "homepage": "https://github.com/wp-cli/media-command", - "time": "2017-11-21T01:04:09+00:00" + "time": "2018-01-29T02:17:56+00:00" }, { "name": "wp-cli/mustangostang-spyc", @@ -7246,38 +7527,39 @@ }, { "name": "wp-cli/package-command", - "version": "v1.0.9", + "version": "v1.0.14", "source": { "type": "git", "url": "https://github.com/wp-cli/package-command.git", - "reference": "0335f46465a8f26dcec5df60357ffe57f60f3c12" + "reference": "a7ce916de5e1d0c3d910d4fc8ca31928ee3775d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/package-command/zipball/0335f46465a8f26dcec5df60357ffe57f60f3c12", - "reference": "0335f46465a8f26dcec5df60357ffe57f60f3c12", + "url": "https://api.github.com/repos/wp-cli/package-command/zipball/a7ce916de5e1d0c3d910d4fc8ca31928ee3775d3", + "reference": "a7ce916de5e1d0c3d910d4fc8ca31928ee3775d3", "shasum": "" }, "require": { - "composer/composer": "^1.2.0", - "wp-cli/wp-cli": "*" + "composer/composer": "^1.2.0" }, "require-dev": { - "behat/behat": "~2.5" + "behat/behat": "~2.5", + "wp-cli/wp-cli": "^1.5" }, "type": "wp-cli-package", "extra": { "branch-alias": { "dev-master": "1.x-dev" }, + "bundled": true, "commands": [ + "package", "package browse", "package install", "package list", "package update", "package uninstall" - ], - "bundled": true + ] }, "autoload": { "psr-4": { @@ -7298,22 +7580,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Manage WP-CLI packages.", + "description": "Lists, installs, and removes WP-CLI packages.", "homepage": "https://github.com/wp-cli/package-command", - "time": "2017-11-21T01:02:41+00:00" + "time": "2018-05-28T11:40:24+00:00" }, { "name": "wp-cli/php-cli-tools", - "version": "v0.11.8", + "version": "v0.11.9", "source": { "type": "git", "url": "https://github.com/wp-cli/php-cli-tools.git", - "reference": "363c75349f5dde561e0b416dd00f7aaa76fa2c27" + "reference": "766653b45f99c817edb2b05dc23f7ee9a893768d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/363c75349f5dde561e0b416dd00f7aaa76fa2c27", - "reference": "363c75349f5dde561e0b416dd00f7aaa76fa2c27", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/766653b45f99c817edb2b05dc23f7ee9a893768d", + "reference": "766653b45f99c817edb2b05dc23f7ee9a893768d", "shasum": "" }, "require": { @@ -7350,20 +7632,20 @@ "cli", "console" ], - "time": "2017-10-12T21:50:48+00:00" + "time": "2018-04-20T08:11:30+00:00" }, { "name": "wp-cli/rewrite-command", - "version": "v1.0.4", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/wp-cli/rewrite-command.git", - "reference": "eb6c25d3479900ec3f88eecb0f08050f879de635" + "reference": "6b1695887e289ffad14c8f4ea86b5f1d92757408" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/eb6c25d3479900ec3f88eecb0f08050f879de635", - "reference": "eb6c25d3479900ec3f88eecb0f08050f879de635", + "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/6b1695887e289ffad14c8f4ea86b5f1d92757408", + "reference": "6b1695887e289ffad14c8f4ea86b5f1d92757408", "shasum": "" }, "require-dev": { @@ -7376,6 +7658,7 @@ "dev-master": "1.x-dev" }, "commands": [ + "rewrite", "rewrite flush", "rewrite list", "rewrite structure" @@ -7401,22 +7684,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Manage rewrite rules.", + "description": "Lists or flushes the site's rewrite rules, updates the permalink structure.", "homepage": "https://github.com/wp-cli/rewrite-command", - "time": "2017-11-21T13:46:10+00:00" + "time": "2017-12-08T17:51:04+00:00" }, { "name": "wp-cli/role-command", - "version": "v1.0.4", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/wp-cli/role-command.git", - "reference": "edc642b21db1b158c7cb2c59459e72b0b4b2920f" + "reference": "f50134ea9c27c108b1069cf044f7395c8f9bf716" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/role-command/zipball/edc642b21db1b158c7cb2c59459e72b0b4b2920f", - "reference": "edc642b21db1b158c7cb2c59459e72b0b4b2920f", + "url": "https://api.github.com/repos/wp-cli/role-command/zipball/f50134ea9c27c108b1069cf044f7395c8f9bf716", + "reference": "f50134ea9c27c108b1069cf044f7395c8f9bf716", "shasum": "" }, "require-dev": { @@ -7429,11 +7712,13 @@ "dev-master": "1.x-dev" }, "commands": [ + "role", "role create", "role delete", "role exists", "role list", "role reset", + "cap", "cap add", "cap list", "cap remove" @@ -7459,33 +7744,34 @@ "homepage": "https://runcommand.io" } ], - "description": "Manage user roles and capabilities.", + "description": "Adds, removes, lists, and resets roles and capabilities.", "homepage": "https://github.com/wp-cli/role-command", - "time": "2017-11-21T12:56:19+00:00" + "time": "2018-04-20T08:05:51+00:00" }, { "name": "wp-cli/scaffold-command", - "version": "v1.1.0", + "version": "v1.1.3", "source": { "type": "git", "url": "https://github.com/wp-cli/scaffold-command.git", - "reference": "f174112ae3dd88df3b29a68b71b6d72171ba62c3" + "reference": "659348f05ebb47e70d7286b2e989146893a3c588" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/f174112ae3dd88df3b29a68b71b6d72171ba62c3", - "reference": "f174112ae3dd88df3b29a68b71b6d72171ba62c3", + "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/659348f05ebb47e70d7286b2e989146893a3c588", + "reference": "659348f05ebb47e70d7286b2e989146893a3c588", "shasum": "" }, "require-dev": { "behat/behat": "~2.5", - "wp-cli/wp-cli": "*" + "wp-cli/wp-cli": "^1.5" }, "type": "wp-cli-package", "extra": { "branch-alias": { "dev-master": "1.x-dev" }, + "bundled": true, "commands": [ "scaffold", "scaffold _s", @@ -7496,8 +7782,7 @@ "scaffold post-type", "scaffold taxonomy", "scaffold theme-tests" - ], - "bundled": true + ] }, "autoload": { "psr-4": { @@ -7518,39 +7803,37 @@ "homepage": "https://runcommand.io" } ], - "description": "Generate code for post types, taxonomies, plugins, child themes, etc.", + "description": "Generates code for post types, taxonomies, blocks, plugins, child themes, etc.", "homepage": "https://github.com/wp-cli/scaffold-command", - "time": "2017-11-28T13:27:30+00:00" + "time": "2018-04-20T18:37:18+00:00" }, { "name": "wp-cli/search-replace-command", - "version": "v1.1.3", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/wp-cli/search-replace-command.git", - "reference": "caa107e45679498329c22a20f3ac355e87f0a3e4" + "reference": "be21639dc530ad6506664baa813862d39b6d78ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/caa107e45679498329c22a20f3ac355e87f0a3e4", - "reference": "caa107e45679498329c22a20f3ac355e87f0a3e4", + "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/be21639dc530ad6506664baa813862d39b6d78ba", + "reference": "be21639dc530ad6506664baa813862d39b6d78ba", "shasum": "" }, - "require": { - "wp-cli/wp-cli": "*" - }, "require-dev": { - "behat/behat": "~2.5" + "behat/behat": "~2.5", + "wp-cli/wp-cli": "^1.5" }, "type": "wp-cli-package", "extra": { "branch-alias": { "dev-master": "1.x-dev" }, + "bundled": true, "commands": [ "search-replace" - ], - "bundled": true + ] }, "autoload": { "psr-4": { @@ -7571,22 +7854,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Search/replace strings in the database.", + "description": "Searches/replaces strings in the database.", "homepage": "https://github.com/wp-cli/search-replace-command", - "time": "2017-11-21T00:39:02+00:00" + "time": "2018-05-29T10:21:19+00:00" }, { "name": "wp-cli/server-command", - "version": "v1.0.8", + "version": "v1.0.9", "source": { "type": "git", "url": "https://github.com/wp-cli/server-command.git", - "reference": "836c6c704dff3241c3d97d957e022553eafc4852" + "reference": "6192e6d7becd07e4c11a8f1560655c73a3b3526a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/server-command/zipball/836c6c704dff3241c3d97d957e022553eafc4852", - "reference": "836c6c704dff3241c3d97d957e022553eafc4852", + "url": "https://api.github.com/repos/wp-cli/server-command/zipball/6192e6d7becd07e4c11a8f1560655c73a3b3526a", + "reference": "6192e6d7becd07e4c11a8f1560655c73a3b3526a", "shasum": "" }, "require": { @@ -7624,22 +7907,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Launch PHP's built-in web server for this specific WordPress installation.", + "description": "Launches PHP's built-in web server for a specific WordPress installation.", "homepage": "https://github.com/wp-cli/server-command", - "time": "2017-11-21T00:44:40+00:00" + "time": "2017-12-14T20:06:24+00:00" }, { "name": "wp-cli/shell-command", - "version": "v1.0.4", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/wp-cli/shell-command.git", - "reference": "a91824269520011e9db9ea5caf091a252f7f0b82" + "reference": "507603a8994d984b6c4d5bd26e31ede6d9cce37e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/a91824269520011e9db9ea5caf091a252f7f0b82", - "reference": "a91824269520011e9db9ea5caf091a252f7f0b82", + "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/507603a8994d984b6c4d5bd26e31ede6d9cce37e", + "reference": "507603a8994d984b6c4d5bd26e31ede6d9cce37e", "shasum": "" }, "require": { @@ -7680,20 +7963,20 @@ ], "description": "Opens an interactive PHP console for running and testing PHP code.", "homepage": "https://github.com/wp-cli/shell-command", - "time": "2017-11-21T00:43:56+00:00" + "time": "2017-12-08T16:03:53+00:00" }, { "name": "wp-cli/super-admin-command", - "version": "v1.0.5", + "version": "v1.0.6", "source": { "type": "git", "url": "https://github.com/wp-cli/super-admin-command.git", - "reference": "314a3f7b02a04fb5e842ef15d15b58dd1295a320" + "reference": "2982d2e6514dbb318561d72d0577746a3a37181e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/314a3f7b02a04fb5e842ef15d15b58dd1295a320", - "reference": "314a3f7b02a04fb5e842ef15d15b58dd1295a320", + "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/2982d2e6514dbb318561d72d0577746a3a37181e", + "reference": "2982d2e6514dbb318561d72d0577746a3a37181e", "shasum": "" }, "require-dev": { @@ -7706,6 +7989,7 @@ "dev-master": "1.x-dev" }, "commands": [ + "super-admin", "super-admin add", "super-admin list", "super-admin remove" @@ -7731,22 +8015,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Lists, adds, or removes super admin users on a multisite install.", + "description": "Lists, adds, or removes super admin users on a multisite installation.", "homepage": "https://github.com/wp-cli/super-admin-command", - "time": "2017-11-21T22:11:13+00:00" + "time": "2017-12-08T17:43:53+00:00" }, { "name": "wp-cli/widget-command", - "version": "v1.0.4", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/wp-cli/widget-command.git", - "reference": "86c95ed4bf1d10f090ea42c6421193f4106017e3" + "reference": "657e0f77d80c892f8f72f90a3a25112c254386df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/86c95ed4bf1d10f090ea42c6421193f4106017e3", - "reference": "86c95ed4bf1d10f090ea42c6421193f4106017e3", + "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/657e0f77d80c892f8f72f90a3a25112c254386df", + "reference": "657e0f77d80c892f8f72f90a3a25112c254386df", "shasum": "" }, "require-dev": { @@ -7759,6 +8043,7 @@ "dev-master": "1.x-dev" }, "commands": [ + "widget", "widget add", "widget deactivate", "widget delete", @@ -7766,6 +8051,7 @@ "widget move", "widget reset", "widget update", + "sidebar", "sidebar list" ], "bundled": true @@ -7789,22 +8075,22 @@ "homepage": "https://runcommand.io" } ], - "description": "Manage widgets and sidebars.", + "description": "Adds, moves, and removes widgets; lists sidebars.", "homepage": "https://github.com/wp-cli/widget-command", - "time": "2017-11-21T01:08:14+00:00" + "time": "2017-12-08T17:45:57+00:00" }, { "name": "wp-cli/wp-cli", - "version": "v1.4.1", + "version": "v1.5.1", "source": { "type": "git", "url": "https://github.com/wp-cli/wp-cli.git", - "reference": "1d9dec0212fa1e85b1c5ca7b0d8395091c52de40" + "reference": "3aac73bc4d629372531f3e15bbb67945d19b5d5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/1d9dec0212fa1e85b1c5ca7b0d8395091c52de40", - "reference": "1d9dec0212fa1e85b1c5ca7b0d8395091c52de40", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/3aac73bc4d629372531f3e15bbb67945d19b5d5a", + "reference": "3aac73bc4d629372531f3e15bbb67945d19b5d5a", "shasum": "" }, "require": { @@ -7832,6 +8118,7 @@ "wp-cli/core-command": "^1.0", "wp-cli/cron-command": "^1.0", "wp-cli/db-command": "^1.0", + "wp-cli/embed-command": "^1.0", "wp-cli/entity-command": "^1.0", "wp-cli/eval-command": "^1.0", "wp-cli/export-command": "^1.0", @@ -7868,6 +8155,9 @@ ], "type": "library", "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + }, "autoload-splitter": { "splitter-logic": "WP_CLI\\AutoloadSplitter", "splitter-location": "php/WP_CLI/AutoloadSplitter.php", @@ -7887,13 +8177,54 @@ "license": [ "MIT" ], - "description": "A command line interface for WordPress", - "homepage": "http://wp-cli.org", + "description": "The command line interface for WordPress", + "homepage": "https://wp-cli.org", "keywords": [ "cli", "wordpress" ], - "time": "2017-11-13T15:28:04+00:00" + "time": "2018-05-31T11:04:05+00:00" + }, + { + "name": "wp-cli/wp-config-transformer", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/wp-config-transformer.git", + "reference": "6ce0a9fae09d53145c9c9c79486a69684598488d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/6ce0a9fae09d53145c9c9c79486a69684598488d", + "reference": "6ce0a9fae09d53145c9c9c79486a69684598488d", + "shasum": "" + }, + "require": { + "php": ">=5.3.29" + }, + "require-dev": { + "composer/composer": "^1.5.6", + "phpunit/phpunit": "^6.5.5", + "wp-coding-standards/wpcs": "^0.14.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/WPConfigTransformer.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frankie Jarrett", + "email": "fjarrett@gmail.com" + } + ], + "description": "Programmatically edit a wp-config.php file.", + "time": "2018-03-20T16:19:27+00:00" }, { "name": "xamin/handlebars.php", From daeee55118bd6f5335377e923417e1e7a9c69f08 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Thu, 14 Jun 2018 12:06:30 +0200 Subject: [PATCH 84/89] Update Codeception deprecated method calls --- tests/unit/API/JSON/APITest.php | 11 +++--- tests/unit/API/JSON/v1/ServicesTest.php | 35 ++++++++++--------- tests/unit/API/MP/APITest.php | 17 ++++----- tests/unit/Analytics/AnalyticsTest.php | 11 +++--- tests/unit/Config/CapabilitiesTest.php | 5 +-- tests/unit/Config/InstallerTest.php | 5 +-- tests/unit/Config/PluginActivatedHookTest.php | 9 ++--- tests/unit/Config/RendererTest.php | 7 ++-- tests/unit/Config/UpdaterTest.php | 5 +-- tests/unit/Cron/DaemonTest.php | 21 +++++------ .../Workers/KeyCheck/KeyCheckWorkerTest.php | 7 ++-- .../KeyCheck/SendingServiceKeyCheckTest.php | 5 +-- tests/unit/Cron/Workers/SchedulerTest.php | 29 +++++++-------- .../Workers/SendingQueue/SendingQueueTest.php | 31 ++++++++-------- .../Workers/SendingQueue/Tasks/MailerTest.php | 5 +-- tests/unit/Cron/Workers/SimpleWorkerTest.php | 5 +-- .../Router/Endpoints/ViewInBrowserTest.php | 9 ++--- tests/unit/Router/RouterTest.php | 11 +++--- tests/unit/Statistics/Track/ClicksTest.php | 9 ++--- tests/unit/Statistics/Track/OpensTest.php | 7 ++-- 20 files changed, 132 insertions(+), 112 deletions(-) diff --git a/tests/unit/API/JSON/APITest.php b/tests/unit/API/JSON/APITest.php index 274de39601..84dc6f7131 100644 --- a/tests/unit/API/JSON/APITest.php +++ b/tests/unit/API/JSON/APITest.php @@ -2,7 +2,8 @@ namespace MailPoet\Test\API\JSON; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use Helper\WordPressHooks as WPHooksHelper; use MailPoet\API\API; use MailPoet\API\JSON\API as JSONAPI; @@ -197,7 +198,7 @@ class APITest extends \MailPoetTest { $access_control = Stub::make( new AccessControl(), array( - 'validatePermission' => Stub::once(function($cap) { + 'validatePermission' => Expected::once(function($cap) { expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS); return false; }) @@ -209,7 +210,7 @@ class APITest extends \MailPoetTest { $access_control = Stub::make( new AccessControl(), array( - 'validatePermission' => Stub::once(function($cap) { + 'validatePermission' => Expected::once(function($cap) { expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS); return true; }) @@ -230,7 +231,7 @@ class APITest extends \MailPoetTest { $access_control = Stub::make( new AccessControl(), array( - 'validatePermission' => Stub::once(function($cap) { + 'validatePermission' => Expected::once(function($cap) { expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS); return false; }) @@ -242,7 +243,7 @@ class APITest extends \MailPoetTest { $access_control = Stub::make( new AccessControl(), array( - 'validatePermission' => Stub::once(function($cap) { + 'validatePermission' => Expected::once(function($cap) { expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS); return true; }) diff --git a/tests/unit/API/JSON/v1/ServicesTest.php b/tests/unit/API/JSON/v1/ServicesTest.php index 3c3b2181c7..c96e63f0ed 100644 --- a/tests/unit/API/JSON/v1/ServicesTest.php +++ b/tests/unit/API/JSON/v1/ServicesTest.php @@ -1,7 +1,8 @@ array('state' => Bridge::KEY_VALID), - 'storeMSSKeyAndState' => Stub::once() + 'storeMSSKeyAndState' => Expected::once() ), $this ); @@ -37,7 +38,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkMSSKey' => array('state' => Bridge::KEY_INVALID), - 'storeMSSKeyAndState' => Stub::once() + 'storeMSSKeyAndState' => Expected::once() ), $this ); @@ -54,7 +55,7 @@ class ServicesTest extends \MailPoetTest { 'state' => Bridge::KEY_EXPIRING, 'data' => array('expire_at' => $date->format('c')) ), - 'storeMSSKeyAndState' => Stub::once() + 'storeMSSKeyAndState' => Expected::once() ), $this ); @@ -69,7 +70,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkMSSKey' => array('code' => Bridge::CHECK_ERROR_UNAVAILABLE), - 'storeMSSKeyAndState' => Stub::once() + 'storeMSSKeyAndState' => Expected::once() ), $this ); @@ -87,7 +88,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkMSSKey' => null, - 'storeMSSKeyAndState' => Stub::once() + 'storeMSSKeyAndState' => Expected::once() ), $this ); @@ -105,7 +106,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkMSSKey' => array('code' => 404), - 'storeMSSKeyAndState' => Stub::once() + 'storeMSSKeyAndState' => Expected::once() ), $this ); @@ -121,7 +122,7 @@ class ServicesTest extends \MailPoetTest { 'checkMSSKey' => function() { throw new \Exception('test'); }, - 'storeMSSKeyAndState' => Stub::never() + 'storeMSSKeyAndState' => Expected::never() ), $this ); @@ -141,7 +142,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkPremiumKey' => array('state' => Bridge::KEY_VALID), - 'storePremiumKeyAndState' => Stub::once() + 'storePremiumKeyAndState' => Expected::once() ), $this ); @@ -157,7 +158,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkPremiumKey' => array('state' => Bridge::KEY_INVALID), - 'storePremiumKeyAndState' => Stub::once() + 'storePremiumKeyAndState' => Expected::once() ), $this ); @@ -170,7 +171,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkPremiumKey' => array('state' => Bridge::KEY_ALREADY_USED), - 'storePremiumKeyAndState' => Stub::once() + 'storePremiumKeyAndState' => Expected::once() ), $this ); @@ -187,7 +188,7 @@ class ServicesTest extends \MailPoetTest { 'state' => Bridge::KEY_EXPIRING, 'data' => array('expire_at' => $date->format('c')) ), - 'storePremiumKeyAndState' => Stub::once() + 'storePremiumKeyAndState' => Expected::once() ), $this ); @@ -202,7 +203,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkPremiumKey' => array('code' => Bridge::CHECK_ERROR_UNAVAILABLE), - 'storePremiumKeyAndState' => Stub::once() + 'storePremiumKeyAndState' => Expected::once() ), $this ); @@ -220,7 +221,7 @@ class ServicesTest extends \MailPoetTest { new Bridge(), array( 'checkPremiumKey' => null, - 'storePremiumKeyAndState' => Stub::once() + 'storePremiumKeyAndState' => Expected::once() ), $this ); @@ -234,11 +235,11 @@ class ServicesTest extends \MailPoetTest { } function testItPrintsErrorCodeIfServiceReturnedAnUnexpectedResponseCodeDuringPremiumCheck() { - $this->services_endpoint->bridge = Stub::make( + $this->services_endpoint->bridge = \Codeception\Stub::make( new Bridge(), array( 'checkPremiumKey' => array('code' => 404), - 'storePremiumKeyAndState' => Stub::once() + 'storePremiumKeyAndState' => Expected::once() ), $this ); @@ -254,7 +255,7 @@ class ServicesTest extends \MailPoetTest { 'checkPremiumKey' => function() { throw new \Exception('test'); }, - 'storePremiumKeyAndState' => Stub::never() + 'storePremiumKeyAndState' => Expected::never() ), $this ); diff --git a/tests/unit/API/MP/APITest.php b/tests/unit/API/MP/APITest.php index 95fb312198..5adc83271a 100644 --- a/tests/unit/API/MP/APITest.php +++ b/tests/unit/API/MP/APITest.php @@ -3,7 +3,8 @@ namespace MailPoet\Test\API\MP; use Codeception\Util\Fixtures; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use MailPoet\API\API; use MailPoet\Models\CustomField; use MailPoet\Models\Segment; @@ -180,7 +181,7 @@ class APITest extends \MailPoetTest { new \MailPoet\API\MP\v1\API(), 'subscribeToLists', array( - '_scheduleWelcomeNotification' => Stub::once() + '_scheduleWelcomeNotification' => Expected::once() ), $this); $subscriber = Subscriber::create(); $subscriber->hydrate(Fixtures::get('subscriber_template')); @@ -199,7 +200,7 @@ class APITest extends \MailPoetTest { new \MailPoet\API\MP\v1\API(), 'subscribeToLists', array( - '_scheduleWelcomeNotification' => Stub::never() + '_scheduleWelcomeNotification' => Expected::never() ), $this); $subscriber = Subscriber::create(); $subscriber->hydrate(Fixtures::get('subscriber_template')); @@ -319,7 +320,7 @@ class APITest extends \MailPoetTest { new \MailPoet\API\MP\v1\API(), 'addSubscriber', array( - '_scheduleWelcomeNotification' => Stub::once() + '_scheduleWelcomeNotification' => Expected::once() ), $this); $subscriber = array( 'email' => 'test@example.com', @@ -334,7 +335,7 @@ class APITest extends \MailPoetTest { new \MailPoet\API\MP\v1\API(), 'addSubscriber', array( - '_scheduleWelcomeNotification' => Stub::never() + '_scheduleWelcomeNotification' => Expected::never() ), $this); $subscriber = array( 'email' => 'test@example.com' @@ -348,7 +349,7 @@ class APITest extends \MailPoetTest { new \MailPoet\API\MP\v1\API(), 'addSubscriber', array( - '_scheduleWelcomeNotification' => Stub::never() + '_scheduleWelcomeNotification' => Expected::never() ), $this); $subscriber = array( 'email' => 'test@example.com', @@ -364,7 +365,7 @@ class APITest extends \MailPoetTest { new \MailPoet\API\MP\v1\API(), 'addSubscriber', array( - '_sendConfirmationEmail' => Stub::once() + '_sendConfirmationEmail' => Expected::once() ), $this); $subscriber = array( 'email' => 'test@example.com' @@ -378,7 +379,7 @@ class APITest extends \MailPoetTest { new \MailPoet\API\MP\v1\API(), 'addSubscriber', array( - '_sendConfirmationEmail' => Stub::never() + '_sendConfirmationEmail' => Expected::never() ), $this); $subscriber = array( 'email' => 'test@example.com' diff --git a/tests/unit/Analytics/AnalyticsTest.php b/tests/unit/Analytics/AnalyticsTest.php index 2e8e2bb258..35b0ea8e05 100644 --- a/tests/unit/Analytics/AnalyticsTest.php +++ b/tests/unit/Analytics/AnalyticsTest.php @@ -3,7 +3,8 @@ namespace MailPoet\Analytics; use Carbon\Carbon; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use MailPoet\Models\Setting; class AnalyticsTest extends \MailPoetTest { @@ -38,7 +39,7 @@ class AnalyticsTest extends \MailPoetTest { $reporter = Stub::makeEmpty( 'MailPoet\Analytics\Reporter', array( - 'getData' => Stub::never(), + 'getData' => Expected::never(), ), $this ); @@ -52,7 +53,7 @@ class AnalyticsTest extends \MailPoetTest { $reporter = Stub::makeEmpty( 'MailPoet\Analytics\Reporter', array( - 'getData' => Stub::never(), + 'getData' => Expected::never(), ), $this ); @@ -68,7 +69,7 @@ class AnalyticsTest extends \MailPoetTest { $reporter = Stub::makeEmpty( 'MailPoet\Analytics\Reporter', array( - 'getData' => Stub::once(function() use ($data){ + 'getData' => Expected::once(function() use ($data){ return $data; }), ), @@ -87,7 +88,7 @@ class AnalyticsTest extends \MailPoetTest { $reporter = Stub::makeEmpty( 'MailPoet\Analytics\Reporter', array( - 'getData' => Stub::once(function() use ($data){ + 'getData' => Expected::once(function() use ($data){ return $data; }), ), diff --git a/tests/unit/Config/CapabilitiesTest.php b/tests/unit/Config/CapabilitiesTest.php index 05e91bde2f..a38e686f5e 100644 --- a/tests/unit/Config/CapabilitiesTest.php +++ b/tests/unit/Config/CapabilitiesTest.php @@ -2,7 +2,8 @@ namespace MailPoet\Test\Config; use AspectMock\Test as Mock; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use Helper\WordPressHooks as WPHooksHelper; use MailPoet\Config\AccessControl; use MailPoet\Config\Capabilities; @@ -19,7 +20,7 @@ class CapabilitiesTest extends \MailPoetTest { $caps = Stub::makeEmptyExcept( $this->caps, 'init', - array('setupMembersCapabilities' => Stub::once()), + array('setupMembersCapabilities' => Expected::once()), $this ); $caps->init(); diff --git a/tests/unit/Config/InstallerTest.php b/tests/unit/Config/InstallerTest.php index fbada07a77..e6f261fb97 100644 --- a/tests/unit/Config/InstallerTest.php +++ b/tests/unit/Config/InstallerTest.php @@ -1,7 +1,8 @@ installer, array( - 'getPluginInformation' => Stub::once() + 'getPluginInformation' => Expected::once() ), $this ); diff --git a/tests/unit/Config/PluginActivatedHookTest.php b/tests/unit/Config/PluginActivatedHookTest.php index ad386c849a..d27cbeca1a 100644 --- a/tests/unit/Config/PluginActivatedHookTest.php +++ b/tests/unit/Config/PluginActivatedHookTest.php @@ -2,7 +2,8 @@ namespace MailPoet\Config; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; class PluginActivatedHookTest extends \MailPoetTest { @@ -11,7 +12,7 @@ class PluginActivatedHookTest extends \MailPoetTest { $deferred_admin_notices = Stub::makeEmpty( 'MailPoet\Config\DeferredAdminNotices', array( - 'addNetworkAdminNotice' => Stub::exactly(1, function () { + 'addNetworkAdminNotice' => Expected::exactly(1, function () { }), ), $this @@ -24,7 +25,7 @@ class PluginActivatedHookTest extends \MailPoetTest { $deferred_admin_notices = Stub::makeEmpty( 'MailPoet\Config\DeferredAdminNotices', array( - 'addNetworkAdminNotice' => Stub::never(), + 'addNetworkAdminNotice' => Expected::never(), ), $this ); @@ -36,7 +37,7 @@ class PluginActivatedHookTest extends \MailPoetTest { $deferred_admin_notices = Stub::makeEmpty( 'MailPoet\Config\DeferredAdminNotices', array( - 'addNetworkAdminNotice' => Stub::never(), + 'addNetworkAdminNotice' => Expected::never(), ), $this ); diff --git a/tests/unit/Config/RendererTest.php b/tests/unit/Config/RendererTest.php index d1d26a9fc2..55c353331c 100644 --- a/tests/unit/Config/RendererTest.php +++ b/tests/unit/Config/RendererTest.php @@ -1,7 +1,8 @@ Stub::makeEmpty('Twig_Environment', array( - 'render' => Stub::atLeastOnce(function() { + 'render' => Expected::atLeastOnce(function() { return 'test render'; }), ), @@ -95,7 +96,7 @@ class RendererTest extends \MailPoetTest { array( 'renderer' => Stub::makeEmpty('Twig_Environment', array( - 'render' => Stub::atLeastOnce(function() use ($exception_message) { + 'render' => Expected::atLeastOnce(function() use ($exception_message) { throw new \RuntimeException($exception_message); }), ), diff --git a/tests/unit/Config/UpdaterTest.php b/tests/unit/Config/UpdaterTest.php index 5a876c6699..7fa58fadcd 100644 --- a/tests/unit/Config/UpdaterTest.php +++ b/tests/unit/Config/UpdaterTest.php @@ -1,7 +1,8 @@ updater, array( - 'checkForUpdate' => Stub::once() + 'checkForUpdate' => Expected::once() ), $this ); diff --git a/tests/unit/Cron/DaemonTest.php b/tests/unit/Cron/DaemonTest.php index 9d2d211825..df7b98cba4 100644 --- a/tests/unit/Cron/DaemonTest.php +++ b/tests/unit/Cron/DaemonTest.php @@ -1,7 +1,8 @@ Stub::exactly(1), - 'executeQueueWorker' => Stub::exactly(1), + 'executeScheduleWorker' => Expected::exactly(1), + 'executeQueueWorker' => Expected::exactly(1), 'pauseExecution' => null, 'callSelf' => null ), $this); @@ -102,7 +103,7 @@ class DaemonTest extends \MailPoetTest { $daemon = Stub::make(new Daemon(true), array( 'executeScheduleWorker' => null, 'executeQueueWorker' => null, - 'pauseExecution' => Stub::exactly(1, function($pause_delay) { + 'pauseExecution' => Expected::exactly(1, function($pause_delay) { expect($pause_delay)->lessThan(CronHelper::DAEMON_EXECUTION_LIMIT); expect($pause_delay)->greaterThan(CronHelper::DAEMON_EXECUTION_LIMIT - 1); }), @@ -124,7 +125,7 @@ class DaemonTest extends \MailPoetTest { }, 'executeQueueWorker' => null, 'pauseExecution' => null, - 'terminateRequest' => Stub::exactly(1) + 'terminateRequest' => Expected::exactly(1) ), $this); $data = array( 'token' => 123 @@ -144,7 +145,7 @@ class DaemonTest extends \MailPoetTest { }, 'executeQueueWorker' => null, 'pauseExecution' => null, - 'terminateRequest' => Stub::exactly(1) + 'terminateRequest' => Expected::exactly(1) ), $this); $data = array( 'token' => 123 @@ -177,10 +178,10 @@ class DaemonTest extends \MailPoetTest { $daemon = Stub::make(new Daemon(true), array( 'pauseExecution' => null, // workers should be executed - 'executeScheduleWorker' => Stub::exactly(1), - 'executeQueueWorker' => Stub::exactly(1), + 'executeScheduleWorker' => Expected::exactly(1), + 'executeQueueWorker' => Expected::exactly(1), // daemon should call itself - 'callSelf' => Stub::exactly(1), + 'callSelf' => Expected::exactly(1), ), $this); $data = array( 'token' => 123 @@ -193,7 +194,7 @@ class DaemonTest extends \MailPoetTest { function testItRespondsToPingRequest() { $daemon = Stub::make(new Daemon(true), array( - 'terminateRequest' => Stub::exactly(1, function($message) { + 'terminateRequest' => Expected::exactly(1, function($message) { expect($message)->equals('pong'); }) ), $this); diff --git a/tests/unit/Cron/Workers/KeyCheck/KeyCheckWorkerTest.php b/tests/unit/Cron/Workers/KeyCheck/KeyCheckWorkerTest.php index 977a598b23..dfa0f89af9 100644 --- a/tests/unit/Cron/Workers/KeyCheck/KeyCheckWorkerTest.php +++ b/tests/unit/Cron/Workers/KeyCheck/KeyCheckWorkerTest.php @@ -2,7 +2,8 @@ namespace MailPoet\Test\Cron\Workers\KeyCheck; use Carbon\Carbon; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use MailPoet\Models\ScheduledTask; use MailPoet\Models\Setting; use MailPoet\Services\Bridge; @@ -33,7 +34,7 @@ class KeyCheckWorkerTest extends \MailPoetTest { 'checkKey' => function () { throw new \Exception; }, - 'reschedule' => Stub::once() + 'reschedule' => Expected::once() ), $this ); @@ -47,7 +48,7 @@ class KeyCheckWorkerTest extends \MailPoetTest { $this->worker, array( 'checkKey' => array('code' => Bridge::CHECK_ERROR_UNAVAILABLE), - 'reschedule' => Stub::once() + 'reschedule' => Expected::once() ), $this ); diff --git a/tests/unit/Cron/Workers/KeyCheck/SendingServiceKeyCheckTest.php b/tests/unit/Cron/Workers/KeyCheck/SendingServiceKeyCheckTest.php index bb4de6baa6..507d39d425 100644 --- a/tests/unit/Cron/Workers/KeyCheck/SendingServiceKeyCheckTest.php +++ b/tests/unit/Cron/Workers/KeyCheck/SendingServiceKeyCheckTest.php @@ -1,7 +1,8 @@ $response, 'storeMSSKeyAndState' => null, - 'updateSubscriberCount' => Stub::once() + 'updateSubscriberCount' => Expected::once() ), $this ); diff --git a/tests/unit/Cron/Workers/SchedulerTest.php b/tests/unit/Cron/Workers/SchedulerTest.php index f88eebd850..e3d77ba8b8 100644 --- a/tests/unit/Cron/Workers/SchedulerTest.php +++ b/tests/unit/Cron/Workers/SchedulerTest.php @@ -3,7 +3,8 @@ namespace MailPoet\Test\Cron\Workers; use AspectMock\Test as Mock; use Carbon\Carbon; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use MailPoet\Cron\CronHelper; use MailPoet\Cron\Workers\Scheduler; use MailPoet\Models\Newsletter; @@ -218,7 +219,7 @@ class SchedulerTest extends \MailPoetTest { // return false when WP user cannot be verified $scheduler = Stub::make(new Scheduler(), array( - 'verifyWPSubscriber' => Stub::exactly(1, function() { + 'verifyWPSubscriber' => Expected::exactly(1, function() { return false; }) ), $this); @@ -233,7 +234,7 @@ class SchedulerTest extends \MailPoetTest { // return false when subscriber cannot be verified $scheduler = Stub::make(new Scheduler(), array( - 'verifyMailpoetSubscriber' => Stub::exactly(1, function() { + 'verifyMailpoetSubscriber' => Expected::exactly(1, function() { return false; }) ), $this); @@ -248,7 +249,7 @@ class SchedulerTest extends \MailPoetTest { $queue = $this->_createQueue($newsletter->id); $queue->setSubscribers(array(1)); $scheduler = Stub::make(new Scheduler(), array( - 'verifyMailpoetSubscriber' => Stub::exactly(1) + 'verifyMailpoetSubscriber' => Expected::exactly(1) ), $this); expect($queue->status)->notNull(); expect($scheduler->processWelcomeNewsletter($newsletter, $queue))->true(); @@ -264,7 +265,7 @@ class SchedulerTest extends \MailPoetTest { $queue = $this->_createQueue($newsletter->id); $queue->setSubscribers(array(1)); $scheduler = Stub::make(new Scheduler(), array( - 'verifyWPSubscriber' => Stub::exactly(1) + 'verifyWPSubscriber' => Expected::exactly(1) ), $this); expect($queue->status)->notNull(); expect($scheduler->processWelcomeNewsletter($newsletter, $queue))->true(); @@ -390,7 +391,7 @@ class SchedulerTest extends \MailPoetTest { // delete or reschedule queue when segments don't exist $scheduler = Stub::make(new Scheduler(), array( - 'deleteQueueOrUpdateNextRunDate' => Stub::exactly(1, function() { + 'deleteQueueOrUpdateNextRunDate' => Expected::exactly(1, function() { return false; }) ), $this); @@ -405,7 +406,7 @@ class SchedulerTest extends \MailPoetTest { // delete or reschedule queue when there are no subscribers in segments $scheduler = Stub::make(new Scheduler(), array( - 'deleteQueueOrUpdateNextRunDate' => Stub::exactly(1, function() { + 'deleteQueueOrUpdateNextRunDate' => Expected::exactly(1, function() { return false; }) ), $this); @@ -482,7 +483,7 @@ class SchedulerTest extends \MailPoetTest { $queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); $queue->save(); $scheduler = Stub::make(new Scheduler(), array( - 'processWelcomeNewsletter' => Stub::exactly(1) + 'processWelcomeNewsletter' => Expected::exactly(1) ), $this); $scheduler->timer = microtime(true); $scheduler->process(); @@ -494,7 +495,7 @@ class SchedulerTest extends \MailPoetTest { $queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); $queue->save(); $scheduler = Stub::make(new Scheduler(), array( - 'processPostNotificationNewsletter' => Stub::exactly(1) + 'processPostNotificationNewsletter' => Expected::exactly(1) ), $this); $scheduler->timer = microtime(true); $scheduler->process(); @@ -506,7 +507,7 @@ class SchedulerTest extends \MailPoetTest { $queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); $queue->save(); $scheduler = Stub::make(new Scheduler(), array( - 'processScheduledStandardNewsletter' => Stub::exactly(1) + 'processScheduledStandardNewsletter' => Expected::exactly(1) ), $this); $scheduler->timer = microtime(true); $scheduler->process(); @@ -518,7 +519,7 @@ class SchedulerTest extends \MailPoetTest { $queue->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); $queue->save(); $scheduler = Stub::make(new Scheduler(), array( - 'processPostNotificationNewsletter' => Stub::exactly(1) + 'processPostNotificationNewsletter' => Expected::exactly(1) ), $this); $scheduler->timer = microtime(true) - CronHelper::DAEMON_EXECUTION_LIMIT; try { @@ -536,7 +537,7 @@ class SchedulerTest extends \MailPoetTest { $queue->save(); $scheduler = Stub::make(new Scheduler(), array( - 'processScheduledStandardNewsletter' => Stub::never() + 'processScheduledStandardNewsletter' => Expected::never() ), $this); // scheduled job is not processed $scheduler->timer = microtime(true); @@ -550,7 +551,7 @@ class SchedulerTest extends \MailPoetTest { $queue->save(); $scheduler = Stub::make(new Scheduler(), array( - 'processScheduledStandardNewsletter' => Stub::once() + 'processScheduledStandardNewsletter' => Expected::once() ), $this); // scheduled job is processed $scheduler->timer = microtime(true); @@ -564,7 +565,7 @@ class SchedulerTest extends \MailPoetTest { $queue->save(); $scheduler = Stub::make(new Scheduler(), array( - 'processScheduledStandardNewsletter' => Stub::once() + 'processScheduledStandardNewsletter' => Expected::once() ), $this); // scheduled job is processed $scheduler->timer = microtime(true); diff --git a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php index 4f2e532608..40aab9beb7 100644 --- a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php +++ b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php @@ -5,7 +5,8 @@ namespace MailPoet\Test\Cron\Workers\SendingQueue; use AspectMock\Test as Mock; use Carbon\Carbon; use Codeception\Util\Fixtures; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use MailPoet\Config\Populator; use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker; use MailPoet\Cron\Workers\SendingQueue\Tasks\Mailer as MailerTask; @@ -108,8 +109,8 @@ class SendingQueueTest extends \MailPoetTest { $sending_queue_worker = Stub::make( new SendingQueueWorker(), array( - 'processQueue' => Stub::never(), - 'enforceSendingAndExecutionLimits' => Stub::exactly(1, function() { + 'processQueue' => Expected::never(), + 'enforceSendingAndExecutionLimits' => Expected::exactly(1, function() { throw new \Exception(); }) ), $this); @@ -126,7 +127,7 @@ class SendingQueueTest extends \MailPoetTest { $sending_queue_worker = Stub::make( new SendingQueueWorker(), array( - 'enforceSendingAndExecutionLimits' => Stub::exactly(1) + 'enforceSendingAndExecutionLimits' => Expected::exactly(1) ), $this); $sending_queue_worker->__construct( $timer = false, @@ -159,7 +160,7 @@ class SendingQueueTest extends \MailPoetTest { $sending_queue_worker = Stub::make( new SendingQueueWorker(), array( - 'enforceSendingAndExecutionLimits' => Stub::never() + 'enforceSendingAndExecutionLimits' => Expected::never() ), $this); $sending_queue_worker->__construct( $timer = false, @@ -191,7 +192,7 @@ class SendingQueueTest extends \MailPoetTest { // this function returns a queue object return (object)array('status' => null); }, - 'enforceSendingAndExecutionLimits' => Stub::exactly(2) + 'enforceSendingAndExecutionLimits' => Expected::exactly(2) ), $this); $sending_queue_worker->__construct(); $sending_queue_worker->process(); @@ -220,7 +221,7 @@ class SendingQueueTest extends \MailPoetTest { Stub::make( new MailerTask(), array( - 'send' => Stub::exactly(1, function($newsletter, $subscriber, $extra_params) use ($directUnsubscribeURL) { + 'send' => Expected::exactly(1, function($newsletter, $subscriber, $extra_params) use ($directUnsubscribeURL) { expect(isset($extra_params['unsubscribe_url']))->true(); expect($extra_params['unsubscribe_url'])->equals($directUnsubscribeURL); return true; @@ -240,7 +241,7 @@ class SendingQueueTest extends \MailPoetTest { Stub::make( new MailerTask(), array( - 'send' => Stub::exactly(1, function($newsletter, $subscriber, $extra_params) use ($trackedUnsubscribeURL) { + 'send' => Expected::exactly(1, function($newsletter, $subscriber, $extra_params) use ($trackedUnsubscribeURL) { expect(isset($extra_params['unsubscribe_url']))->true(); expect($extra_params['unsubscribe_url'])->equals($trackedUnsubscribeURL); return true; @@ -258,7 +259,7 @@ class SendingQueueTest extends \MailPoetTest { Stub::make( new MailerTask(), array( - 'send' => Stub::exactly(1, function($newsletter, $subscriber, $extra_params) { + 'send' => Expected::exactly(1, function($newsletter, $subscriber, $extra_params) { // newsletter body should not be empty expect(!empty($newsletter['body']['html']))->true(); expect(!empty($newsletter['body']['text']))->true(); @@ -301,13 +302,13 @@ class SendingQueueTest extends \MailPoetTest { Stub::make( new MailerTask(), array( - 'send' => Stub::exactly(1, function($newsletter, $subscriber) { + 'send' => Expected::exactly(1, function($newsletter, $subscriber) { // newsletter body should not be empty expect(!empty($newsletter[0]['body']['html']))->true(); expect(!empty($newsletter[0]['body']['text']))->true(); return true; }), - 'getProcessingMethod' => Stub::exactly(1, function() { + 'getProcessingMethod' => Expected::exactly(1, function() { return 'bulk'; }) ), @@ -347,7 +348,7 @@ class SendingQueueTest extends \MailPoetTest { Stub::make( new MailerTask(), array( - 'send' => Stub::exactly(1, function($newsletter, $subscriber) { + 'send' => Expected::exactly(1, function($newsletter, $subscriber) { // newsletter body should not be empty expect(!empty($newsletter['body']['html']))->true(); expect(!empty($newsletter['body']['text']))->true(); @@ -414,7 +415,7 @@ class SendingQueueTest extends \MailPoetTest { Stub::make( new MailerTask(), array( - 'send' => Stub::exactly(1, function($newsletter, $subscriber) { + 'send' => Expected::exactly(1, function($newsletter, $subscriber) { // newsletter body should not be empty expect(!empty($newsletter['body']['html']))->true(); expect(!empty($newsletter['body']['text']))->true(); @@ -463,7 +464,7 @@ class SendingQueueTest extends \MailPoetTest { $sending_queue_worker->mailer_task = Stub::make( new MailerTask(), array( - 'send' => Stub::exactly(1, function() { + 'send' => Expected::exactly(1, function() { return true; }) ), @@ -614,7 +615,7 @@ class SendingQueueTest extends \MailPoetTest { Stub::make( new MailerTask(), array( - 'send' => Stub::once() + 'send' => Expected::once() ), $this ) diff --git a/tests/unit/Cron/Workers/SendingQueue/Tasks/MailerTest.php b/tests/unit/Cron/Workers/SendingQueue/Tasks/MailerTest.php index d16ab11efe..eec241a6a8 100644 --- a/tests/unit/Cron/Workers/SendingQueue/Tasks/MailerTest.php +++ b/tests/unit/Cron/Workers/SendingQueue/Tasks/MailerTest.php @@ -1,7 +1,8 @@ Stub::make( $php_mail_class, - array('send' => Stub::exactly(1, function() { + array('send' => Expected::exactly(1, function() { return true; })), $this diff --git a/tests/unit/Cron/Workers/SimpleWorkerTest.php b/tests/unit/Cron/Workers/SimpleWorkerTest.php index 84da5d2f13..114d8436ec 100644 --- a/tests/unit/Cron/Workers/SimpleWorkerTest.php +++ b/tests/unit/Cron/Workers/SimpleWorkerTest.php @@ -2,7 +2,8 @@ namespace MailPoet\Test\Cron\Workers; use Carbon\Carbon; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use MailPoet\Cron\CronHelper; use MailPoet\Cron\Workers\SimpleWorker; use MailPoet\Models\ScheduledTask; @@ -141,7 +142,7 @@ class SimpleWorkerTest extends \MailPoetTest { function testItCanInitBeforeProcessing() { $worker = Stub::make( $this->worker, - array('init' => Stub::once()), + array('init' => Expected::once()), $this ); $worker->process(); diff --git a/tests/unit/Router/Endpoints/ViewInBrowserTest.php b/tests/unit/Router/Endpoints/ViewInBrowserTest.php index 849588b559..3fb9c41c9b 100644 --- a/tests/unit/Router/Endpoints/ViewInBrowserTest.php +++ b/tests/unit/Router/Endpoints/ViewInBrowserTest.php @@ -2,7 +2,8 @@ namespace MailPoet\Test\Router\Endpoints; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use MailPoet\Config\AccessControl; use MailPoet\Models\Newsletter; use MailPoet\Models\ScheduledTask; @@ -43,7 +44,7 @@ class ViewInBrowserTest extends \MailPoetTest { function testItAbortsWhenBrowserPreviewDataIsMissing() { $view_in_browser = Stub::make($this->view_in_browser, array( - '_abort' => Stub::exactly(2) + '_abort' => Expected::exactly(2) ), $this); // newsletter ID is required $data = $this->browser_preview_data; @@ -57,7 +58,7 @@ class ViewInBrowserTest extends \MailPoetTest { function testItAbortsWhenBrowserPreviewDataIsInvalid() { $view_in_browser = Stub::make($this->view_in_browser, array( - '_abort' => Stub::exactly(3) + '_abort' => Expected::exactly(3) ), $this); // newsletter ID is invalid $data = $this->browser_preview_data; @@ -200,7 +201,7 @@ class ViewInBrowserTest extends \MailPoetTest { function testItReturnsViewActionResult() { $view_in_browser = Stub::make($this->view_in_browser, array( - '_displayNewsletter' => Stub::exactly(1) + '_displayNewsletter' => Expected::exactly(1) ), $this); $view_in_browser->data = $view_in_browser->_processBrowserPreviewData($this->browser_preview_data); $view_in_browser->view(); diff --git a/tests/unit/Router/RouterTest.php b/tests/unit/Router/RouterTest.php index c449cdcd36..85a415e8a8 100644 --- a/tests/unit/Router/RouterTest.php +++ b/tests/unit/Router/RouterTest.php @@ -2,7 +2,8 @@ namespace MailPoet\Test\Router; -use Codeception\Util\Stub; +use Codeception\Stub; +use Codeception\Stub\Expected; use MailPoet\Config\AccessControl; use MailPoet\Router\Router; @@ -103,7 +104,7 @@ class RouterTest extends \MailPoetTest { $access_control = Stub::make( new AccessControl(), array( - 'validatePermission' => Stub::once(function($cap) { + 'validatePermission' => Expected::once(function($cap) { expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS); return false; }) @@ -115,7 +116,7 @@ class RouterTest extends \MailPoetTest { $access_control = Stub::make( new AccessControl(), array( - 'validatePermission' => Stub::once(function($cap) { + 'validatePermission' => Expected::once(function($cap) { expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS); return true; }) @@ -138,7 +139,7 @@ class RouterTest extends \MailPoetTest { $access_control = Stub::make( new AccessControl(), array( - 'validatePermission' => Stub::once(function($cap) { + 'validatePermission' => Expected::once(function($cap) { expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS); return false; }) @@ -150,7 +151,7 @@ class RouterTest extends \MailPoetTest { $access_control = Stub::make( new AccessControl(), array( - 'validatePermission' => Stub::once(function($cap) { + 'validatePermission' => Expected::once(function($cap) { expect($cap)->equals(AccessControl::PERMISSION_MANAGE_SETTINGS); return true; }) diff --git a/tests/unit/Statistics/Track/ClicksTest.php b/tests/unit/Statistics/Track/ClicksTest.php index 17d7de3418..c528d5c2d7 100644 --- a/tests/unit/Statistics/Track/ClicksTest.php +++ b/tests/unit/Statistics/Track/ClicksTest.php @@ -1,7 +1,8 @@ clicks, array( - 'abort' => Stub::exactly(2) + 'abort' => Expected::exactly(2) ), $this); $data = $this->track_data; // 1. when tracking data does not exist @@ -88,7 +89,7 @@ class ClicksTest extends \MailPoetTest { function testItRedirectsToUrlAfterTracking() { $clicks = Stub::make($this->clicks, array( - 'redirectToUrl' => Stub::exactly(1) + 'redirectToUrl' => Expected::exactly(1) ), $this); $clicks->track($this->track_data); } @@ -116,7 +117,7 @@ class ClicksTest extends \MailPoetTest { function testItFailsToConvertsInvalidShortcodeToUrl() { $clicks = Stub::make($this->clicks, array( - 'abort' => Stub::exactly(1) + 'abort' => Expected::exactly(1) ), $this); // should call abort() method if shortcode action does not exist $link = $clicks->processUrl( diff --git a/tests/unit/Statistics/Track/OpensTest.php b/tests/unit/Statistics/Track/OpensTest.php index a5c7c66404..1415199d42 100644 --- a/tests/unit/Statistics/Track/OpensTest.php +++ b/tests/unit/Statistics/Track/OpensTest.php @@ -1,7 +1,8 @@ opens, array( - 'returnResponse' => Stub::exactly(1) + 'returnResponse' => Expected::exactly(1) ), $this); $opens->track(false); expect(StatisticsOpens::findMany())->isEmpty(); @@ -83,7 +84,7 @@ class OpensTest extends \MailPoetTest { function testItReturnsImageAfterTracking() { $opens = Stub::make($this->opens, array( - 'returnResponse' => Stub::exactly(1) + 'returnResponse' => Expected::exactly(1) ), $this); $opens->track($this->track_data); } From 8537796da990516205038d1f275a7099568a23a8 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Fri, 15 Jun 2018 15:08:59 +0200 Subject: [PATCH 85/89] Update logo assets to support retina [MAILPOET-1394] --- assets/img/blank_templates/fake-logo.png | Bin 779 -> 4204 bytes assets/img/mailpoet_logo_newsletter.png | Bin 1739 -> 3401 bytes plugin_repository/assets/icon-256x256.png | Bin 0 -> 12997 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 plugin_repository/assets/icon-256x256.png diff --git a/assets/img/blank_templates/fake-logo.png b/assets/img/blank_templates/fake-logo.png index 6f75a4f8872dadac21c70648aa7a0929ba67b334..78303c535e2307656641ad946f0b2b74859b2a1f 100644 GIT binary patch literal 4204 zcmdT{dpy+Xzki5GYb7g5n5MRJpTUgF8m-HS)wqRGE}0m)&Be^fxHie=7nSx1Ct8Z6 z#$_huniap_FN&~XY9&UiOq5%4X^PJC)!K9Z*w^p8Ugw{4&b;O|-{*P0pX>W`c|LQ- z!)?E^(l#XkfU=9TqZa^jLbyJ!xE}uQ(3zEi4^0lyk8_X_#)+e_sK73iag>U3p;3-e zy{MGX_?U-O8vxdYM|k^j{746^Ll`t;3PNMdr731~8ogds5hO=nwk3FuY1 z)^Lp+o1jsvB%CM$`ioJ1BoCAWgGEK*jLnQfFjy=Kk2l7eDm!s1ky5Nq04(D)~)+Q!#adF0RX2uNGF%ztnl@%hx)YJ%4 z7_sB&917Qn&fd8u!I8=iVMQ=G5ezyCkw`hph~*H_(9$n1(3m9BpMvS^KY)UenQ$pg z6Ra`DghoUBTBT-lyr}`Nva@i)VlB)u7N!`yB^GOGfpxONTH&2A7*l(qso9#0 zzv9K4+2imI7IrvOQ&TLKXlaLYu(G$nnK?ONFpfAU%o?u?oz0=pL#S(dBcR?tc&+{= zueAeB~d~m=*WQ{5}+^sI#O8?$El%CECvm= zim-LWUs&K||KEB3g*Wtnf|?05#so=^|B^0iM=%GG<)6t9H-DB7l@4o$1&c#Nxs(CG zSNSfEcHZ1)Z-+WFb{*1GnCa^sy;9<=mx?aFctuOK^x2Oa<3t;EuSiw-x>qBynE~~$ zQ_{Nkzkb%ZsWCSd707Kp*I~Z*b#$oG>}iXRr3cQt4feRbEWK@d@4?FQh{r)q%{;Y0 zOl#3}Qq1(&*mb0ozxUN;Z$uUk4)ElWeWa`*vh`96MmoiXe1N>=^~?Dor`LA3$ifE- zC$k0F-rRt+7T`?!Uu9h!k_ExxP9=|v1>4O>51CcvW9e-*cWZl>*8yju{1zb0Dl{Lx zw)`Q;th-}ZKP2WsZ(5qqj7)IG78R?|4-y9G>p*ZYa%y|YSo$rl_QAE`koq7jM*Zi%(`t6N>`6hZJ3qRT@&Pg&*-(3O?lF?OSQ+g(=x zJ`xcwQW{wyhsGBGuy6t9!Pfk~4$11SKe-Notr?HQIsKn3`O!f&Qhk2C+tcT9fwv`w zTDFVEW9xuW9WmA!@0qO5FtIVH6Cd5$xmg!KDm`EIu|gZl&B~8y7`qjR)djrD>a=$*#S2LQ9Jfb|BUZ*IdTSaf z3BN9wt?oCdzuvxY@Yfoh8j1fmXrf3IpSZl=VEc)|IT`Sqo~xn^@9GVoBY_uJN?EF3 z5lpgwJ@%7gQroNf+~J?^NZyz!S5-Z+T&a~nv)TF(koQg{o@u!DoUUXM`Ifkv;{G=! zfl5c{fH<>STHSoR+OjEQL|=NaQZ0y2h#b-t$7nDz?zxv1e>Gq8aLx?NALd5aZ!-BHriE_oL+zpB7mzPfept`y1 zv`1gFe`fB8k&@u(=PG`AAM38WPxOg^Mu!Gkw*o+^tNX!XEqS~*!B&)7kl7(oRr=Y` z@_l)j&E7hL;;O-(V@CY58FLkCLBtE@x{tJvUtYz+c|RNVqjSGkzZaMT>zuI+I_CwX?xe&T=)LIt;F?mZIsIhzf*d2JlJR#--jNH zV~C$1SR*a%kT%&?fFn+COhS7%2K|0{?qpAFdrI;P5jC+Y|8U>p7ySf8zer!k*YIIE z&O56mtm&ndN}eV82v0;-kM+IOSAKpjnhl*99}@Rt&QlNVzvMsJ)_I_AWljdhy z+qn~4Ks|dgf7aJ*W#FvXVzjJlDaI_N_w2o0_05XRNEu&pO>a!kt=vjqrLv9Pv0k>% z?nUa`mp*&fr1)>$2@8W0N%<1t*%R4C5p9bFv!}w61e!>{GQSV^2fXVV;_dCz;Fc zXIEsZcUx(>-H$gWTe^#TTP3ABNr7*fwwIcQY_;0VekUhRX#nP8PdcNf=j-Xvh8uzF z{lpP%8W}T6;P~Y2t|i|~a(+bzSfuov9+Rg_E7gplf@v$9v95AwWNUA|#HJ^4p*&Dr zJC;33`JmOcbX+w^rll&mQBxeg|cOBTX9Ank!?*W7#gB zCYNs|JADc;TOpgrDDVPpbXV>k$gg)VQaSkBD}P1te4Py7*zD|=ttcNKoUG|xG^zELlg+~5CwZn+D3YXb(#2!pcaSld7P97p?#X(=bTE) z=>}s;sdvlM(^oPZ^RSvn5 zZn?R$pJxxWRCo_hD9x22?GMU@x0J0G@* z1f)$AR0$(5t+=ah?@G5-H6|XMS4^Nk6CdlDyHe5o$ao>qGL9sfycH%`zE=I2`*1Eg z3Mnz9UwFfQEaxz%{(~U*IU)7h0B^5;cCm#hyCLNMyT%VK5$Z9?MYJA`eG-QfO9t(s z_`Z^40IB)aF-DWfH1mJ)KJv%posZ5?Q|2h$^~;~4s2}ui5DRmsCWMFQMXxg014uvi zLaycUJIaHSyzxpj|8g;UeE1PJz_&alLAxxcr+wYeDxk#;vFPHnO$PS)Z%zg#OirHi zjQ^G?3;a&OOVT;Yd>e5@&GqH!Z$3pgN|nIKxj3;A0H#p|jVh%|2HWa%$+gJb^yHfC zMi9*I)-T%6jh$QopkhC~)`Xg#$v*zJOZ}5Fz^@3(3pRrTK~Mt$fHz40YO)oP0f=*k zq%+b&A6s%V*D(7P91o&-hz^2kkald6jt@BtVeL|diYlgv<5P+1=%(I!Z4i74P7I(k^HnPB zlzm|V^&|iazJ&^gIc24HvqVkVVNHhfGy2k?_%|rfqP+KV=sQ5m5Hc$SZ?-3dx0RS~xFZd?BTn>4gIxYsA)q4;8k5}TD=GNfMt|oU zAS2SpsiEi3>sM#oYt#)p{_o7KFlg}e|6tIb{4Dzw2nf?HTq$YXhuG{wbaSk-4^I6L DH*Shd literal 779 zcmeAS@N?(olHy`uVBq!ia0y~yUB%|L-mo-U3d6}R5pJ=nX%K%g~o zxdWG9qlgC(9Xwtx)hXh!Fj#>VD7f!T=C?!JGFGQ7j`Ur>EwZxg|9Zb;GJz{|#2)|+ z!v-=M4%u3OUwRt9A$J^EmE|qONWKg#CvX#U)WyehG(x=Jz!Yy z^Y5w`3=3js$(4#eZ(x|U?5juUYUYNrmCM&Lec;Vl2qHBiV?*ch=6#xf=e23}_Q=JK z+UcDP>+Z+g&$$z=Uj1jy!GlR2Q)T0gr`C(lmK^{2(D(7mTeCi8lra>XRQgc1YT~s;p(PuB zolbkAYx(nd>F)fb)p7?)yAPZU3fLOH^h?B*%qe@He0um zIqCY3RenC&9bP=~p4jxvG)ayJN7p1ptrlzBIji^RX^Vqm?UqY5BZN+iSPCBTe(5WJ ztFzw1?#s6l>x>n@Zq$aVvPNsID>LoSNn5G4bxGgy2^*Gw@c%gB5BtY=`x4Y^YByfp zH*a6T)7Q%aS8rOj=$O3Uac><;_JCGt2AP3cJh9%14~WjWUWlu8WNBfydm&{ z@5VoN&1aXygdSDC%6P!Fmpi!h*LKY(URs;Evh4P|XI#Bfq$8=k{wBkY2GxZRzr1bn zb^Lezd$iJOv#TptGQ@byUBvcXr7}B@p<(}9bHDd#b&XsLDql_c@x!p;S?0xa-lrI( zmQVbv#c+0V_@nx>K+e4Xrpy^r+<2GIcg)dYWHfP)oBd5mX(gA#Vv(XlQ7`@3fhnwE q{@a6!j3CB>|LbcLnXn}~pk#2U-`nGMuOzO4 z;5tfQ$1-?!qX6Z5)>f1_I1IlsT-qy|-|HVb=}b4SJpt*(1JYjiJ&77CIh1SD*BFg2 zzoA=hm)sg3ipcNE%@6Tg2`M6f37tO|_jbSqEvbx8io1F>eQwxO< z-+>;K9NU%caI=s$dH(6Z({Gji8L?X#2}F z(hYe?*a&)%i|4S&(FEc;2P5Mn^M^9_%aDuDV3rWA>c|JJ_sv+CgMsZ38Rx(DvZRxG zRH+t%JSro$H6Bl229_T-s`&PvtM)nNx;U5=w%oO5ua&-`0pC`?vA zjf+nLZD3%ahDEXj1OyDsw*)k^3T49Wt8Cw(6rK{d{6qlk$cKxa z>+h#kWAv;7H)!eaTY^-Z?|&W(lkj^^>xhc7`s;*n=W>7Q1=+}x+onin3JXd^i1cVKtz~hlfYry*=S+;{O8KW$d{MaJV!%b`fbln zSKc0+jmnP;v*w5ivcPlu&T(!{ibZ4Y8HQK{nCHc@_5h&rqEKnRgcup92?@C41SQ-m zeziT*+uMuBd~Q0zFJp%2_1HDTPe%F#N^l|cC^h)5o7;j{k2H^dZ$Pn>+5?oI!#r2V zohCo&FfDxHxpU`4zNVW#S~Z+Y_5c2DC-$gWp0R~Am|`t+ijP--vP?1n`b46@TP%j~ z=g}28QRwN0e)lE6qyXtlqE;Px((DiEaTsf$qdqE!-~0fFCzLDV`{v&0$y&9d73}1! zb$#EonbZGp`hp)_%l!5sL1MpvV@ituWVa4KAVwsa=5jAsLsU`M!H`MBVmiU+Y}H9g zSij0q05chGED$WJPdHc%?KTDV7-%5)cX5*9*4~irE+~4%4IW??2n!#kZ&Bn}d))as zFhV7rX{WWNc_%x;3eq2(9pfUn%OK@CczWCs>b*!IZXRHi#d#p^Xn%2}>&F*s3mv6m z5$mNDy*}UQdKR%Qg3UyYnB%i+XC^-qg62Ijy$CClxzeqq$g|yY-SWCkHLYN*$TEBK zYvCn^@wc#xJ$Din_@y0N#v8&-I6#3$IUsHzn<-~ zQJQsN>N4@E;#>EdDz5tMb5fz)ZKZrhg!92Esg2mE#B2TPW4hqhJY4pyj+!abspv=FA3U z(R82Tq|6VN-Q+%Xp1#_aas!F3`@DVn$%t^u(j5=?$A8UB^{mcX!b&Ac8WA?q{PGvB zBsN;h3ycgYoL0+(koZML_;BW^ovYj+U7E}{2?2A_^jFW+lH&Yrolf1*3tNg*IaRbd zp<>1(v21S6zKmsO)4XaRPN`>#&N5~l1?%G0_9x-$mFXXW_#(9~+1Lc&yPHBAM&OFX z__u^+4?%D@P(AtnR2;Ma=?{TYwF*M9H@^*5uh)kNzDa(jmCRKLN=P1Av*BfSK*a?m z1w{;mh)>#p5-R^R+b=o8XblSIO9aG=n*b+2FPz*;cJtp^>N~iGmHc{<9CD)%QE2yv zl2mKX@aJN4&A7+LXOiqPH!w;Hlw{LoXE4|)hdPxe1vINIo{TJFTnqZ@uyTU?fkq-3 zTf=A2hda!V(3R~mlF?6QP3ONXIb8$`-#Pr265z2PTICJ9i>#IOhV}|HWbuQh->55! zwf8=T-Z+ZA#}I2Ck&r;m&OI6wT{m^V0}g#K)TUGie14 z=S6L1Jzf0gMp5%N(dlxsv6T!~8L#CU%&q8;@nidz_tAOhpV)rT5IZA7m2DX)Qq~&l z%v^2jUae}c)*7`*l5IO%8Ke^|Xkw`m6I01ukqU5em{U_|dd0ddM~qOOC@D`jqq?6Q z7aiM!A3#GF+j=u@DOZb?Jb%U!aRaT1`JTV3oFxeogl)I>xC%{3FMz}f5YH?!PLxiR z(Cbc7$6?y|p^~X}=#dbJ`;_jkU(u@)9)qkpkC}&5J_h23OF6Z_Uxaw*juRoVsP_9w z89<Bk1sW;9sI1HxKApoD8h)&9__aQBiXp*g6tlzd$Hr$>EiK8azk}Z zMnKM@2Mb)2*Pj;Od?HXWHdrV6&Mf2c)Dzj5eH#E!Cw4qamtUCd_3AM2);Q-+r635> zi&FL`gI*5~7dsR4Bb#Peocq=;pSWFb?|rkyV6esm?K1gVy3QGTFxD{n%x<+yx6Xkj zLfwx2MdBusoyy){z0z+4!TB(DHdAR7bRnH5(1rzTnBUWdCN zMDFxu$3)vVb}=xJ$Po&xdA8AT0=PReuuGb4nj&7cG5+gMOEhS+VMD8XOl{Kpb6q`` zdISmxeVSXzRzpTa;e>nN*#O@9w|GeeB)8jQbsb&I^t_%63B{Yu-T^>=dT` zxcU26bDS_!7m_>x3sz=MQNJSkx+2fUf=BL73ry2ZzVXvrZqm@;YUFjwN;uh4BMA_N z9z=D>T3DE@Xysepa@uaG%in8J(_Fsi(}J4hpmr}`Hy(^S8b%v;T192g`F!Hw4DdLF zC`U0`)P+}7n=6L1aNBDAGHQP_YU{o$D!=$HVcd5qYi{L5b47Ny)Lo6AS5<#odwO<4 z-3A)|bQZ`7Vs>OS*8WJJTMml3gu6bC(4gRyf^O^Iw1!dMN(}u!6&4%*$qr_z2`0+) Uuf6p?{u{BN5GMMSx=#520PPB3PXGV_ delta 1722 zcmV;r21WVF8p{nKiBL{Q4GJ0x0000DNk~Le0001N0000%2nGNE05nuVC6OT~e+F$y zL_t(|+U%XlZW~7shMOX_uhhN^S^){rQJ3UyKY;=J6a&dIc^bcfgXCmCL2^$nItu~> zZP32&yC^F2wWo*?O_~%n!*~Yu0}T#m>E-{cs;he_JNEeaXcXZ=g;Jn`DO50p3Z{Z7 zR4|1Krh+L{Fog=Hf+2*q6{o&b&yWG8Tx%}vI>rY7ZfQsKK-@fA~ zr&JfqZLuEqTEz+!Z(WXk6YN*zG;sXpr(i!SpMm2CKLtxFpMfLkr(g=*f9X)DU@DkG z1yj5Ti6AR)Yil$0_4VfL?97~;oP2e?uCC7BlS-w`{{FuGEQFq(9$U7zw{7A1hK2^S zv$JFF?(R%SM~A7duFl+_PN&Vy&5b!dJuRyKViAkQ?AU0N5(&YEhK5W$9yhJ6t!93H z-rU~aJ{j=v@URsPK7_!caxULU0vDd2L}gj-PyRfxG>Ah z%TN07612Cs+wtw~?U}W;wP*+?e|uJ0S!tS^o9*BPctve(ZC>j|5QKSncz9yL8yg$u z=;+7_z&$(SH!?C}f0~+_EQtukIXnZB0QE>IcCMj4KtJfi*w~mQnl=fgoa^uJw*|;O z^zriY()I)4Mn^|&yW+*(HX;!c0bvBogLFtjAS@hG@Djoj#|#<*H#avev4lO)+1Y95 z3J4Qnz21~74C9%22ldp{)Yx_b{UAx9O+0XEX~`N5=a^4ve~T!92ji7^9ibIqKzJ$l z@SJ!p9=E!>8Xdt9fxTCR&{5V|HNCM;<@!#$Ad zP1B1p5U{ece`1BAUfPkwMcVTw5MGbvy4=Gvv@gblcM~EbEtmi+#=`~%2CV0h3KOz~ zU ziJ-lULO5aYl4fJwh{7Pf6SmAxgdIW@Bzi-e*MqV@f8|(;gs^N7awXH0?2kDN?`DpZ z^&Cb*AE<|WFeaWuK(a*<2jNLZsB3X?G2DV-;S2gScaTwpkMmbS z!2(@4v-V;aK+^aqg0W3aP1&)Q1Az)gcp~hufA%ToZa_IbOSZfiYv={zl?llJ8?Wr5 z%lak?U@VM@u`x!*8hXJ<3}hWcwlzLJZZp7qDR&q^-x&jAkqnYCX0OjeyKrXR1K3z) zEkhxLBdd~Zv6OJhbCNkiRzAWARTRlaOKnSDwRpF#@GQiVF-B&mg8{MGDz7CNu%CN! ze-KB?O;}<a_no;@rzS_S8ja=ocp8x{@%-hzZ5UzPT QTmS$707*qoM6N<$g0v1QPXGV_ diff --git a/plugin_repository/assets/icon-256x256.png b/plugin_repository/assets/icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..790727047ef56a0e68508eed0a51ed57b251bfab GIT binary patch literal 12997 zcmdtJWl)?=w>CPs1SbTC0fGl7xVyV1xHGsza0wpV-Q7ZPf(8k013`lXC%D_pnLO{i z_kPY(@BVSB&iCh=s;TLF_0sNMeXqW%CrV94789KW9RL7e%F9V<003~XCL9129`-Yb zBg*mT$xTC60#G+eb^v=obC%P00{~v&|M|iJvT}$307N=lEj@QVWhDV~CkIwj3nw#6 zR&NJq7&ibQ23SJi2dpLU&SoU|2ryY4_EuYVzMx2v$VH#uyk~H zgUNCHM{}^T{cpklmy_P6&i^v@*C75YHlaVB3usunIoW&s83JubTXzvop}zw9C;5Ly zhppl0iBX|E?`3meeCqTqbXBgFO}d;TdY>16NZs_ATMZu!TvzeN5< z`X~2acJ%*OJAdo>o1}%gfSZRI$kN>XZ}SD4wZB%srlkwp-^fC2|B+h=wiX1Goh)pv ze56d>Ek!ulIrs$Fc?3A#0y*CPX>h{g{RhwAJowWi>1t`}?&PZF8W z^bIuAT>_Yh^WjBT7`1dXGy0q8$dCfNA1ob^1(v`c-8@gVop#1+1kbgW9zUXy)IJ9R z;R_W{-=c=8NXP-HJRs{nY(A$y({E3@>bJXw{jEjrd;RD31oy^s_}#2zz)H9Sak!D% zh+AgOo2!m8VpP2tz3w=3sO$&>?ze8gGT}0i%}C&^f-+759EG?5b7D#~y%;!iYg3=B zkxfVE(CVW0dDwl0LR+% zs<#!OEI30Zh!|MbnNK=}(aZh+lQFr-gN1BvBMnS-g33T)vY}7j!<5o}^Zgnc&BaMZ zM^O|y#Rf0Ia|qw|??x~-iYcqe!1+rd%R6e>tl*lrwB?MPRYHo=5eH{R0u7mQlt3I~ zvu&Gd84X%>1X~t5^Y%pU21+|a>T(jh4xfG&Fj~+QgwME>~Y9WRzV-S z09nY|9+cFqP)tlB#mwWwL1*uml;soaV@vhZX@e=K3#fuV+H#{dtTO8|Glr0Vqy57xfG2i(Ers{eZMGr(=p0yPE5}bCKMs0>PFN%9K{FL>4 z3JhlN%?HWZG#*8)wB5tf3C6r2QpPq#iBdfavTpj=c4r* z5=o^N=TTs<6gjz)>lX|n26AbNE`0=B!SNM7zKW?*B?A^5XPnEei8l_|#=^BatV!p3 zFG|EI`&E<6xOY@Z*zEF?DN8n!Q90#_44O+8a`)>3)j^t2g&0MgWXghVi)Ket-3Ztc zAji9-M9=>X2X5&c8e6tD_}X^jqTryUm&(&rP3Lm_O+=S&sML!@j788#9YkE-=)u4h zROVYKW1p%_4OD8JBGlsu{YU~fy>nXm$oiG1SE2x@FlK=~T|}s6ZO7HH)T$Xlq*q+< zNxhDW9W{`-RK8ddiZ*vHaT{#b`pwI#Anhb9QU1 zplOc>pV~rPkQk%fi0E3y3Q}P;$KF7_RCo&VK*I=Tqzyq-aJptO9aXJsjr9eT; z&kVE_%&ryjvu~F=FWi9mA=X?_)+#9BCUEWz$3`P^Vn{=i&5zIyEHqmW{x8Tm4dw)^ zrpXKx-xMn7gB9>X>l!R_ajSb#798{7;J;0HRpk*fY5Pa=BEF`Tgk)}XYGI+_z%mRF ze3|*?ts&-op(S8@p^nglc>9YQ7V1k_mslc~9PbrKq2DKST3*})upgL2N}4hv9t_J? z93sc?$_}hDtS(7@wAb{gX@MA2*nA1ZK$CqxdLeL&4yCai%E1%{&g&qNB$$;(r6hspDc6r-2h{Z8kG9TG*1UM@IWiR3>c|I`Q zm>kS0HX`aj&!}wPYDq;t!WGwF*bOst_A$0lbZEB<{ToqSZ}6{5+vMI-AW^S)F6a%k zAg7e80$Fx&5h(<={(u$g$^^Cd(H760sMqbyCkpJC=&^i#=AV)VO}HNOLl9hl`BkU4 z?b{9a1i{$FEO7FHRG#_YdF9`14NS|!Wl5RbolZvxTyrs+tr;*e6ng6!HM~IlGZAW< z>0uNT<(QWf`1yg1mfSD4J6`5M`_G)-K*8YemR#dUy&Qh99dd(|G&up(euv<8-!0v; z&o%30n2;2h1cvWjB>ySDl3qnBx`Y%BGhXnWmTqQ&*4??&=V3E>;+OY8#XR)t_Uz`V z{m_kxbu)WP*z|mlmn%rr#`f11q-M+Y-FfE1)T7rrN6OM{PiVgalq(M}smpr*s+()1iyj^#h=CD!`&qxVe z`nzRZ%?s7&c8K)~-st)u?{jvqBUJ`*FT5PGdIPd>T0CzgMiF1=KtnZSAN;Z&#OhY} zy-BzV>tjk4PO4!8s@{H*Nlb&+hX~Yei;nwnv3Oi?*_U=!x#K`XTWY9D|I!%?TcD(b z-Z((~TZWwLCG{m{@DMS4i;La{319hBC_=)J<8v#BQXnq9XNX-N-4eM0FkY0*h6t!WpUpd>esu&mSDr1Eduot2?0B>5gnTkD>X)^2e2~W!M zEq4|o81e(L|C=xJi4BE=o6tB2CnEF>Z2nD%nL;DgWKY)Q1k*{S)Wy9=e{9V1eHZYmmZIlE8-j zup=d^c^5+gVyhIYv`zUAQn}Z$RDyxk5(eN3qRn`UOp#L1VH9ypLL^b$^I%kf5KA~< z?&RaQJ%ixb0+oT73>kl{W8n44;nO2J8>fCAJCvF{(f~p+GUbLYuvs^mgobvpha!<* zjsDq*=_``q9gs-<=P=zb&Xs9J~lX&ZQnS6?A1 zFTR+s*eKz9`8Id9=pDSETp-PU=(s>xGJOK)N)5Ll75j+_{v)M9fA=9*_jA>zO%!o~ zX~SS2TMkapzS-}|o>&2rpU|(?n8$0quoW2H7siQz7@Bw5ln}yHWl^^j9(0NUl4Sps zqTBdn9JlGvQUz(IfM zzf;JA=sLlR_?3=LK%osfJS{e9CvbE10`^kq*|^|pT*hH2OMO*`QI&sQhUET)GbVZ+ zj8==yC1!J8lTKQPp@E`5u7V0yluZasF~2Vt;V!%~MMkB~GP=;9N9374q5O(S>`lHz z!^>uIKMW{TL*hUPLzkz#7elYAp%W_KOMf)w$-OwbVa{WC>iK~$`vEJ3TsLR}-nIlhM(YEB= zI5aeQb@~$@uOAGftyxeJ`U9lw#~_cqrqj(z2o+0sf$h<=)m)tn{7lfC^p{buuq zb#-&F4lDSsvWqxQfSp~7kT8ah82nfyz~%%^&rhs}WW}9a$0xCa?e!R#6y}lk+h|+6 zt1HXix^0j36g=go?5mcWWU6a~T$;hx&yuz!;kzy$Yq^K1rrC;{!D_8dBG1-(oJ!?N zNvG4PCbDHl<42a-OhtLfGy^(ZW;Dt2*A$%zJd?aeJOM)~TKb9&;O5X20oM*n{9KJS z*v&jZz30mV5!kB+uOWBxWG}b##z{x1(?cJad4$`z#HP+QI2G4K47kqLq&Zh9{!j{U z?YVM`_i5_eM+ZDFXugnKr_S8MphCfI`a^T6mZAq0I$hX+RJ0q>g9+Mu+Ei@!vW?_k zGM!dF&}0YYubzc!p)TLd5Td@@&Gh+5 zyfQmd4+IWm48hJyhJTJct*7lfVnM_~BmZBHIo!V;t+m8n903+@dKm!Yal6R&_V@&! zZ0{6$U!wB>RoWUV$w)fm!|Oc@Xcsf!UTgCy**7j%-tJ}b6ekZeIDKj)!x~CqQ7f1V zc2{xh*sV?N^DL%24C)JZaBmb_(s|7twj`q^W~PbUTM^Ik#`?9PX9STmV`;0J$*;j^ zO5RZ~%Ch-&c5H7A$_mQM?Ys3zMr?H*6oTlv!eQ+1srhqXVFyZ8`{AYDxP^k$B+iw{ z_xWWpb>-fx%B5c3PR~pEGgb8rOD)A&-F*uIuye&uK*zB@+vlm5Ge7FTt3qT_OCh;% z7fHHcpQSiB6TNlL_d?vsjVO1Bk2ZOJ&WO1Jpq`VfC5vA{=<;3RQS^jr8Z`O1x|2z4 zKV=9G_cN#X_Dq7hRKiRtRPA4%WUB~AkX}nK`xJE~E%;fR&n#5jQxU`WfBq9?ychzy*AGA5px{Z_+9|pI8rt!$v==MfybO+RLmfcvpQJkNVuI z`ABhc+cmM3kH2|i253Gbw?w-IyPvP{R{Ff}51~q1)0g)Tk6y{^TUpy>7kdjfZ+pkQ z@?GENh9CScrx7$e4)S+#zUhl+WM1LG9-tr!+TfrBFXLlvt+89yQz-eE2VqR;RGS z?#D2LV~rR=P$VUz=Cksf#g0eHvVMt-QRiGy3un?7+D?mE0PK z1*GeS8DQ-frwy+jdGLN*4^U>ElDo zLm7HxmA#q1v2^|B*RNUbeLy1Us&o3W)^LSFSp)^!ENR66{k6=`-^0Lqpv%+kdTi zczl*X%sOx!5PUb%4C3hY71q{1utzTlRhYtSeUe^1$F>~6rBoh`+WK{IPrAP^^4>9L zB@s?+ntgrk3tGB)bWY4S$)7rkwqPj?GWrh8LUQJPi^3{;3myj3N250<`6`n1uoL=x zO+S8pm4V75LGANoKz}^GXf`K+1m$|H%zz95C!xG}qWPrCs{F~JDUkOn+pOPk3)|_w zJRVy$22{0^?KSrmsu5lLs{7s9?=isPwk~FEuBz=p(W9C}cJWrHO9v5;e9j_UxN=Fp zD4`)<4}QU@>;0+dY?_cJf zZvDD?pxiDx0Ck-}^W?k_iIOyaPXYiVj277WuLG{(n=vd97+#CzD`wgoGZ{k>jt%V0 zM~3IgIeGz;EoPxLmMAXY@ZCoy5?57R;V5${%T;G}*~X^w%4hMikMAD(1+8F!x!6qH z@jS#lrKk%^6dgmSU0e@A%Z4t^jRHXnFPglHmz!FCd}c#MCOCB0F&ArqsPmN}Dsol*E>5Zv&h1X8z>;a29c|fX*v(0dKSg z%*smld#8bG&3P6(xK4Z&up{^)^N@&ep-ia}j^==diYo})B;qdtt7H~3_$f!7cqDkUGjP(g$j5W%fbjVcJ1B556(%JNEy`;9-5yFr> z8Ju}o3W|Nw&{rDuSp3ZGWf$-`F>zq^ESy+vKCNe#N^TKL`?ciZ<981?d(UT+XC9e& zSXtQiK%KXpql@OHNGxc7#hP1qmG`^<4=$i*B145^>seEl?pRpt>;J0VE>$2PPVl4I zB2OPZA0~b;sVQb?b-jVhqvRzIw_oG;_ON#zg(*X$ep};=mU~}rNHc`g80)6dhroTh zeZNo1VHN6W8+SqdC4^F`YeYUJp$4l)JGV5N$#NTCG5iiQvO!e;vJfY58eQHXM@B8a zW+O=DTTdSU{hw*kb;!2?Q`TJAzKIyvM?bTChVjsCCTPYP8|+&d7xk~ zq!b`4Z&t1M)OxzFY;LLdQd8*?zk?!d3VJ+qR=>34cIsY83Z10I1@IQct1%mtx%2w>L6%i zDB(|GTIbN8g?+zrccS`q)v6~io@MPXSi{|1?Q&$6{3{GqK?~7a_~18QWf@o}CC{Xl zXOU(ItGJZpam2u{&uX-c)(tTac4OV!ud<%uQ(xs>vi1LZ&Ze6f7!W+zBCRy^QkWL? zK;C5&Qey5&$QM+bpq&Y>Mtigb*Iyl|Vf|ROw$SbpYj^{CYZeMW8 zi~KykzztF1*hc3+#_BiEkWb7<(R;Do^@U`V@Cy`DtL3VZ4((Rf(sG{Eghtv86o2v4 z=xOQGKOX2hRo}a;#8aX)9mc@T;`HrMw|otg-pg|FG{eq-%cP4%`aG5CdnIeTZ?8( z(Y?LM{Sp1nv#d%%piO!vqSR~i`ORSR{@3TB3$R&kSE=Wn_$EFZ1tcUK%z9);vwND7 zFQUAXu6b_@%3+jIDq_UeaHa9$A+WrFm^L{TH@9@oeY{~VvIEqh=4Nq@OL_xm?k3*Y zU>6ETe5(llZe+WB4KUZ>9HgP(cG1={Qm?k-RqN&VAXH&oz1Avr3sDizN0Tl-pVj<` zawwh(K8lk-J9lx3K4-7fO~L1sDh{gqAyXKMFS~z+J0EEw>#D80K3QPM&@WZIRq@(6 zTyp!JN_BPnhf2J6Bxe@<+B(ekET4cgMVV zQ7c00e8J=_mAD=xVm>B-R^z)KYF)mH9!cXwt}KnY0$_5rXfert|NO?mAeHNIchP$3 zK1;hBt%G4nhr&_L%TuRRmTS{*ZSUWX6SQvcw6z(TO-5=VrQ3}p`y?LBV_5&F`#tSds3A}1d z8XZfiGd~r$J~^$^*3#aoT-UNs6O$Z{iu13ml5o^l@(nnX_pBfV&32~~@#TFml+!0? zpw(_BJr-z5Z`mGgHl8UIl9udVETD@+jwLVzI_r)ew>SBw7RhaAa=nZFnkR5wKBQb( z7Os*j=CD(AYkT_PvQI8XsH3JSWnrq^#S8pl?=*pJRqo?sr8+rSVLHuqMAmFexcS;k zMtN*{Vt(2F+ch~AE^6q}nccwYddbkiWZLMIaZ&4u3&!zv7S^HDy6%%t9yMoMmBRha zGxsB6d{P`B4=m?s)dMBjJ2WEUdlmb7 z-8ZbE=C%TZkN->Y-6IIJyqX&9ckFew!;B?o7_bS6%wO(|Q~svQZJ|%)2&MOMp2{w| z1iZUO$`z_ARHqM@t*Cq#(cML&Yh102hYLNraUebmpDN)f*Iii78XF zjh!Yt%;1scOMthah+x8izztB)3mrzklu=(xT=q)v(3#22fQp{e#Se05Wj^1)ICLvy4T-1RDsPQ`pI-zLo}xdz zwIg|378U4xo6KB&p`lHu5I*#4(iRbSAzHGN{gl3pp~|&mKx?Xy(4xE^H~8T(4i7s( ziA7MKF-+hFH-5Zm5;RBZLb1iMix!24go9$Yw zBig8R)}%p-V_hCIOWJx@>GzjzKeWAkRo))$j$yvocc&_~id5;E2WBlTee~J>n$*KxhPNMKLDSz+!&ItLNglOy*k_QnhB z!{T7c_nqMona|Z$Gl>zE+AW<7_IbCDj4b(uX;sZC8X84ydMIQ%nXY{+pl!eae|lt$ zQ$@`0yTCc>`-@z6=LiYPl$-k)ZnNmNM+b#kP4(en$v0`FyVWN6^as6I4=%;;Wa=Z2t<@&9C2{Z8*B1c}OnSrMcvQXTk2TvqX^S&6<-HuA9M?4M}u3gOS**sEL z@ktVs4}`5V7RnuUV7wj=)3$aGP2>qV=k@kpHQb{AQ5D5atIX&(2O{)sKIk=cGrI2H z=9=UO7vh=$Y+kFr`hL1jz$;Yekl40u)ovCZ$}KJn>QY!k(TFcx=4-OT+TrIWP$T)& zWk|2`l020SiYKV-_>3UO>4hwg;<`q2qVy1}we8{Fns^medgiN15S7DU%ZJ1#E*cr2 zJXX|nxvIZuH;m3yU&QUle;5mm!TNqnS$qnWe3qGuLTLKA0N~d5ZjAkF+G>}+s08ML;)ah*M$(1TD+P~m zOd8}Xl5RiMejh5ATxfHGXdeu=D#zXlgu05-?TdaM8a#^^^)tcbget$|(oNTn_?fac zg;~HleqLPmt{ciA4hfILd-KT;*qP6gzLIvhMaNsV%{_Pz$LDT5Rwq(vtl+a%FpGtf z<^w|pmGBCQ0Uq%BWUHmzqQ#CbKXAg$B)LBbBpTHFvhNUqyy>B>2qxMZ$ZCow4 zk0G{Qk@%Ew@SO;nBcO4+b4MATGol;|oE=<%imem;E(h6H`q+3Nt&E`U$*4sazTFHDv;9&e!CLt7}$oNeK%n_6L1!1A@ zib3u|6~lyK#164^w+Jg=BSLm3a|++Ct7SWO#P+p@4oCI zgj{jFOm_jl%lENG+i|*7ncnZB{84QP+B?bkqEg#=c({9x(D|iQ8WeZooUzn|#p2;e zZX?VRU~ab58Y}`~7GEdX1G3wUXEiT)=nVhd>QmkMl|DQ2EE7^Oh!+~ELm36+yyRu< z4X*v3M%&@OsC|q?PG)g}=rW?*0YtrJwqA%cN*eId?@;RrAY$UMq~%@pC6r)grR2{H&^3QKT9MBX z(yNO*wI7#|YJRe*`sx+=)hY6;SHss^`1^f5RohxaY>pi&8rzAQgoLoi!@UFx$27F? z%tI#HIXgpxoVGhF+D((4!{uBLsoo;}Ow3ND4+Yy;i{y(IDNU zJkz8L8kW48h&*)#2`ZhouwHkk*L*@^VJgc#UH3diu#vRu!R$md^tI`H8uRYh0J+R~ zfGrcU*8R~i4)nK%psA`xn|#-Ha#;){o50&Dbi+>?4HOOv)-hd5@D+3|d=2qs9*du` zdO|PIIbT`?_%X1w6qmB<46uQ5WhgIyx}WaTEcnz`S`so{2(R<_Nm5S$dMirwCZX|n zgIp&=WxNrkIM>k16%@NgORoJ5$J=f+ogir>3PjqTfYe?8f(9PXg6!V3@;duIgn7%R zeT4RHgi)JXPp)?!gnaNX?rR^_B%Yh=rlb`Z1RCZ$$?89$byQZB^@j?G+G|<1sNeWp zTiangvj}R?bd9^Y=d=0{1&E!eE*U8W;2_6TWjBO{?$pFQ7!m+#O$o6z6PQsij6fgw zq&RiS5B;UG;MAz5slV?Z`Zjlnx*V_(%(Ri|r0GFGjDU4n&x7fKhB>bkgS+6VLh?}j zU5q9oGbOdU$+X20>A{GDZPVpOB{V`J_%9vN>pd#Zvh9jN(uO+L%dPXr=4T(3JnM@S zc{_?c6`xgQKPt!)Li% zk@?l`1#+jEZ=dwDiZQ}Lo$29Gq8(r11w+RPy~Tt1eORL8Q3GSKuo2>t%Poi;DF}Sg z%J9v+Hgp7Mu?$j#UxJP49}&R4%hQao!F~0Et_gw(|M7V+=(ECLVpe4%QrPrPA1gu! zqnu5I*BG&?FUat7owNiqR?Kgf7pWfI3#L8w$}Po)Fo23BWa*<$RP5{FfD)nMxMm)o z&;Uup;24&sY@1eLWznurqYZp6^RK-5#)HFEX6KPwh>Wax3`@eFagi{Bkc)ooLEpFP zmXgz(7_;BLE!AC6=rhUgH*eY$Bo`uP894n}Qlo? z%WI-5zLz_1wE7sld>aH;=oXKSF>9I7w&(8=F8<5nM0T`SCMJ)rsZgXjJC=clQUB@0 zqhpgpVPLk@QC5R)u0%8`Vhw#EK#f>71-V!Z5#9o)@^WFOKrTzoNY0en^0z47?UTr>wev7_H4%@>Z>dAcARgd$h({YEt@8hCDrV z;_^#7dJ#f)s%w|IC<(hvD`iB+qUrOl_6ufA-Lk^F-jY_+JiIf38&7ML&&Ru>_-|Bs z*-H8)Q+`V1?jE=V3x@ns47laV6+SZh;e!~lQ;xjVkh1p$XOVB*S8^$0fkweHT>pa% z8W9Cn2#QL|R32T~YWa)c`^S>bqrnBKU=Hk?Y$_n04CZCUd;gHAnjxk= zM_DdS`Js&S?vpm*!W>`S&TiAgxW@W$B2Dz83j+Dt5v}jEu#We2C8d=#rH}&r3o+%q zNwk677h3O5C=XvCbv?4PcTDcwpupI8Yb`M%s9ou$coIAE?~R$fEl zdu6?z*O`cpHSd%8j6If^9#|TV5$`%N`%y>;Lovm(1&_FATrCt&)*60UP-8`?3S85)kC>bislvEy5{f^+YiOthn#Ua&;)6%ETx zLP-SckerK?5!tnFR~5%DR%r%i(HL&f+H~@=rp!Upe+C*bUUP_bkbz?S>vF3Ruh!X3 z`MUGFePsilu`Tawqe_ct=)#&<#%y-psB4tOZHT3AzdH_6bm6mlbmjl0|8R=X6qua; znKBc&d_sx%TcDab)%0d`iTl#YD7JK_;+robGW<(*zu23a zf2E_nLPx!VN)Gr-mOD5Bz}eHJw(CjuRsN&RxqFf&#L`jC(ODc<;N@xctQh7m{7GfW zGyv^p0q;WGJ_Yk+<*uqiL97nAhUKk-CO6_5u1bOlh?P;zY8I#I>-O&Sk)%f`4RFVr z0I5JtI!Be+#))=!PZGNw8O0>mBrb2M!-M1%T!F-t@d-P=U4n)auv)E_pJ z7rDm@@@3Ao$<4le$WXSUi)H2))?P|l3@B<%LNMXRa?=4&FB!BPAH9 z%?=kCdJMaM9Mtug{@xk}_6MPfk=Z-J@ax}eJ*xuvu!a&~%f$E3)vQy<&O#;(KsSNM gLHWPP6)0tu5%$N}7P8Af|1FW1R*|ZcFbVm80KOU|>;M1& literal 0 HcmV?d00001 From 9446e3cd50f513232bcb52d3950af7c5b195358b Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Tue, 19 Jun 2018 14:57:41 +0200 Subject: [PATCH 86/89] Fix codeception deprecated call in API test --- tests/unit/API/MP/APITest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/API/MP/APITest.php b/tests/unit/API/MP/APITest.php index 8abf251ec1..2f3bb61a29 100644 --- a/tests/unit/API/MP/APITest.php +++ b/tests/unit/API/MP/APITest.php @@ -306,7 +306,7 @@ class APITest extends \MailPoetTest { new \MailPoet\API\MP\v1\API(), 'addSubscriber', array( - '_sendConfirmationEmail' => Stub::once() + '_sendConfirmationEmail' => Expected::once() ), $this); $segment = Segment::createOrUpdate( array( From 9308cffd45105e43e2433a825f777a68b7a3c925 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Tue, 19 Jun 2018 16:09:29 +0200 Subject: [PATCH 87/89] Refactor fetching newsletter options to respect its type [MAILPOET-1431] --- lib/API/JSON/v1/Newsletters.php | 7 +++--- lib/API/JSON/v1/SendingQueue.php | 3 +-- lib/Cron/Workers/Scheduler.php | 2 +- lib/Models/Newsletter.php | 13 +++++++++- lib/Newsletter/Scheduler/Scheduler.php | 2 +- tests/unit/API/JSON/v1/NewslettersTest.php | 6 ++--- tests/unit/API/MP/APITest.php | 13 +++++----- tests/unit/Cron/Workers/SchedulerTest.php | 24 +++++++++---------- tests/unit/Models/NewsletterTest.php | 6 ++--- .../Newsletter/Scheduler/SchedulerTest.php | 6 ++--- 10 files changed, 45 insertions(+), 37 deletions(-) diff --git a/lib/API/JSON/v1/Newsletters.php b/lib/API/JSON/v1/Newsletters.php index 536ce25f40..7a224a9284 100644 --- a/lib/API/JSON/v1/Newsletters.php +++ b/lib/API/JSON/v1/Newsletters.php @@ -99,8 +99,7 @@ class Newsletters extends APIEndpoint { } } // reload newsletter with updated options - $newsletter = Newsletter::filter('filterWithOptions') - ->findOne($newsletter->id); + $newsletter = Newsletter::filter('filterWithOptions', $newsletter->type)->findOne($newsletter->id); // if this is a post notification, process newsletter options and update its schedule if($newsletter->type === Newsletter::TYPE_NOTIFICATION) { // generate the new schedule from options and get the new "next run" date @@ -151,7 +150,7 @@ class Newsletters extends APIEndpoint { } $id = (isset($data['id'])) ? (int)$data['id'] : false; - $newsletter = Newsletter::filter('filterWithOptions')->findOne($id); + $newsletter = Newsletter::findOneWithOptions($id); if($newsletter === false) { return $this->errorResponse(array( @@ -487,7 +486,7 @@ class Newsletters extends APIEndpoint { && $data['type'] === Newsletter::TYPE_NOTIFICATION ) { - $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + $newsletter = Newsletter::filter('filterWithOptions', $data['type'])->findOne($newsletter->id); Scheduler::processPostNotificationSchedule($newsletter); } diff --git a/lib/API/JSON/v1/SendingQueue.php b/lib/API/JSON/v1/SendingQueue.php index 4eab9cea35..a6c4ba8902 100644 --- a/lib/API/JSON/v1/SendingQueue.php +++ b/lib/API/JSON/v1/SendingQueue.php @@ -25,8 +25,7 @@ class SendingQueue extends APIEndpoint { ); // check that the newsletter exists - $newsletter = Newsletter::filter('filterWithOptions') - ->findOne($newsletter_id); + $newsletter = Newsletter::findOneWithOptions($newsletter_id); if($newsletter === false) { return $this->errorResponse(array( diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index 304c447de1..82ede9afc1 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -33,7 +33,7 @@ class Scheduler { if(!count($scheduled_queues)) return false; $this->updateTasks($scheduled_queues); foreach($scheduled_queues as $i => $queue) { - $newsletter = Newsletter::filter('filterWithOptions')->findOne($queue->newsletter_id); + $newsletter = Newsletter::findOneWithOptions($queue->newsletter_id); if(!$newsletter || $newsletter->deleted_at !== null) { $queue->delete(); } elseif($newsletter->status !== Newsletter::STATUS_ACTIVE && $newsletter->status !== Newsletter::STATUS_SCHEDULED) { diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php index d9d0db62d1..ad4a7debc5 100644 --- a/lib/Models/Newsletter.php +++ b/lib/Models/Newsletter.php @@ -666,10 +666,13 @@ class Newsletter extends Model { return $orm; } - static function filterWithOptions($orm) { + static function filterWithOptions($orm, $type) { $orm = $orm->select(MP_NEWSLETTERS_TABLE.'.*'); $optionFields = NewsletterOptionField::findArray(); foreach($optionFields as $optionField) { + if($optionField['newsletter_type'] !== $type) { + continue; + } $orm = $orm->select_expr( 'IFNULL(GROUP_CONCAT(CASE WHEN ' . MP_NEWSLETTER_OPTION_FIELDS_TABLE . '.id=' . $optionField['id'] . ' THEN ' . @@ -981,4 +984,12 @@ class Newsletter extends Model { return (Helpers::isJson($this->meta)) ? json_decode($this->meta, true) : $this->meta; } + + static function findOneWithOptions($id) { + $newsletter = self::findOne($id); + if($newsletter === false) { + return false; + } + return self::filter('filterWithOptions', $newsletter->type)->findOne($id); + } } diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index 4edfcf3064..ce68bc50ec 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -228,7 +228,7 @@ class Scheduler { return Newsletter::getPublished() ->filter('filterType', $type, $group) ->filter('filterStatus', Newsletter::STATUS_ACTIVE) - ->filter('filterWithOptions') + ->filter('filterWithOptions', $type) ->findMany(); } diff --git a/tests/unit/API/JSON/v1/NewslettersTest.php b/tests/unit/API/JSON/v1/NewslettersTest.php index 4d171132c2..abcd55c577 100644 --- a/tests/unit/API/JSON/v1/NewslettersTest.php +++ b/tests/unit/API/JSON/v1/NewslettersTest.php @@ -132,7 +132,7 @@ class NewslettersTest extends \MailPoetTest { $router = new Newsletters(); $response = $router->save($valid_data); - $saved_newsletter = Newsletter::filter('filterWithOptions') + $saved_newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_STANDARD) ->findOne($response->data['id']); expect($response->status)->equals(APIResponse::STATUS_OK); expect($response->data)->equals($saved_newsletter->asArray()); @@ -253,7 +253,7 @@ class NewslettersTest extends \MailPoetTest { ) ); $response = $router->save($newsletter_data); - $saved_newsletter = Newsletter::filter('filterWithOptions') + $saved_newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($response->data['id']); expect($response->status)->equals(APIResponse::STATUS_OK); expect($response->data)->equals($saved_newsletter->asArray()); @@ -261,7 +261,7 @@ class NewslettersTest extends \MailPoetTest { // schedule should be recalculated when options change $newsletter_data['options']['intervalType'] = Scheduler::INTERVAL_IMMEDIATELY; $response = $router->save($newsletter_data); - $saved_newsletter = Newsletter::filter('filterWithOptions') + $saved_newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($response->data['id']); expect($response->status)->equals(APIResponse::STATUS_OK); expect($saved_newsletter->schedule)->equals('* * * * *'); diff --git a/tests/unit/API/MP/APITest.php b/tests/unit/API/MP/APITest.php index 2f3bb61a29..71c6cc9ea6 100644 --- a/tests/unit/API/MP/APITest.php +++ b/tests/unit/API/MP/APITest.php @@ -408,15 +408,14 @@ class APITest extends \MailPoetTest { } function testItThrowsWhenConfirmationEmailFailsToSend() { - $API = Stub::makeEmptyExcept( - new \MailPoet\API\MP\v1\API(), - 'addSubscriber', - array( - '_sendConfirmationEmail' => function($subscriber) { + $API = new \MailPoet\API\MP\v1\API(); + Mock::double($API, array( + '_sendConfirmationEmail' => function ($subscriber) { $subscriber->setError('Big Error'); return false; - }, - ), $this); + } + ) + ); $segment = Segment::createOrUpdate( array( 'name' => 'Default', diff --git a/tests/unit/Cron/Workers/SchedulerTest.php b/tests/unit/Cron/Workers/SchedulerTest.php index e3d77ba8b8..1ce0b065b8 100644 --- a/tests/unit/Cron/Workers/SchedulerTest.php +++ b/tests/unit/Cron/Workers/SchedulerTest.php @@ -77,7 +77,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field = $this->_createNewsletterOptionField('intervalType', Newsletter::TYPE_WELCOME); $newsletter_option = $this->_createNewsletterOption($newsletter_option_field->id, $newsletter->id, 'immediately'); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -93,7 +93,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field = $this->_createNewsletterOptionField('intervalType', Newsletter::TYPE_WELCOME); $newsletter_option = $this->_createNewsletterOption($newsletter_option_field->id, $newsletter->id, 'daily'); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -103,7 +103,7 @@ class SchedulerTest extends \MailPoetTest { $queue = $this->_createQueue($newsletter->id); $newsletter_option->value = 'daily'; $newsletter_option->save(); - $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME)->findOne($newsletter->id); expect($queue->scheduled_at)->null(); $newsletter->schedule = '0 5 * * *'; // set it to daily at 5 $scheduler->deleteQueueOrUpdateNextRunDate($queue, $newsletter); @@ -123,7 +123,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field->id, $newsletter->id, 'author' ); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -146,7 +146,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field->id, $newsletter->id, 'author' ); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -168,7 +168,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field->id, $newsletter->id, 'author' ); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -188,7 +188,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option = $this->_createNewsletterOption( $newsletter_option_field->id, $newsletter->id, \MailPoet\Newsletter\Scheduler\Scheduler::WORDPRESS_ALL_ROLES); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -292,7 +292,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter = $this->_createNewsletter(); $newsletter_option_field = $this->_createNewsletterOptionField('segment', Newsletter::TYPE_NOTIFICATION); $newsletter_option = $this->_createNewsletterOption($newsletter_option_field->id, $newsletter->id, $segment->id); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -315,7 +315,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field->id, $newsletter->id, $segment->id ); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -342,7 +342,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field->id, $newsletter->id, $segment->id ); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -364,7 +364,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field->id, $newsletter->id, $segment->id ); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); $queue = $this->_createQueue($newsletter->id); $scheduler = new Scheduler(); @@ -426,7 +426,7 @@ class SchedulerTest extends \MailPoetTest { $newsletter_option_field->id, $newsletter->id, $segment->id ); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_NOTIFICATION) ->findOne($newsletter->id); $scheduler = new Scheduler(); $finder = Mock::double('MailPoet\Segments\SubscribersFinder'); diff --git a/tests/unit/Models/NewsletterTest.php b/tests/unit/Models/NewsletterTest.php index 9dffe756df..9db86a02fb 100644 --- a/tests/unit/Models/NewsletterTest.php +++ b/tests/unit/Models/NewsletterTest.php @@ -273,7 +273,7 @@ class NewsletterTest extends \MailPoetTest { function testItCanHaveOptions() { $newsletter_options = array( 'name' => 'Event', - 'newsletter_type' => 'welcome', + 'newsletter_type' => Newsletter::TYPE_WELCOME, ); $option_field = NewsletterOptionField::create(); $option_field->hydrate($newsletter_options); @@ -283,7 +283,7 @@ class NewsletterTest extends \MailPoetTest { $association->option_field_id = $option_field->id; $association->value = 'list'; $association->save(); - $newsletter = Newsletter::filter('filterWithOptions') + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_WELCOME) ->findOne($this->newsletter->id); expect($newsletter->Event)->equals($association->value); } @@ -871,7 +871,7 @@ class NewsletterTest extends \MailPoetTest { expect($newsletter->getMeta())->isEmpty(); // if meta option exists, it should be returned as an array - $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); expect($newsletter->getMeta())->equals($meta); } diff --git a/tests/unit/Newsletter/Scheduler/SchedulerTest.php b/tests/unit/Newsletter/Scheduler/SchedulerTest.php index da02fd679d..ec6f68c302 100644 --- a/tests/unit/Newsletter/Scheduler/SchedulerTest.php +++ b/tests/unit/Newsletter/Scheduler/SchedulerTest.php @@ -513,7 +513,7 @@ class SchedulerTest extends \MailPoetTest { 'afterTimeNumber' => 2 ) ); - $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); $subscriber = Subscriber::create(); $subscriber->hydrate(Fixtures::get('subscriber_template')); $subscriber->save(); @@ -544,7 +544,7 @@ class SchedulerTest extends \MailPoetTest { 'afterTimeNumber' => 2 ) ); - $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); $subscriber = Subscriber::create(); $subscriber->hydrate(Fixtures::get('subscriber_template')); $subscriber->save(); @@ -567,7 +567,7 @@ class SchedulerTest extends \MailPoetTest { 'afterTimeNumber' => 2 ) ); - $newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); Scheduler::createAutomaticEmailSendingTask($newsletter, $subscriber = null, $meta = null); // new scheduled task should be created From 4bd68ebc5fed4f60b44a993401756ec9792253da Mon Sep 17 00:00:00 2001 From: "Fred. P" Date: Wed, 20 Jun 2018 13:27:18 +0200 Subject: [PATCH 88/89] Release 3.7.7 --- mailpoet.php | 4 ++-- package-lock.json | 49 ++++++++++++++++++++++++++++++++++------------- readme.txt | 15 ++++++++++++++- 3 files changed, 52 insertions(+), 16 deletions(-) diff --git a/mailpoet.php b/mailpoet.php index bca436c42e..f7eb8c98d1 100644 --- a/mailpoet.php +++ b/mailpoet.php @@ -4,7 +4,7 @@ if(!defined('ABSPATH')) exit; /* * Plugin Name: MailPoet 3 (New) - * Version: 3.7.6 + * Version: 3.7.7 * Plugin URI: http://www.mailpoet.com * Description: Create and send newsletters, post notifications and welcome emails from your WordPress. * Author: MailPoet @@ -18,7 +18,7 @@ if(!defined('ABSPATH')) exit; */ $mailpoet_plugin = array( - 'version' => '3.7.6', + 'version' => '3.7.7', 'filename' => __FILE__, 'path' => dirname(__FILE__), 'autoloader' => dirname(__FILE__) . '/vendor/autoload.php', diff --git a/package-lock.json b/package-lock.json index 8e5512bc3e..b2078d14b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1330,7 +1330,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base": { "version": "0.11.2", @@ -1450,6 +1451,7 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1862,7 +1864,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -3395,7 +3398,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3416,12 +3420,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3436,17 +3442,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -3563,7 +3572,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -3575,6 +3585,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3589,6 +3600,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3596,12 +3608,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -3620,6 +3634,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3700,7 +3715,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3712,6 +3728,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3797,7 +3814,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -3833,6 +3851,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3852,6 +3871,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3895,12 +3915,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -5257,6 +5279,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } diff --git a/readme.txt b/readme.txt index 6f7bdd34b3..d66a8408f5 100644 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Tags: newsletter, email, welcome email, post notification, autoresponder, signup Requires at least: 4.7 Tested up to: 4.9 Requires PHP: 5.6 -Stable tag: 3.7.6 +Stable tag: 3.7.7 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html @@ -118,6 +118,19 @@ Stop by our [support site](https://www.mailpoet.com/support). == Changelog == += 3.7.7 - 2018-06-20 = +* Changed: MailPoet 3 to no longer work with PHP version 5.3 or older. Please upgrade to PHP 7! +* Added: exit user survey; +* Added: retina display optimized images for MailPoet 3 WordPress plugin entry; +* Fixed: welcome emails are not being sent; +* Fixed: non-Premium users now see a proper call to action for WooCommerce automatic email events; +* Fixed: errors when using Title Only and Display as List setting in ALC content block; +* Fixed: API reports errors when confirmation emails aren't sent. Thanks, Team BrainstormForce; +* Fixed: in some cases, button fonts in newsletter would display in preview incorrectly; +* Fixed: using double quotes cause rendering issues; +* Fixed: MailPoet translation string should not be available on translate.wordpress.org; +* Fixed: word "beta" is duplicated on WooCommerce automatic email select screen; + = 3.7.6 - 2018-06-12 = * Fixed: Woocommerce email template thumbnail overflowing over content. * Fixed: Newsletters created before 3.7.4 now follow featured image display rules implemented in latest release; From fe9038d5a0eb15ada988a2263711d603fbb05214 Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Fri, 22 Jun 2018 10:08:12 +0200 Subject: [PATCH 89/89] Update required php version in composer [MAILPOET-1437] --- composer.json | 2 +- composer.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index db4029c922..1aac86b781 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ } ], "require": { - "php": ">=5.3.3", + "php": ">=5.4", "twig/twig": "1.*", "cerdic/css-tidy": "^1.5.5", "tburry/pquery": "^1.1.1", diff --git a/composer.lock b/composer.lock index cbeb7a8979..04bfdaac31 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "3568eadc55d255e9be1c63f0bf38cf7b", + "content-hash": "b3af53db5ffa008581492e9a33078474", "packages": [ { "name": "cerdic/css-tidy", @@ -8277,7 +8277,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.3.3" + "php": ">=5.4" }, "platform-dev": [], "platform-overrides": {