diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000000..5afce70373 --- /dev/null +++ b/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "es2015", "react", "stage-2" + ] +} 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/box.styl b/assets/css/src/box.styl index 374e80b5c0..181fcfb3c5 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% @@ -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,12 +147,16 @@ $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 max-height: $box-description-height padding-bottom: 0 - overflow: hidden word-wrap: break-word overflow-wrap: break-word 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..4b0f5cb802 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 +$video-guide-badge-color = #46b450 #newsletters_container h2.nav-tab-wrapper @@ -31,14 +32,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 @@ -51,3 +46,20 @@ $green-badge-color = #55bd56 &_green background: $green-badge-color + + &_video + background: $video-guide-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/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 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/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/assets/img/blank_templates/fake-logo.png b/assets/img/blank_templates/fake-logo.png index 6f75a4f887..78303c535e 100644 Binary files a/assets/img/blank_templates/fake-logo.png and b/assets/img/blank_templates/fake-logo.png differ diff --git a/assets/img/mailpoet_logo_newsletter.png b/assets/img/mailpoet_logo_newsletter.png index a4ce35d262..2b69adb118 100644 Binary files a/assets/img/mailpoet_logo_newsletter.png and b/assets/img/mailpoet_logo_newsletter.png differ 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/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 }) + ), }; }, }, 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 new file mode 100644 index 0000000000..a95a8fdafc --- /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/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 064b37810c..bde666dcae 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'; @@ -215,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': @@ -310,9 +311,7 @@ const NewsletterListNotification = React.createClass({ render: function render() { return (
    -

    - {MailPoet.I18n.t('pageTitle')} {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..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,9 +98,7 @@ const NewsletterListNotificationHistory = React.createClass({ render: function render() { return (
    -

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

    + diff --git a/assets/js/src/newsletters/listings/standard.jsx b/assets/js/src/newsletters/listings/standard.jsx index 3cc43048c5..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 06ec73396a..1922c9cb8c 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'; @@ -210,8 +210,8 @@ const NewsletterListWelcome = React.createClass({ ); } sendingEvent = MailPoet.I18n.t('welcomeEventSegment').replace( - '%$1s', segment.name - ); + '%$1s', segment.name + ); break; } @@ -293,9 +293,7 @@ const NewsletterListWelcome = React.createClass({ render: function render() { return (
    -

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

    + diff --git a/assets/js/src/newsletters/send.jsx b/assets/js/src/newsletters/send.jsx index 65796814ea..158b3f9aef 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) => { @@ -106,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( @@ -239,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; }, @@ -286,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({ @@ -360,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/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/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index 84cb328afd..9c58d21416 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 ( @@ -136,8 +139,13 @@ const NewsletterTypes = React.createClass({ {type.thumbnailImage ? : null}
    -

    {type.title}

    +

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

    {type.description}

    + { type.videoGuide && ( +
    + {MailPoet.I18n.t('seeVideoGuide')} + + ) }
    @@ -145,7 +153,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 752390f7e9..819bfbd639 100644 --- a/assets/js/src/newsletters/types/automatic_emails/event.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/event.jsx @@ -6,8 +6,9 @@ import PropTypes from 'prop-types'; class AutomaticEmailEvent extends React.PureComponent { render() { const event = this.props.event; - let action; + const disabled = event.soon; + let action; if (this.props.premium) { action = ( ); + } else if (event.actionButtonLink && event.actionButtonTitle) { + action = ( + + {event.actionButtonTitle} + + ); } else { - const disabled = event.soon; - action = (
    -

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

    +

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

    {event.badge ? ( {event.badge.text} - ) : '' + ) : '' }

    {event.description}

    @@ -58,8 +66,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..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 ( @@ -42,7 +42,7 @@ class AutomaticEmailEventsList extends React.Component { return (

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

    @@ -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; 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/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 ( -
    -

    {MailPoet.I18n.t('wooCommerceSelectEventHeading')}

    - - - -
    -
    - ); - }, -}); - -module.exports = WooCommerceAutomaticEmail; 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/composer.json b/composer.json index b601f095a5..1aac86b781 100644 --- a/composer.json +++ b/composer.json @@ -6,34 +6,33 @@ } ], "require": { - "php": ">=5.3.3", + "php": ">=5.4", "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", "soundasleep/html2text": "dev-master", "sabberworm/php-css-parser": "^8.1", - "symfony/polyfill-xml": "^1.3", - "symfony/polyfill-mbstring": "1.6.0", + "symfony/polyfill-php72": "^1.8", + "symfony/polyfill-mbstring": "1.8.0", "sensiolabs/security-checker": "^4.1" }, "require-dev": { "codeception/aspect-mock": "2.0.1", - "codeception/codeception": "2.3.5", - "codeception/verify": "^0.3.3", - "consolidation/robo": "^1.0.5", + "codeception/codeception": "2.4.2", + "codeception/verify": "^0.4.0", + "consolidation/robo": "^1.3.0", "henrikbjorn/lurker": "^1.2", - "lucatume/wp-browser": "1.21.20", - "phpunit/phpunit": "4.8.21", + "lucatume/wp-browser": "1.21.23", + "phpunit/phpunit": "5.7.27", "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" + "wimg/php-compatibility": "^7.1.2" }, "autoload": { "psr-4": { @@ -44,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 1322c66f00..04bfdaac31 100644 --- a/composer.lock +++ b/composer.lock @@ -4,31 +4,37 @@ "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": "b3af53db5ffa008581492e9a33078474", "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,20 +43,20 @@ } ], "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", - "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": { @@ -59,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" }, @@ -93,26 +99,27 @@ "ssl", "tls" ], - "time": "2017-11-29T09:37:33+00:00" + "time": "2018-03-29T19:57:20+00:00" }, { "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", @@ -154,26 +161,29 @@ "orm", "query builder" ], - "time": "2017-03-21T01:31:25+00:00" + "time": "2018-05-30T23:57:49+00:00" }, { "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": [ @@ -214,7 +224,7 @@ "orm", "paris" ], - "time": "2014-09-23T10:49:36+00:00" + "time": "2017-03-21T02:13:30+00:00" }, { "name": "mtdowling/cron-expression", @@ -262,35 +272,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/", @@ -311,7 +316,7 @@ "datetime", "time" ], - "time": "2017-01-16T07:55:07+00:00" + "time": "2018-05-29T15:23:46+00:00" }, { "name": "psr/log", @@ -406,16 +411,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": { @@ -447,7 +452,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", @@ -500,20 +505,20 @@ "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", - "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": { @@ -548,26 +553,26 @@ } ], "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", - "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": { @@ -622,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": { @@ -678,20 +683,20 @@ ], "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", - "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": { @@ -703,7 +708,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -737,20 +742,20 @@ "portable", "shim" ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2018-04-26T10:06:28+00:00" }, { "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": { @@ -759,7 +764,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.8-dev" } }, "autoload": { @@ -792,68 +797,20 @@ "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", - "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": { @@ -870,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": "" }, @@ -904,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", @@ -1027,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": { @@ -1064,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", @@ -1121,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": { @@ -1176,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", @@ -1223,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": [ @@ -1314,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": { @@ -1350,39 +1382,42 @@ } ], "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", - "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": { @@ -1396,7 +1431,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -1427,7 +1462,7 @@ "dependency", "package" ], - "time": "2017-12-01T13:42:57+00:00" + "time": "2018-05-04T09:44:59+00:00" }, { "name": "composer/semver", @@ -1493,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", @@ -1550,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": { @@ -1575,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", @@ -1601,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": { @@ -1650,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": { @@ -1672,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", @@ -1698,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": { @@ -1720,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": { @@ -1747,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": { @@ -1808,9 +1860,6 @@ } }, "autoload": { - "classmap": [ - "scripts/composer/ScriptHandler.php" - ], "psr-4": { "Robo\\": "src" } @@ -1826,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", @@ -2200,34 +2249,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": { @@ -2251,7 +2305,7 @@ "selenium", "webdriver" ], - "time": "2017-11-15T11:08:09+00:00" + "time": "2018-05-16T17:37:13+00:00" }, { "name": "goaop/framework", @@ -2368,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", @@ -2412,20 +2514,20 @@ } ], "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", - "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": { @@ -2435,7 +2537,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": { @@ -2444,7 +2546,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -2477,7 +2579,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -2597,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": { @@ -2854,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": { @@ -2872,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" @@ -2916,7 +3018,65 @@ "json", "schema" ], - "time": "2017-10-21T13:15:38+00:00" + "time": "2018-02-14T22:26:30+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", @@ -3027,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": { @@ -3085,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", @@ -3134,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" }, @@ -3160,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/" @@ -3184,7 +3354,7 @@ "password", "wordpress" ], - "time": "2015-02-12T03:09:57+00:00" + "time": "2018-01-11T14:12:02+00:00" }, { "name": "mustache/mustache", @@ -3232,6 +3402,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", @@ -3326,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": { @@ -3367,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", @@ -3520,28 +3736,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": { @@ -3579,43 +3795,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": { @@ -3641,7 +3858,7 @@ "testing", "xunit" ], - "time": "2015-10-06T15:47:00+00:00" + "time": "2017-04-02T07:44:40+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3831,40 +4048,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": [ @@ -3873,7 +4100,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.8.x-dev" + "dev-master": "5.7.x-dev" } }, "autoload": { @@ -3899,30 +4126,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": "*" @@ -3930,7 +4160,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "3.2.x-dev" } }, "autoload": { @@ -3955,7 +4185,7 @@ "mock", "xunit" ], - "time": "2015-10-02T06:51:40+00:00" + "time": "2017-06-30T09:13:00+00:00" }, { "name": "psr/container", @@ -4101,58 +4331,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", @@ -4202,6 +4380,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", @@ -4320,28 +4543,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": { @@ -4366,25 +4589,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": "*", @@ -4393,7 +4616,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -4433,7 +4656,7 @@ "export", "exporter" ], - "time": "2016-06-17T09:04:28+00:00" + "time": "2016-11-19T08:54:04+00:00" }, { "name": "sebastian/global-state", @@ -4487,17 +4710,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": { @@ -4509,7 +4778,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -4537,23 +4806,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/" @@ -4572,7 +4891,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", @@ -4624,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" @@ -4669,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", @@ -4715,59 +5034,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-12 11:58:38" - }, { "name": "squizlabs/php_codesniffer", "version": "2.9.1", @@ -4846,63 +5112,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": { @@ -4946,25 +5167,26 @@ ], "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", - "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", @@ -4972,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" }, @@ -5008,20 +5231,20 @@ ], "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", - "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": { @@ -5061,20 +5284,20 @@ ], "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", - "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": { @@ -5082,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" }, @@ -5131,24 +5354,25 @@ ], "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", - "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": { @@ -5187,7 +5411,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", @@ -5251,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": { @@ -5296,20 +5521,20 @@ ], "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", - "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": { @@ -5345,7 +5570,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", @@ -5550,6 +5775,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", @@ -5610,16 +5890,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": { @@ -5655,7 +5935,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", @@ -5875,16 +6155,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": { @@ -5926,7 +6206,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", @@ -6085,16 +6365,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": { @@ -6131,7 +6411,7 @@ "check", "validate" ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2018-01-29T19:49:41+00:00" }, { "name": "wimg/php-compatibility", @@ -6220,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": { @@ -6279,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": { @@ -6308,7 +6588,8 @@ }, "bundled": true, "commands": [ - "checksum core" + "core verify-checksums", + "plugin verify-checksums" ] }, "autoload": { @@ -6332,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": "*" @@ -6360,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": { @@ -6382,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": { @@ -6413,6 +6707,7 @@ }, "bundled": true, "commands": [ + "core", "core check-update", "core download", "core install", @@ -6443,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": { @@ -6472,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" ] }, @@ -6499,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": { @@ -6530,6 +6826,7 @@ }, "bundled": true, "commands": [ + "db", "db create", "db drop", "db reset", @@ -6543,7 +6840,8 @@ "db import", "db search", "db tables", - "db size" + "db size", + "db columns" ] }, "autoload": { @@ -6565,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": { @@ -6596,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": { @@ -6643,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": { @@ -6695,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": { @@ -6749,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": { @@ -6778,6 +7257,7 @@ }, "bundled": true, "commands": [ + "plugin", "plugin activate", "plugin deactivate", "plugin delete", @@ -6791,6 +7271,7 @@ "plugin toggle", "plugin uninstall", "plugin update", + "theme", "theme activate", "theme delete", "theme disable", @@ -6799,6 +7280,7 @@ "theme install", "theme is-installed", "theme list", + "theme mod", "theme mod get", "theme mod set", "theme mod remove", @@ -6827,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": { @@ -6880,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": { @@ -6909,6 +7391,7 @@ }, "commands": [ "language", + "language core", "language core activate", "language core install", "language core list", @@ -6936,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": { @@ -6991,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", @@ -7045,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": { @@ -7097,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": { @@ -7149,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": { @@ -7175,6 +7658,7 @@ "dev-master": "1.x-dev" }, "commands": [ + "rewrite", "rewrite flush", "rewrite list", "rewrite structure" @@ -7200,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": { @@ -7228,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" @@ -7258,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", @@ -7295,8 +7782,7 @@ "scaffold post-type", "scaffold taxonomy", "scaffold theme-tests" - ], - "bundled": true + ] }, "autoload": { "psr-4": { @@ -7317,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": { @@ -7370,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": { @@ -7423,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": { @@ -7479,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": { @@ -7505,6 +7989,7 @@ "dev-master": "1.x-dev" }, "commands": [ + "super-admin", "super-admin add", "super-admin list", "super-admin remove" @@ -7530,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": { @@ -7558,6 +8043,7 @@ "dev-master": "1.x-dev" }, "commands": [ + "widget", "widget add", "widget deactivate", "widget delete", @@ -7565,6 +8051,7 @@ "widget move", "widget reset", "widget update", + "sidebar", "sidebar list" ], "bundled": true @@ -7588,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": { @@ -7631,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", @@ -7667,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", @@ -7686,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", @@ -7740,13 +8272,15 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "soundasleep/html2text": 20, - "simplyadmire/composer-plugins": 20 + "soundasleep/html2text": 20 }, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.3.3" + "php": ">=5.4" }, - "platform-dev": [] + "platform-dev": [], + "platform-overrides": { + "php": "5.6.30" + } } 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/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/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/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..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) { @@ -213,7 +214,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 +302,9 @@ class Initializer { } return WPNotice::displayError($exception); } -} \ No newline at end of file + + function setupDeactivationSurvey() { + $survey = new DeactivationSurvey($this->renderer); + $survey->init(); + } +} diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 385f7d6d20..8ffc870bf0 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,6 +438,8 @@ class Menu { ) ); + $data['is_new_user'] = $this->isNewUser(); + $data = array_merge($data, Installer::getPremiumStatus()); $this->displayPage('settings.html', $data); @@ -541,6 +543,8 @@ class Menu { $data['items_per_page'] = $this->getLimitPerPage('forms'); $data['segments'] = Segment::findArray(); + $data['is_new_user'] = $this->isNewUser(); + $this->displayPage('forms.html', $data); } @@ -577,7 +581,59 @@ 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', + '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'), + '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(); wp_enqueue_script('jquery-ui'); wp_enqueue_script('jquery-ui-datepicker'); @@ -609,6 +665,9 @@ class Menu { 'month_names' => Block\Date::getMonthNames(), 'sub_menu' => 'mailpoet-subscribers' )); + + $data['is_new_user'] = $this->isNewUser(); + $this->displayPage('subscribers/importExport/import.html', $data); } @@ -747,4 +806,14 @@ class Menu { $notice->displayWPNotice(); } } + + function isNewUser() { + $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/Config/Migrator.php b/lib/Config/Migrator.php index 7038655b5e..dcb79b0642 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,', @@ -278,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),', 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/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index 384f388b80..82ede9afc1 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -5,6 +5,8 @@ namespace MailPoet\Cron\Workers; 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; @@ -29,9 +31,9 @@ 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); + $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) { @@ -42,6 +44,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); } @@ -99,6 +103,31 @@ 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; + } + } else { + $subscribers = $queue->getSubscribers(); + $subscriber = (!empty($subscribers) && is_array($subscribers)) ? + Subscriber::findOne($subscribers[0]) : + false; + if(!$subscriber) { + $queue->delete(); + return false; + } + } + + $queue->status = null; + $queue->save(); + return true; + } + function processScheduledStandardNewsletter($newsletter, $queue) { $segments = $newsletter->segments()->findArray(); $finder = new SubscribersFinder(); @@ -177,6 +206,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/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/Models/Newsletter.php b/lib/Models/Newsletter.php index 0e955cd46f..ad4a7debc5 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 @@ -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 ' . @@ -840,7 +843,6 @@ class Newsletter extends Model { NewsletterOptionField::$_table, array( 'option_fields.newsletter_type', '=', self::$_table . '.type', - 'option_fields.name', '=', 'group' ), 'option_fields' ) @@ -976,4 +978,18 @@ 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; + } + + 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/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/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/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/Editor/PostTransformer.php b/lib/Newsletter/Editor/PostTransformer.php index 8e4a19fbd1..e9f08ceb7d 100644 --- a/lib/Newsletter/Editor/PostTransformer.php +++ b/lib/Newsletter/Editor/PostTransformer.php @@ -5,6 +5,7 @@ use MailPoet\Newsletter\Editor\PostContentManager; use MailPoet\Newsletter\Editor\MetaInformationManager; use MailPoet\Newsletter\Editor\StructureTransformer; use MailPoet\Newsletter\Editor\LayoutHelper; +use MailPoet\WP\Functions as WPFunctions; if(!defined('ABSPATH')) exit; @@ -16,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'; } @@ -42,8 +43,8 @@ class PostTransformer { $featured_image = $this->getFeaturedImage($post); $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') { @@ -51,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); } } @@ -65,10 +66,10 @@ class PostTransformer { $featured_image = $this->getFeaturedImage($post); $position = $this->args['featuredImagePosition']; - + if(!$featured_image || $position === 'none' || $this->args['displayType'] !== 'excerpt') { array_unshift($content, $title); - + return array( LayoutHelper::row(array( LayoutHelper::col($content) @@ -147,12 +148,7 @@ class PostTransformer { } $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/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 +} 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/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index c02c0fcb5e..ce68bc50ec 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); } } } @@ -38,13 +38,25 @@ 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::createWelcomeNotificationQueue($newsletter, $subscriber_id); + $result[] = self::createWelcomeNotificationSendingTask($newsletter, $subscriber_id); } } + return $result; + } + + 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::createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta); + } } static function scheduleWPUserWelcomeNotification( @@ -69,45 +81,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)); - $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; - return $queue->save(); + $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 $sending_task->save(); } - static function createPostNotificationQueue($newsletter) { + static function createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta) { + $sending_task = SendingTask::create(); + $sending_task->newsletter_id = $newsletter->id; + if($newsletter->sendTo === 'user' && $subscriber_id) { + $sending_task->setSubscribers(array($subscriber_id)); + } + if($meta) { + $sending_task->__set('meta', $meta); + } + $sending_task->status = SendingQueue::STATUS_SCHEDULED; + $sending_task->priority = SendingQueue::PRIORITY_MEDIUM; + $sending_task->scheduled_at = self::getScheduledTimeWithDelay( + $newsletter->afterTimeType, + $newsletter->afterTimeNumber + ); + return $sending_task->save(); + } + + static function createPostNotificationSendingTask($newsletter) { $existing_notification_history = Newsletter::where('parent_id', $newsletter->id) ->where('type', Newsletter::TYPE_NOTIFICATION_HISTORY) ->where('status', Newsletter::STATUS_SENDING) @@ -115,7 +131,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 @@ -123,12 +138,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) { @@ -195,11 +210,25 @@ class Scheduler { return $previous_run_date; } - static function getNewsletters($type) { + static function getScheduledTimeWithDelay($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; + } + } + + static function getNewsletters($type, $group = false) { return Newsletter::getPublished() - ->filter('filterType', $type) + ->filter('filterType', $type, $group) ->filter('filterStatus', Newsletter::STATUS_ACTIVE) - ->filter('filterWithOptions') + ->filter('filterWithOptions', $type) ->findMany(); } 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/lib/Router/Endpoints/ViewInBrowser.php b/lib/Router/Endpoints/ViewInBrowser.php index 7e8a961d63..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; @@ -101,4 +106,4 @@ class ViewInBrowser { status_header(404); exit; } -} \ No newline at end of file +} 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; } diff --git a/lib/Tasks/Sending.php b/lib/Tasks/Sending.php index 0cc44c4d2b..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( @@ -227,6 +228,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(); @@ -238,7 +240,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/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/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/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 @@ '3.7.4', + 'version' => '3.7.7', 'filename' => __FILE__, 'path' => dirname(__FILE__), 'autoloader' => dirname(__FILE__) . '/vendor/autoload.php', @@ -43,7 +41,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 +64,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); diff --git a/package-lock.json b/package-lock.json index 8e85822b47..b2078d14b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,14 +2,9 @@ "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" + "version": "github:carldanley/WP-JS-Hooks#36b53ee6a56de37849456b67205c9784a00118b1", + "from": "github:carldanley/WP-JS-Hooks" }, "abab": { "version": "1.0.4", @@ -24,18 +19,35 @@ "dev": true }, "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "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", "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "dev": true, "requires": { - "acorn": "5.5.3" + "acorn": "^5.0.0" }, "dependencies": { "acorn": { @@ -52,7 +64,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -64,19 +76,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" + "co": "^4.6.0", + "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": { @@ -84,9 +98,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": { @@ -94,15 +108,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.6" - } - }, "amd-inject-loader": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/amd-inject-loader/-/amd-inject-loader-0.5.0.tgz", @@ -115,9 +120,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": { @@ -133,22 +138,22 @@ "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.3.11", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "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.3" + "sprintf-js": "~1.0.2" } }, "aria-query": { @@ -161,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.1.0" - } + "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", @@ -175,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", @@ -193,8 +201,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 +211,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -213,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": { @@ -241,9 +249,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": { @@ -267,16 +275,10 @@ "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=", + "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": { @@ -308,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", @@ -335,69 +343,81 @@ "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": { - "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.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", - "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", - "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" + "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.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": { @@ -408,125 +428,858 @@ } } }, - "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.8.38", - "loader-utils": "0.2.17", - "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", "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=", + "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=", "dev": true, "requires": { - "lodash": "3.10.1" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "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=", + "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": { - "leven": "1.0.2" + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "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=", + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true + } + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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": "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": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + } + }, + "babel-messages": { + "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" + } + }, + "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=", + "dev": true, + "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=", "dev": true }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true + } + } + }, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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==", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "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=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "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-runtime": { + "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" + }, + "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 + } + } + }, + "babel-template": { + "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", + "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==", + "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=", + "dev": true, + "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==", + "dev": true + } + } + }, + "babel-types": { + "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", + "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==", + "dev": true + } + } + }, "babylon": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", - "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "backbone": { @@ -534,7 +1287,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 +1295,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 +1308,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 +1317,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": { @@ -580,6 +1333,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", @@ -598,7 +1412,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "big.js": { @@ -618,12 +1432,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", @@ -636,7 +1444,7 @@ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "brace-expansion": { @@ -645,27 +1453,39 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "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.2", - "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" + } + } } }, - "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", @@ -678,18 +1498,24 @@ "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", "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 +1524,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 +1535,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 +1546,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,22 +1556,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" - } - }, - "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.9" + "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" } }, "buffer": { @@ -754,11 +1571,17 @@ "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-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", @@ -777,13 +1600,30 @@ "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", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -808,8 +1648,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,13 +1674,19 @@ "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" } }, + "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", @@ -848,20 +1694,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.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": "^2.0.0", + "async-each": "^1.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": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" } }, "cipher-base": { @@ -870,8 +1719,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": { @@ -880,6 +1729,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", @@ -891,16 +1763,16 @@ "integrity": "sha512-M1Li5yLHECcN2MahoreuODul5LkjohJGFxLPTjl3j1ttKrF5rgjZET1SJduuqxLAuT1gAPOdkhg03qcaaU1KeA==", "dev": true, "requires": { - "rimraf": "2.6.2" + "rimraf": "^2.6.1" } }, "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": { @@ -914,8 +1786,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": { @@ -926,12 +1798,6 @@ } } }, - "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", @@ -949,63 +1815,51 @@ "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", + "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", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "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.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" - }, - "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.3", - "private": "0.1.8", - "source-map": "0.5.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 - } - } + "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", @@ -1014,14 +1868,15 @@ "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": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "console-browserify": { @@ -1030,7 +1885,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -1046,9 +1901,15 @@ "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 + }, + "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": { @@ -1067,8 +1928,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 +1938,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 +1951,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 +1964,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 +1975,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 +1985,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 +2002,7 @@ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -1150,7 +2011,7 @@ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -1161,17 +2022,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 +2040,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 +2061,7 @@ "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "dev": true, "requires": { - "cssom": "0.3.2" + "cssom": "0.3.x" } }, "d": { @@ -1209,7 +2070,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.35" + "es5-ext": "^0.10.9" } }, "damerau-levenshtein": { @@ -1224,7 +2085,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "data-urls": { @@ -1233,9 +2094,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": { @@ -1258,6 +2119,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", @@ -1284,32 +2151,55 @@ "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": { - "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=", + "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": { - "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" + "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": { @@ -1318,13 +2208,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,43 +2229,23 @@ "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": { - "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.2.0", - "repeating": "1.1.3" - }, - "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.13", - "defined": "1.0.0" + "repeating": "^2.0.0" } }, "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": { @@ -1384,19 +2254,18 @@ "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": { - "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": { @@ -1404,8 +2273,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 +2301,7 @@ "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "webidl-conversions": "4.0.2" + "webidl-conversions": "^4.0.2" } }, "domhandler": { @@ -1440,7 +2309,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 +2317,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 +2328,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "elliptic": { @@ -1468,13 +2337,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 +2363,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 +2372,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 +2388,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -1528,7 +2397,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -1537,11 +2406,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,19 +2419,20 @@ "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": { - "version": "0.10.35", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", - "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "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" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-iterator": { @@ -1571,9 +2441,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 +2452,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 +2466,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 +2479,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 +2489,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 +2507,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,79 +2535,123 @@ "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": { - "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.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" + "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", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.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": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.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.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": "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", "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": { - "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": { @@ -1746,16 +2660,25 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "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.2" + "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" } } } @@ -1766,7 +2689,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 +2698,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 +2707,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 +2717,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } } } @@ -1805,17 +2728,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 +2747,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 +2757,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 +2775,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 +2791,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "resolve": { @@ -1877,7 +2800,7 @@ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } } } @@ -1888,13 +2811,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 +2826,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 +2838,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "jsx-ast-utils": { @@ -1924,7 +2847,7 @@ "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "dev": true, "requires": { - "array-includes": "3.0.3" + "array-includes": "^3.0.3" } } } @@ -1935,47 +2858,56 @@ "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.2", - "acorn-jsx": "3.0.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 } } }, - "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.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.2.0" + "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.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -1996,8 +2928,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,32 +2944,58 @@ "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": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true + "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": "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.1" - } - }, - "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.2.4" + "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": { @@ -2046,8 +3004,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 +3020,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": { @@ -2087,13 +3045,107 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "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": { - "is-extglob": "1.0.0" + "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", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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": { @@ -2125,23 +3177,22 @@ "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": { - "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.1" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -2150,8 +3201,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": { @@ -2159,23 +3210,58 @@ "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.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "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": { + "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", + "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": { @@ -2190,8 +3276,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 +3286,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } } } @@ -2211,7 +3297,7 @@ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", "dev": true, "requires": { - "glob": "5.0.15" + "glob": "~5.0.0" } }, "flat-cache": { @@ -2220,10 +3306,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": { @@ -2232,15 +3318,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.2" - } - }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -2259,9 +3336,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 +3347,16 @@ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", "dev": true, "requires": { - "samsam": "1.1.3" + "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": { @@ -2279,19 +3365,13 @@ "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": { - "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", @@ -2299,39 +3379,30 @@ "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.10.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 + "dev": true, + "optional": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true @@ -2342,92 +3413,28 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "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", + "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", + "brace-expansion": { + "version": "1.1.11", "bundled": true, "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true @@ -2435,58 +3442,29 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } + "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", "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "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, @@ -2495,16 +3473,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, @@ -2512,74 +3485,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.1" - } - }, - "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.15" + "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.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } + "optional": true }, "gauge": { "version": "2.7.4", @@ -2587,65 +3511,28 @@ "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" - } - }, - "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 - } + "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" } }, "glob": { "version": "7.1.2", "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" - } - }, - "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.11.8", - "har-schema": "1.0.5" + "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" } }, "has-unicode": { @@ -2654,49 +3541,42 @@ "dev": true, "optional": true }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "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.4.0", - "sshpk": "1.13.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.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -2705,119 +3585,56 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "number-is-nan": "1.0.1" + "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.1" - } - }, - "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, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.7" + "brace-expansion": "^1.1.7" } }, "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" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2828,23 +3645,33 @@ "dev": true, "optional": true }, - "node-pre-gyp": { - "version": "0.6.39", + "needle": { + "version": "2.2.0", "bundled": true, "dev": true, "optional": true, "requires": { - "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", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "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", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -2853,30 +3680,41 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, - "npmlog": { - "version": "4.1.0", + "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": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, "dev": true, "optional": true }, @@ -2890,8 +3728,9 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -2907,53 +3746,37 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "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": { "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.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -2965,64 +3788,49 @@ } }, "readable-stream": { - "version": "2.2.9", - "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" - } - }, - "request": { - "version": "2.81.0", + "version": "2.3.6", "bundled": true, "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" + "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.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { - "version": "5.0.1", + "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": 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 @@ -3039,69 +3847,33 @@ "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "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.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" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, "string-width": { "version": "1.0.2", "bundled": true, "dev": true, + "optional": 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": { - "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, "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3111,94 +3883,46 @@ "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", + "version": "4.4.1", "bundled": true, "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" + "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, "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true } } }, @@ -3208,25 +3932,28 @@ "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.2" - } + "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-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "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", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getpass": { @@ -3235,7 +3962,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -3244,36 +3971,38 @@ "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" - } - }, - "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.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.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.1" + "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": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", - "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "globby": { @@ -3282,12 +4011,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 +4025,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 +4039,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -3322,9 +4051,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": { @@ -3333,10 +4062,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 +4087,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 +4098,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 +4115,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 +4125,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 +4139,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -3419,23 +4148,55 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "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": { + "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", "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 +4205,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,21 +4215,27 @@ "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" } }, + "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", "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 +4244,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": { @@ -3494,13 +4261,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.2", - "user-home": "1.1.1" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "hosted-git-info": { @@ -3515,7 +4282,7 @@ "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "html2canvas": { @@ -3531,22 +4298,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" - } - }, - "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.1", - "inherits": "2.0.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-signature": { @@ -3555,9 +4312,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": { @@ -3578,9 +4335,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": { @@ -3589,8 +4346,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 +4362,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 +4393,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3646,31 +4403,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.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": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.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" + } } } }, @@ -3690,7 +4498,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 +4513,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": { @@ -3717,6 +4525,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", @@ -3729,7 +4546,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -3743,7 +4560,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { @@ -3752,25 +4569,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": { @@ -3780,9 +4610,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": { @@ -3791,55 +4621,48 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.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.1" - } + "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", - "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-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.2" - } - }, - "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.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "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.2.2" + "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": { @@ -3849,39 +4672,36 @@ "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": "^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.2" + "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-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-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "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": { @@ -3890,7 +4710,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-relative": { @@ -3899,17 +4719,14 @@ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "dev": true, "requires": { - "is-unc-path": "0.1.2" + "is-unc-path": "^0.1.1" } }, "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.3" - } + "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", @@ -3934,7 +4751,7 @@ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "dev": true, "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.0" } }, "is-windows": { @@ -3955,21 +4772,18 @@ "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", "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": { @@ -3978,30 +4792,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", @@ -4018,19 +4808,19 @@ "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.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "dependencies": { "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 } } @@ -4048,32 +4838,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": { @@ -4091,9 +4881,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": { @@ -4114,14 +4904,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", @@ -4130,9 +4917,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": { @@ -4141,21 +4928,9 @@ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "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", @@ -4179,7 +4954,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 +4963,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "lazy-cache": { @@ -4202,7 +4977,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "left-pad": { @@ -4211,20 +4986,14 @@ "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", "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,30 +5002,27 @@ "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-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", - "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.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - } + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "locate-path": { @@ -4265,8 +5031,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 +5061,7 @@ "integrity": "sha1-PsXiYGAU9MuX91X+aRTt2L/ADqw=", "dev": true, "requires": { - "lodash.isarray": "3.0.4" + "lodash.isarray": "^3.0.0" } }, "lodash.escaperegexp": { @@ -4314,8 +5080,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 +5122,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,25 +5131,51 @@ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "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=", + "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", + "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", "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 +5184,17 @@ "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" + } + }, + "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": { @@ -4403,24 +5204,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.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": "^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": { @@ -4429,8 +5238,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,9 +5254,15 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.33.0" + "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", @@ -4461,12 +5276,12 @@ "dev": true }, "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "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.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -4474,6 +5289,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", @@ -4492,102 +5328,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.1" + "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.3", - "inherits": "2.0.3", - "minimatch": "0.2.14" + "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": { - "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.7.3", - "sigmund": "1.0.1" + "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" + } } } }, @@ -4603,9 +5413,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": { @@ -4615,12 +5425,52 @@ "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 + }, + "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", @@ -4635,8 +5485,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 +5495,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 +5526,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "pako": { @@ -4691,7 +5541,7 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } } } @@ -4702,7 +5552,7 @@ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "normalize-package-data": { @@ -4711,10 +5561,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 +5573,16 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "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": { @@ -4749,20 +5608,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.5", - "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": { @@ -4771,22 +5660,25 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "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", "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 +5687,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": { @@ -4824,12 +5716,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": { @@ -4838,16 +5732,11 @@ "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.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } + "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", @@ -4855,7 +5744,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 +5753,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -4873,12 +5762,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", @@ -4890,23 +5773,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" - } - }, - "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.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "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-json": { @@ -4915,7 +5786,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse5": { @@ -4929,19 +5800,25 @@ "resolved": "https://registry.npmjs.org/parsleyjs/-/parsleyjs-2.8.1.tgz", "integrity": "sha1-oEq/kcIUZHXm1NVAS0WUCtb7uKQ=", "requires": { - "jquery": "3.3.1" + "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-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", + "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": { @@ -4956,6 +5833,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", @@ -4968,7 +5851,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "pbkdf2": { @@ -4977,19 +5860,13 @@ "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": { - "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", @@ -5014,7 +5891,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -5023,13 +5900,13 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "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": { @@ -5038,18 +5915,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", @@ -5068,9 +5945,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": { @@ -5078,7 +5955,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 +5963,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 +5986,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": { @@ -5122,12 +5999,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", @@ -5138,8 +6009,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": { @@ -5154,38 +6025,13 @@ "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.2", - "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", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -5194,8 +6040,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 +6049,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 +6064,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 +6074,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 +6082,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 +6096,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 +6107,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 +6117,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 +6128,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 +6138,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 +6149,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 +6159,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -5323,13 +6169,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 +6184,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,105 +6196,59 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } }, - "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.1.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", - "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", - "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" - }, - "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 - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.4.0" - } - }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, - "regenerator": { - "version": "0.8.40", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", - "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "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": { - "commoner": "0.10.8", - "defs": "1.1.1", - "esprima-fb": "15001.1001.0-dev-harmony-fb", - "private": "0.1.8", - "recast": "0.10.33", - "through": "2.3.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "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" } }, - "regexpu": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", - "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", + "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-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "esprima": "2.7.3", - "recast": "0.10.33", - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - } + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -5463,7 +6263,15 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "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=", + "dev": true + } } }, "remove-trailing-separator": { @@ -5484,12 +6292,12 @@ "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.2" + "is-finite": "^1.0.0" } }, "request": { @@ -5498,27 +6306,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 +6343,7 @@ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.13.1" }, "dependencies": { "lodash": { @@ -5553,18 +6361,30 @@ "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-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", "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 +6393,7 @@ "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-from": { @@ -5582,22 +6402,34 @@ "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": "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.1.1", - "onetime": "1.1.0" + "onetime": "^2.0.0", + "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", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -5606,7 +6438,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" }, "dependencies": { "glob": { @@ -5615,12 +6447,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 +6461,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -5640,30 +6472,48 @@ "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": { - "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.4.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", "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", @@ -5681,8 +6531,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": { @@ -5691,12 +6541,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", @@ -5708,8 +6587,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 +6597,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -5727,58 +6606,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.1.2", - "interpret": "1.0.4", - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "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.8" - } - } - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "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=", + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "sinon": { @@ -5789,7 +6620,7 @@ "requires": { "formatio": "1.1.1", "lolex": "1.1.0", - "util": "0.10.3" + "util": ">=0.10.3 <1" } }, "sinon-chai": { @@ -5805,10 +6636,121 @@ "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" + } + }, + "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", @@ -5816,13 +6758,13 @@ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "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": { @@ -5831,37 +6773,53 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": "1.0.1" + "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.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": "1.0.1" - } + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, + "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", "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 +6834,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": { @@ -5891,6 +6849,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", @@ -5903,21 +6870,36 @@ "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": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", - "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=", - "dev": true + "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", @@ -5931,8 +6913,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 +6923,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 +6942,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 +6957,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } } } @@ -5986,14 +6968,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.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "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": { @@ -6001,28 +6999,16 @@ "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": { - "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.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -6031,6 +7017,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", @@ -6043,12 +7035,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 +7049,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 +7063,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } } } @@ -6089,54 +7081,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.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.4", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" + "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" } } } @@ -6159,20 +7155,20 @@ "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.10" - } - }, "tinymce": { "version": "4.5.6", "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", @@ -6185,13 +7181,44 @@ "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", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tr46": { @@ -6200,7 +7227,7 @@ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { @@ -6217,24 +7244,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 - }, - "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", - "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", - "dev": true - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -6247,7 +7256,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -6263,7 +7272,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -6287,34 +7296,30 @@ "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.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": { "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.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" } } @@ -6323,7 +7328,27 @@ "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 + }, + "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", @@ -6336,6 +7361,110 @@ "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 + }, + "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", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -6354,11 +7483,22 @@ } } }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true + "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", @@ -6394,8 +7534,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 +7543,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 +7559,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 +7579,7 @@ "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "dev": true, "requires": { - "browser-process-hrtime": "0.1.2" + "browser-process-hrtime": "^0.1.2" } }, "warning": { @@ -6447,26 +7587,18 @@ "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": { - "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.2", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - }, - "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": { @@ -6476,263 +7608,133 @@ "dev": true }, "webpack": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.12.9.tgz", - "integrity": "sha1-KgMdZhiYOcxcvyxo+AVm2i4U/04=", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "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" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "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": "^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": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" }, "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": "6.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz", + "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==", "dev": true, "requires": { - "pbkdf2-compat": "2.0.1", - "ripemd160": "0.2.0", - "sha.js": "2.2.6" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "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=", + "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" + } + }, + "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" + } + }, + "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 }, - "interpret": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=", + "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 }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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", + "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.7", - "readable-stream": "2.3.3" + "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.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "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", - "https-browserify": "0.0.0", - "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", - "tty-browserify": "0.0.0", - "url": "0.10.3", - "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.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } - }, - "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.3", - "readable-stream": "1.1.14" - }, - "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.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } - }, - "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", - "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" } }, - "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.10", - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "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.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.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.8", - "source-map": "0.4.4" - }, - "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": "1.0.1" - } } } }, @@ -6742,8 +7744,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 +7754,25 @@ "integrity": "sha1-2fGJnq1mRFndi2sMkmrHHPvXvHo=", "dev": true, "requires": { - "md5": "2.2.1" + "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": { @@ -6781,9 +7801,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,13 +7812,13 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "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=", + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wordwrap": { @@ -6806,6 +7826,38 @@ "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", @@ -6818,7 +7870,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "ws": { @@ -6827,8 +7879,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": { @@ -6856,17 +7908,82 @@ "dev": true }, "yargs": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "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": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^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": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "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" + }, + "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": { + "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" + } + } + } + }, + "yargs-parser": { + "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": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "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 c950eb13e6..16761f8391 100644 --- a/package.json +++ b/package.json @@ -41,13 +41,16 @@ }, "devDependencies": { "amd-inject-loader": "~0.5.0", - "babel-core": "^5.8.22", - "babel-loader": "^5.3.2", + "babel-core": "6.26.3", + "babel-loader": "7.1.4", + "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", "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,12 +62,12 @@ "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", "stylus": "~0.54.5", - "webpack": "1.12.9", + "webpack": "3.12.0", "webpack-manifest-plugin": "^1.1.0", "webpack-md5-hash": "0.0.5" } diff --git a/plugin_repository/assets/icon-256x256.png b/plugin_repository/assets/icon-256x256.png new file mode 100644 index 0000000000..790727047e Binary files /dev/null and b/plugin_repository/assets/icon-256x256.png differ diff --git a/readme.txt b/readme.txt index 3fc208357e..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.4 +Stable tag: 3.7.7 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html @@ -118,6 +118,31 @@ 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; +* 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. + = 3.7.4 - 2018-05-30 = * Added: What's New page no longer shows after every update; * Improved: template selection page thumbnails are larger; diff --git a/tests/_data/test-image.jpg b/tests/_data/test-image.jpg new file mode 100644 index 0000000000..54fd1499bd Binary files /dev/null and b/tests/_data/test-image.jpg differ diff --git a/tests/acceptance/NewsletterCreationCest.php b/tests/acceptance/NewsletterCreationCest.php index f6a850273c..7504eff5b7 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,40 @@ 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('Send'); + } +} diff --git a/tests/acceptance/SaveNewsletterAsDraftCest.php b/tests/acceptance/SaveNewsletterAsDraftCest.php new file mode 100644 index 0000000000..6ccd4e14ae --- /dev/null +++ b/tests/acceptance/SaveNewsletterAsDraftCest.php @@ -0,0 +1,41 @@ +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'); + $I->waitForText('Standard newsletter', 5, '[data-automation-id="listing_item_1"]'); + } +} 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; 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/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/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..71c6cc9ea6 100644 --- a/tests/unit/API/MP/APITest.php +++ b/tests/unit/API/MP/APITest.php @@ -2,13 +2,17 @@ namespace MailPoet\Test\API\MP; +use AspectMock\Test as Mock; 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\ScheduledTask; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; +use MailPoet\Tasks\Sending; class APITest extends \MailPoetTest { const VERSION = 'v1'; @@ -180,7 +184,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 +203,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')); @@ -298,6 +302,12 @@ class APITest extends \MailPoetTest { } function testItSubscribesToSegmentsWhenAddingSubscriber() { + $API = Stub::makeEmptyExcept( + new \MailPoet\API\MP\v1\API(), + 'addSubscriber', + array( + '_sendConfirmationEmail' => Expected::once() + ), $this); $segment = Segment::createOrUpdate( array( 'name' => 'Default', @@ -308,7 +318,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); @@ -319,7 +329,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', @@ -329,12 +339,36 @@ 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(), 'addSubscriber', array( - '_scheduleWelcomeNotification' => Stub::never() + '_scheduleWelcomeNotification' => Expected::never() ), $this); $subscriber = array( 'email' => 'test@example.com' @@ -348,7 +382,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 +398,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' @@ -373,12 +407,34 @@ class APITest extends \MailPoetTest { $API->addSubscriber($subscriber, $segments); } + function testItThrowsWhenConfirmationEmailFailsToSend() { + $API = new \MailPoet\API\MP\v1\API(); + Mock::double($API, array( + '_sendConfirmationEmail' => function ($subscriber) { + $subscriber->setError('Big Error'); + return false; + } + ) + ); + $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(), 'addSubscriber', array( - '_sendConfirmationEmail' => Stub::never() + '_sendConfirmationEmail' => Expected::never() ), $this); $subscriber = array( 'email' => 'test@example.com' @@ -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/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/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'); } 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 04d4985674..1ce0b065b8 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; @@ -76,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(); @@ -92,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(); @@ -102,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); @@ -122,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(); @@ -145,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(); @@ -167,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(); @@ -187,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(); @@ -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(); @@ -291,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(); @@ -314,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(); @@ -341,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(); @@ -363,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(); @@ -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); @@ -425,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'); @@ -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,13 +565,106 @@ 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); $scheduler->process(); } + 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 = 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 = 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(); + $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 = 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 = SendingTask::getByNewsletterId($newsletter->id); + 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); + $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; diff --git a/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php b/tests/unit/Cron/Workers/SendingQueue/SendingQueueTest.php index 758c62f7cd..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(); @@ -385,6 +386,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(); @@ -394,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(); @@ -443,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; }) ), @@ -594,7 +615,7 @@ class SendingQueueTest extends \MailPoetTest { Stub::make( new MailerTask(), array( - 'send' => Stub::once() + 'send' => Expected::once() ), $this ) @@ -631,4 +652,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/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/Models/NewsletterTest.php b/tests/unit/Models/NewsletterTest.php index df93bb3cb8..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); } @@ -840,7 +840,42 @@ class NewsletterTest extends \MailPoetTest { expect($result[1]->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', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); + expect($newsletter->getMeta())->equals($meta); + } + + function testPausesTaskWhenPostNotificationIsDisabled() { $newsletter = Newsletter::createOrUpdate(array( 'type' => Newsletter::TYPE_NOTIFICATION )); @@ -854,7 +889,7 @@ class NewsletterTest extends \MailPoetTest { expect($task_found->status)->equals(ScheduledTask::STATUS_PAUSED); } - function testUnPauseTaskWhenEnablePostNotification() { + function testUnpausesTaskWhenPostNotificationIsEnabled() { $newsletter = Newsletter::createOrUpdate(array( 'type' => Newsletter::TYPE_NOTIFICATION )); @@ -870,8 +905,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); 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; diff --git a/tests/unit/Newsletter/Editor/PostContentTransformerTest.php b/tests/unit/Newsletter/Editor/PostContentTransformerTest.php new file mode 100644 index 0000000000..42367f9215 --- /dev/null +++ b/tests/unit/Newsletter/Editor/PostContentTransformerTest.php @@ -0,0 +1,207 @@ +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)); + } + + 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 + */ + 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 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]; diff --git a/tests/unit/Newsletter/Scheduler/SchedulerTest.php b/tests/unit/Newsletter/Scheduler/SchedulerTest.php index 2d77acac5e..ec6f68c302 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() { @@ -59,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); @@ -72,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, @@ -89,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 testItCreatesWelcomeNotificationSendingTaskScheduledToSendInHours() { $newsletter = (object)array( 'id' => 1, 'afterTimeNumber' => 2 @@ -105,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')); @@ -114,10 +130,17 @@ 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'; - Scheduler::createWelcomeNotificationQueue($newsletter, $subscriber_id = 1); + Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); $queue = SendingQueue::findTaskByNewsletterId(1) ->findOne(); @@ -126,10 +149,17 @@ 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'; - Scheduler::createWelcomeNotificationQueue($newsletter, $subscriber_id = 1); + Scheduler::createWelcomeNotificationSendingTask($newsletter, $subscriber_id = 1); $current_time = Carbon::createFromTimestamp(current_time('timestamp')); $queue = SendingQueue::findTaskByNewsletterId(1) ->findOne(); @@ -138,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::createWelcomeNotificationQueue($newsletter, $subscriber_id = 1); + 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')) @@ -214,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, @@ -227,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() { @@ -345,10 +382,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 @@ -367,6 +404,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( @@ -378,13 +422,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( @@ -393,7 +443,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) @@ -402,6 +452,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( @@ -410,7 +467,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) @@ -419,6 +476,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( @@ -438,11 +502,174 @@ class SchedulerTest extends \MailPoetTest { ->equals('2017-01-01 13:01:00'); } + 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', Newsletter::TYPE_AUTOMATIC)->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, + Newsletter::TYPE_AUTOMATIC, + array( + 'sendTo' => 'user', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); + $subscriber = Subscriber::create(); + $subscriber->hydrate(Fixtures::get('subscriber_template')); + $subscriber->save(); + $meta = array('some' => 'value'); + + 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); + } + + function testItCreatesAutomaticEmailSendingTaskForSegment() { + $newsletter = $this->_createNewsletter(Newsletter::TYPE_AUTOMATIC); + $this->_createNewsletterOptions( + $newsletter->id, + Newsletter::TYPE_AUTOMATIC, + array( + 'sendTo' => 'segment', + 'afterTimeType' => 'hours', + 'afterTimeNumber' => 2 + ) + ); + $newsletter = Newsletter::filter('filterWithOptions', Newsletter::TYPE_AUTOMATIC)->findOne($newsletter->id); + + Scheduler::createAutomaticEmailSendingTask($newsletter, $subscriber = null, $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 not have any subscribers + $subscribers = $task->subscribers()->findMany(); + expect($subscribers)->count(0); + } + + 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, + 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'; + }; + + // email should only be scheduled if it matches condition ("send to segment") + Scheduler::scheduleAutomaticEmail('some_group', 'some_event', $condition); + $result = SendingQueue::findMany(); + expect($result)->count(1); + expect($result[0]->newsletter_id)->equals($newsletter_2->id); + // 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 +678,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 +713,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 +758,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 +792,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 +} 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); } diff --git a/tests/unit/Tasks/SendingTest.php b/tests/unit/Tasks/SendingTest.php index a8373d7d00..16eaed09ff 100644 --- a/tests/unit/Tasks/SendingTest.php +++ b/tests/unit/Tasks/SendingTest.php @@ -176,6 +176,44 @@ 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 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; 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); + } + } +} 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; + } +} 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 @@ + 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;" diff --git a/views/forms.html b/views/forms.html index 8e51940fa2..4c1487f228 100644 --- a/views/forms.html +++ b/views/forms.html @@ -12,6 +12,11 @@

    + <% set badgeClassName = (is_new_user == true) ? 'mailpoet_badge mailpoet_badge_video' : 'mailpoet_badge mailpoet_badge_video mailpoet_badge_video_grey' %> + + <%= __('See video guide') %> + + <% endblock %> @@ -122,6 +124,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'), @@ -190,6 +193,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/views/settings/mta.html b/views/settings/mta.html index 712c44008b..c4067ab2b3 100644 --- a/views/settings/mta.html +++ b/views/settings/mta.html @@ -145,8 +145,11 @@

    - <%= __("Need help to pick? [link]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 88e8646483..965c6ac629 100644 --- a/views/subscribers/importExport/import/step1.html +++ b/views/subscribers/importExport/import/step1.html @@ -22,6 +22,11 @@ + <% 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/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 %>> diff --git a/webpack.config.js b/webpack.config.js index 6aa33cb87f..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,13 +49,11 @@ var baseConfig = { ]) ], module: { - preLoaders: [ - { test: /\.json$/, loader: "json-loader" }, - ], - loaders: [ + rules: [ { test: /\.jsx$/, - loader: 'babel-loader' + exclude: /node_modules/, + loader: 'babel-loader', }, { test: /form_editor\.js$/, @@ -73,6 +71,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', @@ -87,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'), @@ -95,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$/, @@ -167,7 +208,10 @@ var baseConfig = { }, { include: require.resolve('classnames'), - loader: 'expose-loader?' + globalPrefix + '.ClassNames!babel-loader', + use: [ + 'expose-loader?' + globalPrefix + '.ClassNames', + 'babel-loader', + ] }, ] } @@ -200,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', @@ -402,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'