diff --git a/.gitignore b/.gitignore index a7d9697..7da4cd5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ site *.sln *.nupkg /index.html -/test.html \ No newline at end of file +/test.html +private_local_dir/** \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..fa29cdf --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +** \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9c4db38..64ee05e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,38 +1,33 @@ Submitting Issues ================= -If you are submitting a bug, please test and/or fork [this jsfiddle](http://jsfiddle.net/Eonasdan/0Ltv25o8/) demonstrating the issue. Code issues and fringe case bugs that do not include a jsfiddle (or similar) will be closed. +If you are submitting a bug, please test and/or fork [this JSFiddle](https://jsfiddle.net/nmocbjLf/1/) demonstrating the issue. +In your Pull Request (PR), describe the use case and provide a link to your forked JSFiddle and possibly provide a code example in the PR itself. Issues that are submitted without a description (title only) will be closed with no further explanation. Contributing code ================= -To contribute, fork the library and install grunt and dependencies. You need [node](http://nodejs.org/); use [nvm](https://github.com/creationix/nvm) or [nenv](https://github.com/ryuone/nenv) to install it. +PRs are welcome. + +**Working on your first Pull Request?** You can learn how from this _free_ series [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github). + +To contribute, fork the library and install dependencies. You will need [node](http://nodejs.org/). +You can use [nvm](https://github.com/nvm-sh/nvm) or [nenv](https://github.com/ryuone/nenv) to install it. + +Then, run the following commands: ```bash -git clone https://github.com/Eonasdan/bootstrap-datetimepicker.git -cd bootstrap-datetimepicker +git clone https://github.com/tempusdominus/core.git +cd tempusdominus npm install -g grunt-cli npm install -git checkout development # all patches against development branch, please! -grunt # this runs tests and jshint +npm run watch ``` Very important notes ==================== - * **Pull requests to the `master` branch will be closed.** Please submit all pull requests to the `development` branch. - * **Do not include the minified files in your pull request.** Don't worry, we'll build them when we cut a release. - * Pull requests that do not include a description (title only) and the following will be closed: - * What the change does - * A use case (for new features or enhancements) - -Grunt tasks -=========== - -We use Grunt for managing the build. Here are some useful Grunt tasks: - - * `grunt` The default task lints the code and runs the tests. You should make sure you do this before submitting a PR. - * `grunt build` Compiles the less stylesheet and minifies the javascript source in build directory. - * `grunt build:travis` Compliles and runs the jasmine/travis tests. **All PR's MUST pass tests in place** \ No newline at end of file + * **Please submit your pull requests to a new branch** (you may call it like you want, just choose a name that describes your feature/bugfix). + * **You don't have to include the minified files in your pull request** (by running `npm run build-all`). Don't worry, we'll build them when we bump a new version. diff --git a/Gruntfile.js b/Gruntfile.js index 1fcc550..c65281e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -110,7 +110,7 @@ module.exports = function (grunt) { ]); // Task to be run when building - grunt.registerTask('build', ['babel:dev', 'eslint', 'babel:dist']); + grunt.registerTask('build', ['babel:dev', 'eslint', 'babel:dist', 'uglify']); grunt.registerTask('test', ['build', 'env:paris', 'connect', 'jasmine']); diff --git a/build/js/tempusdominus-core.js b/build/js/tempusdominus-core.js index 6337cf9..dc9d917 100644 --- a/build/js/tempusdominus-core.js +++ b/build/js/tempusdominus-core.js @@ -4,8 +4,23 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons // ReSharper disable once InconsistentNaming var DateTimePicker = function ($, moment) { + function escapeRegExp(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + } + + function isValidDate(date) { + return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime()); + } + + function isValidDateTimeStr(str) { + return isValidDate(new Date(str)); + } + // ReSharper disable InconsistentNaming - var NAME = 'datetimepicker', + var trim = function trim(str) { + return str.replace(/(^\s+)|(\s+$)/g, ''); + }, + NAME = 'datetimepicker', DATA_KEY = '' + NAME, EVENT_KEY = '.' + DATA_KEY, DATA_API_KEY = '.data-api', @@ -77,7 +92,78 @@ var DateTimePicker = function ($, moment) { }, ViewModes = ['times', 'days', 'months', 'years', 'decades'], keyState = {}, - keyPressHandled = {}; + keyPressHandled = {}, + optionsSortMap = { + timeZone: -39, + format: -38, + dayViewHeaderFormat: -37, + extraFormats: -36, + stepping: -35, + minDate: -34, + maxDate: -33, + useCurrent: -32, + collapse: -31, + locale: -30, + defaultDate: -29, + disabledDates: -28, + enabledDates: -27, + icons: -26, + tooltips: -25, + useStrict: -24, + sideBySide: -23, + daysOfWeekDisabled: -22, + calendarWeeks: -21, + viewMode: -20, + toolbarPlacement: -19, + buttons: -18, + widgetPositioning: -17, + widgetParent: -16, + ignoreReadonly: -15, + keepOpen: -14, + focusOnShow: -13, + inline: -12, + keepInvalid: -11, + keyBinds: -10, + debug: -9, + allowInputToggle: -8, + disabledTimeIntervals: -7, + disabledHours: -6, + enabledHours: -5, + viewDate: -4, + allowMultidate: -3, + multidateSeparator: -2, + updateOnlyThroughDateOption: -1, + date: 1 + }, + defaultFeatherIcons = { + time: 'clock', + date: 'calendar', + up: 'arrow-up', + down: 'arrow-down', + previous: 'arrow-left', + next: 'arrow-right', + today: 'arrow-down-circle', + clear: 'trash-2', + close: 'x' + }; + + function optionsSortFn(optionKeyA, optionKeyB) { + if (optionsSortMap[optionKeyA] && optionsSortMap[optionKeyB]) { + if (optionsSortMap[optionKeyA] < 0 && optionsSortMap[optionKeyB] < 0) { + return Math.abs(optionsSortMap[optionKeyB]) - Math.abs(optionsSortMap[optionKeyA]); + } else if (optionsSortMap[optionKeyA] < 0) { + return -1; + } else if (optionsSortMap[optionKeyB] < 0) { + return 1; + } + return optionsSortMap[optionKeyA] - optionsSortMap[optionKeyB]; + } else if (optionsSortMap[optionKeyA]) { + return optionsSortMap[optionKeyA]; + } else if (optionsSortMap[optionKeyB]) { + return optionsSortMap[optionKeyB]; + } + return 0; + } var Default = { timeZone: '', @@ -94,6 +180,7 @@ var DateTimePicker = function ($, moment) { disabledDates: false, enabledDates: false, icons: { + type: 'class', time: 'fa fa-clock-o', date: 'fa fa-calendar', up: 'fa fa-arrow-up', @@ -101,7 +188,7 @@ var DateTimePicker = function ($, moment) { previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-calendar-check-o', - clear: 'fa fa-delete', + clear: 'fa fa-trash', close: 'fa fa-times' }, tooltips: { @@ -148,6 +235,7 @@ var DateTimePicker = function ($, moment) { vertical: 'auto' }, widgetParent: null, + readonly: false, ignoreReadonly: false, keepOpen: false, focusOnShow: true, @@ -288,7 +376,10 @@ var DateTimePicker = function ($, moment) { enabledHours: false, viewDate: false, allowMultidate: false, - multidateSeparator: ',' + multidateSeparator: ', ', + updateOnlyThroughDateOption: false, + promptTimeOnDateChange: false, + promptTimeOnDateChangeTransitionDelay: 200 }; // ReSharper restore InconsistentNaming @@ -316,6 +407,13 @@ var DateTimePicker = function ($, moment) { this.parseFormats = null; this.currentViewMode = null; this.MinViewModeNumber = 0; + this.isInitFormatting = false; + this.isInit = false; + this.isDateUpdateThroughDateOptionFromClientCode = false; + this.hasInitDate = false; + this.initDate = void 0; + this._notifyChangeEventContext = void 0; + this._currentPromptTimeTimeout = null; this._int(); } @@ -328,6 +426,7 @@ var DateTimePicker = function ($, moment) { //private DateTimePicker.prototype._int = function _int() { + this.isInit = true; var targetInput = this._element.data('target-input'); if (this._element.is('input')) { this.input = this._element; @@ -345,18 +444,27 @@ var DateTimePicker = function ($, moment) { $.extend(true, this._options, this._dataToOptions()); + this.hasInitDate = false; + this.initDate = void 0; this.options(this._options); + this.isInitFormatting = true; this._initFormatting(); + this.isInitFormatting = false; if (this.input !== undefined && this.input.is('input') && this.input.val().trim().length !== 0) { this._setValue(this._parseInputDate(this.input.val().trim()), 0); } else if (this._options.defaultDate && this.input !== undefined && this.input.attr('placeholder') === undefined) { this._setValue(this._options.defaultDate, 0); } + if (this.hasInitDate) { + this.date(this.initDate); + } + if (this._options.inline) { this.show(); } + this.isInit = false; }; DateTimePicker.prototype._update = function _update() { @@ -368,20 +476,42 @@ var DateTimePicker = function ($, moment) { }; DateTimePicker.prototype._setValue = function _setValue(targetMoment, index) { - var oldDate = this.unset ? null : this._dates[index]; - var outpValue = ''; + var noIndex = typeof index === 'undefined', + isClear = !targetMoment && noIndex, + isDateUpdateThroughDateOptionFromClientCode = this.isDateUpdateThroughDateOptionFromClientCode, + isNotAllowedProgrammaticUpdate = !this.isInit && this._options.updateOnlyThroughDateOption && !isDateUpdateThroughDateOptionFromClientCode; + var outpValue = '', + isInvalid = false, + oldDate = this.unset ? null : this._dates[index]; + if (!oldDate && !this.unset && noIndex && isClear) { + oldDate = this._dates[this._dates.length - 1]; + } + // case of calling setValue(null or false) if (!targetMoment) { - if (!this._options.allowMultidate || this._dates.length === 1) { + if (isNotAllowedProgrammaticUpdate) { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment, + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + return; + } + if (!this._options.allowMultidate || this._dates.length === 1 || isClear) { this.unset = true; this._dates = []; this._datesFormatted = []; } else { - outpValue = this._element.data('date') + ','; - outpValue = outpValue.replace(oldDate.format(this.actualFormat) + ',', '').replace(',,', '').replace(/,\s*$/, ''); + outpValue = '' + this._element.data('date') + this._options.multidateSeparator; + outpValue = oldDate && outpValue.replace('' + oldDate.format(this.actualFormat) + this._options.multidateSeparator, '').replace('' + this._options.multidateSeparator + this._options.multidateSeparator, '').replace(new RegExp(escapeRegExp(this._options.multidateSeparator) + '\\s*$'), '') || ''; this._dates.splice(index, 1); this._datesFormatted.splice(index, 1); } + outpValue = trim(outpValue); if (this.input !== undefined) { this.input.val(outpValue); this.input.trigger('input'); @@ -390,7 +520,11 @@ var DateTimePicker = function ($, moment) { this._notifyEvent({ type: DateTimePicker.Event.CHANGE, date: false, - oldDate: oldDate + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit }); this._update(); return; @@ -407,6 +541,18 @@ var DateTimePicker = function ($, moment) { } if (this._isValid(targetMoment)) { + if (isNotAllowedProgrammaticUpdate) { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment.clone(), + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + return; + } this._dates[index] = targetMoment; this._datesFormatted[index] = targetMoment.format('YYYY-MM-DD'); this._viewDate = targetMoment.clone(); @@ -414,10 +560,11 @@ var DateTimePicker = function ($, moment) { for (var i = 0; i < this._dates.length; i++) { outpValue += '' + this._dates[i].format(this.actualFormat) + this._options.multidateSeparator; } - outpValue = outpValue.replace(/,\s*$/, ''); + outpValue = outpValue.replace(new RegExp(this._options.multidateSeparator + '\\s*$'), ''); } else { outpValue = this._dates[index].format(this.actualFormat); } + outpValue = trim(outpValue); if (this.input !== undefined) { this.input.val(outpValue); this.input.trigger('input'); @@ -429,9 +576,14 @@ var DateTimePicker = function ($, moment) { this._notifyEvent({ type: DateTimePicker.Event.CHANGE, date: this._dates[index].clone(), - oldDate: oldDate + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit }); } else { + isInvalid = true; if (!this._options.keepInvalid) { if (this.input !== undefined) { this.input.val('' + (this.unset ? '' : this._dates[index].format(this.actualFormat))); @@ -441,7 +593,11 @@ var DateTimePicker = function ($, moment) { this._notifyEvent({ type: DateTimePicker.Event.CHANGE, date: targetMoment, - oldDate: oldDate + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit }); } this._notifyEvent({ @@ -455,7 +611,7 @@ var DateTimePicker = function ($, moment) { DateTimePicker.prototype._change = function _change(e) { var val = $(e.target).val().trim(), parsedDate = val ? this._parseInputDate(val) : null; - this._setValue(parsedDate); + this._setValue(parsedDate, 0); e.stopImmediatePropagation(); return false; }; @@ -464,7 +620,9 @@ var DateTimePicker = function ($, moment) { DateTimePicker.prototype._getOptions = function _getOptions(options) { - options = $.extend(true, {}, Default, options); + options = $.extend(true, {}, Default, options && options.icons && options.icons.type === 'feather' ? { + icons: defaultFeatherIcons + } : {}, options); return options; }; @@ -525,11 +683,48 @@ var DateTimePicker = function ($, moment) { return dataOptions; }; + DateTimePicker.prototype._format = function _format() { + return this._options.format || 'YYYY-MM-DD HH:mm'; + }; + + DateTimePicker.prototype._areSameDates = function _areSameDates(a, b) { + var format = this._format(); + return a && b && (a.isSame(b) || moment(a.format(format), format).isSame(moment(b.format(format), format))); + }; + DateTimePicker.prototype._notifyEvent = function _notifyEvent(e) { - if (e.type === DateTimePicker.Event.CHANGE && (e.date && e.date.isSame(e.oldDate)) || !e.date && !e.oldDate) { - return; + if (e.type === DateTimePicker.Event.CHANGE) { + this._notifyChangeEventContext = this._notifyChangeEventContext || 0; + this._notifyChangeEventContext++; + if (e.date && this._areSameDates(e.date, e.oldDate) || !e.isClear && !e.date && !e.oldDate || this._notifyChangeEventContext > 1) { + this._notifyChangeEventContext = void 0; + return; + } + this._handlePromptTimeIfNeeded(e); } this._element.trigger(e); + this._notifyChangeEventContext = void 0; + }; + + DateTimePicker.prototype._handlePromptTimeIfNeeded = function _handlePromptTimeIfNeeded(e) { + if (this._options.promptTimeOnDateChange) { + if (!e.oldDate && this._options.useCurrent) { + // First time ever. If useCurrent option is set to true (default), do nothing + // because the first date is selected automatically. + return; + } else if (e.oldDate && e.date && (e.oldDate.format('YYYY-MM-DD') === e.date.format('YYYY-MM-DD') || e.oldDate.format('YYYY-MM-DD') !== e.date.format('YYYY-MM-DD') && e.oldDate.format('HH:mm:ss') !== e.date.format('HH:mm:ss'))) { + // Date didn't change (time did) or date changed because time did. + return; + } + + var that = this; + clearTimeout(this._currentPromptTimeTimeout); + this._currentPromptTimeTimeout = setTimeout(function () { + if (that.widget) { + that.widget.find('[data-action="togglePicker"]').click(); + } + }, this._options.promptTimeOnDateChangeTransitionDelay); + } }; DateTimePicker.prototype._viewUpdate = function _viewUpdate(e) { @@ -570,7 +765,7 @@ var DateTimePicker = function ($, moment) { }; DateTimePicker.prototype._isValid = function _isValid(targetMoment, granularity) { - if (!targetMoment.isValid()) { + if (!targetMoment || !targetMoment.isValid()) { return false; } if (this._options.disabledDates && granularity === 'd' && this._isInDisabledDates(targetMoment)) { @@ -610,7 +805,11 @@ var DateTimePicker = function ($, moment) { }; DateTimePicker.prototype._parseInputDate = function _parseInputDate(inputDate) { - if (this._options.parseInputDate === undefined) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$isPickerShow = _ref.isPickerShow, + isPickerShow = _ref$isPickerShow === undefined ? false : _ref$isPickerShow; + + if (this._options.parseInputDate === undefined || isPickerShow) { if (!moment.isMoment(inputDate)) { inputDate = this.getMoment(inputDate); } @@ -713,7 +912,7 @@ var DateTimePicker = function ($, moment) { self = this; this.actualFormat = format.replace(/(\[[^\[]*])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput) { - return self._dates[0].localeData().longDateFormat(formatInput) || formatInput; //todo taking the first date should be ok + return (self.isInitFormatting && self._options.date === null ? self.getMoment() : self._dates[0]).localeData().longDateFormat(formatInput) || formatInput; //todo taking the first date should be ok }); this.parseFormats = this._options.extraFormats ? this._options.extraFormats.slice() : []; @@ -741,7 +940,11 @@ var DateTimePicker = function ($, moment) { }; DateTimePicker.prototype._getLastPickedDate = function _getLastPickedDate() { - return this._dates[this._getLastPickedDateIndex()]; + var lastPickedDate = this._dates[this._getLastPickedDateIndex()]; + if (!lastPickedDate && this._options.allowMultidate) { + lastPickedDate = moment(new Date()); + } + return lastPickedDate; }; DateTimePicker.prototype._getLastPickedDateIndex = function _getLastPickedDateIndex() { @@ -755,7 +958,8 @@ var DateTimePicker = function ($, moment) { var returnMoment = void 0; if (d === undefined || d === null) { - returnMoment = moment(); //TODO should this use format? and locale? + // TODO: Should this use format? + returnMoment = moment().clone().locale(this._options.locale); } else if (this._hasTimeZone()) { // There is a string to parse and a default time zone // parse with the tz function which takes a default time zone if it is not in the format string @@ -775,12 +979,29 @@ var DateTimePicker = function ($, moment) { return this.widget ? this.hide() : this.show(); }; + DateTimePicker.prototype.readonly = function readonly(_readonly) { + if (arguments.length === 0) { + return this._options.readonly; + } + if (typeof _readonly !== 'boolean') { + throw new TypeError('readonly() expects a boolean parameter'); + } + this._options.readonly = _readonly; + if (this.input !== undefined) { + this.input.prop('readonly', this._options.readonly); + } + if (this.widget) { + this.hide(); + this.show(); + } + }; + DateTimePicker.prototype.ignoreReadonly = function ignoreReadonly(_ignoreReadonly) { if (arguments.length === 0) { return this._options.ignoreReadonly; } if (typeof _ignoreReadonly !== 'boolean') { - throw new TypeError('ignoreReadonly () expects a boolean parameter'); + throw new TypeError('ignoreReadonly() expects a boolean parameter'); } this._options.ignoreReadonly = _ignoreReadonly; }; @@ -794,9 +1015,16 @@ var DateTimePicker = function ($, moment) { throw new TypeError('options() this.options parameter should be an object'); } $.extend(true, this._options, newOptions); - var self = this; - $.each(this._options, function (key, value) { + var self = this, + optionsKeys = Object.keys(this._options).sort(optionsSortFn); + $.each(optionsKeys, function (i, key) { + var value = self._options[key]; if (self[key] !== undefined) { + if (self.isInit && key === 'date') { + self.hasInitDate = true; + self.initDate = value; + return; + } self[key](value); } }); @@ -819,9 +1047,21 @@ var DateTimePicker = function ($, moment) { throw new TypeError('date() parameter must be one of [null, string, moment or Date]'); } + if (typeof newDate === 'string' && isValidDateTimeStr(newDate)) { + newDate = new Date(newDate); + } + this._setValue(newDate === null ? null : this._parseInputDate(newDate), index); }; + DateTimePicker.prototype.updateOnlyThroughDateOption = function updateOnlyThroughDateOption(_updateOnlyThroughDateOption) { + if (typeof _updateOnlyThroughDateOption !== 'boolean') { + throw new TypeError('updateOnlyThroughDateOption() expects a boolean parameter'); + } + + this._options.updateOnlyThroughDateOption = _updateOnlyThroughDateOption; + }; + DateTimePicker.prototype.format = function format(newFormat) { if (arguments.length === 0) { return this._options.format; @@ -1442,7 +1682,14 @@ var DateTimePicker = function ($, moment) { } this._viewDate = this._parseInputDate(newDate); - this._viewUpdate(); + this._update(); + this._viewUpdate(DatePickerModes[this.currentViewMode] && DatePickerModes[this.currentViewMode].NAV_FUNCTION); + }; + + DateTimePicker.prototype._fillDate = function _fillDate() {}; + + DateTimePicker.prototype._useFeatherIcons = function _useFeatherIcons() { + return this._options.icons.type === 'feather'; }; DateTimePicker.prototype.allowMultidate = function allowMultidate(_allowMultidate) { @@ -1458,8 +1705,8 @@ var DateTimePicker = function ($, moment) { return this._options.multidateSeparator; } - if (typeof _multidateSeparator !== 'string' || _multidateSeparator.length > 1) { - throw new TypeError('multidateSeparator expects a single character string parameter'); + if (typeof _multidateSeparator !== 'string') { + throw new TypeError('multidateSeparator expects a string parameter'); } this._options.multidateSeparator = _multidateSeparator; diff --git a/build/js/tempusdominus-core.min.js b/build/js/tempusdominus-core.min.js new file mode 100644 index 0000000..f3d30a6 --- /dev/null +++ b/build/js/tempusdominus-core.min.js @@ -0,0 +1 @@ +var _createClass=function(){function o(t,e){for(var i=0;i div").hide().filter(".datepicker-"+l[this.currentViewMode].CLASS_NAME).show())},D.prototype._isInDisabledDates=function(t){return!0===this._options.disabledDates[t.format("YYYY-MM-DD")]},D.prototype._isInEnabledDates=function(t){return!0===this._options.enabledDates[t.format("YYYY-MM-DD")]},D.prototype._isInDisabledHours=function(t){return!0===this._options.disabledHours[t.format("H")]},D.prototype._isInEnabledHours=function(t){return!0===this._options.enabledHours[t.format("H")]},D.prototype._isValid=function(t,e){if(!t||!t.isValid())return!1;if(this._options.disabledDates&&"d"===e&&this._isInDisabledDates(t))return!1;if(this._options.enabledDates&&"d"===e&&!this._isInEnabledDates(t))return!1;if(this._options.minDate&&t.isBefore(this._options.minDate,e))return!1;if(this._options.maxDate&&t.isAfter(this._options.maxDate,e))return!1;if(this._options.daysOfWeekDisabled&&"d"===e&&-1!==this._options.daysOfWeekDisabled.indexOf(t.day()))return!1;if(this._options.disabledHours&&("h"===e||"m"===e||"s"===e)&&this._isInDisabledHours(t))return!1;if(this._options.enabledHours&&("h"===e||"m"===e||"s"===e)&&!this._isInEnabledHours(t))return!1;if(this._options.disabledTimeIntervals&&("h"===e||"m"===e||"s"===e)){var i=!1;if(n.each(this._options.disabledTimeIntervals,function(){if(t.isBetween(this[0],this[1]))return!(i=!0)}),i)return!1}return!0},D.prototype._parseInputDate=function(t,e){var i=(1 1) { + for (var i = 0; i < this._dates.length; i++) { + outpValue += '' + this._dates[i].format(this.actualFormat) + this._options.multidateSeparator; + } + outpValue = outpValue.replace(new RegExp(this._options.multidateSeparator + '\\s*$'), ''); + } else { + outpValue = this._dates[index].format(this.actualFormat); + } + outpValue = trim(outpValue); + if (this.input !== undefined) { + this.input.val(outpValue); + this.input.trigger('input'); + } + this._element.data('date', outpValue); + + this.unset = false; + this._update(); + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: this._dates[index].clone(), + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + } else { + isInvalid = true; + if (!this._options.keepInvalid) { + if (this.input !== undefined) { + this.input.val('' + (this.unset ? '' : this._dates[index].format(this.actualFormat))); + this.input.trigger('input'); + } + } else { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment, + oldDate: oldDate, + isClear: isClear, + isInvalid: isInvalid, + isDateUpdateThroughDateOptionFromClientCode: isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + } + this._notifyEvent({ + type: DateTimePicker.Event.ERROR, + date: targetMoment, + oldDate: oldDate + }); + } + }; + + DateTimePicker.prototype._change = function _change(e) { + var val = $(e.target).val().trim(), + parsedDate = val ? this._parseInputDate(val) : null; + this._setValue(parsedDate, 0); + e.stopImmediatePropagation(); + return false; + }; + + //noinspection JSMethodCanBeStatic + + + DateTimePicker.prototype._getOptions = function _getOptions(options) { + options = $.extend(true, {}, Default, options && options.icons && options.icons.type === 'feather' ? { + icons: defaultFeatherIcons + } : {}, options); + return options; + }; + + DateTimePicker.prototype._hasTimeZone = function _hasTimeZone() { + return moment.tz !== undefined && this._options.timeZone !== undefined && this._options.timeZone !== null && this._options.timeZone !== ''; + }; + + DateTimePicker.prototype._isEnabled = function _isEnabled(granularity) { + if (typeof granularity !== 'string' || granularity.length > 1) { + throw new TypeError('isEnabled expects a single character string parameter'); + } + switch (granularity) { + case 'y': + return this.actualFormat.indexOf('Y') !== -1; + case 'M': + return this.actualFormat.indexOf('M') !== -1; + case 'd': + return this.actualFormat.toLowerCase().indexOf('d') !== -1; + case 'h': + case 'H': + return this.actualFormat.toLowerCase().indexOf('h') !== -1; + case 'm': + return this.actualFormat.indexOf('m') !== -1; + case 's': + return this.actualFormat.indexOf('s') !== -1; + case 'a': + case 'A': + return this.actualFormat.toLowerCase().indexOf('a') !== -1; + default: + return false; + } + }; + + DateTimePicker.prototype._hasTime = function _hasTime() { + return this._isEnabled('h') || this._isEnabled('m') || this._isEnabled('s'); + }; + + DateTimePicker.prototype._hasDate = function _hasDate() { + return this._isEnabled('y') || this._isEnabled('M') || this._isEnabled('d'); + }; + + DateTimePicker.prototype._dataToOptions = function _dataToOptions() { + var eData = this._element.data(); + var dataOptions = {}; + + if (eData.dateOptions && eData.dateOptions instanceof Object) { + dataOptions = $.extend(true, dataOptions, eData.dateOptions); + } + + $.each(this._options, function (key) { + var attributeName = 'date' + key.charAt(0).toUpperCase() + key.slice(1); //todo data api key + if (eData[attributeName] !== undefined) { + dataOptions[key] = eData[attributeName]; + } else { + delete dataOptions[key]; + } + }); + return dataOptions; + }; + + DateTimePicker.prototype._format = function _format() { + return this._options.format || 'YYYY-MM-DD HH:mm'; + }; + + DateTimePicker.prototype._areSameDates = function _areSameDates(a, b) { + var format = this._format(); + return a && b && (a.isSame(b) || moment(a.format(format), format).isSame(moment(b.format(format), format))); + }; + + DateTimePicker.prototype._notifyEvent = function _notifyEvent(e) { + if (e.type === DateTimePicker.Event.CHANGE) { + this._notifyChangeEventContext = this._notifyChangeEventContext || 0; + this._notifyChangeEventContext++; + if (e.date && this._areSameDates(e.date, e.oldDate) || !e.isClear && !e.date && !e.oldDate || this._notifyChangeEventContext > 1) { + this._notifyChangeEventContext = void 0; + return; + } + this._handlePromptTimeIfNeeded(e); + } + this._element.trigger(e); + this._notifyChangeEventContext = void 0; + }; + + DateTimePicker.prototype._handlePromptTimeIfNeeded = function _handlePromptTimeIfNeeded(e) { + if (this._options.promptTimeOnDateChange) { + if (!e.oldDate && this._options.useCurrent) { + // First time ever. If useCurrent option is set to true (default), do nothing + // because the first date is selected automatically. + return; + } else if (e.oldDate && e.date && (e.oldDate.format('YYYY-MM-DD') === e.date.format('YYYY-MM-DD') || e.oldDate.format('YYYY-MM-DD') !== e.date.format('YYYY-MM-DD') && e.oldDate.format('HH:mm:ss') !== e.date.format('HH:mm:ss'))) { + // Date didn't change (time did) or date changed because time did. + return; + } + + var that = this; + clearTimeout(this._currentPromptTimeTimeout); + this._currentPromptTimeTimeout = setTimeout(function () { + if (that.widget) { + that.widget.find('[data-action="togglePicker"]').click(); + } + }, this._options.promptTimeOnDateChangeTransitionDelay); + } + }; + + DateTimePicker.prototype._viewUpdate = function _viewUpdate(e) { + if (e === 'y') { + e = 'YYYY'; + } + this._notifyEvent({ + type: DateTimePicker.Event.UPDATE, + change: e, + viewDate: this._viewDate.clone() + }); + }; + + DateTimePicker.prototype._showMode = function _showMode(dir) { + if (!this.widget) { + return; + } + if (dir) { + this.currentViewMode = Math.max(this.MinViewModeNumber, Math.min(3, this.currentViewMode + dir)); + } + this.widget.find('.datepicker > div').hide().filter('.datepicker-' + DatePickerModes[this.currentViewMode].CLASS_NAME).show(); + }; + + DateTimePicker.prototype._isInDisabledDates = function _isInDisabledDates(testDate) { + return this._options.disabledDates[testDate.format('YYYY-MM-DD')] === true; + }; + + DateTimePicker.prototype._isInEnabledDates = function _isInEnabledDates(testDate) { + return this._options.enabledDates[testDate.format('YYYY-MM-DD')] === true; + }; + + DateTimePicker.prototype._isInDisabledHours = function _isInDisabledHours(testDate) { + return this._options.disabledHours[testDate.format('H')] === true; + }; + + DateTimePicker.prototype._isInEnabledHours = function _isInEnabledHours(testDate) { + return this._options.enabledHours[testDate.format('H')] === true; + }; + + DateTimePicker.prototype._isValid = function _isValid(targetMoment, granularity) { + if (!targetMoment || !targetMoment.isValid()) { + return false; + } + if (this._options.disabledDates && granularity === 'd' && this._isInDisabledDates(targetMoment)) { + return false; + } + if (this._options.enabledDates && granularity === 'd' && !this._isInEnabledDates(targetMoment)) { + return false; + } + if (this._options.minDate && targetMoment.isBefore(this._options.minDate, granularity)) { + return false; + } + if (this._options.maxDate && targetMoment.isAfter(this._options.maxDate, granularity)) { + return false; + } + if (this._options.daysOfWeekDisabled && granularity === 'd' && this._options.daysOfWeekDisabled.indexOf(targetMoment.day()) !== -1) { + return false; + } + if (this._options.disabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && this._isInDisabledHours(targetMoment)) { + return false; + } + if (this._options.enabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && !this._isInEnabledHours(targetMoment)) { + return false; + } + if (this._options.disabledTimeIntervals && (granularity === 'h' || granularity === 'm' || granularity === 's')) { + var found = false; + $.each(this._options.disabledTimeIntervals, function () { + if (targetMoment.isBetween(this[0], this[1])) { + found = true; + return false; + } + }); + if (found) { + return false; + } + } + return true; + }; + + DateTimePicker.prototype._parseInputDate = function _parseInputDate(inputDate) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$isPickerShow = _ref.isPickerShow, + isPickerShow = _ref$isPickerShow === undefined ? false : _ref$isPickerShow; + + if (this._options.parseInputDate === undefined || isPickerShow) { + if (!moment.isMoment(inputDate)) { + inputDate = this.getMoment(inputDate); + } + } else { + inputDate = this._options.parseInputDate(inputDate); + } + //inputDate.locale(this.options.locale); + return inputDate; + }; + + DateTimePicker.prototype._keydown = function _keydown(e) { + var handler = null, + index = void 0, + index2 = void 0, + keyBindKeys = void 0, + allModifiersPressed = void 0; + var pressedKeys = [], + pressedModifiers = {}, + currentKey = e.which, + pressed = 'p'; + + keyState[currentKey] = pressed; + + for (index in keyState) { + if (keyState.hasOwnProperty(index) && keyState[index] === pressed) { + pressedKeys.push(index); + if (parseInt(index, 10) !== currentKey) { + pressedModifiers[index] = true; + } + } + } + + for (index in this._options.keyBinds) { + if (this._options.keyBinds.hasOwnProperty(index) && typeof this._options.keyBinds[index] === 'function') { + keyBindKeys = index.split(' '); + if (keyBindKeys.length === pressedKeys.length && KeyMap[currentKey] === keyBindKeys[keyBindKeys.length - 1]) { + allModifiersPressed = true; + for (index2 = keyBindKeys.length - 2; index2 >= 0; index2--) { + if (!(KeyMap[keyBindKeys[index2]] in pressedModifiers)) { + allModifiersPressed = false; + break; + } + } + if (allModifiersPressed) { + handler = this._options.keyBinds[index]; + break; + } + } + } + } + + if (handler) { + if (handler.call(this)) { + e.stopPropagation(); + e.preventDefault(); + } + } + }; + + //noinspection JSMethodCanBeStatic,SpellCheckingInspection + + + DateTimePicker.prototype._keyup = function _keyup(e) { + keyState[e.which] = 'r'; + if (keyPressHandled[e.which]) { + keyPressHandled[e.which] = false; + e.stopPropagation(); + e.preventDefault(); + } + }; + + DateTimePicker.prototype._indexGivenDates = function _indexGivenDates(givenDatesArray) { + // Store given enabledDates and disabledDates as keys. + // This way we can check their existence in O(1) time instead of looping through whole array. + // (for example: options.enabledDates['2014-02-27'] === true) + var givenDatesIndexed = {}, + self = this; + $.each(givenDatesArray, function () { + var dDate = self._parseInputDate(this); + if (dDate.isValid()) { + givenDatesIndexed[dDate.format('YYYY-MM-DD')] = true; + } + }); + return Object.keys(givenDatesIndexed).length ? givenDatesIndexed : false; + }; + + DateTimePicker.prototype._indexGivenHours = function _indexGivenHours(givenHoursArray) { + // Store given enabledHours and disabledHours as keys. + // This way we can check their existence in O(1) time instead of looping through whole array. + // (for example: options.enabledHours['2014-02-27'] === true) + var givenHoursIndexed = {}; + $.each(givenHoursArray, function () { + givenHoursIndexed[this] = true; + }); + return Object.keys(givenHoursIndexed).length ? givenHoursIndexed : false; + }; + + DateTimePicker.prototype._initFormatting = function _initFormatting() { + var format = this._options.format || 'L LT', + self = this; + + this.actualFormat = format.replace(/(\[[^\[]*])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput) { + return (self.isInitFormatting && self._options.date === null ? self.getMoment() : self._dates[0]).localeData().longDateFormat(formatInput) || formatInput; //todo taking the first date should be ok + }); + + this.parseFormats = this._options.extraFormats ? this._options.extraFormats.slice() : []; + if (this.parseFormats.indexOf(format) < 0 && this.parseFormats.indexOf(this.actualFormat) < 0) { + this.parseFormats.push(this.actualFormat); + } + + this.use24Hours = this.actualFormat.toLowerCase().indexOf('a') < 1 && this.actualFormat.replace(/\[.*?]/g, '').indexOf('h') < 1; + + if (this._isEnabled('y')) { + this.MinViewModeNumber = 2; + } + if (this._isEnabled('M')) { + this.MinViewModeNumber = 1; + } + if (this._isEnabled('d')) { + this.MinViewModeNumber = 0; + } + + this.currentViewMode = Math.max(this.MinViewModeNumber, this.currentViewMode); + + if (!this.unset) { + this._setValue(this._dates[0], 0); + } + }; + + DateTimePicker.prototype._getLastPickedDate = function _getLastPickedDate() { + var lastPickedDate = this._dates[this._getLastPickedDateIndex()]; + if (!lastPickedDate && this._options.allowMultidate) { + lastPickedDate = moment(new Date()); + } + return lastPickedDate; + }; + + DateTimePicker.prototype._getLastPickedDateIndex = function _getLastPickedDateIndex() { + return this._dates.length - 1; + }; + + //public + + + DateTimePicker.prototype.getMoment = function getMoment(d) { + var returnMoment = void 0; + + if (d === undefined || d === null) { + // TODO: Should this use format? + returnMoment = moment().clone().locale(this._options.locale); + } else if (this._hasTimeZone()) { + // There is a string to parse and a default time zone + // parse with the tz function which takes a default time zone if it is not in the format string + returnMoment = moment.tz(d, this.parseFormats, this._options.locale, this._options.useStrict, this._options.timeZone); + } else { + returnMoment = moment(d, this.parseFormats, this._options.locale, this._options.useStrict); + } + + if (this._hasTimeZone()) { + returnMoment.tz(this._options.timeZone); + } + + return returnMoment; + }; + + DateTimePicker.prototype.toggle = function toggle() { + return this.widget ? this.hide() : this.show(); + }; + + DateTimePicker.prototype.readonly = function readonly(_readonly) { + if (arguments.length === 0) { + return this._options.readonly; + } + if (typeof _readonly !== 'boolean') { + throw new TypeError('readonly() expects a boolean parameter'); + } + this._options.readonly = _readonly; + if (this.input !== undefined) { + this.input.prop('readonly', this._options.readonly); + } + if (this.widget) { + this.hide(); + this.show(); + } + }; + + DateTimePicker.prototype.ignoreReadonly = function ignoreReadonly(_ignoreReadonly) { + if (arguments.length === 0) { + return this._options.ignoreReadonly; + } + if (typeof _ignoreReadonly !== 'boolean') { + throw new TypeError('ignoreReadonly() expects a boolean parameter'); + } + this._options.ignoreReadonly = _ignoreReadonly; + }; + + DateTimePicker.prototype.options = function options(newOptions) { + if (arguments.length === 0) { + return $.extend(true, {}, this._options); + } + + if (!(newOptions instanceof Object)) { + throw new TypeError('options() this.options parameter should be an object'); + } + $.extend(true, this._options, newOptions); + var self = this, + optionsKeys = Object.keys(this._options).sort(optionsSortFn); + $.each(optionsKeys, function (i, key) { + var value = self._options[key]; + if (self[key] !== undefined) { + if (self.isInit && key === 'date') { + self.hasInitDate = true; + self.initDate = value; + return; + } + self[key](value); + } + }); + }; + + DateTimePicker.prototype.date = function date(newDate, index) { + index = index || 0; + if (arguments.length === 0) { + if (this.unset) { + return null; + } + if (this._options.allowMultidate) { + return this._dates.join(this._options.multidateSeparator); + } else { + return this._dates[index].clone(); + } + } + + if (newDate !== null && typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { + throw new TypeError('date() parameter must be one of [null, string, moment or Date]'); + } + + if (typeof newDate === 'string' && isValidDateTimeStr(newDate)) { + newDate = new Date(newDate); + } + + this._setValue(newDate === null ? null : this._parseInputDate(newDate), index); + }; + + DateTimePicker.prototype.updateOnlyThroughDateOption = function updateOnlyThroughDateOption(_updateOnlyThroughDateOption) { + if (typeof _updateOnlyThroughDateOption !== 'boolean') { + throw new TypeError('updateOnlyThroughDateOption() expects a boolean parameter'); + } + + this._options.updateOnlyThroughDateOption = _updateOnlyThroughDateOption; + }; + + DateTimePicker.prototype.format = function format(newFormat) { + if (arguments.length === 0) { + return this._options.format; + } + + if (typeof newFormat !== 'string' && (typeof newFormat !== 'boolean' || newFormat !== false)) { + throw new TypeError('format() expects a string or boolean:false parameter ' + newFormat); + } + + this._options.format = newFormat; + if (this.actualFormat) { + this._initFormatting(); // reinitialize formatting + } + }; + + DateTimePicker.prototype.timeZone = function timeZone(newZone) { + if (arguments.length === 0) { + return this._options.timeZone; + } + + if (typeof newZone !== 'string') { + throw new TypeError('newZone() expects a string parameter'); + } + + this._options.timeZone = newZone; + }; + + DateTimePicker.prototype.dayViewHeaderFormat = function dayViewHeaderFormat(newFormat) { + if (arguments.length === 0) { + return this._options.dayViewHeaderFormat; + } + + if (typeof newFormat !== 'string') { + throw new TypeError('dayViewHeaderFormat() expects a string parameter'); + } + + this._options.dayViewHeaderFormat = newFormat; + }; + + DateTimePicker.prototype.extraFormats = function extraFormats(formats) { + if (arguments.length === 0) { + return this._options.extraFormats; + } + + if (formats !== false && !(formats instanceof Array)) { + throw new TypeError('extraFormats() expects an array or false parameter'); + } + + this._options.extraFormats = formats; + if (this.parseFormats) { + this._initFormatting(); // reinit formatting + } + }; + + DateTimePicker.prototype.disabledDates = function disabledDates(dates) { + if (arguments.length === 0) { + return this._options.disabledDates ? $.extend({}, this._options.disabledDates) : this._options.disabledDates; + } + + if (!dates) { + this._options.disabledDates = false; + this._update(); + return true; + } + if (!(dates instanceof Array)) { + throw new TypeError('disabledDates() expects an array parameter'); + } + this._options.disabledDates = this._indexGivenDates(dates); + this._options.enabledDates = false; + this._update(); + }; + + DateTimePicker.prototype.enabledDates = function enabledDates(dates) { + if (arguments.length === 0) { + return this._options.enabledDates ? $.extend({}, this._options.enabledDates) : this._options.enabledDates; + } + + if (!dates) { + this._options.enabledDates = false; + this._update(); + return true; + } + if (!(dates instanceof Array)) { + throw new TypeError('enabledDates() expects an array parameter'); + } + this._options.enabledDates = this._indexGivenDates(dates); + this._options.disabledDates = false; + this._update(); + }; + + DateTimePicker.prototype.daysOfWeekDisabled = function daysOfWeekDisabled(_daysOfWeekDisabled) { + if (arguments.length === 0) { + return this._options.daysOfWeekDisabled.splice(0); + } + + if (typeof _daysOfWeekDisabled === 'boolean' && !_daysOfWeekDisabled) { + this._options.daysOfWeekDisabled = false; + this._update(); + return true; + } + + if (!(_daysOfWeekDisabled instanceof Array)) { + throw new TypeError('daysOfWeekDisabled() expects an array parameter'); + } + this._options.daysOfWeekDisabled = _daysOfWeekDisabled.reduce(function (previousValue, currentValue) { + currentValue = parseInt(currentValue, 10); + if (currentValue > 6 || currentValue < 0 || isNaN(currentValue)) { + return previousValue; + } + if (previousValue.indexOf(currentValue) === -1) { + previousValue.push(currentValue); + } + return previousValue; + }, []).sort(); + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; + while (!this._isValid(this._dates[i], 'd')) { + this._dates[i].add(1, 'd'); + if (tries === 31) { + throw 'Tried 31 times to find a valid date'; + } + tries++; + } + this._setValue(this._dates[i], i); + } + } + this._update(); + }; + + DateTimePicker.prototype.maxDate = function maxDate(_maxDate) { + if (arguments.length === 0) { + return this._options.maxDate ? this._options.maxDate.clone() : this._options.maxDate; + } + + if (typeof _maxDate === 'boolean' && _maxDate === false) { + this._options.maxDate = false; + this._update(); + return true; + } + + if (typeof _maxDate === 'string') { + if (_maxDate === 'now' || _maxDate === 'moment') { + _maxDate = this.getMoment(); + } + } + + var parsedDate = this._parseInputDate(_maxDate); + + if (!parsedDate.isValid()) { + throw new TypeError('maxDate() Could not parse date parameter: ' + _maxDate); + } + if (this._options.minDate && parsedDate.isBefore(this._options.minDate)) { + throw new TypeError('maxDate() date parameter is before this.options.minDate: ' + parsedDate.format(this.actualFormat)); + } + this._options.maxDate = parsedDate; + for (var i = 0; i < this._dates.length; i++) { + if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isAfter(_maxDate)) { + this._setValue(this._options.maxDate, i); + } + } + if (this._viewDate.isAfter(parsedDate)) { + this._viewDate = parsedDate.clone().subtract(this._options.stepping, 'm'); + } + this._update(); + }; + + DateTimePicker.prototype.minDate = function minDate(_minDate) { + if (arguments.length === 0) { + return this._options.minDate ? this._options.minDate.clone() : this._options.minDate; + } + + if (typeof _minDate === 'boolean' && _minDate === false) { + this._options.minDate = false; + this._update(); + return true; + } + + if (typeof _minDate === 'string') { + if (_minDate === 'now' || _minDate === 'moment') { + _minDate = this.getMoment(); + } + } + + var parsedDate = this._parseInputDate(_minDate); + + if (!parsedDate.isValid()) { + throw new TypeError('minDate() Could not parse date parameter: ' + _minDate); + } + if (this._options.maxDate && parsedDate.isAfter(this._options.maxDate)) { + throw new TypeError('minDate() date parameter is after this.options.maxDate: ' + parsedDate.format(this.actualFormat)); + } + this._options.minDate = parsedDate; + for (var i = 0; i < this._dates.length; i++) { + if (this._options.useCurrent && !this._options.keepInvalid && this._dates[i].isBefore(_minDate)) { + this._setValue(this._options.minDate, i); + } + } + if (this._viewDate.isBefore(parsedDate)) { + this._viewDate = parsedDate.clone().add(this._options.stepping, 'm'); + } + this._update(); + }; + + DateTimePicker.prototype.defaultDate = function defaultDate(_defaultDate) { + if (arguments.length === 0) { + return this._options.defaultDate ? this._options.defaultDate.clone() : this._options.defaultDate; + } + if (!_defaultDate) { + this._options.defaultDate = false; + return true; + } + + if (typeof _defaultDate === 'string') { + if (_defaultDate === 'now' || _defaultDate === 'moment') { + _defaultDate = this.getMoment(); + } else { + _defaultDate = this.getMoment(_defaultDate); + } + } + + var parsedDate = this._parseInputDate(_defaultDate); + if (!parsedDate.isValid()) { + throw new TypeError('defaultDate() Could not parse date parameter: ' + _defaultDate); + } + if (!this._isValid(parsedDate)) { + throw new TypeError('defaultDate() date passed is invalid according to component setup validations'); + } + + this._options.defaultDate = parsedDate; + + if (this._options.defaultDate && this._options.inline || this.input !== undefined && this.input.val().trim() === '') { + this._setValue(this._options.defaultDate, 0); + } + }; + + DateTimePicker.prototype.locale = function locale(_locale) { + if (arguments.length === 0) { + return this._options.locale; + } + + if (!moment.localeData(_locale)) { + throw new TypeError('locale() locale ' + _locale + ' is not loaded from moment locales!'); + } + + this._options.locale = _locale; + + for (var i = 0; i < this._dates.length; i++) { + this._dates[i].locale(this._options.locale); + } + this._viewDate.locale(this._options.locale); + + if (this.actualFormat) { + this._initFormatting(); // reinitialize formatting + } + if (this.widget) { + this.hide(); + this.show(); + } + }; + + DateTimePicker.prototype.stepping = function stepping(_stepping) { + if (arguments.length === 0) { + return this._options.stepping; + } + + _stepping = parseInt(_stepping, 10); + if (isNaN(_stepping) || _stepping < 1) { + _stepping = 1; + } + this._options.stepping = _stepping; + }; + + DateTimePicker.prototype.useCurrent = function useCurrent(_useCurrent) { + var useCurrentOptions = ['year', 'month', 'day', 'hour', 'minute']; + if (arguments.length === 0) { + return this._options.useCurrent; + } + + if (typeof _useCurrent !== 'boolean' && typeof _useCurrent !== 'string') { + throw new TypeError('useCurrent() expects a boolean or string parameter'); + } + if (typeof _useCurrent === 'string' && useCurrentOptions.indexOf(_useCurrent.toLowerCase()) === -1) { + throw new TypeError('useCurrent() expects a string parameter of ' + useCurrentOptions.join(', ')); + } + this._options.useCurrent = _useCurrent; + }; + + DateTimePicker.prototype.collapse = function collapse(_collapse) { + if (arguments.length === 0) { + return this._options.collapse; + } + + if (typeof _collapse !== 'boolean') { + throw new TypeError('collapse() expects a boolean parameter'); + } + if (this._options.collapse === _collapse) { + return true; + } + this._options.collapse = _collapse; + if (this.widget) { + this.hide(); + this.show(); + } + }; + + DateTimePicker.prototype.icons = function icons(_icons) { + if (arguments.length === 0) { + return $.extend({}, this._options.icons); + } + + if (!(_icons instanceof Object)) { + throw new TypeError('icons() expects parameter to be an Object'); + } + + $.extend(this._options.icons, _icons); + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + DateTimePicker.prototype.tooltips = function tooltips(_tooltips) { + if (arguments.length === 0) { + return $.extend({}, this._options.tooltips); + } + + if (!(_tooltips instanceof Object)) { + throw new TypeError('tooltips() expects parameter to be an Object'); + } + $.extend(this._options.tooltips, _tooltips); + if (this.widget) { + this.hide(); + this.show(); + } + }; + + DateTimePicker.prototype.useStrict = function useStrict(_useStrict) { + if (arguments.length === 0) { + return this._options.useStrict; + } + + if (typeof _useStrict !== 'boolean') { + throw new TypeError('useStrict() expects a boolean parameter'); + } + this._options.useStrict = _useStrict; + }; + + DateTimePicker.prototype.sideBySide = function sideBySide(_sideBySide) { + if (arguments.length === 0) { + return this._options.sideBySide; + } + + if (typeof _sideBySide !== 'boolean') { + throw new TypeError('sideBySide() expects a boolean parameter'); + } + this._options.sideBySide = _sideBySide; + if (this.widget) { + this.hide(); + this.show(); + } + }; + + DateTimePicker.prototype.viewMode = function viewMode(_viewMode) { + if (arguments.length === 0) { + return this._options.viewMode; + } + + if (typeof _viewMode !== 'string') { + throw new TypeError('viewMode() expects a string parameter'); + } + + if (DateTimePicker.ViewModes.indexOf(_viewMode) === -1) { + throw new TypeError('viewMode() parameter must be one of (' + DateTimePicker.ViewModes.join(', ') + ') value'); + } + + this._options.viewMode = _viewMode; + this.currentViewMode = Math.max(DateTimePicker.ViewModes.indexOf(_viewMode) - 1, this.MinViewModeNumber); + + this._showMode(); + }; + + DateTimePicker.prototype.calendarWeeks = function calendarWeeks(_calendarWeeks) { + if (arguments.length === 0) { + return this._options.calendarWeeks; + } + + if (typeof _calendarWeeks !== 'boolean') { + throw new TypeError('calendarWeeks() expects parameter to be a boolean value'); + } + + this._options.calendarWeeks = _calendarWeeks; + this._update(); + }; + + DateTimePicker.prototype.buttons = function buttons(_buttons) { + if (arguments.length === 0) { + return $.extend({}, this._options.buttons); + } + + if (!(_buttons instanceof Object)) { + throw new TypeError('buttons() expects parameter to be an Object'); + } + + $.extend(this._options.buttons, _buttons); + + if (typeof this._options.buttons.showToday !== 'boolean') { + throw new TypeError('buttons.showToday expects a boolean parameter'); + } + if (typeof this._options.buttons.showClear !== 'boolean') { + throw new TypeError('buttons.showClear expects a boolean parameter'); + } + if (typeof this._options.buttons.showClose !== 'boolean') { + throw new TypeError('buttons.showClose expects a boolean parameter'); + } + + if (this.widget) { + this.hide(); + this.show(); + } + }; + + DateTimePicker.prototype.keepOpen = function keepOpen(_keepOpen) { + if (arguments.length === 0) { + return this._options.keepOpen; + } + + if (typeof _keepOpen !== 'boolean') { + throw new TypeError('keepOpen() expects a boolean parameter'); + } + + this._options.keepOpen = _keepOpen; + }; + + DateTimePicker.prototype.focusOnShow = function focusOnShow(_focusOnShow) { + if (arguments.length === 0) { + return this._options.focusOnShow; + } + + if (typeof _focusOnShow !== 'boolean') { + throw new TypeError('focusOnShow() expects a boolean parameter'); + } + + this._options.focusOnShow = _focusOnShow; + }; + + DateTimePicker.prototype.inline = function inline(_inline) { + if (arguments.length === 0) { + return this._options.inline; + } + + if (typeof _inline !== 'boolean') { + throw new TypeError('inline() expects a boolean parameter'); + } + + this._options.inline = _inline; + }; + + DateTimePicker.prototype.clear = function clear() { + this._setValue(null); //todo + }; + + DateTimePicker.prototype.keyBinds = function keyBinds(_keyBinds) { + if (arguments.length === 0) { + return this._options.keyBinds; + } + + this._options.keyBinds = _keyBinds; + }; + + DateTimePicker.prototype.debug = function debug(_debug) { + if (typeof _debug !== 'boolean') { + throw new TypeError('debug() expects a boolean parameter'); + } + + this._options.debug = _debug; + }; + + DateTimePicker.prototype.allowInputToggle = function allowInputToggle(_allowInputToggle) { + if (arguments.length === 0) { + return this._options.allowInputToggle; + } + + if (typeof _allowInputToggle !== 'boolean') { + throw new TypeError('allowInputToggle() expects a boolean parameter'); + } + + this._options.allowInputToggle = _allowInputToggle; + }; + + DateTimePicker.prototype.keepInvalid = function keepInvalid(_keepInvalid) { + if (arguments.length === 0) { + return this._options.keepInvalid; + } + + if (typeof _keepInvalid !== 'boolean') { + throw new TypeError('keepInvalid() expects a boolean parameter'); + } + this._options.keepInvalid = _keepInvalid; + }; + + DateTimePicker.prototype.datepickerInput = function datepickerInput(_datepickerInput) { + if (arguments.length === 0) { + return this._options.datepickerInput; + } + + if (typeof _datepickerInput !== 'string') { + throw new TypeError('datepickerInput() expects a string parameter'); + } + + this._options.datepickerInput = _datepickerInput; + }; + + DateTimePicker.prototype.parseInputDate = function parseInputDate(_parseInputDate2) { + if (arguments.length === 0) { + return this._options.parseInputDate; + } + + if (typeof _parseInputDate2 !== 'function') { + throw new TypeError('parseInputDate() should be as function'); + } + + this._options.parseInputDate = _parseInputDate2; + }; + + DateTimePicker.prototype.disabledTimeIntervals = function disabledTimeIntervals(_disabledTimeIntervals) { + if (arguments.length === 0) { + return this._options.disabledTimeIntervals ? $.extend({}, this._options.disabledTimeIntervals) : this._options.disabledTimeIntervals; + } + + if (!_disabledTimeIntervals) { + this._options.disabledTimeIntervals = false; + this._update(); + return true; + } + if (!(_disabledTimeIntervals instanceof Array)) { + throw new TypeError('disabledTimeIntervals() expects an array parameter'); + } + this._options.disabledTimeIntervals = _disabledTimeIntervals; + this._update(); + }; + + DateTimePicker.prototype.disabledHours = function disabledHours(hours) { + if (arguments.length === 0) { + return this._options.disabledHours ? $.extend({}, this._options.disabledHours) : this._options.disabledHours; + } + + if (!hours) { + this._options.disabledHours = false; + this._update(); + return true; + } + if (!(hours instanceof Array)) { + throw new TypeError('disabledHours() expects an array parameter'); + } + this._options.disabledHours = this._indexGivenHours(hours); + this._options.enabledHours = false; + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; + while (!this._isValid(this._dates[i], 'h')) { + this._dates[i].add(1, 'h'); + if (tries === 24) { + throw 'Tried 24 times to find a valid date'; + } + tries++; + } + this._setValue(this._dates[i], i); + } + } + this._update(); + }; + + DateTimePicker.prototype.enabledHours = function enabledHours(hours) { + if (arguments.length === 0) { + return this._options.enabledHours ? $.extend({}, this._options.enabledHours) : this._options.enabledHours; + } + + if (!hours) { + this._options.enabledHours = false; + this._update(); + return true; + } + if (!(hours instanceof Array)) { + throw new TypeError('enabledHours() expects an array parameter'); + } + this._options.enabledHours = this._indexGivenHours(hours); + this._options.disabledHours = false; + if (this._options.useCurrent && !this._options.keepInvalid) { + for (var i = 0; i < this._dates.length; i++) { + var tries = 0; + while (!this._isValid(this._dates[i], 'h')) { + this._dates[i].add(1, 'h'); + if (tries === 24) { + throw 'Tried 24 times to find a valid date'; + } + tries++; + } + this._setValue(this._dates[i], i); + } + } + this._update(); + }; + + DateTimePicker.prototype.viewDate = function viewDate(newDate) { + if (arguments.length === 0) { + return this._viewDate.clone(); + } + + if (!newDate) { + this._viewDate = (this._dates[0] || this.getMoment()).clone(); + return true; + } + + if (typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) { + throw new TypeError('viewDate() parameter must be one of [string, moment or Date]'); + } + + this._viewDate = this._parseInputDate(newDate); + this._update(); + this._viewUpdate(DatePickerModes[this.currentViewMode] && DatePickerModes[this.currentViewMode].NAV_FUNCTION); + }; + + DateTimePicker.prototype._fillDate = function _fillDate() {}; + + DateTimePicker.prototype._useFeatherIcons = function _useFeatherIcons() { + return this._options.icons.type === 'feather'; + }; + + DateTimePicker.prototype.allowMultidate = function allowMultidate(_allowMultidate) { + if (typeof _allowMultidate !== 'boolean') { + throw new TypeError('allowMultidate() expects a boolean parameter'); + } + + this._options.allowMultidate = _allowMultidate; + }; + + DateTimePicker.prototype.multidateSeparator = function multidateSeparator(_multidateSeparator) { + if (arguments.length === 0) { + return this._options.multidateSeparator; + } + + if (typeof _multidateSeparator !== 'string') { + throw new TypeError('multidateSeparator expects a string parameter'); + } + + this._options.multidateSeparator = _multidateSeparator; + }; + + _createClass(DateTimePicker, null, [{ + key: 'NAME', + get: function get() { + return NAME; + } + + /** + * @return {string} + */ + + }, { + key: 'DATA_KEY', + get: function get() { + return DATA_KEY; + } + + /** + * @return {string} + */ + + }, { + key: 'EVENT_KEY', + get: function get() { + return EVENT_KEY; + } + + /** + * @return {string} + */ + + }, { + key: 'DATA_API_KEY', + get: function get() { + return DATA_API_KEY; + } + }, { + key: 'DatePickerModes', + get: function get() { + return DatePickerModes; + } + }, { + key: 'ViewModes', + get: function get() { + return ViewModes; + } + }, { + key: 'Event', + get: function get() { + return Event; + } + }, { + key: 'Selector', + get: function get() { + return Selector; + } + }, { + key: 'Default', + get: function get() { + return Default; + }, + set: function set(value) { + Default = value; + } + }, { + key: 'ClassName', + get: function get() { + return ClassName; + } + }]); + + return DateTimePicker; + }(); + + return DateTimePicker; +}(jQuery, moment); diff --git a/build/js/tempusdominus.min.js b/build/js/tempusdominus.min.js new file mode 100644 index 0000000..2a5b2dc --- /dev/null +++ b/build/js/tempusdominus.min.js @@ -0,0 +1 @@ +var _createClass=function(){function o(t,e){for(var i=0;i div").hide().filter(".datepicker-"+l[this.currentViewMode].CLASS_NAME).show())},D.prototype._isInDisabledDates=function(t){return!0===this._options.disabledDates[t.format("YYYY-MM-DD")]},D.prototype._isInEnabledDates=function(t){return!0===this._options.enabledDates[t.format("YYYY-MM-DD")]},D.prototype._isInDisabledHours=function(t){return!0===this._options.disabledHours[t.format("H")]},D.prototype._isInEnabledHours=function(t){return!0===this._options.enabledHours[t.format("H")]},D.prototype._isValid=function(t,e){if(!t||!t.isValid())return!1;if(this._options.disabledDates&&"d"===e&&this._isInDisabledDates(t))return!1;if(this._options.enabledDates&&"d"===e&&!this._isInEnabledDates(t))return!1;if(this._options.minDate&&t.isBefore(this._options.minDate,e))return!1;if(this._options.maxDate&&t.isAfter(this._options.maxDate,e))return!1;if(this._options.daysOfWeekDisabled&&"d"===e&&-1!==this._options.daysOfWeekDisabled.indexOf(t.day()))return!1;if(this._options.disabledHours&&("h"===e||"m"===e||"s"===e)&&this._isInDisabledHours(t))return!1;if(this._options.enabledHours&&("h"===e||"m"===e||"s"===e)&&!this._isInEnabledHours(t))return!1;if(this._options.disabledTimeIntervals&&("h"===e||"m"===e||"s"===e)){var i=!1;if(n.each(this._options.disabledTimeIntervals,function(){if(t.isBetween(this[0],this[1]))return!(i=!0)}),i)return!1}return!0},D.prototype._parseInputDate=function(t,e){var i=(1CDN </head> -

bower Bower version

+

bower Bower version

Run the following command:

-
bower install tempusdominus-core#latest --save
+
bower install tempusdominus#latest --save
 

Include necessary scripts and styles:

@@ -192,7 +192,7 @@

bower Bower version

diff --git a/docs/mkdocs/search_index.json b/docs/mkdocs/search_index.json index 2477950..6212c91 100644 --- a/docs/mkdocs/search_index.json +++ b/docs/mkdocs/search_index.json @@ -1,924 +1,924 @@ { - "docs": [ - { - "location": "/", - "text": "Tempus Dominus - Core v5 Docs\n\n\n\n \nNote\n\n All functions are accessed via the \ndata\n attribute e.g. \n$('#datetimepicker').datetimepicker(FUNCTION)\n\n\n\n\n\nUnderstanding \"Core\"\n\n\nThese documents represent the functions and options specif to the Core module. Each UI module should contain these docs and their own code examples and requirements.\n\n\nUnless you are interested in developing your own UI module you should refer to the docs for the UI module you're using.", - "title": "Home" - }, - { - "location": "/#tempus-dominus-core-v5-docs", - "text": "Note \n All functions are accessed via the data attribute e.g. $('#datetimepicker').datetimepicker(FUNCTION)", - "title": "Tempus Dominus - Core v5 Docs" - }, - { - "location": "/#understanding-core", - "text": "These documents represent the functions and options specif to the Core module. Each UI module should contain these docs and their own code examples and requirements. Unless you are interested in developing your own UI module you should refer to the docs for the UI module you're using.", - "title": "Understanding \"Core\"" - }, - { - "location": "/Installing/", - "text": "Minimal Requirements\n\n\n\n\njQuery\n\n\nMoment.js\n\n\nLocales: Moment's locale files are \nhere\n\n\n\n\nInstallation Guides\n\n\n\n\nCDN\n\n\nBower\n\n\nNuget\n\n\nRails\n\n\nAngular\n\n\nMeteor.js\n\n\nManual\n\n\n\n\nCDN\n\n\nhead\n\n \nscript type=\ntext/javascript\n src=\nhttps://cdnjs.com/libraries/[fill-in].js\n/script\n\n\n/head\n\n\n\n\n\nbower\n \n\n\nRun the following command:\n\n\nbower install tempusdominus-core#latest --save\n\n\n\n\nInclude necessary scripts and styles:\n\n\nhead\n\n \n!-- ... --\n\n \nscript type=\ntext/javascript\n src=\n/bower_components/jquery/jquery.min.js\n/script\n\n \nscript type=\ntext/javascript\n src=\n/bower_components/moment/min/moment.min.js\n/script\n\n \nscript type=\ntext/javascript\n src=\n/bower_components/tempusdominus-core/build/js/core.min.js\n/script\n\n\n/head\n\n\n\n\n\nNuget\n\n\nCore\n: \n\n\nPM\n Install-Package Tempus.Dominus.Core\n\n\n\n\nhead\n\n \nscript type=\ntext/javascript\n src=\n/scripts/jquery.min.js\n/script\n\n \nscript type=\ntext/javascript\n src=\n/scripts/moment.min.js\n/script\n\n \nscript type=\ntext/javascript\n src=\n/scripts/tempusdominus/core.js\n/script\n\n\n/head\n\n\n\n\n\nRails\n\n\nNeed new wrapper for this version.\n\n\nAngular Wrapper\n\n\nNeed new wrapper for this version.\n\n\nMeteor.js\n\n\nNeed new wrapper for this version.\n\n\nManual\n\n\nAcquire \njQuery\n\n\nAcquire \nMoment.js\n\n\nscript type=\ntext/javascript\n src=\n/path/to/jquery.js\n/script\n\n\nscript type=\ntext/javascript\n src=\n/path/to/moment.js\n/script\n\n\nscript type=\ntext/javascript\n src=\n/path/to/core.min.js\n/script\n\n\n\n\n\nKnockout\n\n\nNeed new wrapper for this version.", - "title": "Installing" - }, - { - "location": "/Installing/#minimal-requirements", - "text": "jQuery Moment.js Locales: Moment's locale files are here", - "title": "Minimal Requirements" - }, - { - "location": "/Installing/#installation-guides", - "text": "CDN Bower Nuget Rails Angular Meteor.js Manual", - "title": "Installation Guides" - }, - { - "location": "/Installing/#cdn", - "text": "head \n script type= text/javascript src= https://cdnjs.com/libraries/[fill-in].js /script /head", - "title": "CDN" - }, - { - "location": "/Installing/#bower", - "text": "Run the following command: bower install tempusdominus-core#latest --save Include necessary scripts and styles: head \n !-- ... -- \n script type= text/javascript src= /bower_components/jquery/jquery.min.js /script \n script type= text/javascript src= /bower_components/moment/min/moment.min.js /script \n script type= text/javascript src= /bower_components/tempusdominus-core/build/js/core.min.js /script /head", - "title": "bower" - }, - { - "location": "/Installing/#nuget", - "text": "", - "title": "Nuget" - }, - { - "location": "/Installing/#core", - "text": "PM Install-Package Tempus.Dominus.Core head \n script type= text/javascript src= /scripts/jquery.min.js /script \n script type= text/javascript src= /scripts/moment.min.js /script \n script type= text/javascript src= /scripts/tempusdominus/core.js /script /head", - "title": "Core:" - }, - { - "location": "/Installing/#rails", - "text": "Need new wrapper for this version.", - "title": "Rails" - }, - { - "location": "/Installing/#angular-wrapper", - "text": "Need new wrapper for this version.", - "title": "Angular Wrapper" - }, - { - "location": "/Installing/#meteorjs", - "text": "Need new wrapper for this version.", - "title": "Meteor.js" - }, - { - "location": "/Installing/#manual", - "text": "", - "title": "Manual" - }, - { - "location": "/Installing/#acquire-jquery", - "text": "", - "title": "Acquire jQuery" - }, - { - "location": "/Installing/#acquire-momentjs", - "text": "script type= text/javascript src= /path/to/jquery.js /script script type= text/javascript src= /path/to/moment.js /script script type= text/javascript src= /path/to/core.min.js /script", - "title": "Acquire Moment.js" - }, - { - "location": "/Installing/#knockout", - "text": "Need new wrapper for this version.", - "title": "Knockout" - }, - { - "location": "/Functions/", - "text": "Functions\n\n\n\n \nNote\n\n All functions are accessed via the \ndata\n attribute e.g. \n$('#datetimepicker').datetimepicker(FUNCTION)\n\n\n\n\n\ndestroy\n\n\nDestroys the widget and removes all attached event listeners\n\n\n\n\ntoggle\n\n\nShows or hides the widget\n\n\nEmits\n\n\n\n\n\n\nhide.datetimepicker\n - if the widget is hidden after the toggle call\n\n\n\n\n\n\nshow.datetimepicker\n - if the widget is show after the toggle call\n\n\n\n\n\n\nchange.datetimepicker\n - if the widget is opened for the first time and the input element is empty and \noptions.useCurrent != false\n\n\n\n\n\n\n\n\nshow\n\n\nShows the widget\n\n\nEmits\n\n\n\n\n\n\nshow.datetimepicker\n - if the widget was hidden before that call\n\n\n\n\n\n\nchange.datetimepicker\n - if the widget is opened for the first time and the \nuseCurrent\n is set to true or to a granularity value and the input element the component is attached to has an empty value\n\n\n\n\n\n\n\n\nhide\n\n\nHides the widget\n\n\nEmits\n\n\n\n\nhide.datetimepicker\n - if the widget was visible before that call\n\n\n\n\n\n\ndisable\n\n\nDisables the input element, the component is attached to, by adding a \ndisabled=\"true\"\n attribute to it. If the widget was visible before that call it is hidden.\n\n\nEmits\n\n\n\n\nhide.datetimepicker\n - if the widget was visible before that call\n\n\n\n\n\n\nenable\n\n\nEnables the input element, the component is attached to, by removing \ndisabled\n attribute from it.\n\n\n\n\nclear\n\n\nClears the date picker by setting the value to \nnull\n\n\n\n\nviewDate\n\n\nviewDate\n\n\nReturns a \nmoment\n variable with the currently set \noptions.viewDate\n option.\n\n\nviewDate(viewDate)\n\n\nTakes a \nstring, moment or Date\n value.\n\n\nThis will change the \nviewDate\n without changing or setting the selected date.", - "title": "Functions" - }, - { - "location": "/Functions/#functions", - "text": "Note \n All functions are accessed via the data attribute e.g. $('#datetimepicker').datetimepicker(FUNCTION)", - "title": "Functions" - }, - { - "location": "/Functions/#destroy", - "text": "Destroys the widget and removes all attached event listeners", - "title": "destroy" - }, - { - "location": "/Functions/#toggle", - "text": "Shows or hides the widget", - "title": "toggle" - }, - { - "location": "/Functions/#emits", - "text": "hide.datetimepicker - if the widget is hidden after the toggle call show.datetimepicker - if the widget is show after the toggle call change.datetimepicker - if the widget is opened for the first time and the input element is empty and options.useCurrent != false", - "title": "Emits" - }, - { - "location": "/Functions/#show", - "text": "Shows the widget", - "title": "show" - }, - { - "location": "/Functions/#emits_1", - "text": "show.datetimepicker - if the widget was hidden before that call change.datetimepicker - if the widget is opened for the first time and the useCurrent is set to true or to a granularity value and the input element the component is attached to has an empty value", - "title": "Emits" - }, - { - "location": "/Functions/#hide", - "text": "Hides the widget", - "title": "hide" - }, - { - "location": "/Functions/#emits_2", - "text": "hide.datetimepicker - if the widget was visible before that call", - "title": "Emits" - }, - { - "location": "/Functions/#disable", - "text": "Disables the input element, the component is attached to, by adding a disabled=\"true\" attribute to it. If the widget was visible before that call it is hidden.", - "title": "disable" - }, - { - "location": "/Functions/#emits_3", - "text": "hide.datetimepicker - if the widget was visible before that call", - "title": "Emits" - }, - { - "location": "/Functions/#enable", - "text": "Enables the input element, the component is attached to, by removing disabled attribute from it.", - "title": "enable" - }, - { - "location": "/Functions/#clear", - "text": "Clears the date picker by setting the value to null", - "title": "clear" - }, - { - "location": "/Functions/#viewdate", - "text": "", - "title": "viewDate" - }, - { - "location": "/Functions/#viewdate_1", - "text": "Returns a moment variable with the currently set options.viewDate option.", - "title": "viewDate" - }, - { - "location": "/Functions/#viewdateviewdate", - "text": "Takes a string, moment or Date value. This will change the viewDate without changing or setting the selected date.", - "title": "viewDate(viewDate)" - }, - { - "location": "/Options/", - "text": "Options\n\n\n\n \nNote\n\n All options are accessed via the \ndata\n attribute e.g. \n$('#datetimepicker').datetimepicker(OPTION, ARGUMENT)\n\n\n **TODO** should I move some of this to the component?\n\n\n\n\noptions\n\n\nReturns the components current options object. Note that the changing the values of the returned object does not change the components actual configuration. Use \noptions(options)\n to set the components options massively or the other methods for setting config options individually.\n\n\noptions, [options]\n\n\nTakes an object variable with option key:value properties and configures the component. Use this to update multiple options on the component.\n\n\n\n\ndate\n\n\nReturns the component's model current date, a \nmoment\n object or \nnull\n if not set.\n\n\ndate, [newDate]\n\n\nTakes \nstring, Date, moment, null\n parameter and sets the components model current moment to it. Passing a \nnull\n value unsets the components model current moment. Parsing of the \nnewDate\n parameter is made using moment library with the \noptions.format\n and \noptions.useStrict\n components configuration.\n\n\nThrows\n\n\n\n\nTypeError\n - in case the \nnewDate\n cannot be parsed\n\n\n\n\nEmits\n\n\n\n\nchange.datetimepicker\n - In case \nnewDate\n is different from current moment\n\n\n\n\n\n\nformat\n\n\nDefault: false\n\n\n\nSee \nmomentjs' docs\n for valid formats. Format also dictates what components are shown, e.g. \nMM/dd/YYYY\n will not display the time picker.\n\n\nformat\n\n\nReturns the component's \noptions.format\n \nstring\n\n\nformat, [format]\n\n\nTakes a \nmoment.js\n format \nstring\n and sets the components \noptions.format\n. This is used for displaying and also for parsing input strings either from the input element the component is attached to or the \ndate()\n function.\nThe parameter can also be a \nboolean:false\n in which case the format is set to the locale's \nL LT\n.\n\n\nNote:\n this is also used to determine if the time picker sub component will display the hours in 12 or 24 format. (if \na\n or \nh\n exists in the passed \nstring\n then a 12 hour mode is set)\n\n\n\n\ndayViewHeaderFormat\n\n\nDefault: 'MMMM YYYY'\n\n\n\nChanges the heading of the date picker when in \"days\" view.\n\n\n\n\ndayViewHeaderFormat\n\n\nReturns a \nstring\n variable with the currently set \noptions.dayViewHeaderFormat\n option.\n\n\ndayViewHeaderFormat, [string]\n\n\nTakes a \nstring\n value.\n\n\nUsed to customize the header of the day view.\n\n\n\n\nextraFormats\n\n\nDefault: false\n\n\n\nAllows for several input formats to be valid. See \nthis PR\n.\n\n\nextraFormats\n\n\nReturns a \nboolean\n or array with the \noptions.extraFormats\n option configuration\n\n\nextraFormats, [formats]\n\n\nTakes an array of valid input moment format options.\n\n\n\n\nstepping\n\n\nDefault: 1\n\n\n\nNumber of minutes the up/down arrow's will move the minutes value in the time picker\n\n\nstepping\n\n\nReturns a \nnumber\n with the \noptions.stepping\n option configuration\n\n\nstepping, [number]\n\n\nTakes a \nnumber\n. This be the amount the up/down arrows move the minute value with a time picker.\n\n\n\n\nmin/maxDate\n\n\nDefault: false\nAccepts: date, moment, string\n\n\n\nPrevents date/time selections before this date. Will override \ndefaultDate\n and \nuseCurrent\n if either of these settings are the same day since both options are invalid according to the rules you've selected.\n\n\nminDate\n\n\nReturns the currently set moment of the \noptions.minDate\n or \nfalse\n if not set\n\n\nminDate, [minDate]\n\n\nTakes a \nminDate\n \nstring, Date, moment, boolean:false\n parameter and disallows the user to select a moment that is before that moment. If a \nboolean:false\n value is passed the \noptions.minDate\n parameter is cleared and there is no restriction to the minimum moment the user can select. \n\n\nNote:\n If the \nminDate\n parameter is after the currently selected moment the currently selected moment changes to minDate parameter\n\n\nThrows\n\n\n\n\n\n\nTypeError\n - if \nminDate\n parameter cannot be parsed using the \noptions.format\n and \noptions.useStrict\n configuration settings\n\n\n\n\n\n\nTypeError\n - if \nminDate\n parameter is after \noptions.maxDate\n\n\n\n\n\n\nEmits\n\n\n\n\n\n\nchange.datetimepicker\n - if the new \nminDate\n is after currently selected moment (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\ndp.error\n - if the new \nminDate\n is after currently selected moment (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\n\n\nmaxDate\n\n\nReturns the currently set moment of the \noptions.maxDate\n or \nfalse\n if not set\n\n\nmaxDate, [maxDate]\n\n\nTakes a [maxDate] \nstring, Date, moment, boolean:false\n parameter and disallows the user to select a moment that is after that moment. If a \nboolean:false\n value is passed \noptions.maxDate\n is cleared and there is no restriction to the maximum moment the user can select.\n\n\nNote:\n If [maxDate] is before the currently selected moment the currently selected moment changes to [maxDate]\n\n\nThrows\n\n\n\n\n\n\nTypeError\n - if \nmaxDate\n parameter cannot be parsed using the \noptions.format\n and \noptions.useStrict\n configuration settings\n\n\n\n\n\n\nTypeError\n - if \nmaxDate\n parameter is before \noptions.minDate\n\n\n\n\n\n\nEmits\n\n\n\n\n\n\nchange.datetimepicker\n - if the new \nmaxDate\n is after currently selected moment (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\ndp.error\n - if the new \nmaxDate\n is after currently selected moment (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\n\n\nuseCurrent\n\n\nDefault: true\n\n\n\nOn \nshow\n, will set the picker to the current date/time.\n\n\nuseCurrent\n\n\nReturns a \nboolean\n or \nstring\n with the \noptions.useCurrent\n option configuration\n\n\nuseCurrent, boolean or string\n\n\nTakes a \nboolean\n or \nstring\n. If a \nboolean\n true is passed and the components model moment is not set (either through \nsetDate\n or through a valid value on the input element the component is attached to) then the first time the user opens the datetimepicker widget the value is initialized to the current moment of the action. If a false \nboolean\n is passed then no initialization happens on the input element. You can select the granularity on the initialized moment by passing one of the following strings (\n'year', 'month', 'day', 'hour', 'minute'\n) in the variable.\n\n\nIf for example you pass \n'day'\n to the \nsetUseCurrent\n function and the input field is empty the first time the user opens the datetimepicker widget the input text will be initialized to the current date time with day granularity (e.g. if current time = \n2014-08-10 13:32:33\n the input value will be initialized to \n2014-08-10 00:00:00\n)\n\n\nNote:\n If the \noptions.defaultDate\n is set or the input element the component is attached to has already a value that takes precedence and the functionality of \nuseCurrent\n is not triggered!\n\n\n\n\ncollapse\n\n\nDefault: true\n\n\n\nUsing a Bootstraps collapse to switch between date/time pickers.\n\n\ncollapse\n\n\nReturns a \nboolean\n of the \noptions.sideBySide\n.\n\n\ncollapse, [collapse]\n\n\nTakes a \nboolean\n. If set to \nfalse\n the picker will display similar to \nsideBySide\n except vertical.\n\n\n\n\nlocale\n\n\nDefault: moment.locale()\nAccepts: string, moment.local('locale')\n\n\n\nSee \nmomentjs\n for valid locales.\n\n\nYou must include \nmoment-with-locales.js\n or a local js file.\n\n\nlocale\n\n\nReturns the currently set locale of the \noptions.locale\n\n\nlocale, [newLocale]\n\n\nTakes a \nstring\n of any valid \nmoment locale\n e.g. \nde\n for German.\n\n\nThrows\n\n\n\n\nTypeError\n - if the locale is not loaded via a separate script or \nmoment-with-locales\n\n\n\n\n\n\ndefaultDate\n\n\nDefault: false\nAccepts: date, moment, string\n\n\n\nSets the picker default date/time. Overrides \nuseCurrent\n\n\ndefaultDate\n\n\nReturns a \nmoment\n with the \noptions.defaultDate\n option configuration or \nfalse\n if not set\n\n\ndefaultDate, [defaultDate]\n\n\nTakes a \nstring, Date, moment, boolean:false\n. Will set the picker's initial date. If a \nboolean:false\n value is passed the \noptions.defaultDate\n parameter is cleared. \n\n\n\n\n\n\nTypeError\n - if the provided date pass validation, including \ndisabledDates\n, \nenabledDates\n, \nminDate\n, \nmaxDate\n, and \ndaysOfWeekDisabled\n\n\n\n\n\n\nTypeError\n - if the provided date cannot be parsed by moment.js\n\n\n\n\n\n\n\n\nen/disabledDates\n\n\nDefault: false\nAccepts: array of [date, moment, string]\n\n\n\ndisabledDates\n\n\nReturns an array with the currently set disabled dates on the component.\n\n\ndisabledDates, [dates]\n\n\nTakes an \n[\n \nstring\n or \nDate\n or \nmoment\n \n]\n of values and disallows the user to select those days. Setting this takes precedence over \noptions.minDate\n, \noptions.maxDate\n configuration. Also calling this function removes the configuration of options.enabledDates if such exist.\n\n\nNote:\n These values are matched with \nDay\n granularity.\n\n\n\n\nenabledDates\n\n\nReturns an array with the currently set enabled dates on the component.\n\n\nenabledDates, [dates]\n\n\nTakes an \n[\n \nstring\n or \nDate\n or \nmoment\n \n]\n of values and allows the user to select only from those days. Setting this takes precedence over \noptions.minDate\n, \noptions.maxDate\n configuration. Also calling this function removes the configuration of \noptions.disabledDates\n if such exist.\n\n\nNote:\n These values are matched with \nDay\n granularity.\n\n\n\n\nicons\n\n\nDefault: {\n time: 'glyphicon glyphicon-time',\n date: 'glyphicon glyphicon-calendar',\n up: 'glyphicon glyphicon-chevron-up',\n down: 'glyphicon glyphicon-chevron-down',\n previous: 'glyphicon glyphicon-chevron-left',\n next: 'glyphicon glyphicon-chevron-right',\n today: 'glyphicon glyphicon-screenshot',\n clear: 'glyphicon glyphicon-trash',\n close: 'glyphicon glyphicon-remove'\n }\nAccepts: object with all or some of the parameters above\n\n\n\nChange the default icons for the pickers functions.\n\n\nicons\n\n\nReturns an \nOjbect\n of \noptions.icons\n \n\n\nicons, [icons]\n\n\nTakes an \nOjbect\n of \nstrings\n.\n\n\nThrows\n\n\n\n\nTypeError\n - if icons parameter is not an \nOjbect\n\n\n\n\n\n\nuseStrict\n\n\nDefault: false\n\n\n\nDefines if moment should use strict date parsing when considering a date to be valid.\n\n\nuseStrict\n\n\nReturns a \nboolean\n of the \noptions.useStrict\n\n\nuseStrict, [useStrict]\n\n\nTakes a \nboolean\n. If \nuseStrict\n is \ntrue\n, moment.js parsing rules will be stricter when determining if a date is valid or not.\n\n\n\n\nsideBySide\n\n\nDefault: false\n\n\n\nShows the picker side by side when using the time and date together.\n\n\n\n\nsideBySide\n\n\nReturns a \nboolean\n of the \noptions.sideBySide\n.\n\n\nsideBySide, [sideBySide]\n\n\nTakes a \nboolean\n. If \nsideBySide\n is \ntrue\n and the time picker is used, both components will display side by side instead of collapsing.\n\n\n\n\ndaysOfWeekDisabled\n\n\nDefault: []\nAccepts: array of numbers from 0-6\n\n\n\nDisables the section of days of the week, e.g. weekends.\n\n\ndaysOfWeekDisabled\n\n\nReturns an array with the \noptions.daysOfWeekDisabled\n configuration setting of the component.\n\n\ndaysOfWeekDisabled, [daysOfWeek]\n\n\nTakes an \n[\n \nNumber\n:\n0\n to \n6\n \n]\n and disallow the user to select weekdays that exist in this array. This has lower priority over the \noptions.minDate\n, \noptions.maxDate\n, \noptions.disabledDates\n and \noptions.enabledDates\n configuration settings.\n\n\nEmits\n\n\n\n\n\n\nchange.datetimepicker\n - if the currently selected moment falls in the values passed on the daysOfWeek parameter. (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\ndp.error\n - if the currently selected moment falls in the values passed on the daysOfWeek parameter. (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\n\n\ncalendarWeeks\n\n\nDefault: false\n\n\n\nShows the week of the year to the left of first day of the week.\n\n\n\n\ncalendarWeeks\n\n\nReturns a \nboolean\n with the current \noptions.calendarWeeks\n option configuration\n\n\ncalendarWeeks, [boolean]\n\n\nTakes a \nboolean\n variable to set if the week numbers will appear to the left on the days view\n\n\n\n\nviewMode\n\n\nDefault: 'days'\nAccepts: 'decades','years','months','days'\n\n\n\nThe default view to display when the picker is shown.\n\n\nNote\n: To limit the picker to selecting, for instance the year and month, use \nformat: MM/YYYY\n.\n\n\nviewMode\n\n\nReturns a \nstring\n of the \noptions.viewMode\n.\n\n\nviewMode, [newViewMode]\n\n\nTakes a \nstring\n. Valid values are \n'days'\n, \n'months'\n, \n'years'\n and \n'decades'\n\n\nThrows\n\n\n\n\nTypeError\n - if \nnewViewMode\n parameter is not an a \nstring\n or if \nnewViewMode\n is not a valid value.\n\n\n\n\n\n\ntoolbarPlacement\n\n\nDefault: 'default'\nAccepts: 'default', 'top', 'bottom'\n\n\n\nChanges the placement of the icon toolbar.\n\n\n\n\ntoolbarplacement\n\n\nReturns a \nstring\n variable with the currently set \noptions.toolbarplacement\n option.\n\n\ntoolbarplacement, [string]\n\n\nTakes a \nstring\n value. Valid values are \n'default'\n, \n'top'\n and \n'bottom'\n.\n\n\nChanges the placement of the toolbar where the today, clear, component switch icon are located.\n\n\n\n\nbuttons\n\n\nDefault: {\n showToday: false,\n showClear: false,\n showClose: false\n }\nAccepts: object with all or some of the parameters above\n\n\n\nChange the default toolbar buttons for the pickers functions.\n\n\nbuttons\n\n\nReturns an \nOjbect\n of \noptions.buttons\n \n\n\nbuttons, [buttons]\n\n\nTakes an \nOjbect\n of \nboolean\n.\n\n\nThrows\n\n\n\n\nTypeError\n - if buttons parameter is not an \nOjbect\n\n\n\n\n\n\nwidgetPositioning\n\n\nDefault: {\n horizontal: 'auto'\n vertical: 'auto'\n }\nAccepts: object with the all or one of the parameters above\n horizontal: 'auto', 'left', 'right'\n vertical: 'auto', 'top', 'bottom'\n\n\n\nwidgetPositioning\n\n\nReturns the currently set \noptions.widgetPositioning\n object containing two keys \nhorizontal\n and \nvertical\n\n\nwidgetPositioning, [positioningObject]\n\n\nTakes an object parameter that can contain two keys \nvertical\n and \nhorizontal\n each having a value of \n'auto', 'top', 'bottom'\n for \nvertical\n and \n'auto', 'left', 'right'\n for \nhorizontal\n which defines where the dropdown with the widget will appear relative to the input element the component is attached to.\n\n\n'auto'\n is the default value for both \nhorizontal\n and \nvertical\n keys and it tries to automatically place the dropdown in a position that is visible to the user. Usually you should not override those options unless you have a special need in your layout.\n\n\n\n\nwidgetParent\n\n\nDefault: null\nAccepts: string or jQuery object\n\n\n\nOn picker show, places the widget at the identifier (string) or jQuery object \nif\n the element has css \nposition: 'relative'\n\n\nwidgetParent\n\n\nReturns a \n$(element)\n variable with the currently set \noptions.widgetParent\n option.\n\n\nwidgetParent, [widgetParent]\n\n\nTakes a \nstring\n or \n$(element)\n value.\n\n\n\n\nkeepOpen\n\n\nDefault: false\n\n\n\nWill cause the date picker to stay open after selecting a date.\n\n\nkeepOpen\n\n\nReturns a \nboolean\n variable with the currently set \noptions.keepOpen\n option.\n\n\nkeepOpen, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\n\n\ninline\n\n\nDefault: false\n\n\n\nWill display the picker inline without the need of a input field. This will also hide borders and shadows.\n\n\ninline\n\n\nReturns a \nboolean\n variable with the currently set \noptions.inline\n option.\n\n\ninline, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\n\n\nkeepInvalid\n\n\n4.7.14\n\n\nDefault: false\n\n\n\nWill cause the date picker to \nnot\n revert or overwrite invalid dates.\n\n\nkeepInvalid\n\n\nReturns a \nstring\n variable with the currently set \noptions.keepInvalid\n option.\n\n\nkeepInvalid, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\nIf \ntrue\n, invalid dates will not be reverted to a previous selection or changed.\n\n\n\n\nkeyBinds\n\n\nDefault: up: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(7, 'd'));\n } else {\n this.date(this.date().clone().add(1, 'm'));\n }\n },\n down: function (widget) {\n if (!widget) {\n this.show();\n }\n else if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(7, 'd'));\n } else {\n this.date(this.date().clone().subtract(1, 'm'));\n }\n },\n 'control up': function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'y'));\n } else {\n this.date(this.date().clone().add(1, 'h'));\n }\n },\n 'control down': function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'y'));\n } else {\n this.date(this.date().clone().subtract(1, 'h'));\n }\n },\n left: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'd'));\n }\n },\n right: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'd'));\n }\n },\n pageUp: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'M'));\n }\n },\n pageDown: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'M'));\n }\n },\n enter: function () {\n this.hide();\n },\n escape: function () {\n this.hide();\n },\n 'control space': function (widget) {\n if (widget.find('.timepicker').is(':visible')) {\n widget.find('.btn[data-action=\"togglePeriod\"]').click();\n }\n },\n t: function () {\n this.date(moment());\n },\n 'delete': function () {\n this.clear();\n }\n\n\n\nAllows for custom events to fire on keyboard press.\n\n\nkeyBinds\n\n\nReturns a \nstring\n variable with the currently set \noptions.keyBinds\n option.\n\n\nkeyBinds, [object]\n\n\nTakes an \nobject\n value.\n\n\nAllows for several \nkeyBinding\n functions to be specified for ease of access or accessibility. See the options page for defaults.\n\n\n\n\ndebug\n\n\nDefault: false\n\n\n\nWill cause the date picker to stay open after a \nblur\n event.\n\n\n\n\nignoreReadonly\n\n\nDefault: false\n\n\n\nAllow date picker show event to fire even when the associated input element has the \nreadonly=\"readonly\"\n property.\n\n\nignoreReadonly\n\n\nReturns a \nboolean\n variable with the currently set \noptions.ignoreReadonly\n option.\n\n\nignoreReadonly, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\nSet this to \ntrue\n to allow the picker to be used even if the input field is \nreadonly\n. This will \nnot\n bypass the \ndisabled\n property\n\n\n\n\ndisabledTimeIntervals\n\n\nDefault: false\n\n\n\nDisables time selection between the given \nmoments\n.\n\n\ndisabledTimeIntervals\n\n\nReturns an \narray\n variable with the currently set \noptions.disabledTimeIntervals\n option.\n\n\ndisabledTimeIntervals, [array]\n\n\nTakes a \narray\n value.\n\n\nThe array \nmust\n be in the following format \n[moment(),moment()]\n\n\nFor example:\n\n\ndisabledTimeIntervals: [[moment({ h: 0 }), moment({ h: 8 })], [moment({ h: 18 }), moment({ h: 24 })]]\n\n\n\nWill disable times between 12-8am and 6-12pm today\n\n\n\n\nallowInputToggle\n\n\nDefault: false\n\n\n\nIf \ntrue\n, the picker will show on textbox focus and icon click when used in a button group.\n\n\nallowInputToggle\n\n\nReturns a \nboolean\n variable with the currently set \noptions.allowInputToggle\n option.\n\n\nallowInputToggle, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\nIf \ntrue\n, the picker will show on textbox focus and icon click when used in a button group\n\n\n\n\nfocusOnShow\n\n\nDefault: true\n\n\n\nIf \nfalse\n, the textbox will not be given focus when the picker is shown.\n\n\nfocusOnShow\n\n\nReturns a \nboolean\n variable with the currently set \noptions.focusOnShow\n option.\n\n\nfocusOnShow, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\nIf \nfalse\n, the textbox will not be given focus when the picker is shown\n\n\n\n\nen/disabledHours\n\n\nDefault: false\n\n\n\ndisabledHours\n\n\nReturns an \narray\n variable with the currently set \noptions.en/disabledHours\n option.\n\n\ndisabledHours, boolean\n\n\nTakes a \narray\n value.\n\n\nMust be in 24 hour format. Will allow or disallow hour selections (much like \ndisabledTimeIntervals\n) but will affect all days.\n\n\nLike \nen/disabledDates\n, these options are mutually exclusive and will reset one of the options back to false.\n\n\ndisabledHours: [0, 1, 2, 3, 4, 5, 6, 7, 8, 18, 19, 20, 21, 22, 23, 24]\nenabledHours: [9, 10, 11, 12, 13, 14, 15, 16]\n\n\n\n\n\nviewDate\n\n\nDefault: false\n\n\n\nThis will change the \nviewDate\n without changing or setting the selected date.\n\n\n\n\nparseInputDate\n\n\nparseInputDate\n\n\nReturns a \nfunction\n with the currently set \noptions.parseInputDate\n\n\nparseInputDate, [function]\n\n\nTakes a \nfunction\n\n\nAllows custom input formatting For example: the user can enter 'yesterday' or '30 days ago.\n\n\nExample:\n\n\nvar parseRelativeDate = function(relativeDate) {\n\n switch (relativeDate) {\n case 'today':\n return moment()\n case 'yesterday':\n return moment().subtract(1, 'day');\n default:\n return moment()\n .subtract(Number(relativeDate.replace(\ndays ago\n, \n).trim()), 'days');\n }\n}\n\nvar parseInputDate = function(inputDate) {\n var relativeDatePattern = /today|yesterday|[0-9]+\\s+(days ago)/,\n resultDate;\n\n if (moment.isMoment(inputDate) || inputDate instanceof Date) {\n resultDate = moment(inputDate);\n } else {\n var relativeDate = inputDate.match(relativeDatePattern),\n parseDate = null;\n\n if (relativeDate !== null) \n parseDate = this.parseRelativeDate(inputDate.match(relativeDatePattern)[0]);\n else \n parseDate = moment();\n\n resultDate = moment(parseDate, \nYYYY-MM-DD\n);\n }\n\n return resultDate;\n}\n\n\n\n\n\n\ntooltips\n\n\ntooltips: {\n today: 'Go to today',\n clear: 'Clear selection',\n close: 'Close the picker',\n selectMonth: 'Select Month',\n prevMonth: 'Previous Month',\n nextMonth: 'Next Month',\n selectYear: 'Select Year',\n prevYear: 'Previous Year',\n nextYear: 'Next Year',\n selectDecade: 'Select Decade',\n prevDecade: 'Previous Decade',\n nextDecade: 'Next Decade',\n prevCentury: 'Previous Century',\n nextCentury: 'Next Century'\n}\n\n\n\n\nThis will change the \ntooltips\n over each icon to a custom string.\n\n\ntooltips\n\n\nReturns an \nOjbect\n of \noptions.tooltips\n \n\n\ntooltips, [tooltips]\n\n\nTakes an \nOjbect\n of \nstrings\n.\n\n\nThrows\n\n\n\n\nTypeError\n - if \ntooltips\n parameter is not an \nOjbect\n\n\n\n\n\n\ntimeZone\n\n\ntimeZone: ''\n\n\n\nAllows the setting of the Time Zone. You must include \nmoment-timezone.js\n and \nmoment-timzone\n data. See moment timezone documentation for usage.\n\n\ntimeZone\n\n\nReturns an \nstring\n of \noptions.timeZone\n \n\n\ntimeZone, [timeZone]\n\n\nTakes an \nstring\n of a valid timezone.\n\n\nThrows\n\n\n\n\nTypeError\n - if \ntooltips\n parameter is not an \nstring", - "title": "Options" - }, - { - "location": "/Options/#options", - "text": "Note \n All options are accessed via the data attribute e.g. $('#datetimepicker').datetimepicker(OPTION, ARGUMENT) \n\n **TODO** should I move some of this to the component?", - "title": "Options" - }, - { - "location": "/Options/#options_1", - "text": "Returns the components current options object. Note that the changing the values of the returned object does not change the components actual configuration. Use options(options) to set the components options massively or the other methods for setting config options individually.", - "title": "options" - }, - { - "location": "/Options/#options-options", - "text": "Takes an object variable with option key:value properties and configures the component. Use this to update multiple options on the component.", - "title": "options, [options]" - }, - { - "location": "/Options/#date", - "text": "Returns the component's model current date, a moment object or null if not set.", - "title": "date" - }, - { - "location": "/Options/#date-newdate", - "text": "Takes string, Date, moment, null parameter and sets the components model current moment to it. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.", - "title": "date, [newDate]" - }, - { - "location": "/Options/#throws", - "text": "TypeError - in case the newDate cannot be parsed", - "title": "Throws" - }, - { - "location": "/Options/#emits", - "text": "change.datetimepicker - In case newDate is different from current moment", - "title": "Emits" - }, - { - "location": "/Options/#format", - "text": "Default: false See momentjs' docs for valid formats. Format also dictates what components are shown, e.g. MM/dd/YYYY will not display the time picker.", - "title": "format" - }, - { - "location": "/Options/#format_1", - "text": "Returns the component's options.format string", - "title": "format" - }, - { - "location": "/Options/#format-format", - "text": "Takes a moment.js format string and sets the components options.format . This is used for displaying and also for parsing input strings either from the input element the component is attached to or the date() function.\nThe parameter can also be a boolean:false in which case the format is set to the locale's L LT . Note: this is also used to determine if the time picker sub component will display the hours in 12 or 24 format. (if a or h exists in the passed string then a 12 hour mode is set)", - "title": "format, [format]" - }, - { - "location": "/Options/#dayviewheaderformat", - "text": "Default: 'MMMM YYYY' Changes the heading of the date picker when in \"days\" view.", - "title": "dayViewHeaderFormat" - }, - { - "location": "/Options/#dayviewheaderformat_1", - "text": "Returns a string variable with the currently set options.dayViewHeaderFormat option.", - "title": "dayViewHeaderFormat" - }, - { - "location": "/Options/#dayviewheaderformat-string", - "text": "Takes a string value. Used to customize the header of the day view.", - "title": "dayViewHeaderFormat, [string]" - }, - { - "location": "/Options/#extraformats", - "text": "Default: false Allows for several input formats to be valid. See this PR .", - "title": "extraFormats" - }, - { - "location": "/Options/#extraformats_1", - "text": "Returns a boolean or array with the options.extraFormats option configuration", - "title": "extraFormats" - }, - { - "location": "/Options/#extraformats-formats", - "text": "Takes an array of valid input moment format options.", - "title": "extraFormats, [formats]" - }, - { - "location": "/Options/#stepping", - "text": "Default: 1 Number of minutes the up/down arrow's will move the minutes value in the time picker", - "title": "stepping" - }, - { - "location": "/Options/#stepping_1", - "text": "Returns a number with the options.stepping option configuration", - "title": "stepping" - }, - { - "location": "/Options/#stepping-number", - "text": "Takes a number . This be the amount the up/down arrows move the minute value with a time picker.", - "title": "stepping, [number]" - }, - { - "location": "/Options/#minmaxdate", - "text": "Default: false\nAccepts: date, moment, string Prevents date/time selections before this date. Will override defaultDate and useCurrent if either of these settings are the same day since both options are invalid according to the rules you've selected.", - "title": "min/maxDate" - }, - { - "location": "/Options/#mindate", - "text": "Returns the currently set moment of the options.minDate or false if not set", - "title": "minDate" - }, - { - "location": "/Options/#mindate-mindate", - "text": "Takes a minDate string, Date, moment, boolean:false parameter and disallows the user to select a moment that is before that moment. If a boolean:false value is passed the options.minDate parameter is cleared and there is no restriction to the minimum moment the user can select. Note: If the minDate parameter is after the currently selected moment the currently selected moment changes to minDate parameter", - "title": "minDate, [minDate]" - }, - { - "location": "/Options/#throws_1", - "text": "TypeError - if minDate parameter cannot be parsed using the options.format and options.useStrict configuration settings TypeError - if minDate parameter is after options.maxDate", - "title": "Throws" - }, - { - "location": "/Options/#emits_1", - "text": "change.datetimepicker - if the new minDate is after currently selected moment (waiting for #472 to close in order to finalize this part) dp.error - if the new minDate is after currently selected moment (waiting for #472 to close in order to finalize this part)", - "title": "Emits" - }, - { - "location": "/Options/#maxdate", - "text": "Returns the currently set moment of the options.maxDate or false if not set", - "title": "maxDate" - }, - { - "location": "/Options/#maxdate-maxdate", - "text": "Takes a [maxDate] string, Date, moment, boolean:false parameter and disallows the user to select a moment that is after that moment. If a boolean:false value is passed options.maxDate is cleared and there is no restriction to the maximum moment the user can select. Note: If [maxDate] is before the currently selected moment the currently selected moment changes to [maxDate]", - "title": "maxDate, [maxDate]" - }, - { - "location": "/Options/#throws_2", - "text": "TypeError - if maxDate parameter cannot be parsed using the options.format and options.useStrict configuration settings TypeError - if maxDate parameter is before options.minDate", - "title": "Throws" - }, - { - "location": "/Options/#emits_2", - "text": "change.datetimepicker - if the new maxDate is after currently selected moment (waiting for #472 to close in order to finalize this part) dp.error - if the new maxDate is after currently selected moment (waiting for #472 to close in order to finalize this part)", - "title": "Emits" - }, - { - "location": "/Options/#usecurrent", - "text": "Default: true On show , will set the picker to the current date/time.", - "title": "useCurrent" - }, - { - "location": "/Options/#usecurrent_1", - "text": "Returns a boolean or string with the options.useCurrent option configuration", - "title": "useCurrent" - }, - { - "location": "/Options/#usecurrent-boolean-or-string", - "text": "Takes a boolean or string . If a boolean true is passed and the components model moment is not set (either through setDate or through a valid value on the input element the component is attached to) then the first time the user opens the datetimepicker widget the value is initialized to the current moment of the action. If a false boolean is passed then no initialization happens on the input element. You can select the granularity on the initialized moment by passing one of the following strings ( 'year', 'month', 'day', 'hour', 'minute' ) in the variable. If for example you pass 'day' to the setUseCurrent function and the input field is empty the first time the user opens the datetimepicker widget the input text will be initialized to the current date time with day granularity (e.g. if current time = 2014-08-10 13:32:33 the input value will be initialized to 2014-08-10 00:00:00 ) Note: If the options.defaultDate is set or the input element the component is attached to has already a value that takes precedence and the functionality of useCurrent is not triggered!", - "title": "useCurrent, boolean or string" - }, - { - "location": "/Options/#collapse", - "text": "Default: true Using a Bootstraps collapse to switch between date/time pickers.", - "title": "collapse" - }, - { - "location": "/Options/#collapse_1", - "text": "Returns a boolean of the options.sideBySide .", - "title": "collapse" - }, - { - "location": "/Options/#collapse-collapse", - "text": "Takes a boolean . If set to false the picker will display similar to sideBySide except vertical.", - "title": "collapse, [collapse]" - }, - { - "location": "/Options/#locale", - "text": "Default: moment.locale()\nAccepts: string, moment.local('locale') See momentjs for valid locales. You must include moment-with-locales.js or a local js file.", - "title": "locale" - }, - { - "location": "/Options/#locale_1", - "text": "Returns the currently set locale of the options.locale", - "title": "locale" - }, - { - "location": "/Options/#locale-newlocale", - "text": "Takes a string of any valid moment locale e.g. de for German.", - "title": "locale, [newLocale]" - }, - { - "location": "/Options/#throws_3", - "text": "TypeError - if the locale is not loaded via a separate script or moment-with-locales", - "title": "Throws" - }, - { - "location": "/Options/#defaultdate", - "text": "Default: false\nAccepts: date, moment, string Sets the picker default date/time. Overrides useCurrent", - "title": "defaultDate" - }, - { - "location": "/Options/#defaultdate_1", - "text": "Returns a moment with the options.defaultDate option configuration or false if not set", - "title": "defaultDate" - }, - { - "location": "/Options/#defaultdate-defaultdate", - "text": "Takes a string, Date, moment, boolean:false . Will set the picker's initial date. If a boolean:false value is passed the options.defaultDate parameter is cleared. TypeError - if the provided date pass validation, including disabledDates , enabledDates , minDate , maxDate , and daysOfWeekDisabled TypeError - if the provided date cannot be parsed by moment.js", - "title": "defaultDate, [defaultDate]" - }, - { - "location": "/Options/#endisableddates", - "text": "Default: false\nAccepts: array of [date, moment, string]", - "title": "en/disabledDates" - }, - { - "location": "/Options/#disableddates", - "text": "Returns an array with the currently set disabled dates on the component.", - "title": "disabledDates" - }, - { - "location": "/Options/#disableddates-dates", - "text": "Takes an [ string or Date or moment ] of values and disallows the user to select those days. Setting this takes precedence over options.minDate , options.maxDate configuration. Also calling this function removes the configuration of options.enabledDates if such exist. Note: These values are matched with Day granularity.", - "title": "disabledDates, [dates]" - }, - { - "location": "/Options/#enableddates", - "text": "Returns an array with the currently set enabled dates on the component.", - "title": "enabledDates" - }, - { - "location": "/Options/#enableddates-dates", - "text": "Takes an [ string or Date or moment ] of values and allows the user to select only from those days. Setting this takes precedence over options.minDate , options.maxDate configuration. Also calling this function removes the configuration of options.disabledDates if such exist. Note: These values are matched with Day granularity.", - "title": "enabledDates, [dates]" - }, - { - "location": "/Options/#icons", - "text": "Default: {\n time: 'glyphicon glyphicon-time',\n date: 'glyphicon glyphicon-calendar',\n up: 'glyphicon glyphicon-chevron-up',\n down: 'glyphicon glyphicon-chevron-down',\n previous: 'glyphicon glyphicon-chevron-left',\n next: 'glyphicon glyphicon-chevron-right',\n today: 'glyphicon glyphicon-screenshot',\n clear: 'glyphicon glyphicon-trash',\n close: 'glyphicon glyphicon-remove'\n }\nAccepts: object with all or some of the parameters above Change the default icons for the pickers functions.", - "title": "icons" - }, - { - "location": "/Options/#icons_1", - "text": "Returns an Ojbect of options.icons", - "title": "icons" - }, - { - "location": "/Options/#icons-icons", - "text": "Takes an Ojbect of strings .", - "title": "icons, [icons]" - }, - { - "location": "/Options/#throws_4", - "text": "TypeError - if icons parameter is not an Ojbect", - "title": "Throws" - }, - { - "location": "/Options/#usestrict", - "text": "Default: false Defines if moment should use strict date parsing when considering a date to be valid.", - "title": "useStrict" - }, - { - "location": "/Options/#usestrict_1", - "text": "Returns a boolean of the options.useStrict", - "title": "useStrict" - }, - { - "location": "/Options/#usestrict-usestrict", - "text": "Takes a boolean . If useStrict is true , moment.js parsing rules will be stricter when determining if a date is valid or not.", - "title": "useStrict, [useStrict]" - }, - { - "location": "/Options/#sidebyside", - "text": "Default: false Shows the picker side by side when using the time and date together.", - "title": "sideBySide" - }, - { - "location": "/Options/#sidebyside_1", - "text": "Returns a boolean of the options.sideBySide .", - "title": "sideBySide" - }, - { - "location": "/Options/#sidebyside-sidebyside", - "text": "Takes a boolean . If sideBySide is true and the time picker is used, both components will display side by side instead of collapsing.", - "title": "sideBySide, [sideBySide]" - }, - { - "location": "/Options/#daysofweekdisabled", - "text": "Default: []\nAccepts: array of numbers from 0-6 Disables the section of days of the week, e.g. weekends.", - "title": "daysOfWeekDisabled" - }, - { - "location": "/Options/#daysofweekdisabled_1", - "text": "Returns an array with the options.daysOfWeekDisabled configuration setting of the component.", - "title": "daysOfWeekDisabled" - }, - { - "location": "/Options/#daysofweekdisabled-daysofweek", - "text": "Takes an [ Number : 0 to 6 ] and disallow the user to select weekdays that exist in this array. This has lower priority over the options.minDate , options.maxDate , options.disabledDates and options.enabledDates configuration settings.", - "title": "daysOfWeekDisabled, [daysOfWeek]" - }, - { - "location": "/Options/#emits_3", - "text": "change.datetimepicker - if the currently selected moment falls in the values passed on the daysOfWeek parameter. (waiting for #472 to close in order to finalize this part) dp.error - if the currently selected moment falls in the values passed on the daysOfWeek parameter. (waiting for #472 to close in order to finalize this part)", - "title": "Emits" - }, - { - "location": "/Options/#calendarweeks", - "text": "Default: false Shows the week of the year to the left of first day of the week.", - "title": "calendarWeeks" - }, - { - "location": "/Options/#calendarweeks_1", - "text": "Returns a boolean with the current options.calendarWeeks option configuration", - "title": "calendarWeeks" - }, - { - "location": "/Options/#calendarweeks-boolean", - "text": "Takes a boolean variable to set if the week numbers will appear to the left on the days view", - "title": "calendarWeeks, [boolean]" - }, - { - "location": "/Options/#viewmode", - "text": "Default: 'days'\nAccepts: 'decades','years','months','days' The default view to display when the picker is shown. Note : To limit the picker to selecting, for instance the year and month, use format: MM/YYYY .", - "title": "viewMode" - }, - { - "location": "/Options/#viewmode_1", - "text": "Returns a string of the options.viewMode .", - "title": "viewMode" - }, - { - "location": "/Options/#viewmode-newviewmode", - "text": "Takes a string . Valid values are 'days' , 'months' , 'years' and 'decades'", - "title": "viewMode, [newViewMode]" - }, - { - "location": "/Options/#throws_5", - "text": "TypeError - if newViewMode parameter is not an a string or if newViewMode is not a valid value.", - "title": "Throws" - }, - { - "location": "/Options/#toolbarplacement", - "text": "Default: 'default'\nAccepts: 'default', 'top', 'bottom' Changes the placement of the icon toolbar.", - "title": "toolbarPlacement" - }, - { - "location": "/Options/#toolbarplacement_1", - "text": "Returns a string variable with the currently set options.toolbarplacement option.", - "title": "toolbarplacement" - }, - { - "location": "/Options/#toolbarplacement-string", - "text": "Takes a string value. Valid values are 'default' , 'top' and 'bottom' . Changes the placement of the toolbar where the today, clear, component switch icon are located.", - "title": "toolbarplacement, [string]" - }, - { - "location": "/Options/#buttons", - "text": "Default: {\n showToday: false,\n showClear: false,\n showClose: false\n }\nAccepts: object with all or some of the parameters above Change the default toolbar buttons for the pickers functions.", - "title": "buttons" - }, - { - "location": "/Options/#buttons_1", - "text": "Returns an Ojbect of options.buttons", - "title": "buttons" - }, - { - "location": "/Options/#buttons-buttons", - "text": "Takes an Ojbect of boolean .", - "title": "buttons, [buttons]" - }, - { - "location": "/Options/#throws_6", - "text": "TypeError - if buttons parameter is not an Ojbect", - "title": "Throws" - }, - { - "location": "/Options/#widgetpositioning", - "text": "Default: {\n horizontal: 'auto'\n vertical: 'auto'\n }\nAccepts: object with the all or one of the parameters above\n horizontal: 'auto', 'left', 'right'\n vertical: 'auto', 'top', 'bottom'", - "title": "widgetPositioning" - }, - { - "location": "/Options/#widgetpositioning_1", - "text": "Returns the currently set options.widgetPositioning object containing two keys horizontal and vertical", - "title": "widgetPositioning" - }, - { - "location": "/Options/#widgetpositioning-positioningobject", - "text": "Takes an object parameter that can contain two keys vertical and horizontal each having a value of 'auto', 'top', 'bottom' for vertical and 'auto', 'left', 'right' for horizontal which defines where the dropdown with the widget will appear relative to the input element the component is attached to. 'auto' is the default value for both horizontal and vertical keys and it tries to automatically place the dropdown in a position that is visible to the user. Usually you should not override those options unless you have a special need in your layout.", - "title": "widgetPositioning, [positioningObject]" - }, - { - "location": "/Options/#widgetparent", - "text": "Default: null\nAccepts: string or jQuery object On picker show, places the widget at the identifier (string) or jQuery object if the element has css position: 'relative'", - "title": "widgetParent" - }, - { - "location": "/Options/#widgetparent_1", - "text": "Returns a $(element) variable with the currently set options.widgetParent option.", - "title": "widgetParent" - }, - { - "location": "/Options/#widgetparent-widgetparent", - "text": "Takes a string or $(element) value.", - "title": "widgetParent, [widgetParent]" - }, - { - "location": "/Options/#keepopen", - "text": "Default: false Will cause the date picker to stay open after selecting a date.", - "title": "keepOpen" - }, - { - "location": "/Options/#keepopen_1", - "text": "Returns a boolean variable with the currently set options.keepOpen option.", - "title": "keepOpen" - }, - { - "location": "/Options/#keepopen-boolean", - "text": "Takes a boolean value.", - "title": "keepOpen, [boolean]" - }, - { - "location": "/Options/#inline", - "text": "Default: false Will display the picker inline without the need of a input field. This will also hide borders and shadows.", - "title": "inline" - }, - { - "location": "/Options/#inline_1", - "text": "Returns a boolean variable with the currently set options.inline option.", - "title": "inline" - }, - { - "location": "/Options/#inline-boolean", - "text": "Takes a boolean value.", - "title": "inline, [boolean]" - }, - { - "location": "/Options/#keepinvalid", - "text": "4.7.14 Default: false Will cause the date picker to not revert or overwrite invalid dates.", - "title": "keepInvalid" - }, - { - "location": "/Options/#keepinvalid_1", - "text": "Returns a string variable with the currently set options.keepInvalid option.", - "title": "keepInvalid" - }, - { - "location": "/Options/#keepinvalid-boolean", - "text": "Takes a boolean value. If true , invalid dates will not be reverted to a previous selection or changed.", - "title": "keepInvalid, [boolean]" - }, - { - "location": "/Options/#keybinds", - "text": "Default: up: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(7, 'd'));\n } else {\n this.date(this.date().clone().add(1, 'm'));\n }\n },\n down: function (widget) {\n if (!widget) {\n this.show();\n }\n else if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(7, 'd'));\n } else {\n this.date(this.date().clone().subtract(1, 'm'));\n }\n },\n 'control up': function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'y'));\n } else {\n this.date(this.date().clone().add(1, 'h'));\n }\n },\n 'control down': function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'y'));\n } else {\n this.date(this.date().clone().subtract(1, 'h'));\n }\n },\n left: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'd'));\n }\n },\n right: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'd'));\n }\n },\n pageUp: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'M'));\n }\n },\n pageDown: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'M'));\n }\n },\n enter: function () {\n this.hide();\n },\n escape: function () {\n this.hide();\n },\n 'control space': function (widget) {\n if (widget.find('.timepicker').is(':visible')) {\n widget.find('.btn[data-action=\"togglePeriod\"]').click();\n }\n },\n t: function () {\n this.date(moment());\n },\n 'delete': function () {\n this.clear();\n } Allows for custom events to fire on keyboard press.", - "title": "keyBinds" - }, - { - "location": "/Options/#keybinds_1", - "text": "Returns a string variable with the currently set options.keyBinds option.", - "title": "keyBinds" - }, - { - "location": "/Options/#keybinds-object", - "text": "Takes an object value. Allows for several keyBinding functions to be specified for ease of access or accessibility. See the options page for defaults.", - "title": "keyBinds, [object]" - }, - { - "location": "/Options/#debug", - "text": "Default: false Will cause the date picker to stay open after a blur event.", - "title": "debug" - }, - { - "location": "/Options/#ignorereadonly", - "text": "Default: false Allow date picker show event to fire even when the associated input element has the readonly=\"readonly\" property.", - "title": "ignoreReadonly" - }, - { - "location": "/Options/#ignorereadonly_1", - "text": "Returns a boolean variable with the currently set options.ignoreReadonly option.", - "title": "ignoreReadonly" - }, - { - "location": "/Options/#ignorereadonly-boolean", - "text": "Takes a boolean value. Set this to true to allow the picker to be used even if the input field is readonly . This will not bypass the disabled property", - "title": "ignoreReadonly, [boolean]" - }, - { - "location": "/Options/#disabledtimeintervals", - "text": "Default: false Disables time selection between the given moments .", - "title": "disabledTimeIntervals" - }, - { - "location": "/Options/#disabledtimeintervals_1", - "text": "Returns an array variable with the currently set options.disabledTimeIntervals option.", - "title": "disabledTimeIntervals" - }, - { - "location": "/Options/#disabledtimeintervals-array", - "text": "Takes a array value. The array must be in the following format [moment(),moment()] For example: disabledTimeIntervals: [[moment({ h: 0 }), moment({ h: 8 })], [moment({ h: 18 }), moment({ h: 24 })]] Will disable times between 12-8am and 6-12pm today", - "title": "disabledTimeIntervals, [array]" - }, - { - "location": "/Options/#allowinputtoggle", - "text": "Default: false If true , the picker will show on textbox focus and icon click when used in a button group.", - "title": "allowInputToggle" - }, - { - "location": "/Options/#allowinputtoggle_1", - "text": "Returns a boolean variable with the currently set options.allowInputToggle option.", - "title": "allowInputToggle" - }, - { - "location": "/Options/#allowinputtoggle-boolean", - "text": "Takes a boolean value. If true , the picker will show on textbox focus and icon click when used in a button group", - "title": "allowInputToggle, [boolean]" - }, - { - "location": "/Options/#focusonshow", - "text": "Default: true If false , the textbox will not be given focus when the picker is shown.", - "title": "focusOnShow" - }, - { - "location": "/Options/#focusonshow_1", - "text": "Returns a boolean variable with the currently set options.focusOnShow option.", - "title": "focusOnShow" - }, - { - "location": "/Options/#focusonshow-boolean", - "text": "Takes a boolean value. If false , the textbox will not be given focus when the picker is shown", - "title": "focusOnShow, [boolean]" - }, - { - "location": "/Options/#endisabledhours", - "text": "Default: false", - "title": "en/disabledHours" - }, - { - "location": "/Options/#disabledhours", - "text": "Returns an array variable with the currently set options.en/disabledHours option.", - "title": "disabledHours" - }, - { - "location": "/Options/#disabledhours-boolean", - "text": "Takes a array value. Must be in 24 hour format. Will allow or disallow hour selections (much like disabledTimeIntervals ) but will affect all days. Like en/disabledDates , these options are mutually exclusive and will reset one of the options back to false. disabledHours: [0, 1, 2, 3, 4, 5, 6, 7, 8, 18, 19, 20, 21, 22, 23, 24]\nenabledHours: [9, 10, 11, 12, 13, 14, 15, 16]", - "title": "disabledHours, boolean" - }, - { - "location": "/Options/#viewdate", - "text": "Default: false This will change the viewDate without changing or setting the selected date.", - "title": "viewDate" - }, - { - "location": "/Options/#parseinputdate", - "text": "", - "title": "parseInputDate" - }, - { - "location": "/Options/#parseinputdate_1", - "text": "Returns a function with the currently set options.parseInputDate", - "title": "parseInputDate" - }, - { - "location": "/Options/#parseinputdate-function", - "text": "Takes a function Allows custom input formatting For example: the user can enter 'yesterday' or '30 days ago. Example: var parseRelativeDate = function(relativeDate) {\n\n switch (relativeDate) {\n case 'today':\n return moment()\n case 'yesterday':\n return moment().subtract(1, 'day');\n default:\n return moment()\n .subtract(Number(relativeDate.replace( days ago , ).trim()), 'days');\n }\n}\n\nvar parseInputDate = function(inputDate) {\n var relativeDatePattern = /today|yesterday|[0-9]+\\s+(days ago)/,\n resultDate;\n\n if (moment.isMoment(inputDate) || inputDate instanceof Date) {\n resultDate = moment(inputDate);\n } else {\n var relativeDate = inputDate.match(relativeDatePattern),\n parseDate = null;\n\n if (relativeDate !== null) \n parseDate = this.parseRelativeDate(inputDate.match(relativeDatePattern)[0]);\n else \n parseDate = moment();\n\n resultDate = moment(parseDate, YYYY-MM-DD );\n }\n\n return resultDate;\n}", - "title": "parseInputDate, [function]" - }, - { - "location": "/Options/#tooltips", - "text": "tooltips: {\n today: 'Go to today',\n clear: 'Clear selection',\n close: 'Close the picker',\n selectMonth: 'Select Month',\n prevMonth: 'Previous Month',\n nextMonth: 'Next Month',\n selectYear: 'Select Year',\n prevYear: 'Previous Year',\n nextYear: 'Next Year',\n selectDecade: 'Select Decade',\n prevDecade: 'Previous Decade',\n nextDecade: 'Next Decade',\n prevCentury: 'Previous Century',\n nextCentury: 'Next Century'\n} This will change the tooltips over each icon to a custom string.", - "title": "tooltips" - }, - { - "location": "/Options/#tooltips_1", - "text": "Returns an Ojbect of options.tooltips", - "title": "tooltips" - }, - { - "location": "/Options/#tooltips-tooltips", - "text": "Takes an Ojbect of strings .", - "title": "tooltips, [tooltips]" - }, - { - "location": "/Options/#throws_7", - "text": "TypeError - if tooltips parameter is not an Ojbect", - "title": "Throws" - }, - { - "location": "/Options/#timezone", - "text": "timeZone: '' Allows the setting of the Time Zone. You must include moment-timezone.js and moment-timzone data. See moment timezone documentation for usage.", - "title": "timeZone" - }, - { - "location": "/Options/#timezone_1", - "text": "Returns an string of options.timeZone", - "title": "timeZone" - }, - { - "location": "/Options/#timezone-timezone", - "text": "Takes an string of a valid timezone.", - "title": "timeZone, [timeZone]" - }, - { - "location": "/Options/#throws_8", - "text": "TypeError - if tooltips parameter is not an string", - "title": "Throws" - }, - { - "location": "/Events/", - "text": "Events\n\n\nhide.datetimepicker\n\n\nFired when the widget is hidden.\n\n\nParameters:\n\n\ne = {\n date //the currently set date. Type: moment object (clone)\n}\n\n\n\n\nEmitted from:\n\n\n\n\ntoggle()\n\n\nhide()\n\n\ndisable()\n\n\n\n\n\n\nshow.datetimepicker\n\n\nFired when the widget is shown.\n\n\nParameters:\n\n\nNo parameters are include, listen to \nchange.datetimepicker\n instead\n\n\nEmitted from:\n\n\n\n\ntoggle()\n\n\nshow()\n\n\n\n\n\n\nchange.datetimepicker\n\n\nFired when the date is changed, including when changed to a non-date (e.g. When keepInvalid=true).\n\n\nParameters:\n\n\ne = {\n date, //date the picker changed to. Type: moment object (clone)\n oldDate //previous date. Type: moment object (clone) or false in the event of a null\n}\n\n\n\n\nEmitted from:\n\n\n\n\ntoggle() \nNote\n: Only fired when using \nuseCurrent\n\n\nshow() \nNote\n: Only fired when using \nuseCurrent\n or when or the date is changed to comply with date rules (min/max etc)\n\n\ndate(newDate)\n\n\nminDate(minDate)\n\n\nmaxDate(maxDate)\n\n\ndaysOfWeekDisabled()\n\n\n\n\n\n\nerror.datetimepicker\n\n\nFired when a selected date fails to pass validation.\n\n\nParameters:\n\n\ne = {\n date //the invalid date. Type: moment object (clone)\n oldDate //previous date. Type: moment object (clone) or false in the event of a null\n}\n\n\n\n\nEmmited from:\n\n\n\n\nminDate(minDate)\n\n\nmaxDate(maxDate)\n\n\ndaysOfWeekDisabled()\n\n\nsetValue() \nprivate function\n\n\n\n\n\n\nupdate.datetimepicker\n\n\nFired (in most cases) when the \nviewDate\n changes. E.g. Next and Previous buttons, selecting a year.\n\n\nParameters:\n\n\ne = {\n change, //Change type as a momentjs format token. Type: string e.g. yyyy on year change\n viewDate //new viewDate. Type: moment object\n}", - "title": "Events" - }, - { - "location": "/Events/#events", - "text": "", - "title": "Events" - }, - { - "location": "/Events/#hidedatetimepicker", - "text": "Fired when the widget is hidden. Parameters: e = {\n date //the currently set date. Type: moment object (clone)\n} Emitted from: toggle() hide() disable()", - "title": "hide.datetimepicker" - }, - { - "location": "/Events/#showdatetimepicker", - "text": "Fired when the widget is shown. Parameters: No parameters are include, listen to change.datetimepicker instead Emitted from: toggle() show()", - "title": "show.datetimepicker" - }, - { - "location": "/Events/#changedatetimepicker", - "text": "Fired when the date is changed, including when changed to a non-date (e.g. When keepInvalid=true). Parameters: e = {\n date, //date the picker changed to. Type: moment object (clone)\n oldDate //previous date. Type: moment object (clone) or false in the event of a null\n} Emitted from: toggle() Note : Only fired when using useCurrent show() Note : Only fired when using useCurrent or when or the date is changed to comply with date rules (min/max etc) date(newDate) minDate(minDate) maxDate(maxDate) daysOfWeekDisabled()", - "title": "change.datetimepicker" - }, - { - "location": "/Events/#errordatetimepicker", - "text": "Fired when a selected date fails to pass validation. Parameters: e = {\n date //the invalid date. Type: moment object (clone)\n oldDate //previous date. Type: moment object (clone) or false in the event of a null\n} Emmited from: minDate(minDate) maxDate(maxDate) daysOfWeekDisabled() setValue() private function", - "title": "error.datetimepicker" - }, - { - "location": "/Events/#updatedatetimepicker", - "text": "Fired (in most cases) when the viewDate changes. E.g. Next and Previous buttons, selecting a year. Parameters: e = {\n change, //Change type as a momentjs format token. Type: string e.g. yyyy on year change\n viewDate //new viewDate. Type: moment object\n}", - "title": "update.datetimepicker" - }, - { - "location": "/Changelog/", - "text": "Version 5\n\n\n5.0.0-alpha\n\n\nNew Features\n\n\n\n\nES6 rewrite\n\n\nStripped UI/UX related code and shunted it into its own module\n\n\nMore configuration based setup\n\n\nBootstrap 4-esk plugin creation style\n\n\nAll events are namespaced properly \n{event}.datetimepicker\n\n\nAdded a jquery no conflict option\n\n\n\n\nOther changes\n\n\n\n\nmoved \nshowTodayButton\n, \nshowClear\n and \nshowClose\n into \noptions.buttons", - "title": "Change Log" - }, - { - "location": "/Changelog/#version-5", - "text": "", - "title": "Version 5" - }, - { - "location": "/Changelog/#500-alpha", - "text": "", - "title": "5.0.0-alpha" - }, - { - "location": "/Changelog/#new-features", - "text": "ES6 rewrite Stripped UI/UX related code and shunted it into its own module More configuration based setup Bootstrap 4-esk plugin creation style All events are namespaced properly {event}.datetimepicker Added a jquery no conflict option", - "title": "New Features" - }, - { - "location": "/Changelog/#other-changes", - "text": "moved showTodayButton , showClear and showClose into options.buttons", - "title": "Other changes" - }, - { - "location": "/ContributorsGuide/", - "text": "This guide is aimed to contributors wishing to understand the internals of the code in order to change/evolve the component. \n\n\nNote:\n this guide refers to \nversion 5\n which is currently in alpha and will be updated as we progress\n\n\nIntroduction\n\n\nThis component consists actually of 2 subcomponent UI widgets one for the date and one for the time selection process. The developers can configure which of those are needed and also the granularity that the component will allow the users to select a date/time. Developers also choose the format that the selected date/time will be displayed in the input field.\nThe component uses on \njQuery\n, \nmoment.js\n libraries.\n\n\nCode\n\n\nPrivate variables\n\n\n\n\n\n\nelement\n - Holds the DOM element this instance is attached to\n\n\n\n\n\n\noptions\n - Holds an object with the currently set options for the specific instance of the component. Don't directly change the properties of that object use the public API methods instead. DO NOT expose this object or its properties outside of the component.\n\n\n\n\n\n\ndate\n - Holds the moment object for the model value of the component. \nDON'T\n directly change this variable unless you \nREALLY\n know what you are doing. Use \nsetValue()\n function to set it. It handles all component logic for updating the model value and emitting all the appropriate events\n\n\n\n\n\n\nviewDate\n - Holds the currently selected value that the user has selected through the widget. This is not the model value this is the view value. Changing this usually requires a subsequent call to \nupdate()\n function\n\n\n\n\n\n\nunset\n - A \nboolean\n variable that holds whether the components model value is set or not. Model's value starts as \nunset = true\n and if is either set by the user or programmatically through the api to a valid value then it is set to \nfalse\n. If subsequent events lead to an invalid value then this variable is set to \ntrue\n again. Setting this variable usually takes place in the \nsetValue()\n function.\n\n\n\n\n\n\ninput\n - Hold the DOM input element this instance is attached to\n\n\n\n\n\n\ncomponent\n - Holds a reference to the .input-group DOM element that the widget is attached or false if it is attached directly on an input field\n\n\n\n\n\n\nwidget\n - Holds a reference to the DOM element containing the widget or \nfalse\n if the widget is hidden\n\n\n\n\n\n\nuse24hours\n - Holds whether the component uses 24 hours format or not. This is initialized on the \nformat()\n function\n\n\n\n\n\n\nminViewModeNumber\n - Holds the Numeric equivalent of the options.minViewMode parameter\n\n\n\n\n\n\nformat\n - Holds the current format string that is used for formatting the date model value. Note this is not the same thing as the \noptions.format\n as the second could be set to \nfalse\n in which case the first takes the locale's \nL\n or \nLT\n value\n\n\n\n\n\n\ncurrentViewMode\n - Hold the state of the current viewMode for the DatePicker subcomponent\n\n\n\n\n\n\ndatePickerModes\n - An array of objects with configuration parameters for the different views of the DatePicker subcomponent\n\n\n\n\n\n\nviewModes\n - An array of strings containing all the possible strings that \noptions.viewMode\n can take through \nviewMode()\n public api function\n\n\n\n\n\n\ndirectionModes\n - An array of strings containing all the possible strings that \noptions.direction\n can take through \ndirection()\n public api function\n\n\n\n\n\n\norientationModes\n - An array of strings containing all the possible strings that \noptions.orientation\n can take through \norientation()\n public api function\n\n\n\n\n\n\nPrivate functions\n\n\nEvents related\n\n\n\n\n\n\nnotifyEvent(e)\n - Use this function when you want to send en event to listener this could be used as a filter later\n\n\n\n\n\n\nstopEvent(e)\n - Shortcut for stopping propagation of events\n\n\n\n\n\n\nkeydown(e)\n - Function to trap \n\n\n\n\n\n\nchange(e)\n - Listener function to track change events occurring on the \ninput\n dom element the component is attached to\n\n\n\n\n\n\nattachDatePickerElementEvents()\n - Attaches listeners to the existing DOM elements the component is attached to. Called upon construction of each datetimepicker instance\n\n\n\n\n\n\ndetachDatePickerElementEvents()\n - Detaches listeners from the DOM element the component is attached to. Called on \ndestroy()\n\n\n\n\n\n\nattachDatePickerWidgetEvents()\n - Attaches listeners on the components widget. Called on \nshow()\n\n\n\n\n\n\ndetachDatePickerWidgetEvents()\n - Detaches listeners on the components widget. Called on \nhide()\n\n\n\n\n\n\nModel related\n\n\n\n\n\n\nsetValue(targetMoment)\n - Sets the model value of the component takes a moment object. An \nerror\n event will be emmited if the \ntargetMoment\n does not pass the configured validations. Otherwise the \ndate\n variable will be set and the relevant events will be fired.\n\n\n\n\n\n\nisValid(targetMoment, granularity)\n - returns \ntrue\n if the \ntargetMoment\n moment object is valid according to the components set validation rules (\nmin/maxDates\n, \ndisabled/enabledDates\n and \ndaysOfWeekDisabled\n). You may pass a second variable to check only up the the specific granularity \nyear, month, day, hour, minute, second\n\n\n\n\n\n\nUtilities\n\n\n\n\n\n\nindexGivenDates (givenDatesArray)\n - Function that takes the array from \nenabledDates()\n and \ndisabledDates()\n public functions and stores them as object keys to enable quick lookup\n\n\n\n\n\n\nisInEnableDates(date)\n - Checks whether if the given moment object exists in the \noptions.enabledDates\n object\n\n\n\n\n\n\nisInDisableDates(date)\n - Checks whether if the given moment object exists in the \noptions.disabledDates\n array\n\n\n\n\n\n\ndataToOptions()\n - Parses \ndata-date-*\n options set on the input dom element the component is attached to and returns an object with them\n\n\n\n\n\n\nisInFixed()\n - Checks if the dom element or its parents has a fixed position css rule.\n\n\n\n\n\n\nparseInputDate(date)\n - Parses a date parameter with moment using the component's \noptions.format\n and \noptions.useStrict\n. It returns a \nmoment\n object or false if \nparsedMoment#isValid()\n returns \nfalse\n. Use this to parse date inputs from outside the component (public API calls).\n\n\n\n\n\n\ninit()\n - Initializes the component. Called when the component instance is created", - "title": "Dev Guide" - }, - { - "location": "/ContributorsGuide/#introduction", - "text": "This component consists actually of 2 subcomponent UI widgets one for the date and one for the time selection process. The developers can configure which of those are needed and also the granularity that the component will allow the users to select a date/time. Developers also choose the format that the selected date/time will be displayed in the input field.\nThe component uses on jQuery , moment.js libraries.", - "title": "Introduction" - }, - { - "location": "/ContributorsGuide/#code", - "text": "", - "title": "Code" - }, - { - "location": "/ContributorsGuide/#private-variables", - "text": "element - Holds the DOM element this instance is attached to options - Holds an object with the currently set options for the specific instance of the component. Don't directly change the properties of that object use the public API methods instead. DO NOT expose this object or its properties outside of the component. date - Holds the moment object for the model value of the component. DON'T directly change this variable unless you REALLY know what you are doing. Use setValue() function to set it. It handles all component logic for updating the model value and emitting all the appropriate events viewDate - Holds the currently selected value that the user has selected through the widget. This is not the model value this is the view value. Changing this usually requires a subsequent call to update() function unset - A boolean variable that holds whether the components model value is set or not. Model's value starts as unset = true and if is either set by the user or programmatically through the api to a valid value then it is set to false . If subsequent events lead to an invalid value then this variable is set to true again. Setting this variable usually takes place in the setValue() function. input - Hold the DOM input element this instance is attached to component - Holds a reference to the .input-group DOM element that the widget is attached or false if it is attached directly on an input field widget - Holds a reference to the DOM element containing the widget or false if the widget is hidden use24hours - Holds whether the component uses 24 hours format or not. This is initialized on the format() function minViewModeNumber - Holds the Numeric equivalent of the options.minViewMode parameter format - Holds the current format string that is used for formatting the date model value. Note this is not the same thing as the options.format as the second could be set to false in which case the first takes the locale's L or LT value currentViewMode - Hold the state of the current viewMode for the DatePicker subcomponent datePickerModes - An array of objects with configuration parameters for the different views of the DatePicker subcomponent viewModes - An array of strings containing all the possible strings that options.viewMode can take through viewMode() public api function directionModes - An array of strings containing all the possible strings that options.direction can take through direction() public api function orientationModes - An array of strings containing all the possible strings that options.orientation can take through orientation() public api function", - "title": "Private variables" - }, - { - "location": "/ContributorsGuide/#private-functions", - "text": "", - "title": "Private functions" - }, - { - "location": "/ContributorsGuide/#events-related", - "text": "notifyEvent(e) - Use this function when you want to send en event to listener this could be used as a filter later stopEvent(e) - Shortcut for stopping propagation of events keydown(e) - Function to trap change(e) - Listener function to track change events occurring on the input dom element the component is attached to attachDatePickerElementEvents() - Attaches listeners to the existing DOM elements the component is attached to. Called upon construction of each datetimepicker instance detachDatePickerElementEvents() - Detaches listeners from the DOM element the component is attached to. Called on destroy() attachDatePickerWidgetEvents() - Attaches listeners on the components widget. Called on show() detachDatePickerWidgetEvents() - Detaches listeners on the components widget. Called on hide()", - "title": "Events related" - }, - { - "location": "/ContributorsGuide/#model-related", - "text": "setValue(targetMoment) - Sets the model value of the component takes a moment object. An error event will be emmited if the targetMoment does not pass the configured validations. Otherwise the date variable will be set and the relevant events will be fired. isValid(targetMoment, granularity) - returns true if the targetMoment moment object is valid according to the components set validation rules ( min/maxDates , disabled/enabledDates and daysOfWeekDisabled ). You may pass a second variable to check only up the the specific granularity year, month, day, hour, minute, second", - "title": "Model related" - }, - { - "location": "/ContributorsGuide/#utilities", - "text": "indexGivenDates (givenDatesArray) - Function that takes the array from enabledDates() and disabledDates() public functions and stores them as object keys to enable quick lookup isInEnableDates(date) - Checks whether if the given moment object exists in the options.enabledDates object isInDisableDates(date) - Checks whether if the given moment object exists in the options.disabledDates array dataToOptions() - Parses data-date-* options set on the input dom element the component is attached to and returns an object with them isInFixed() - Checks if the dom element or its parents has a fixed position css rule. parseInputDate(date) - Parses a date parameter with moment using the component's options.format and options.useStrict . It returns a moment object or false if parsedMoment#isValid() returns false . Use this to parse date inputs from outside the component (public API calls). init() - Initializes the component. Called when the component instance is created", - "title": "Utilities" - }, - { - "location": "/Extras/", - "text": "Extras\n\n\nGuides for making the picker work better with rails, IE, etc. \nNote:\n I have no idea if these guides still apply for v5 or not.\n\n\nRails 3\n\n\nby \ndhulihan\n\n\nYou can easily override the default rails form helpers (\ndate_select\n and \ndatetime_select\n) with bootstrap-datetimepicker for a much nicer experience. \n\n\n# Add to config/initializers/form.rb or the end of app/helpers/application_helper.rb\nmodule ActionView\n module Helpers\n class FormBuilder \n def date_select(method, options = {}, html_options = {})\n existing_date = @object.send(method) \n formatted_date = existing_date.to_date.strftime(\n%F\n) if existing_date.present?\n @template.content_tag(:div, :class =\n \ninput-group\n) do \n text_field(method, :value =\n formatted_date, :class =\n \nform-control datepicker\n, :\ndata-date-format\n =\n \nYYYY-MM-DD\n) +\n @template.content_tag(:span, @template.content_tag(:span, \n, :class =\n \nglyphicon glyphicon-calendar\n) ,:class =\n \ninput-group-addon\n)\n end\n end\n\n def datetime_select(method, options = {}, html_options = {})\n existing_time = @object.send(method) \n formatted_time = existing_time.to_time.strftime(\n%F %I:%M %p\n) if existing_time.present?\n @template.content_tag(:div, :class =\n \ninput-group\n) do \n text_field(method, :value =\n formatted_time, :class =\n \nform-control datetimepicker\n, :\ndata-date-format\n =\n \nYYYY-MM-DD hh:mm A\n) +\n @template.content_tag(:span, @template.content_tag(:span, \n, :class =\n \nglyphicon glyphicon-calendar\n) ,:class =\n \ninput-group-addon\n)\n end\n end\n end\n end\nend\n\n\n\n\nThe time format used here is ActiveRecord-friendly, which means it will be parsed correctly when passed in through \nparams\n to your record.\n\n\nThat's all there is to it! Now all of your forms that use \ndatetime_select\n or \ndate_select\n will be automatically updated:\n\n\n% form_for @post do |f| %\n\n \ndiv class=\nform-group\n\n \nlabel\nPublished At\n/label\n\n \n%= f.datetime_select :published_at %\n\n \n/div\n\n\n% end %", - "title": "Extras" - }, - { - "location": "/Extras/#extras", - "text": "Guides for making the picker work better with rails, IE, etc. Note: I have no idea if these guides still apply for v5 or not.", - "title": "Extras" - }, - { - "location": "/Extras/#rails-3", - "text": "by dhulihan You can easily override the default rails form helpers ( date_select and datetime_select ) with bootstrap-datetimepicker for a much nicer experience. # Add to config/initializers/form.rb or the end of app/helpers/application_helper.rb\nmodule ActionView\n module Helpers\n class FormBuilder \n def date_select(method, options = {}, html_options = {})\n existing_date = @object.send(method) \n formatted_date = existing_date.to_date.strftime( %F ) if existing_date.present?\n @template.content_tag(:div, :class = input-group ) do \n text_field(method, :value = formatted_date, :class = form-control datepicker , : data-date-format = YYYY-MM-DD ) +\n @template.content_tag(:span, @template.content_tag(:span, , :class = glyphicon glyphicon-calendar ) ,:class = input-group-addon )\n end\n end\n\n def datetime_select(method, options = {}, html_options = {})\n existing_time = @object.send(method) \n formatted_time = existing_time.to_time.strftime( %F %I:%M %p ) if existing_time.present?\n @template.content_tag(:div, :class = input-group ) do \n text_field(method, :value = formatted_time, :class = form-control datetimepicker , : data-date-format = YYYY-MM-DD hh:mm A ) +\n @template.content_tag(:span, @template.content_tag(:span, , :class = glyphicon glyphicon-calendar ) ,:class = input-group-addon )\n end\n end\n end\n end\nend The time format used here is ActiveRecord-friendly, which means it will be parsed correctly when passed in through params to your record. That's all there is to it! Now all of your forms that use datetime_select or date_select will be automatically updated: % form_for @post do |f| % \n div class= form-group \n label Published At /label \n %= f.datetime_select :published_at % \n /div % end %", - "title": "Rails 3" - }, - { - "location": "/FAQ/", - "text": "FAQs\n\n\nHow do I disable the date or time element\n\n\nHow do I format ...; How do I add seconds; etc.\n\n\nThe picker uses the \nformat\n option to decide what components to show. Set \nformat\n to \nLT\n, \nLTS\n or another valid \nMomentJs format string\n to display certain components\n\n\nHow do I change the language/locale\n\n\nThe picker uses MomentJs to determine the language string. You can use \nmoment-with-locales\n or you can include whatever local file you need. Set the picker's \nlocale\n option to \nde\n or whatever the locale string is.\n\n\nHow do I change the styles? The picker closes.\n\n\nSet \ndebug:true\n which will force the picker to stay open, even \nonBlur\n. You can hide the picker manually by calling \nhide()\n\n\nHow do I change the start of the week?\n\n\nStart of the week is based on the \nlocale\n provided\n. This is defined by moment's locales. If you want to change it, create your own locale file or override. \nSee moment's docs\n.\n\n\nHow I use the picker as birthday picker?\n\n\nUse the \nviewMode\n option to \n'years'", - "title": "FAQs" - }, - { - "location": "/FAQ/#faqs", - "text": "", - "title": "FAQs" - }, - { - "location": "/FAQ/#how-do-i-disable-the-date-or-time-element", - "text": "How do I format ...; How do I add seconds; etc. The picker uses the format option to decide what components to show. Set format to LT , LTS or another valid MomentJs format string to display certain components", - "title": "How do I disable the date or time element" - }, - { - "location": "/FAQ/#how-do-i-change-the-languagelocale", - "text": "The picker uses MomentJs to determine the language string. You can use moment-with-locales or you can include whatever local file you need. Set the picker's locale option to de or whatever the locale string is.", - "title": "How do I change the language/locale" - }, - { - "location": "/FAQ/#how-do-i-change-the-styles-the-picker-closes", - "text": "Set debug:true which will force the picker to stay open, even onBlur . You can hide the picker manually by calling hide()", - "title": "How do I change the styles? The picker closes." - }, - { - "location": "/FAQ/#how-do-i-change-the-start-of-the-week", - "text": "Start of the week is based on the locale provided . This is defined by moment's locales. If you want to change it, create your own locale file or override. See moment's docs .", - "title": "How do I change the start of the week?" - }, - { - "location": "/FAQ/#how-i-use-the-picker-as-birthday-picker", - "text": "Use the viewMode option to 'years'", - "title": "How I use the picker as birthday picker?" - } - ] + "docs": [ + { + "location": "/", + "text": "Tempus Dominus - Core v5 Docs\n\n\n\n \nNote\n\n All functions are accessed via the \ndata\n attribute e.g. \n$('#datetimepicker').datetimepicker(FUNCTION)\n\n\n\n\n\nUnderstanding \"Core\"\n\n\nThese documents represent the functions and options specif to the Core module. Each UI module should contain these docs and their own code examples and requirements.\n\n\nUnless you are interested in developing your own UI module you should refer to the docs for the UI module you're using.", + "title": "Home" + }, + { + "location": "/#tempus-dominus-core-v5-docs", + "text": "Note \n All functions are accessed via the data attribute e.g. $('#datetimepicker').datetimepicker(FUNCTION)", + "title": "Tempus Dominus - Core v5 Docs" + }, + { + "location": "/#understanding-core", + "text": "These documents represent the functions and options specif to the Core module. Each UI module should contain these docs and their own code examples and requirements. Unless you are interested in developing your own UI module you should refer to the docs for the UI module you're using.", + "title": "Understanding \"Core\"" + }, + { + "location": "/Installing/", + "text": "Minimal Requirements\n\n\n\n\njQuery\n\n\nMoment.js\n\n\nLocales: Moment's locale files are \nhere\n\n\n\n\nInstallation Guides\n\n\n\n\nCDN\n\n\nBower\n\n\nNuget\n\n\nRails\n\n\nAngular\n\n\nMeteor.js\n\n\nManual\n\n\n\n\nCDN\n\n\nhead\n\n \nscript type=\ntext/javascript\n src=\nhttps://cdnjs.com/libraries/[fill-in].js\n/script\n\n\n/head\n\n\n\n\n\nbower\n \n\n\nRun the following command:\n\n\nbower install tempusdominus#latest --save\n\n\n\n\nInclude necessary scripts and styles:\n\n\nhead\n\n \n!-- ... --\n\n \nscript type=\ntext/javascript\n src=\n/bower_components/jquery/jquery.min.js\n/script\n\n \nscript type=\ntext/javascript\n src=\n/bower_components/moment/min/moment.min.js\n/script\n\n \nscript type=\ntext/javascript\n src=\n/bower_components/tempusdominus/build/js/core.min.js\n/script\n\n\n/head\n\n\n\n\n\nNuget\n\n\nCore\n: \n\n\nPM\n Install-Package Tempus.Dominus.Core\n\n\n\n\nhead\n\n \nscript type=\ntext/javascript\n src=\n/scripts/jquery.min.js\n/script\n\n \nscript type=\ntext/javascript\n src=\n/scripts/moment.min.js\n/script\n\n \nscript type=\ntext/javascript\n src=\n/scripts/tempusdominus/core.js\n/script\n\n\n/head\n\n\n\n\n\nRails\n\n\nNeed new wrapper for this version.\n\n\nAngular Wrapper\n\n\nNeed new wrapper for this version.\n\n\nMeteor.js\n\n\nNeed new wrapper for this version.\n\n\nManual\n\n\nAcquire \njQuery\n\n\nAcquire \nMoment.js\n\n\nscript type=\ntext/javascript\n src=\n/path/to/jquery.js\n/script\n\n\nscript type=\ntext/javascript\n src=\n/path/to/moment.js\n/script\n\n\nscript type=\ntext/javascript\n src=\n/path/to/core.min.js\n/script\n\n\n\n\n\nKnockout\n\n\nNeed new wrapper for this version.", + "title": "Installing" + }, + { + "location": "/Installing/#minimal-requirements", + "text": "jQuery Moment.js Locales: Moment's locale files are here", + "title": "Minimal Requirements" + }, + { + "location": "/Installing/#installation-guides", + "text": "CDN Bower Nuget Rails Angular Meteor.js Manual", + "title": "Installation Guides" + }, + { + "location": "/Installing/#cdn", + "text": "head \n script type= text/javascript src= https://cdnjs.com/libraries/[fill-in].js /script /head", + "title": "CDN" + }, + { + "location": "/Installing/#bower", + "text": "Run the following command: bower install tempusdominus#latest --save Include necessary scripts and styles: head \n !-- ... -- \n script type= text/javascript src= /bower_components/jquery/jquery.min.js /script \n script type= text/javascript src= /bower_components/moment/min/moment.min.js /script \n script type= text/javascript src= /bower_components/tempusdominus/build/js/core.min.js /script /head", + "title": "bower" + }, + { + "location": "/Installing/#nuget", + "text": "", + "title": "Nuget" + }, + { + "location": "/Installing/#core", + "text": "PM Install-Package Tempus.Dominus.Core head \n script type= text/javascript src= /scripts/jquery.min.js /script \n script type= text/javascript src= /scripts/moment.min.js /script \n script type= text/javascript src= /scripts/tempusdominus/core.js /script /head", + "title": "Core:" + }, + { + "location": "/Installing/#rails", + "text": "Need new wrapper for this version.", + "title": "Rails" + }, + { + "location": "/Installing/#angular-wrapper", + "text": "Need new wrapper for this version.", + "title": "Angular Wrapper" + }, + { + "location": "/Installing/#meteorjs", + "text": "Need new wrapper for this version.", + "title": "Meteor.js" + }, + { + "location": "/Installing/#manual", + "text": "", + "title": "Manual" + }, + { + "location": "/Installing/#acquire-jquery", + "text": "", + "title": "Acquire jQuery" + }, + { + "location": "/Installing/#acquire-momentjs", + "text": "script type= text/javascript src= /path/to/jquery.js /script script type= text/javascript src= /path/to/moment.js /script script type= text/javascript src= /path/to/core.min.js /script", + "title": "Acquire Moment.js" + }, + { + "location": "/Installing/#knockout", + "text": "Need new wrapper for this version.", + "title": "Knockout" + }, + { + "location": "/Functions/", + "text": "Functions\n\n\n\n \nNote\n\n All functions are accessed via the \ndata\n attribute e.g. \n$('#datetimepicker').datetimepicker(FUNCTION)\n\n\n\n\n\ndestroy\n\n\nDestroys the widget and removes all attached event listeners\n\n\n\n\ntoggle\n\n\nShows or hides the widget\n\n\nEmits\n\n\n\n\n\n\nhide.datetimepicker\n - if the widget is hidden after the toggle call\n\n\n\n\n\n\nshow.datetimepicker\n - if the widget is show after the toggle call\n\n\n\n\n\n\nchange.datetimepicker\n - if the widget is opened for the first time and the input element is empty and \noptions.useCurrent != false\n\n\n\n\n\n\n\n\nshow\n\n\nShows the widget\n\n\nEmits\n\n\n\n\n\n\nshow.datetimepicker\n - if the widget was hidden before that call\n\n\n\n\n\n\nchange.datetimepicker\n - if the widget is opened for the first time and the \nuseCurrent\n is set to true or to a granularity value and the input element the component is attached to has an empty value\n\n\n\n\n\n\n\n\nhide\n\n\nHides the widget\n\n\nEmits\n\n\n\n\nhide.datetimepicker\n - if the widget was visible before that call\n\n\n\n\n\n\ndisable\n\n\nDisables the input element, the component is attached to, by adding a \ndisabled=\"true\"\n attribute to it. If the widget was visible before that call it is hidden.\n\n\nEmits\n\n\n\n\nhide.datetimepicker\n - if the widget was visible before that call\n\n\n\n\n\n\nenable\n\n\nEnables the input element, the component is attached to, by removing \ndisabled\n attribute from it.\n\n\n\n\nclear\n\n\nClears the date picker by setting the value to \nnull\n\n\n\n\nviewDate\n\n\nviewDate\n\n\nReturns a \nmoment\n variable with the currently set \noptions.viewDate\n option.\n\n\nviewDate(viewDate)\n\n\nTakes a \nstring, moment or Date\n value.\n\n\nThis will change the \nviewDate\n without changing or setting the selected date.", + "title": "Functions" + }, + { + "location": "/Functions/#functions", + "text": "Note \n All functions are accessed via the data attribute e.g. $('#datetimepicker').datetimepicker(FUNCTION)", + "title": "Functions" + }, + { + "location": "/Functions/#destroy", + "text": "Destroys the widget and removes all attached event listeners", + "title": "destroy" + }, + { + "location": "/Functions/#toggle", + "text": "Shows or hides the widget", + "title": "toggle" + }, + { + "location": "/Functions/#emits", + "text": "hide.datetimepicker - if the widget is hidden after the toggle call show.datetimepicker - if the widget is show after the toggle call change.datetimepicker - if the widget is opened for the first time and the input element is empty and options.useCurrent != false", + "title": "Emits" + }, + { + "location": "/Functions/#show", + "text": "Shows the widget", + "title": "show" + }, + { + "location": "/Functions/#emits_1", + "text": "show.datetimepicker - if the widget was hidden before that call change.datetimepicker - if the widget is opened for the first time and the useCurrent is set to true or to a granularity value and the input element the component is attached to has an empty value", + "title": "Emits" + }, + { + "location": "/Functions/#hide", + "text": "Hides the widget", + "title": "hide" + }, + { + "location": "/Functions/#emits_2", + "text": "hide.datetimepicker - if the widget was visible before that call", + "title": "Emits" + }, + { + "location": "/Functions/#disable", + "text": "Disables the input element, the component is attached to, by adding a disabled=\"true\" attribute to it. If the widget was visible before that call it is hidden.", + "title": "disable" + }, + { + "location": "/Functions/#emits_3", + "text": "hide.datetimepicker - if the widget was visible before that call", + "title": "Emits" + }, + { + "location": "/Functions/#enable", + "text": "Enables the input element, the component is attached to, by removing disabled attribute from it.", + "title": "enable" + }, + { + "location": "/Functions/#clear", + "text": "Clears the date picker by setting the value to null", + "title": "clear" + }, + { + "location": "/Functions/#viewdate", + "text": "", + "title": "viewDate" + }, + { + "location": "/Functions/#viewdate_1", + "text": "Returns a moment variable with the currently set options.viewDate option.", + "title": "viewDate" + }, + { + "location": "/Functions/#viewdateviewdate", + "text": "Takes a string, moment or Date value. This will change the viewDate without changing or setting the selected date.", + "title": "viewDate(viewDate)" + }, + { + "location": "/Options/", + "text": "Options\n\n\n\n \nNote\n\n All options are accessed via the \ndata\n attribute e.g. \n$('#datetimepicker').datetimepicker(OPTION, ARGUMENT)\n\n\n **TODO** should I move some of this to the component?\n\n\n\n\noptions\n\n\nReturns the components current options object. Note that the changing the values of the returned object does not change the components actual configuration. Use \noptions(options)\n to set the components options massively or the other methods for setting config options individually.\n\n\noptions, [options]\n\n\nTakes an object variable with option key:value properties and configures the component. Use this to update multiple options on the component.\n\n\n\n\ndate\n\n\nReturns the component's model current date, a \nmoment\n object or \nnull\n if not set.\n\n\ndate, [newDate]\n\n\nTakes \nstring, Date, moment, null\n parameter and sets the components model current moment to it. Passing a \nnull\n value unsets the components model current moment. Parsing of the \nnewDate\n parameter is made using moment library with the \noptions.format\n and \noptions.useStrict\n components configuration.\n\n\nThrows\n\n\n\n\nTypeError\n - in case the \nnewDate\n cannot be parsed\n\n\n\n\nEmits\n\n\n\n\nchange.datetimepicker\n - In case \nnewDate\n is different from current moment\n\n\n\n\n\n\nformat\n\n\nDefault: false\n\n\n\nSee \nmomentjs' docs\n for valid formats. Format also dictates what components are shown, e.g. \nMM/dd/YYYY\n will not display the time picker.\n\n\nformat\n\n\nReturns the component's \noptions.format\n \nstring\n\n\nformat, [format]\n\n\nTakes a \nmoment.js\n format \nstring\n and sets the components \noptions.format\n. This is used for displaying and also for parsing input strings either from the input element the component is attached to or the \ndate()\n function.\nThe parameter can also be a \nboolean:false\n in which case the format is set to the locale's \nL LT\n.\n\n\nNote:\n this is also used to determine if the time picker sub component will display the hours in 12 or 24 format. (if \na\n or \nh\n exists in the passed \nstring\n then a 12 hour mode is set)\n\n\n\n\ndayViewHeaderFormat\n\n\nDefault: 'MMMM YYYY'\n\n\n\nChanges the heading of the date picker when in \"days\" view.\n\n\n\n\ndayViewHeaderFormat\n\n\nReturns a \nstring\n variable with the currently set \noptions.dayViewHeaderFormat\n option.\n\n\ndayViewHeaderFormat, [string]\n\n\nTakes a \nstring\n value.\n\n\nUsed to customize the header of the day view.\n\n\n\n\nextraFormats\n\n\nDefault: false\n\n\n\nAllows for several input formats to be valid. See \nthis PR\n.\n\n\nextraFormats\n\n\nReturns a \nboolean\n or array with the \noptions.extraFormats\n option configuration\n\n\nextraFormats, [formats]\n\n\nTakes an array of valid input moment format options.\n\n\n\n\nstepping\n\n\nDefault: 1\n\n\n\nNumber of minutes the up/down arrow's will move the minutes value in the time picker\n\n\nstepping\n\n\nReturns a \nnumber\n with the \noptions.stepping\n option configuration\n\n\nstepping, [number]\n\n\nTakes a \nnumber\n. This be the amount the up/down arrows move the minute value with a time picker.\n\n\n\n\nmin/maxDate\n\n\nDefault: false\nAccepts: date, moment, string\n\n\n\nPrevents date/time selections before this date. Will override \ndefaultDate\n and \nuseCurrent\n if either of these settings are the same day since both options are invalid according to the rules you've selected.\n\n\nminDate\n\n\nReturns the currently set moment of the \noptions.minDate\n or \nfalse\n if not set\n\n\nminDate, [minDate]\n\n\nTakes a \nminDate\n \nstring, Date, moment, boolean:false\n parameter and disallows the user to select a moment that is before that moment. If a \nboolean:false\n value is passed the \noptions.minDate\n parameter is cleared and there is no restriction to the minimum moment the user can select. \n\n\nNote:\n If the \nminDate\n parameter is after the currently selected moment the currently selected moment changes to minDate parameter\n\n\nThrows\n\n\n\n\n\n\nTypeError\n - if \nminDate\n parameter cannot be parsed using the \noptions.format\n and \noptions.useStrict\n configuration settings\n\n\n\n\n\n\nTypeError\n - if \nminDate\n parameter is after \noptions.maxDate\n\n\n\n\n\n\nEmits\n\n\n\n\n\n\nchange.datetimepicker\n - if the new \nminDate\n is after currently selected moment (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\ndp.error\n - if the new \nminDate\n is after currently selected moment (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\n\n\nmaxDate\n\n\nReturns the currently set moment of the \noptions.maxDate\n or \nfalse\n if not set\n\n\nmaxDate, [maxDate]\n\n\nTakes a [maxDate] \nstring, Date, moment, boolean:false\n parameter and disallows the user to select a moment that is after that moment. If a \nboolean:false\n value is passed \noptions.maxDate\n is cleared and there is no restriction to the maximum moment the user can select.\n\n\nNote:\n If [maxDate] is before the currently selected moment the currently selected moment changes to [maxDate]\n\n\nThrows\n\n\n\n\n\n\nTypeError\n - if \nmaxDate\n parameter cannot be parsed using the \noptions.format\n and \noptions.useStrict\n configuration settings\n\n\n\n\n\n\nTypeError\n - if \nmaxDate\n parameter is before \noptions.minDate\n\n\n\n\n\n\nEmits\n\n\n\n\n\n\nchange.datetimepicker\n - if the new \nmaxDate\n is after currently selected moment (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\ndp.error\n - if the new \nmaxDate\n is after currently selected moment (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\n\n\nuseCurrent\n\n\nDefault: true\n\n\n\nOn \nshow\n, will set the picker to the current date/time.\n\n\nuseCurrent\n\n\nReturns a \nboolean\n or \nstring\n with the \noptions.useCurrent\n option configuration\n\n\nuseCurrent, boolean or string\n\n\nTakes a \nboolean\n or \nstring\n. If a \nboolean\n true is passed and the components model moment is not set (either through \nsetDate\n or through a valid value on the input element the component is attached to) then the first time the user opens the datetimepicker widget the value is initialized to the current moment of the action. If a false \nboolean\n is passed then no initialization happens on the input element. You can select the granularity on the initialized moment by passing one of the following strings (\n'year', 'month', 'day', 'hour', 'minute'\n) in the variable.\n\n\nIf for example you pass \n'day'\n to the \nsetUseCurrent\n function and the input field is empty the first time the user opens the datetimepicker widget the input text will be initialized to the current date time with day granularity (e.g. if current time = \n2014-08-10 13:32:33\n the input value will be initialized to \n2014-08-10 00:00:00\n)\n\n\nNote:\n If the \noptions.defaultDate\n is set or the input element the component is attached to has already a value that takes precedence and the functionality of \nuseCurrent\n is not triggered!\n\n\n\n\ncollapse\n\n\nDefault: true\n\n\n\nUsing a Bootstraps collapse to switch between date/time pickers.\n\n\ncollapse\n\n\nReturns a \nboolean\n of the \noptions.sideBySide\n.\n\n\ncollapse, [collapse]\n\n\nTakes a \nboolean\n. If set to \nfalse\n the picker will display similar to \nsideBySide\n except vertical.\n\n\n\n\nlocale\n\n\nDefault: moment.locale()\nAccepts: string, moment.local('locale')\n\n\n\nSee \nmomentjs\n for valid locales.\n\n\nYou must include \nmoment-with-locales.js\n or a local js file.\n\n\nlocale\n\n\nReturns the currently set locale of the \noptions.locale\n\n\nlocale, [newLocale]\n\n\nTakes a \nstring\n of any valid \nmoment locale\n e.g. \nde\n for German.\n\n\nThrows\n\n\n\n\nTypeError\n - if the locale is not loaded via a separate script or \nmoment-with-locales\n\n\n\n\n\n\ndefaultDate\n\n\nDefault: false\nAccepts: date, moment, string\n\n\n\nSets the picker default date/time. Overrides \nuseCurrent\n\n\ndefaultDate\n\n\nReturns a \nmoment\n with the \noptions.defaultDate\n option configuration or \nfalse\n if not set\n\n\ndefaultDate, [defaultDate]\n\n\nTakes a \nstring, Date, moment, boolean:false\n. Will set the picker's initial date. If a \nboolean:false\n value is passed the \noptions.defaultDate\n parameter is cleared. \n\n\n\n\n\n\nTypeError\n - if the provided date pass validation, including \ndisabledDates\n, \nenabledDates\n, \nminDate\n, \nmaxDate\n, and \ndaysOfWeekDisabled\n\n\n\n\n\n\nTypeError\n - if the provided date cannot be parsed by moment.js\n\n\n\n\n\n\n\n\nen/disabledDates\n\n\nDefault: false\nAccepts: array of [date, moment, string]\n\n\n\ndisabledDates\n\n\nReturns an array with the currently set disabled dates on the component.\n\n\ndisabledDates, [dates]\n\n\nTakes an \n[\n \nstring\n or \nDate\n or \nmoment\n \n]\n of values and disallows the user to select those days. Setting this takes precedence over \noptions.minDate\n, \noptions.maxDate\n configuration. Also calling this function removes the configuration of options.enabledDates if such exist.\n\n\nNote:\n These values are matched with \nDay\n granularity.\n\n\n\n\nenabledDates\n\n\nReturns an array with the currently set enabled dates on the component.\n\n\nenabledDates, [dates]\n\n\nTakes an \n[\n \nstring\n or \nDate\n or \nmoment\n \n]\n of values and allows the user to select only from those days. Setting this takes precedence over \noptions.minDate\n, \noptions.maxDate\n configuration. Also calling this function removes the configuration of \noptions.disabledDates\n if such exist.\n\n\nNote:\n These values are matched with \nDay\n granularity.\n\n\n\n\nicons\n\n\nDefault: {\n time: 'glyphicon glyphicon-time',\n date: 'glyphicon glyphicon-calendar',\n up: 'glyphicon glyphicon-chevron-up',\n down: 'glyphicon glyphicon-chevron-down',\n previous: 'glyphicon glyphicon-chevron-left',\n next: 'glyphicon glyphicon-chevron-right',\n today: 'glyphicon glyphicon-screenshot',\n clear: 'glyphicon glyphicon-trash',\n close: 'glyphicon glyphicon-remove'\n }\nAccepts: object with all or some of the parameters above\n\n\n\nChange the default icons for the pickers functions.\n\n\nicons\n\n\nReturns an \nOjbect\n of \noptions.icons\n \n\n\nicons, [icons]\n\n\nTakes an \nOjbect\n of \nstrings\n.\n\n\nThrows\n\n\n\n\nTypeError\n - if icons parameter is not an \nOjbect\n\n\n\n\n\n\nuseStrict\n\n\nDefault: false\n\n\n\nDefines if moment should use strict date parsing when considering a date to be valid.\n\n\nuseStrict\n\n\nReturns a \nboolean\n of the \noptions.useStrict\n\n\nuseStrict, [useStrict]\n\n\nTakes a \nboolean\n. If \nuseStrict\n is \ntrue\n, moment.js parsing rules will be stricter when determining if a date is valid or not.\n\n\n\n\nsideBySide\n\n\nDefault: false\n\n\n\nShows the picker side by side when using the time and date together.\n\n\n\n\nsideBySide\n\n\nReturns a \nboolean\n of the \noptions.sideBySide\n.\n\n\nsideBySide, [sideBySide]\n\n\nTakes a \nboolean\n. If \nsideBySide\n is \ntrue\n and the time picker is used, both components will display side by side instead of collapsing.\n\n\n\n\ndaysOfWeekDisabled\n\n\nDefault: []\nAccepts: array of numbers from 0-6\n\n\n\nDisables the section of days of the week, e.g. weekends.\n\n\ndaysOfWeekDisabled\n\n\nReturns an array with the \noptions.daysOfWeekDisabled\n configuration setting of the component.\n\n\ndaysOfWeekDisabled, [daysOfWeek]\n\n\nTakes an \n[\n \nNumber\n:\n0\n to \n6\n \n]\n and disallow the user to select weekdays that exist in this array. This has lower priority over the \noptions.minDate\n, \noptions.maxDate\n, \noptions.disabledDates\n and \noptions.enabledDates\n configuration settings.\n\n\nEmits\n\n\n\n\n\n\nchange.datetimepicker\n - if the currently selected moment falls in the values passed on the daysOfWeek parameter. (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\ndp.error\n - if the currently selected moment falls in the values passed on the daysOfWeek parameter. (waiting for #472 to close in order to finalize this part)\n\n\n\n\n\n\n\n\ncalendarWeeks\n\n\nDefault: false\n\n\n\nShows the week of the year to the left of first day of the week.\n\n\n\n\ncalendarWeeks\n\n\nReturns a \nboolean\n with the current \noptions.calendarWeeks\n option configuration\n\n\ncalendarWeeks, [boolean]\n\n\nTakes a \nboolean\n variable to set if the week numbers will appear to the left on the days view\n\n\n\n\nviewMode\n\n\nDefault: 'days'\nAccepts: 'decades','years','months','days'\n\n\n\nThe default view to display when the picker is shown.\n\n\nNote\n: To limit the picker to selecting, for instance the year and month, use \nformat: MM/YYYY\n.\n\n\nviewMode\n\n\nReturns a \nstring\n of the \noptions.viewMode\n.\n\n\nviewMode, [newViewMode]\n\n\nTakes a \nstring\n. Valid values are \n'days'\n, \n'months'\n, \n'years'\n and \n'decades'\n\n\nThrows\n\n\n\n\nTypeError\n - if \nnewViewMode\n parameter is not an a \nstring\n or if \nnewViewMode\n is not a valid value.\n\n\n\n\n\n\ntoolbarPlacement\n\n\nDefault: 'default'\nAccepts: 'default', 'top', 'bottom'\n\n\n\nChanges the placement of the icon toolbar.\n\n\n\n\ntoolbarplacement\n\n\nReturns a \nstring\n variable with the currently set \noptions.toolbarplacement\n option.\n\n\ntoolbarplacement, [string]\n\n\nTakes a \nstring\n value. Valid values are \n'default'\n, \n'top'\n and \n'bottom'\n.\n\n\nChanges the placement of the toolbar where the today, clear, component switch icon are located.\n\n\n\n\nbuttons\n\n\nDefault: {\n showToday: false,\n showClear: false,\n showClose: false\n }\nAccepts: object with all or some of the parameters above\n\n\n\nChange the default toolbar buttons for the pickers functions.\n\n\nbuttons\n\n\nReturns an \nOjbect\n of \noptions.buttons\n \n\n\nbuttons, [buttons]\n\n\nTakes an \nOjbect\n of \nboolean\n.\n\n\nThrows\n\n\n\n\nTypeError\n - if buttons parameter is not an \nOjbect\n\n\n\n\n\n\nwidgetPositioning\n\n\nDefault: {\n horizontal: 'auto'\n vertical: 'auto'\n }\nAccepts: object with the all or one of the parameters above\n horizontal: 'auto', 'left', 'right'\n vertical: 'auto', 'top', 'bottom'\n\n\n\nwidgetPositioning\n\n\nReturns the currently set \noptions.widgetPositioning\n object containing two keys \nhorizontal\n and \nvertical\n\n\nwidgetPositioning, [positioningObject]\n\n\nTakes an object parameter that can contain two keys \nvertical\n and \nhorizontal\n each having a value of \n'auto', 'top', 'bottom'\n for \nvertical\n and \n'auto', 'left', 'right'\n for \nhorizontal\n which defines where the dropdown with the widget will appear relative to the input element the component is attached to.\n\n\n'auto'\n is the default value for both \nhorizontal\n and \nvertical\n keys and it tries to automatically place the dropdown in a position that is visible to the user. Usually you should not override those options unless you have a special need in your layout.\n\n\n\n\nwidgetParent\n\n\nDefault: null\nAccepts: string or jQuery object\n\n\n\nOn picker show, places the widget at the identifier (string) or jQuery object \nif\n the element has css \nposition: 'relative'\n\n\nwidgetParent\n\n\nReturns a \n$(element)\n variable with the currently set \noptions.widgetParent\n option.\n\n\nwidgetParent, [widgetParent]\n\n\nTakes a \nstring\n or \n$(element)\n value.\n\n\n\n\nkeepOpen\n\n\nDefault: false\n\n\n\nWill cause the date picker to stay open after selecting a date.\n\n\nkeepOpen\n\n\nReturns a \nboolean\n variable with the currently set \noptions.keepOpen\n option.\n\n\nkeepOpen, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\n\n\ninline\n\n\nDefault: false\n\n\n\nWill display the picker inline without the need of a input field. This will also hide borders and shadows.\n\n\ninline\n\n\nReturns a \nboolean\n variable with the currently set \noptions.inline\n option.\n\n\ninline, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\n\n\nkeepInvalid\n\n\n4.7.14\n\n\nDefault: false\n\n\n\nWill cause the date picker to \nnot\n revert or overwrite invalid dates.\n\n\nkeepInvalid\n\n\nReturns a \nstring\n variable with the currently set \noptions.keepInvalid\n option.\n\n\nkeepInvalid, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\nIf \ntrue\n, invalid dates will not be reverted to a previous selection or changed.\n\n\n\n\nkeyBinds\n\n\nDefault: up: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(7, 'd'));\n } else {\n this.date(this.date().clone().add(1, 'm'));\n }\n },\n down: function (widget) {\n if (!widget) {\n this.show();\n }\n else if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(7, 'd'));\n } else {\n this.date(this.date().clone().subtract(1, 'm'));\n }\n },\n 'control up': function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'y'));\n } else {\n this.date(this.date().clone().add(1, 'h'));\n }\n },\n 'control down': function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'y'));\n } else {\n this.date(this.date().clone().subtract(1, 'h'));\n }\n },\n left: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'd'));\n }\n },\n right: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'd'));\n }\n },\n pageUp: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'M'));\n }\n },\n pageDown: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'M'));\n }\n },\n enter: function () {\n this.hide();\n },\n escape: function () {\n this.hide();\n },\n 'control space': function (widget) {\n if (widget.find('.timepicker').is(':visible')) {\n widget.find('.btn[data-action=\"togglePeriod\"]').click();\n }\n },\n t: function () {\n this.date(moment());\n },\n 'delete': function () {\n this.clear();\n }\n\n\n\nAllows for custom events to fire on keyboard press.\n\n\nkeyBinds\n\n\nReturns a \nstring\n variable with the currently set \noptions.keyBinds\n option.\n\n\nkeyBinds, [object]\n\n\nTakes an \nobject\n value.\n\n\nAllows for several \nkeyBinding\n functions to be specified for ease of access or accessibility. See the options page for defaults.\n\n\n\n\ndebug\n\n\nDefault: false\n\n\n\nWill cause the date picker to stay open after a \nblur\n event.\n\n\n\n\nignoreReadonly\n\n\nDefault: false\n\n\n\nAllow date picker show event to fire even when the associated input element has the \nreadonly=\"readonly\"\n property.\n\n\nignoreReadonly\n\n\nReturns a \nboolean\n variable with the currently set \noptions.ignoreReadonly\n option.\n\n\nignoreReadonly, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\nSet this to \ntrue\n to allow the picker to be used even if the input field is \nreadonly\n. This will \nnot\n bypass the \ndisabled\n property\n\n\n\n\ndisabledTimeIntervals\n\n\nDefault: false\n\n\n\nDisables time selection between the given \nmoments\n.\n\n\ndisabledTimeIntervals\n\n\nReturns an \narray\n variable with the currently set \noptions.disabledTimeIntervals\n option.\n\n\ndisabledTimeIntervals, [array]\n\n\nTakes a \narray\n value.\n\n\nThe array \nmust\n be in the following format \n[moment(),moment()]\n\n\nFor example:\n\n\ndisabledTimeIntervals: [[moment({ h: 0 }), moment({ h: 8 })], [moment({ h: 18 }), moment({ h: 24 })]]\n\n\n\nWill disable times between 12-8am and 6-12pm today\n\n\n\n\nallowInputToggle\n\n\nDefault: false\n\n\n\nIf \ntrue\n, the picker will show on textbox focus and icon click when used in a button group.\n\n\nallowInputToggle\n\n\nReturns a \nboolean\n variable with the currently set \noptions.allowInputToggle\n option.\n\n\nallowInputToggle, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\nIf \ntrue\n, the picker will show on textbox focus and icon click when used in a button group\n\n\n\n\nfocusOnShow\n\n\nDefault: true\n\n\n\nIf \nfalse\n, the textbox will not be given focus when the picker is shown.\n\n\nfocusOnShow\n\n\nReturns a \nboolean\n variable with the currently set \noptions.focusOnShow\n option.\n\n\nfocusOnShow, [boolean]\n\n\nTakes a \nboolean\n value.\n\n\nIf \nfalse\n, the textbox will not be given focus when the picker is shown\n\n\n\n\nen/disabledHours\n\n\nDefault: false\n\n\n\ndisabledHours\n\n\nReturns an \narray\n variable with the currently set \noptions.en/disabledHours\n option.\n\n\ndisabledHours, boolean\n\n\nTakes a \narray\n value.\n\n\nMust be in 24 hour format. Will allow or disallow hour selections (much like \ndisabledTimeIntervals\n) but will affect all days.\n\n\nLike \nen/disabledDates\n, these options are mutually exclusive and will reset one of the options back to false.\n\n\ndisabledHours: [0, 1, 2, 3, 4, 5, 6, 7, 8, 18, 19, 20, 21, 22, 23, 24]\nenabledHours: [9, 10, 11, 12, 13, 14, 15, 16]\n\n\n\n\n\nviewDate\n\n\nDefault: false\n\n\n\nThis will change the \nviewDate\n without changing or setting the selected date.\n\n\n\n\nparseInputDate\n\n\nparseInputDate\n\n\nReturns a \nfunction\n with the currently set \noptions.parseInputDate\n\n\nparseInputDate, [function]\n\n\nTakes a \nfunction\n\n\nAllows custom input formatting For example: the user can enter 'yesterday' or '30 days ago.\n\n\nExample:\n\n\nvar parseRelativeDate = function(relativeDate) {\n\n switch (relativeDate) {\n case 'today':\n return moment()\n case 'yesterday':\n return moment().subtract(1, 'day');\n default:\n return moment()\n .subtract(Number(relativeDate.replace(\ndays ago\n, \n).trim()), 'days');\n }\n}\n\nvar parseInputDate = function(inputDate) {\n var relativeDatePattern = /today|yesterday|[0-9]+\\s+(days ago)/,\n resultDate;\n\n if (moment.isMoment(inputDate) || inputDate instanceof Date) {\n resultDate = moment(inputDate);\n } else {\n var relativeDate = inputDate.match(relativeDatePattern),\n parseDate = null;\n\n if (relativeDate !== null) \n parseDate = this.parseRelativeDate(inputDate.match(relativeDatePattern)[0]);\n else \n parseDate = moment();\n\n resultDate = moment(parseDate, \nYYYY-MM-DD\n);\n }\n\n return resultDate;\n}\n\n\n\n\n\n\ntooltips\n\n\ntooltips: {\n today: 'Go to today',\n clear: 'Clear selection',\n close: 'Close the picker',\n selectMonth: 'Select Month',\n prevMonth: 'Previous Month',\n nextMonth: 'Next Month',\n selectYear: 'Select Year',\n prevYear: 'Previous Year',\n nextYear: 'Next Year',\n selectDecade: 'Select Decade',\n prevDecade: 'Previous Decade',\n nextDecade: 'Next Decade',\n prevCentury: 'Previous Century',\n nextCentury: 'Next Century'\n}\n\n\n\n\nThis will change the \ntooltips\n over each icon to a custom string.\n\n\ntooltips\n\n\nReturns an \nOjbect\n of \noptions.tooltips\n \n\n\ntooltips, [tooltips]\n\n\nTakes an \nOjbect\n of \nstrings\n.\n\n\nThrows\n\n\n\n\nTypeError\n - if \ntooltips\n parameter is not an \nOjbect\n\n\n\n\n\n\ntimeZone\n\n\ntimeZone: ''\n\n\n\nAllows the setting of the Time Zone. You must include \nmoment-timezone.js\n and \nmoment-timzone\n data. See moment timezone documentation for usage.\n\n\ntimeZone\n\n\nReturns an \nstring\n of \noptions.timeZone\n \n\n\ntimeZone, [timeZone]\n\n\nTakes an \nstring\n of a valid timezone.\n\n\nThrows\n\n\n\n\nTypeError\n - if \ntooltips\n parameter is not an \nstring", + "title": "Options" + }, + { + "location": "/Options/#options", + "text": "Note \n All options are accessed via the data attribute e.g. $('#datetimepicker').datetimepicker(OPTION, ARGUMENT) \n\n **TODO** should I move some of this to the component?", + "title": "Options" + }, + { + "location": "/Options/#options_1", + "text": "Returns the components current options object. Note that the changing the values of the returned object does not change the components actual configuration. Use options(options) to set the components options massively or the other methods for setting config options individually.", + "title": "options" + }, + { + "location": "/Options/#options-options", + "text": "Takes an object variable with option key:value properties and configures the component. Use this to update multiple options on the component.", + "title": "options, [options]" + }, + { + "location": "/Options/#date", + "text": "Returns the component's model current date, a moment object or null if not set.", + "title": "date" + }, + { + "location": "/Options/#date-newdate", + "text": "Takes string, Date, moment, null parameter and sets the components model current moment to it. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.", + "title": "date, [newDate]" + }, + { + "location": "/Options/#throws", + "text": "TypeError - in case the newDate cannot be parsed", + "title": "Throws" + }, + { + "location": "/Options/#emits", + "text": "change.datetimepicker - In case newDate is different from current moment", + "title": "Emits" + }, + { + "location": "/Options/#format", + "text": "Default: false See momentjs' docs for valid formats. Format also dictates what components are shown, e.g. MM/dd/YYYY will not display the time picker.", + "title": "format" + }, + { + "location": "/Options/#format_1", + "text": "Returns the component's options.format string", + "title": "format" + }, + { + "location": "/Options/#format-format", + "text": "Takes a moment.js format string and sets the components options.format . This is used for displaying and also for parsing input strings either from the input element the component is attached to or the date() function.\nThe parameter can also be a boolean:false in which case the format is set to the locale's L LT . Note: this is also used to determine if the time picker sub component will display the hours in 12 or 24 format. (if a or h exists in the passed string then a 12 hour mode is set)", + "title": "format, [format]" + }, + { + "location": "/Options/#dayviewheaderformat", + "text": "Default: 'MMMM YYYY' Changes the heading of the date picker when in \"days\" view.", + "title": "dayViewHeaderFormat" + }, + { + "location": "/Options/#dayviewheaderformat_1", + "text": "Returns a string variable with the currently set options.dayViewHeaderFormat option.", + "title": "dayViewHeaderFormat" + }, + { + "location": "/Options/#dayviewheaderformat-string", + "text": "Takes a string value. Used to customize the header of the day view.", + "title": "dayViewHeaderFormat, [string]" + }, + { + "location": "/Options/#extraformats", + "text": "Default: false Allows for several input formats to be valid. See this PR .", + "title": "extraFormats" + }, + { + "location": "/Options/#extraformats_1", + "text": "Returns a boolean or array with the options.extraFormats option configuration", + "title": "extraFormats" + }, + { + "location": "/Options/#extraformats-formats", + "text": "Takes an array of valid input moment format options.", + "title": "extraFormats, [formats]" + }, + { + "location": "/Options/#stepping", + "text": "Default: 1 Number of minutes the up/down arrow's will move the minutes value in the time picker", + "title": "stepping" + }, + { + "location": "/Options/#stepping_1", + "text": "Returns a number with the options.stepping option configuration", + "title": "stepping" + }, + { + "location": "/Options/#stepping-number", + "text": "Takes a number . This be the amount the up/down arrows move the minute value with a time picker.", + "title": "stepping, [number]" + }, + { + "location": "/Options/#minmaxdate", + "text": "Default: false\nAccepts: date, moment, string Prevents date/time selections before this date. Will override defaultDate and useCurrent if either of these settings are the same day since both options are invalid according to the rules you've selected.", + "title": "min/maxDate" + }, + { + "location": "/Options/#mindate", + "text": "Returns the currently set moment of the options.minDate or false if not set", + "title": "minDate" + }, + { + "location": "/Options/#mindate-mindate", + "text": "Takes a minDate string, Date, moment, boolean:false parameter and disallows the user to select a moment that is before that moment. If a boolean:false value is passed the options.minDate parameter is cleared and there is no restriction to the minimum moment the user can select. Note: If the minDate parameter is after the currently selected moment the currently selected moment changes to minDate parameter", + "title": "minDate, [minDate]" + }, + { + "location": "/Options/#throws_1", + "text": "TypeError - if minDate parameter cannot be parsed using the options.format and options.useStrict configuration settings TypeError - if minDate parameter is after options.maxDate", + "title": "Throws" + }, + { + "location": "/Options/#emits_1", + "text": "change.datetimepicker - if the new minDate is after currently selected moment (waiting for #472 to close in order to finalize this part) dp.error - if the new minDate is after currently selected moment (waiting for #472 to close in order to finalize this part)", + "title": "Emits" + }, + { + "location": "/Options/#maxdate", + "text": "Returns the currently set moment of the options.maxDate or false if not set", + "title": "maxDate" + }, + { + "location": "/Options/#maxdate-maxdate", + "text": "Takes a [maxDate] string, Date, moment, boolean:false parameter and disallows the user to select a moment that is after that moment. If a boolean:false value is passed options.maxDate is cleared and there is no restriction to the maximum moment the user can select. Note: If [maxDate] is before the currently selected moment the currently selected moment changes to [maxDate]", + "title": "maxDate, [maxDate]" + }, + { + "location": "/Options/#throws_2", + "text": "TypeError - if maxDate parameter cannot be parsed using the options.format and options.useStrict configuration settings TypeError - if maxDate parameter is before options.minDate", + "title": "Throws" + }, + { + "location": "/Options/#emits_2", + "text": "change.datetimepicker - if the new maxDate is after currently selected moment (waiting for #472 to close in order to finalize this part) dp.error - if the new maxDate is after currently selected moment (waiting for #472 to close in order to finalize this part)", + "title": "Emits" + }, + { + "location": "/Options/#usecurrent", + "text": "Default: true On show , will set the picker to the current date/time.", + "title": "useCurrent" + }, + { + "location": "/Options/#usecurrent_1", + "text": "Returns a boolean or string with the options.useCurrent option configuration", + "title": "useCurrent" + }, + { + "location": "/Options/#usecurrent-boolean-or-string", + "text": "Takes a boolean or string . If a boolean true is passed and the components model moment is not set (either through setDate or through a valid value on the input element the component is attached to) then the first time the user opens the datetimepicker widget the value is initialized to the current moment of the action. If a false boolean is passed then no initialization happens on the input element. You can select the granularity on the initialized moment by passing one of the following strings ( 'year', 'month', 'day', 'hour', 'minute' ) in the variable. If for example you pass 'day' to the setUseCurrent function and the input field is empty the first time the user opens the datetimepicker widget the input text will be initialized to the current date time with day granularity (e.g. if current time = 2014-08-10 13:32:33 the input value will be initialized to 2014-08-10 00:00:00 ) Note: If the options.defaultDate is set or the input element the component is attached to has already a value that takes precedence and the functionality of useCurrent is not triggered!", + "title": "useCurrent, boolean or string" + }, + { + "location": "/Options/#collapse", + "text": "Default: true Using a Bootstraps collapse to switch between date/time pickers.", + "title": "collapse" + }, + { + "location": "/Options/#collapse_1", + "text": "Returns a boolean of the options.sideBySide .", + "title": "collapse" + }, + { + "location": "/Options/#collapse-collapse", + "text": "Takes a boolean . If set to false the picker will display similar to sideBySide except vertical.", + "title": "collapse, [collapse]" + }, + { + "location": "/Options/#locale", + "text": "Default: moment.locale()\nAccepts: string, moment.local('locale') See momentjs for valid locales. You must include moment-with-locales.js or a local js file.", + "title": "locale" + }, + { + "location": "/Options/#locale_1", + "text": "Returns the currently set locale of the options.locale", + "title": "locale" + }, + { + "location": "/Options/#locale-newlocale", + "text": "Takes a string of any valid moment locale e.g. de for German.", + "title": "locale, [newLocale]" + }, + { + "location": "/Options/#throws_3", + "text": "TypeError - if the locale is not loaded via a separate script or moment-with-locales", + "title": "Throws" + }, + { + "location": "/Options/#defaultdate", + "text": "Default: false\nAccepts: date, moment, string Sets the picker default date/time. Overrides useCurrent", + "title": "defaultDate" + }, + { + "location": "/Options/#defaultdate_1", + "text": "Returns a moment with the options.defaultDate option configuration or false if not set", + "title": "defaultDate" + }, + { + "location": "/Options/#defaultdate-defaultdate", + "text": "Takes a string, Date, moment, boolean:false . Will set the picker's initial date. If a boolean:false value is passed the options.defaultDate parameter is cleared. TypeError - if the provided date pass validation, including disabledDates , enabledDates , minDate , maxDate , and daysOfWeekDisabled TypeError - if the provided date cannot be parsed by moment.js", + "title": "defaultDate, [defaultDate]" + }, + { + "location": "/Options/#endisableddates", + "text": "Default: false\nAccepts: array of [date, moment, string]", + "title": "en/disabledDates" + }, + { + "location": "/Options/#disableddates", + "text": "Returns an array with the currently set disabled dates on the component.", + "title": "disabledDates" + }, + { + "location": "/Options/#disableddates-dates", + "text": "Takes an [ string or Date or moment ] of values and disallows the user to select those days. Setting this takes precedence over options.minDate , options.maxDate configuration. Also calling this function removes the configuration of options.enabledDates if such exist. Note: These values are matched with Day granularity.", + "title": "disabledDates, [dates]" + }, + { + "location": "/Options/#enableddates", + "text": "Returns an array with the currently set enabled dates on the component.", + "title": "enabledDates" + }, + { + "location": "/Options/#enableddates-dates", + "text": "Takes an [ string or Date or moment ] of values and allows the user to select only from those days. Setting this takes precedence over options.minDate , options.maxDate configuration. Also calling this function removes the configuration of options.disabledDates if such exist. Note: These values are matched with Day granularity.", + "title": "enabledDates, [dates]" + }, + { + "location": "/Options/#icons", + "text": "Default: {\n time: 'glyphicon glyphicon-time',\n date: 'glyphicon glyphicon-calendar',\n up: 'glyphicon glyphicon-chevron-up',\n down: 'glyphicon glyphicon-chevron-down',\n previous: 'glyphicon glyphicon-chevron-left',\n next: 'glyphicon glyphicon-chevron-right',\n today: 'glyphicon glyphicon-screenshot',\n clear: 'glyphicon glyphicon-trash',\n close: 'glyphicon glyphicon-remove'\n }\nAccepts: object with all or some of the parameters above Change the default icons for the pickers functions.", + "title": "icons" + }, + { + "location": "/Options/#icons_1", + "text": "Returns an Ojbect of options.icons", + "title": "icons" + }, + { + "location": "/Options/#icons-icons", + "text": "Takes an Ojbect of strings .", + "title": "icons, [icons]" + }, + { + "location": "/Options/#throws_4", + "text": "TypeError - if icons parameter is not an Ojbect", + "title": "Throws" + }, + { + "location": "/Options/#usestrict", + "text": "Default: false Defines if moment should use strict date parsing when considering a date to be valid.", + "title": "useStrict" + }, + { + "location": "/Options/#usestrict_1", + "text": "Returns a boolean of the options.useStrict", + "title": "useStrict" + }, + { + "location": "/Options/#usestrict-usestrict", + "text": "Takes a boolean . If useStrict is true , moment.js parsing rules will be stricter when determining if a date is valid or not.", + "title": "useStrict, [useStrict]" + }, + { + "location": "/Options/#sidebyside", + "text": "Default: false Shows the picker side by side when using the time and date together.", + "title": "sideBySide" + }, + { + "location": "/Options/#sidebyside_1", + "text": "Returns a boolean of the options.sideBySide .", + "title": "sideBySide" + }, + { + "location": "/Options/#sidebyside-sidebyside", + "text": "Takes a boolean . If sideBySide is true and the time picker is used, both components will display side by side instead of collapsing.", + "title": "sideBySide, [sideBySide]" + }, + { + "location": "/Options/#daysofweekdisabled", + "text": "Default: []\nAccepts: array of numbers from 0-6 Disables the section of days of the week, e.g. weekends.", + "title": "daysOfWeekDisabled" + }, + { + "location": "/Options/#daysofweekdisabled_1", + "text": "Returns an array with the options.daysOfWeekDisabled configuration setting of the component.", + "title": "daysOfWeekDisabled" + }, + { + "location": "/Options/#daysofweekdisabled-daysofweek", + "text": "Takes an [ Number : 0 to 6 ] and disallow the user to select weekdays that exist in this array. This has lower priority over the options.minDate , options.maxDate , options.disabledDates and options.enabledDates configuration settings.", + "title": "daysOfWeekDisabled, [daysOfWeek]" + }, + { + "location": "/Options/#emits_3", + "text": "change.datetimepicker - if the currently selected moment falls in the values passed on the daysOfWeek parameter. (waiting for #472 to close in order to finalize this part) dp.error - if the currently selected moment falls in the values passed on the daysOfWeek parameter. (waiting for #472 to close in order to finalize this part)", + "title": "Emits" + }, + { + "location": "/Options/#calendarweeks", + "text": "Default: false Shows the week of the year to the left of first day of the week.", + "title": "calendarWeeks" + }, + { + "location": "/Options/#calendarweeks_1", + "text": "Returns a boolean with the current options.calendarWeeks option configuration", + "title": "calendarWeeks" + }, + { + "location": "/Options/#calendarweeks-boolean", + "text": "Takes a boolean variable to set if the week numbers will appear to the left on the days view", + "title": "calendarWeeks, [boolean]" + }, + { + "location": "/Options/#viewmode", + "text": "Default: 'days'\nAccepts: 'decades','years','months','days' The default view to display when the picker is shown. Note : To limit the picker to selecting, for instance the year and month, use format: MM/YYYY .", + "title": "viewMode" + }, + { + "location": "/Options/#viewmode_1", + "text": "Returns a string of the options.viewMode .", + "title": "viewMode" + }, + { + "location": "/Options/#viewmode-newviewmode", + "text": "Takes a string . Valid values are 'days' , 'months' , 'years' and 'decades'", + "title": "viewMode, [newViewMode]" + }, + { + "location": "/Options/#throws_5", + "text": "TypeError - if newViewMode parameter is not an a string or if newViewMode is not a valid value.", + "title": "Throws" + }, + { + "location": "/Options/#toolbarplacement", + "text": "Default: 'default'\nAccepts: 'default', 'top', 'bottom' Changes the placement of the icon toolbar.", + "title": "toolbarPlacement" + }, + { + "location": "/Options/#toolbarplacement_1", + "text": "Returns a string variable with the currently set options.toolbarplacement option.", + "title": "toolbarplacement" + }, + { + "location": "/Options/#toolbarplacement-string", + "text": "Takes a string value. Valid values are 'default' , 'top' and 'bottom' . Changes the placement of the toolbar where the today, clear, component switch icon are located.", + "title": "toolbarplacement, [string]" + }, + { + "location": "/Options/#buttons", + "text": "Default: {\n showToday: false,\n showClear: false,\n showClose: false\n }\nAccepts: object with all or some of the parameters above Change the default toolbar buttons for the pickers functions.", + "title": "buttons" + }, + { + "location": "/Options/#buttons_1", + "text": "Returns an Ojbect of options.buttons", + "title": "buttons" + }, + { + "location": "/Options/#buttons-buttons", + "text": "Takes an Ojbect of boolean .", + "title": "buttons, [buttons]" + }, + { + "location": "/Options/#throws_6", + "text": "TypeError - if buttons parameter is not an Ojbect", + "title": "Throws" + }, + { + "location": "/Options/#widgetpositioning", + "text": "Default: {\n horizontal: 'auto'\n vertical: 'auto'\n }\nAccepts: object with the all or one of the parameters above\n horizontal: 'auto', 'left', 'right'\n vertical: 'auto', 'top', 'bottom'", + "title": "widgetPositioning" + }, + { + "location": "/Options/#widgetpositioning_1", + "text": "Returns the currently set options.widgetPositioning object containing two keys horizontal and vertical", + "title": "widgetPositioning" + }, + { + "location": "/Options/#widgetpositioning-positioningobject", + "text": "Takes an object parameter that can contain two keys vertical and horizontal each having a value of 'auto', 'top', 'bottom' for vertical and 'auto', 'left', 'right' for horizontal which defines where the dropdown with the widget will appear relative to the input element the component is attached to. 'auto' is the default value for both horizontal and vertical keys and it tries to automatically place the dropdown in a position that is visible to the user. Usually you should not override those options unless you have a special need in your layout.", + "title": "widgetPositioning, [positioningObject]" + }, + { + "location": "/Options/#widgetparent", + "text": "Default: null\nAccepts: string or jQuery object On picker show, places the widget at the identifier (string) or jQuery object if the element has css position: 'relative'", + "title": "widgetParent" + }, + { + "location": "/Options/#widgetparent_1", + "text": "Returns a $(element) variable with the currently set options.widgetParent option.", + "title": "widgetParent" + }, + { + "location": "/Options/#widgetparent-widgetparent", + "text": "Takes a string or $(element) value.", + "title": "widgetParent, [widgetParent]" + }, + { + "location": "/Options/#keepopen", + "text": "Default: false Will cause the date picker to stay open after selecting a date.", + "title": "keepOpen" + }, + { + "location": "/Options/#keepopen_1", + "text": "Returns a boolean variable with the currently set options.keepOpen option.", + "title": "keepOpen" + }, + { + "location": "/Options/#keepopen-boolean", + "text": "Takes a boolean value.", + "title": "keepOpen, [boolean]" + }, + { + "location": "/Options/#inline", + "text": "Default: false Will display the picker inline without the need of a input field. This will also hide borders and shadows.", + "title": "inline" + }, + { + "location": "/Options/#inline_1", + "text": "Returns a boolean variable with the currently set options.inline option.", + "title": "inline" + }, + { + "location": "/Options/#inline-boolean", + "text": "Takes a boolean value.", + "title": "inline, [boolean]" + }, + { + "location": "/Options/#keepinvalid", + "text": "4.7.14 Default: false Will cause the date picker to not revert or overwrite invalid dates.", + "title": "keepInvalid" + }, + { + "location": "/Options/#keepinvalid_1", + "text": "Returns a string variable with the currently set options.keepInvalid option.", + "title": "keepInvalid" + }, + { + "location": "/Options/#keepinvalid-boolean", + "text": "Takes a boolean value. If true , invalid dates will not be reverted to a previous selection or changed.", + "title": "keepInvalid, [boolean]" + }, + { + "location": "/Options/#keybinds", + "text": "Default: up: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(7, 'd'));\n } else {\n this.date(this.date().clone().add(1, 'm'));\n }\n },\n down: function (widget) {\n if (!widget) {\n this.show();\n }\n else if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(7, 'd'));\n } else {\n this.date(this.date().clone().subtract(1, 'm'));\n }\n },\n 'control up': function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'y'));\n } else {\n this.date(this.date().clone().add(1, 'h'));\n }\n },\n 'control down': function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'y'));\n } else {\n this.date(this.date().clone().subtract(1, 'h'));\n }\n },\n left: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'd'));\n }\n },\n right: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'd'));\n }\n },\n pageUp: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().subtract(1, 'M'));\n }\n },\n pageDown: function (widget) {\n if (widget.find('.datepicker').is(':visible')) {\n this.date(this.date().clone().add(1, 'M'));\n }\n },\n enter: function () {\n this.hide();\n },\n escape: function () {\n this.hide();\n },\n 'control space': function (widget) {\n if (widget.find('.timepicker').is(':visible')) {\n widget.find('.btn[data-action=\"togglePeriod\"]').click();\n }\n },\n t: function () {\n this.date(moment());\n },\n 'delete': function () {\n this.clear();\n } Allows for custom events to fire on keyboard press.", + "title": "keyBinds" + }, + { + "location": "/Options/#keybinds_1", + "text": "Returns a string variable with the currently set options.keyBinds option.", + "title": "keyBinds" + }, + { + "location": "/Options/#keybinds-object", + "text": "Takes an object value. Allows for several keyBinding functions to be specified for ease of access or accessibility. See the options page for defaults.", + "title": "keyBinds, [object]" + }, + { + "location": "/Options/#debug", + "text": "Default: false Will cause the date picker to stay open after a blur event.", + "title": "debug" + }, + { + "location": "/Options/#ignorereadonly", + "text": "Default: false Allow date picker show event to fire even when the associated input element has the readonly=\"readonly\" property.", + "title": "ignoreReadonly" + }, + { + "location": "/Options/#ignorereadonly_1", + "text": "Returns a boolean variable with the currently set options.ignoreReadonly option.", + "title": "ignoreReadonly" + }, + { + "location": "/Options/#ignorereadonly-boolean", + "text": "Takes a boolean value. Set this to true to allow the picker to be used even if the input field is readonly . This will not bypass the disabled property", + "title": "ignoreReadonly, [boolean]" + }, + { + "location": "/Options/#disabledtimeintervals", + "text": "Default: false Disables time selection between the given moments .", + "title": "disabledTimeIntervals" + }, + { + "location": "/Options/#disabledtimeintervals_1", + "text": "Returns an array variable with the currently set options.disabledTimeIntervals option.", + "title": "disabledTimeIntervals" + }, + { + "location": "/Options/#disabledtimeintervals-array", + "text": "Takes a array value. The array must be in the following format [moment(),moment()] For example: disabledTimeIntervals: [[moment({ h: 0 }), moment({ h: 8 })], [moment({ h: 18 }), moment({ h: 24 })]] Will disable times between 12-8am and 6-12pm today", + "title": "disabledTimeIntervals, [array]" + }, + { + "location": "/Options/#allowinputtoggle", + "text": "Default: false If true , the picker will show on textbox focus and icon click when used in a button group.", + "title": "allowInputToggle" + }, + { + "location": "/Options/#allowinputtoggle_1", + "text": "Returns a boolean variable with the currently set options.allowInputToggle option.", + "title": "allowInputToggle" + }, + { + "location": "/Options/#allowinputtoggle-boolean", + "text": "Takes a boolean value. If true , the picker will show on textbox focus and icon click when used in a button group", + "title": "allowInputToggle, [boolean]" + }, + { + "location": "/Options/#focusonshow", + "text": "Default: true If false , the textbox will not be given focus when the picker is shown.", + "title": "focusOnShow" + }, + { + "location": "/Options/#focusonshow_1", + "text": "Returns a boolean variable with the currently set options.focusOnShow option.", + "title": "focusOnShow" + }, + { + "location": "/Options/#focusonshow-boolean", + "text": "Takes a boolean value. If false , the textbox will not be given focus when the picker is shown", + "title": "focusOnShow, [boolean]" + }, + { + "location": "/Options/#endisabledhours", + "text": "Default: false", + "title": "en/disabledHours" + }, + { + "location": "/Options/#disabledhours", + "text": "Returns an array variable with the currently set options.en/disabledHours option.", + "title": "disabledHours" + }, + { + "location": "/Options/#disabledhours-boolean", + "text": "Takes a array value. Must be in 24 hour format. Will allow or disallow hour selections (much like disabledTimeIntervals ) but will affect all days. Like en/disabledDates , these options are mutually exclusive and will reset one of the options back to false. disabledHours: [0, 1, 2, 3, 4, 5, 6, 7, 8, 18, 19, 20, 21, 22, 23, 24]\nenabledHours: [9, 10, 11, 12, 13, 14, 15, 16]", + "title": "disabledHours, boolean" + }, + { + "location": "/Options/#viewdate", + "text": "Default: false This will change the viewDate without changing or setting the selected date.", + "title": "viewDate" + }, + { + "location": "/Options/#parseinputdate", + "text": "", + "title": "parseInputDate" + }, + { + "location": "/Options/#parseinputdate_1", + "text": "Returns a function with the currently set options.parseInputDate", + "title": "parseInputDate" + }, + { + "location": "/Options/#parseinputdate-function", + "text": "Takes a function Allows custom input formatting For example: the user can enter 'yesterday' or '30 days ago. Example: var parseRelativeDate = function(relativeDate) {\n\n switch (relativeDate) {\n case 'today':\n return moment()\n case 'yesterday':\n return moment().subtract(1, 'day');\n default:\n return moment()\n .subtract(Number(relativeDate.replace( days ago , ).trim()), 'days');\n }\n}\n\nvar parseInputDate = function(inputDate) {\n var relativeDatePattern = /today|yesterday|[0-9]+\\s+(days ago)/,\n resultDate;\n\n if (moment.isMoment(inputDate) || inputDate instanceof Date) {\n resultDate = moment(inputDate);\n } else {\n var relativeDate = inputDate.match(relativeDatePattern),\n parseDate = null;\n\n if (relativeDate !== null) \n parseDate = this.parseRelativeDate(inputDate.match(relativeDatePattern)[0]);\n else \n parseDate = moment();\n\n resultDate = moment(parseDate, YYYY-MM-DD );\n }\n\n return resultDate;\n}", + "title": "parseInputDate, [function]" + }, + { + "location": "/Options/#tooltips", + "text": "tooltips: {\n today: 'Go to today',\n clear: 'Clear selection',\n close: 'Close the picker',\n selectMonth: 'Select Month',\n prevMonth: 'Previous Month',\n nextMonth: 'Next Month',\n selectYear: 'Select Year',\n prevYear: 'Previous Year',\n nextYear: 'Next Year',\n selectDecade: 'Select Decade',\n prevDecade: 'Previous Decade',\n nextDecade: 'Next Decade',\n prevCentury: 'Previous Century',\n nextCentury: 'Next Century'\n} This will change the tooltips over each icon to a custom string.", + "title": "tooltips" + }, + { + "location": "/Options/#tooltips_1", + "text": "Returns an Ojbect of options.tooltips", + "title": "tooltips" + }, + { + "location": "/Options/#tooltips-tooltips", + "text": "Takes an Ojbect of strings .", + "title": "tooltips, [tooltips]" + }, + { + "location": "/Options/#throws_7", + "text": "TypeError - if tooltips parameter is not an Ojbect", + "title": "Throws" + }, + { + "location": "/Options/#timezone", + "text": "timeZone: '' Allows the setting of the Time Zone. You must include moment-timezone.js and moment-timzone data. See moment timezone documentation for usage.", + "title": "timeZone" + }, + { + "location": "/Options/#timezone_1", + "text": "Returns an string of options.timeZone", + "title": "timeZone" + }, + { + "location": "/Options/#timezone-timezone", + "text": "Takes an string of a valid timezone.", + "title": "timeZone, [timeZone]" + }, + { + "location": "/Options/#throws_8", + "text": "TypeError - if tooltips parameter is not an string", + "title": "Throws" + }, + { + "location": "/Events/", + "text": "Events\n\n\nhide.datetimepicker\n\n\nFired when the widget is hidden.\n\n\nParameters:\n\n\ne = {\n date //the currently set date. Type: moment object (clone)\n}\n\n\n\n\nEmitted from:\n\n\n\n\ntoggle()\n\n\nhide()\n\n\ndisable()\n\n\n\n\n\n\nshow.datetimepicker\n\n\nFired when the widget is shown.\n\n\nParameters:\n\n\nNo parameters are include, listen to \nchange.datetimepicker\n instead\n\n\nEmitted from:\n\n\n\n\ntoggle()\n\n\nshow()\n\n\n\n\n\n\nchange.datetimepicker\n\n\nFired when the date is changed, including when changed to a non-date (e.g. When keepInvalid=true).\n\n\nParameters:\n\n\ne = {\n date, //date the picker changed to. Type: moment object (clone)\n oldDate //previous date. Type: moment object (clone) or false in the event of a null\n}\n\n\n\n\nEmitted from:\n\n\n\n\ntoggle() \nNote\n: Only fired when using \nuseCurrent\n\n\nshow() \nNote\n: Only fired when using \nuseCurrent\n or when or the date is changed to comply with date rules (min/max etc)\n\n\ndate(newDate)\n\n\nminDate(minDate)\n\n\nmaxDate(maxDate)\n\n\ndaysOfWeekDisabled()\n\n\n\n\n\n\nerror.datetimepicker\n\n\nFired when a selected date fails to pass validation.\n\n\nParameters:\n\n\ne = {\n date //the invalid date. Type: moment object (clone)\n oldDate //previous date. Type: moment object (clone) or false in the event of a null\n}\n\n\n\n\nEmmited from:\n\n\n\n\nminDate(minDate)\n\n\nmaxDate(maxDate)\n\n\ndaysOfWeekDisabled()\n\n\nsetValue() \nprivate function\n\n\n\n\n\n\nupdate.datetimepicker\n\n\nFired (in most cases) when the \nviewDate\n changes. E.g. Next and Previous buttons, selecting a year.\n\n\nParameters:\n\n\ne = {\n change, //Change type as a momentjs format token. Type: string e.g. yyyy on year change\n viewDate //new viewDate. Type: moment object\n}", + "title": "Events" + }, + { + "location": "/Events/#events", + "text": "", + "title": "Events" + }, + { + "location": "/Events/#hidedatetimepicker", + "text": "Fired when the widget is hidden. Parameters: e = {\n date //the currently set date. Type: moment object (clone)\n} Emitted from: toggle() hide() disable()", + "title": "hide.datetimepicker" + }, + { + "location": "/Events/#showdatetimepicker", + "text": "Fired when the widget is shown. Parameters: No parameters are include, listen to change.datetimepicker instead Emitted from: toggle() show()", + "title": "show.datetimepicker" + }, + { + "location": "/Events/#changedatetimepicker", + "text": "Fired when the date is changed, including when changed to a non-date (e.g. When keepInvalid=true). Parameters: e = {\n date, //date the picker changed to. Type: moment object (clone)\n oldDate //previous date. Type: moment object (clone) or false in the event of a null\n} Emitted from: toggle() Note : Only fired when using useCurrent show() Note : Only fired when using useCurrent or when or the date is changed to comply with date rules (min/max etc) date(newDate) minDate(minDate) maxDate(maxDate) daysOfWeekDisabled()", + "title": "change.datetimepicker" + }, + { + "location": "/Events/#errordatetimepicker", + "text": "Fired when a selected date fails to pass validation. Parameters: e = {\n date //the invalid date. Type: moment object (clone)\n oldDate //previous date. Type: moment object (clone) or false in the event of a null\n} Emmited from: minDate(minDate) maxDate(maxDate) daysOfWeekDisabled() setValue() private function", + "title": "error.datetimepicker" + }, + { + "location": "/Events/#updatedatetimepicker", + "text": "Fired (in most cases) when the viewDate changes. E.g. Next and Previous buttons, selecting a year. Parameters: e = {\n change, //Change type as a momentjs format token. Type: string e.g. yyyy on year change\n viewDate //new viewDate. Type: moment object\n}", + "title": "update.datetimepicker" + }, + { + "location": "/Changelog/", + "text": "Version 5\n\n\n5.0.0-alpha\n\n\nNew Features\n\n\n\n\nES6 rewrite\n\n\nStripped UI/UX related code and shunted it into its own module\n\n\nMore configuration based setup\n\n\nBootstrap 4-esk plugin creation style\n\n\nAll events are namespaced properly \n{event}.datetimepicker\n\n\nAdded a jquery no conflict option\n\n\n\n\nOther changes\n\n\n\n\nmoved \nshowTodayButton\n, \nshowClear\n and \nshowClose\n into \noptions.buttons", + "title": "Change Log" + }, + { + "location": "/Changelog/#version-5", + "text": "", + "title": "Version 5" + }, + { + "location": "/Changelog/#500-alpha", + "text": "", + "title": "5.0.0-alpha" + }, + { + "location": "/Changelog/#new-features", + "text": "ES6 rewrite Stripped UI/UX related code and shunted it into its own module More configuration based setup Bootstrap 4-esk plugin creation style All events are namespaced properly {event}.datetimepicker Added a jquery no conflict option", + "title": "New Features" + }, + { + "location": "/Changelog/#other-changes", + "text": "moved showTodayButton , showClear and showClose into options.buttons", + "title": "Other changes" + }, + { + "location": "/ContributorsGuide/", + "text": "This guide is aimed to contributors wishing to understand the internals of the code in order to change/evolve the component. \n\n\nNote:\n this guide refers to \nversion 5\n which is currently in alpha and will be updated as we progress\n\n\nIntroduction\n\n\nThis component consists actually of 2 subcomponent UI widgets one for the date and one for the time selection process. The developers can configure which of those are needed and also the granularity that the component will allow the users to select a date/time. Developers also choose the format that the selected date/time will be displayed in the input field.\nThe component uses on \njQuery\n, \nmoment.js\n libraries.\n\n\nCode\n\n\nPrivate variables\n\n\n\n\n\n\nelement\n - Holds the DOM element this instance is attached to\n\n\n\n\n\n\noptions\n - Holds an object with the currently set options for the specific instance of the component. Don't directly change the properties of that object use the public API methods instead. DO NOT expose this object or its properties outside of the component.\n\n\n\n\n\n\ndate\n - Holds the moment object for the model value of the component. \nDON'T\n directly change this variable unless you \nREALLY\n know what you are doing. Use \nsetValue()\n function to set it. It handles all component logic for updating the model value and emitting all the appropriate events\n\n\n\n\n\n\nviewDate\n - Holds the currently selected value that the user has selected through the widget. This is not the model value this is the view value. Changing this usually requires a subsequent call to \nupdate()\n function\n\n\n\n\n\n\nunset\n - A \nboolean\n variable that holds whether the components model value is set or not. Model's value starts as \nunset = true\n and if is either set by the user or programmatically through the api to a valid value then it is set to \nfalse\n. If subsequent events lead to an invalid value then this variable is set to \ntrue\n again. Setting this variable usually takes place in the \nsetValue()\n function.\n\n\n\n\n\n\ninput\n - Hold the DOM input element this instance is attached to\n\n\n\n\n\n\ncomponent\n - Holds a reference to the .input-group DOM element that the widget is attached or false if it is attached directly on an input field\n\n\n\n\n\n\nwidget\n - Holds a reference to the DOM element containing the widget or \nfalse\n if the widget is hidden\n\n\n\n\n\n\nuse24hours\n - Holds whether the component uses 24 hours format or not. This is initialized on the \nformat()\n function\n\n\n\n\n\n\nminViewModeNumber\n - Holds the Numeric equivalent of the options.minViewMode parameter\n\n\n\n\n\n\nformat\n - Holds the current format string that is used for formatting the date model value. Note this is not the same thing as the \noptions.format\n as the second could be set to \nfalse\n in which case the first takes the locale's \nL\n or \nLT\n value\n\n\n\n\n\n\ncurrentViewMode\n - Hold the state of the current viewMode for the DatePicker subcomponent\n\n\n\n\n\n\ndatePickerModes\n - An array of objects with configuration parameters for the different views of the DatePicker subcomponent\n\n\n\n\n\n\nviewModes\n - An array of strings containing all the possible strings that \noptions.viewMode\n can take through \nviewMode()\n public api function\n\n\n\n\n\n\ndirectionModes\n - An array of strings containing all the possible strings that \noptions.direction\n can take through \ndirection()\n public api function\n\n\n\n\n\n\norientationModes\n - An array of strings containing all the possible strings that \noptions.orientation\n can take through \norientation()\n public api function\n\n\n\n\n\n\nPrivate functions\n\n\nEvents related\n\n\n\n\n\n\nnotifyEvent(e)\n - Use this function when you want to send en event to listener this could be used as a filter later\n\n\n\n\n\n\nstopEvent(e)\n - Shortcut for stopping propagation of events\n\n\n\n\n\n\nkeydown(e)\n - Function to trap \n\n\n\n\n\n\nchange(e)\n - Listener function to track change events occurring on the \ninput\n dom element the component is attached to\n\n\n\n\n\n\nattachDatePickerElementEvents()\n - Attaches listeners to the existing DOM elements the component is attached to. Called upon construction of each datetimepicker instance\n\n\n\n\n\n\ndetachDatePickerElementEvents()\n - Detaches listeners from the DOM element the component is attached to. Called on \ndestroy()\n\n\n\n\n\n\nattachDatePickerWidgetEvents()\n - Attaches listeners on the components widget. Called on \nshow()\n\n\n\n\n\n\ndetachDatePickerWidgetEvents()\n - Detaches listeners on the components widget. Called on \nhide()\n\n\n\n\n\n\nModel related\n\n\n\n\n\n\nsetValue(targetMoment)\n - Sets the model value of the component takes a moment object. An \nerror\n event will be emmited if the \ntargetMoment\n does not pass the configured validations. Otherwise the \ndate\n variable will be set and the relevant events will be fired.\n\n\n\n\n\n\nisValid(targetMoment, granularity)\n - returns \ntrue\n if the \ntargetMoment\n moment object is valid according to the components set validation rules (\nmin/maxDates\n, \ndisabled/enabledDates\n and \ndaysOfWeekDisabled\n). You may pass a second variable to check only up the the specific granularity \nyear, month, day, hour, minute, second\n\n\n\n\n\n\nUtilities\n\n\n\n\n\n\nindexGivenDates (givenDatesArray)\n - Function that takes the array from \nenabledDates()\n and \ndisabledDates()\n public functions and stores them as object keys to enable quick lookup\n\n\n\n\n\n\nisInEnableDates(date)\n - Checks whether if the given moment object exists in the \noptions.enabledDates\n object\n\n\n\n\n\n\nisInDisableDates(date)\n - Checks whether if the given moment object exists in the \noptions.disabledDates\n array\n\n\n\n\n\n\ndataToOptions()\n - Parses \ndata-date-*\n options set on the input dom element the component is attached to and returns an object with them\n\n\n\n\n\n\nisInFixed()\n - Checks if the dom element or its parents has a fixed position css rule.\n\n\n\n\n\n\nparseInputDate(date)\n - Parses a date parameter with moment using the component's \noptions.format\n and \noptions.useStrict\n. It returns a \nmoment\n object or false if \nparsedMoment#isValid()\n returns \nfalse\n. Use this to parse date inputs from outside the component (public API calls).\n\n\n\n\n\n\ninit()\n - Initializes the component. Called when the component instance is created", + "title": "Dev Guide" + }, + { + "location": "/ContributorsGuide/#introduction", + "text": "This component consists actually of 2 subcomponent UI widgets one for the date and one for the time selection process. The developers can configure which of those are needed and also the granularity that the component will allow the users to select a date/time. Developers also choose the format that the selected date/time will be displayed in the input field.\nThe component uses on jQuery , moment.js libraries.", + "title": "Introduction" + }, + { + "location": "/ContributorsGuide/#code", + "text": "", + "title": "Code" + }, + { + "location": "/ContributorsGuide/#private-variables", + "text": "element - Holds the DOM element this instance is attached to options - Holds an object with the currently set options for the specific instance of the component. Don't directly change the properties of that object use the public API methods instead. DO NOT expose this object or its properties outside of the component. date - Holds the moment object for the model value of the component. DON'T directly change this variable unless you REALLY know what you are doing. Use setValue() function to set it. It handles all component logic for updating the model value and emitting all the appropriate events viewDate - Holds the currently selected value that the user has selected through the widget. This is not the model value this is the view value. Changing this usually requires a subsequent call to update() function unset - A boolean variable that holds whether the components model value is set or not. Model's value starts as unset = true and if is either set by the user or programmatically through the api to a valid value then it is set to false . If subsequent events lead to an invalid value then this variable is set to true again. Setting this variable usually takes place in the setValue() function. input - Hold the DOM input element this instance is attached to component - Holds a reference to the .input-group DOM element that the widget is attached or false if it is attached directly on an input field widget - Holds a reference to the DOM element containing the widget or false if the widget is hidden use24hours - Holds whether the component uses 24 hours format or not. This is initialized on the format() function minViewModeNumber - Holds the Numeric equivalent of the options.minViewMode parameter format - Holds the current format string that is used for formatting the date model value. Note this is not the same thing as the options.format as the second could be set to false in which case the first takes the locale's L or LT value currentViewMode - Hold the state of the current viewMode for the DatePicker subcomponent datePickerModes - An array of objects with configuration parameters for the different views of the DatePicker subcomponent viewModes - An array of strings containing all the possible strings that options.viewMode can take through viewMode() public api function directionModes - An array of strings containing all the possible strings that options.direction can take through direction() public api function orientationModes - An array of strings containing all the possible strings that options.orientation can take through orientation() public api function", + "title": "Private variables" + }, + { + "location": "/ContributorsGuide/#private-functions", + "text": "", + "title": "Private functions" + }, + { + "location": "/ContributorsGuide/#events-related", + "text": "notifyEvent(e) - Use this function when you want to send en event to listener this could be used as a filter later stopEvent(e) - Shortcut for stopping propagation of events keydown(e) - Function to trap change(e) - Listener function to track change events occurring on the input dom element the component is attached to attachDatePickerElementEvents() - Attaches listeners to the existing DOM elements the component is attached to. Called upon construction of each datetimepicker instance detachDatePickerElementEvents() - Detaches listeners from the DOM element the component is attached to. Called on destroy() attachDatePickerWidgetEvents() - Attaches listeners on the components widget. Called on show() detachDatePickerWidgetEvents() - Detaches listeners on the components widget. Called on hide()", + "title": "Events related" + }, + { + "location": "/ContributorsGuide/#model-related", + "text": "setValue(targetMoment) - Sets the model value of the component takes a moment object. An error event will be emmited if the targetMoment does not pass the configured validations. Otherwise the date variable will be set and the relevant events will be fired. isValid(targetMoment, granularity) - returns true if the targetMoment moment object is valid according to the components set validation rules ( min/maxDates , disabled/enabledDates and daysOfWeekDisabled ). You may pass a second variable to check only up the the specific granularity year, month, day, hour, minute, second", + "title": "Model related" + }, + { + "location": "/ContributorsGuide/#utilities", + "text": "indexGivenDates (givenDatesArray) - Function that takes the array from enabledDates() and disabledDates() public functions and stores them as object keys to enable quick lookup isInEnableDates(date) - Checks whether if the given moment object exists in the options.enabledDates object isInDisableDates(date) - Checks whether if the given moment object exists in the options.disabledDates array dataToOptions() - Parses data-date-* options set on the input dom element the component is attached to and returns an object with them isInFixed() - Checks if the dom element or its parents has a fixed position css rule. parseInputDate(date) - Parses a date parameter with moment using the component's options.format and options.useStrict . It returns a moment object or false if parsedMoment#isValid() returns false . Use this to parse date inputs from outside the component (public API calls). init() - Initializes the component. Called when the component instance is created", + "title": "Utilities" + }, + { + "location": "/Extras/", + "text": "Extras\n\n\nGuides for making the picker work better with rails, IE, etc. \nNote:\n I have no idea if these guides still apply for v5 or not.\n\n\nRails 3\n\n\nby \ndhulihan\n\n\nYou can easily override the default rails form helpers (\ndate_select\n and \ndatetime_select\n) with bootstrap-datetimepicker for a much nicer experience. \n\n\n# Add to config/initializers/form.rb or the end of app/helpers/application_helper.rb\nmodule ActionView\n module Helpers\n class FormBuilder \n def date_select(method, options = {}, html_options = {})\n existing_date = @object.send(method) \n formatted_date = existing_date.to_date.strftime(\n%F\n) if existing_date.present?\n @template.content_tag(:div, :class =\n \ninput-group\n) do \n text_field(method, :value =\n formatted_date, :class =\n \nform-control datepicker\n, :\ndata-date-format\n =\n \nYYYY-MM-DD\n) +\n @template.content_tag(:span, @template.content_tag(:span, \n, :class =\n \nglyphicon glyphicon-calendar\n) ,:class =\n \ninput-group-addon\n)\n end\n end\n\n def datetime_select(method, options = {}, html_options = {})\n existing_time = @object.send(method) \n formatted_time = existing_time.to_time.strftime(\n%F %I:%M %p\n) if existing_time.present?\n @template.content_tag(:div, :class =\n \ninput-group\n) do \n text_field(method, :value =\n formatted_time, :class =\n \nform-control datetimepicker\n, :\ndata-date-format\n =\n \nYYYY-MM-DD hh:mm A\n) +\n @template.content_tag(:span, @template.content_tag(:span, \n, :class =\n \nglyphicon glyphicon-calendar\n) ,:class =\n \ninput-group-addon\n)\n end\n end\n end\n end\nend\n\n\n\n\nThe time format used here is ActiveRecord-friendly, which means it will be parsed correctly when passed in through \nparams\n to your record.\n\n\nThat's all there is to it! Now all of your forms that use \ndatetime_select\n or \ndate_select\n will be automatically updated:\n\n\n% form_for @post do |f| %\n\n \ndiv class=\nform-group\n\n \nlabel\nPublished At\n/label\n\n \n%= f.datetime_select :published_at %\n\n \n/div\n\n\n% end %", + "title": "Extras" + }, + { + "location": "/Extras/#extras", + "text": "Guides for making the picker work better with rails, IE, etc. Note: I have no idea if these guides still apply for v5 or not.", + "title": "Extras" + }, + { + "location": "/Extras/#rails-3", + "text": "by dhulihan You can easily override the default rails form helpers ( date_select and datetime_select ) with bootstrap-datetimepicker for a much nicer experience. # Add to config/initializers/form.rb or the end of app/helpers/application_helper.rb\nmodule ActionView\n module Helpers\n class FormBuilder \n def date_select(method, options = {}, html_options = {})\n existing_date = @object.send(method) \n formatted_date = existing_date.to_date.strftime( %F ) if existing_date.present?\n @template.content_tag(:div, :class = input-group ) do \n text_field(method, :value = formatted_date, :class = form-control datepicker , : data-date-format = YYYY-MM-DD ) +\n @template.content_tag(:span, @template.content_tag(:span, , :class = glyphicon glyphicon-calendar ) ,:class = input-group-addon )\n end\n end\n\n def datetime_select(method, options = {}, html_options = {})\n existing_time = @object.send(method) \n formatted_time = existing_time.to_time.strftime( %F %I:%M %p ) if existing_time.present?\n @template.content_tag(:div, :class = input-group ) do \n text_field(method, :value = formatted_time, :class = form-control datetimepicker , : data-date-format = YYYY-MM-DD hh:mm A ) +\n @template.content_tag(:span, @template.content_tag(:span, , :class = glyphicon glyphicon-calendar ) ,:class = input-group-addon )\n end\n end\n end\n end\nend The time format used here is ActiveRecord-friendly, which means it will be parsed correctly when passed in through params to your record. That's all there is to it! Now all of your forms that use datetime_select or date_select will be automatically updated: % form_for @post do |f| % \n div class= form-group \n label Published At /label \n %= f.datetime_select :published_at % \n /div % end %", + "title": "Rails 3" + }, + { + "location": "/FAQ/", + "text": "FAQs\n\n\nHow do I disable the date or time element\n\n\nHow do I format ...; How do I add seconds; etc.\n\n\nThe picker uses the \nformat\n option to decide what components to show. Set \nformat\n to \nLT\n, \nLTS\n or another valid \nMomentJs format string\n to display certain components\n\n\nHow do I change the language/locale\n\n\nThe picker uses MomentJs to determine the language string. You can use \nmoment-with-locales\n or you can include whatever local file you need. Set the picker's \nlocale\n option to \nde\n or whatever the locale string is.\n\n\nHow do I change the styles? The picker closes.\n\n\nSet \ndebug:true\n which will force the picker to stay open, even \nonBlur\n. You can hide the picker manually by calling \nhide()\n\n\nHow do I change the start of the week?\n\n\nStart of the week is based on the \nlocale\n provided\n. This is defined by moment's locales. If you want to change it, create your own locale file or override. \nSee moment's docs\n.\n\n\nHow I use the picker as birthday picker?\n\n\nUse the \nviewMode\n option to \n'years'", + "title": "FAQs" + }, + { + "location": "/FAQ/#faqs", + "text": "", + "title": "FAQs" + }, + { + "location": "/FAQ/#how-do-i-disable-the-date-or-time-element", + "text": "How do I format ...; How do I add seconds; etc. The picker uses the format option to decide what components to show. Set format to LT , LTS or another valid MomentJs format string to display certain components", + "title": "How do I disable the date or time element" + }, + { + "location": "/FAQ/#how-do-i-change-the-languagelocale", + "text": "The picker uses MomentJs to determine the language string. You can use moment-with-locales or you can include whatever local file you need. Set the picker's locale option to de or whatever the locale string is.", + "title": "How do I change the language/locale" + }, + { + "location": "/FAQ/#how-do-i-change-the-styles-the-picker-closes", + "text": "Set debug:true which will force the picker to stay open, even onBlur . You can hide the picker manually by calling hide()", + "title": "How do I change the styles? The picker closes." + }, + { + "location": "/FAQ/#how-do-i-change-the-start-of-the-week", + "text": "Start of the week is based on the locale provided . This is defined by moment's locales. If you want to change it, create your own locale file or override. See moment's docs .", + "title": "How do I change the start of the week?" + }, + { + "location": "/FAQ/#how-i-use-the-picker-as-birthday-picker", + "text": "Use the viewMode option to 'years'", + "title": "How I use the picker as birthday picker?" + } + ] } \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 6144a77..7beb35f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,11 +3,13 @@ repo_url: https://github.com/tempusdominus/core edit_uri: edit/master/src/docs/ docs_dir: src/docs site_dir: docs -theme_dir: src/docs/theme +theme: + name: null + custom_dir: src/docs/theme pages: - Home: 'index.md' - Functions: 'Functions.md' - Options: 'Options.md' - Events: 'Events.md' -- Change Log: 'Changelog.md' +- Change Log: 'ChangeLog.md' - FAQs: 'FAQ.md' \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8cc05e1..9b9b011 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,106 @@ { "name": "tempusdominus-core", - "version": "5.0.0", + "version": "5.16.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@blakeembrey/deque": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz", + "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==", + "dev": true + }, + "@blakeembrey/template": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@blakeembrey/template/-/template-1.0.0.tgz", + "integrity": "sha512-J6WGZqCLdRMHUkyRG6fBSIFJ0rL60/nsQNh5rQvsYZ5u0PsKw6XQcJcA3DWvd9cN3j/IQx5yB1fexhCafwwUUw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -44,33 +141,33 @@ } }, "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { "es6-promisify": "^5.0.0" } }, "agentkeepalive": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.1.tgz", - "integrity": "sha512-Cte/sTY9/XcygXjJ0q58v//SnEQ7ViWExKyJpLJlLqomDbQyMLh6Is4KuWJ/wmxzhiwkGRple7Gqv1zf6Syz5w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", "dev": true, "requires": { "humanize-ms": "^1.2.1" } }, "ajv": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", - "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-keywords": { @@ -97,12 +194,28 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", @@ -113,9 +226,9 @@ } }, "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", "dev": true }, "array-find-index": { @@ -145,27 +258,10 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { + "astral-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, "async": { @@ -175,32 +271,11 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true, - "optional": true - }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -296,9 +371,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true } } @@ -358,9 +433,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true } } @@ -439,9 +514,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true } } @@ -763,9 +838,9 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true } } @@ -794,9 +869,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true } } @@ -819,9 +894,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true } } @@ -839,9 +914,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true } } @@ -859,12 +934,20 @@ "dev": true }, "basic-auth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", - "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "batch": { @@ -873,20 +956,16 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true }, "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "body": { @@ -911,16 +990,25 @@ "concat-map": "0.0.1" } }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, - "builtin-modules": { + "buffer-from": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "builtins": { @@ -936,31 +1024,32 @@ "dev": true }, "cacache": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", - "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", "y18n": "^4.0.0" }, "dependencies": { "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -971,13 +1060,19 @@ "path-is-absolute": "^1.0.0" } }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } } } @@ -1013,13 +1108,6 @@ "map-obj": "^1.0.0" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -1034,15 +1122,31 @@ } }, "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "circular-json": { @@ -1062,9 +1166,9 @@ }, "dependencies": { "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1092,12 +1196,6 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1137,22 +1235,6 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1223,13 +1305,27 @@ "run-queue": "^1.0.0" }, "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } } } @@ -1247,12 +1343,14 @@ "dev": true }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } @@ -1266,17 +1364,10 @@ "array-find-index": "^1.0.1" } }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true, - "optional": true - }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, "d": { @@ -1288,16 +1379,6 @@ "es5-ext": "^0.10.9" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1350,12 +1431,6 @@ "rimraf": "^2.2.8" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", @@ -1388,33 +1463,33 @@ } }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", "dev": true }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true } } }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domhandler": { @@ -1437,15 +1512,15 @@ } }, "duplexer": { - "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -1454,23 +1529,18 @@ "stream-shift": "^1.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "encodeurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", @@ -1487,9 +1557,9 @@ } }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -1528,9 +1598,9 @@ } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -1572,9 +1642,9 @@ } }, "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, "es6-promisify": { @@ -1689,9 +1759,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "shelljs": { @@ -1720,19 +1790,28 @@ } }, "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "espree": { @@ -1746,9 +1825,9 @@ } }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { @@ -1816,34 +1895,27 @@ "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", "dev": true }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "optional": true - }, "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" }, "dependencies": { "concat-stream": { @@ -1857,26 +1929,22 @@ "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true, - "optional": true - }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "fast-json-stable-stringify": { @@ -1901,18 +1969,18 @@ } }, "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "requires": { "pend": "~1.2.0" } }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, "figures": { @@ -1935,6 +2003,15 @@ "object-assign": "^4.0.1" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "finalhandler": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", @@ -1996,43 +2073,50 @@ "write": "^0.2.1" } }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, - "optional": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" }, "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "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": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "optional": true, "requires": { - "delayed-stream": "~1.0.0" + "safe-buffer": "~5.1.0" } } } @@ -2053,25 +2137,13 @@ "readable-stream": "^2.0.0" } }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, - "optional": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs-write-stream-atomic": { @@ -2092,6 +2164,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, "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", @@ -2108,10 +2187,13 @@ } }, "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } }, "generate-object-property": { "version": "1.2.0", @@ -2123,9 +2205,9 @@ } }, "genfun": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-4.0.1.tgz", - "integrity": "sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, "get-stdin": { @@ -2135,10 +2217,13 @@ "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "getobject": { "version": "0.1.0", @@ -2146,16 +2231,6 @@ "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", @@ -2170,6 +2245,15 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -2224,9 +2308,9 @@ "dev": true }, "grunt": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.3.tgz", - "integrity": "sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.1.0.tgz", + "integrity": "sha512-+NGod0grmviZ7Nzdi9am7vuRS/h76PcWDsV635mEXF0PEQMUV6Kb+OjTdsVxbi0PZmfQOjCMKb3w8CVZcqsn1g==", "dev": true, "requires": { "coffeescript": "~1.10.0", @@ -2240,14 +2324,20 @@ "grunt-legacy-log": "~2.0.0", "grunt-legacy-util": "~1.1.1", "iconv-lite": "~0.4.13", - "js-yaml": "~3.5.2", + "js-yaml": "~3.13.1", "minimatch": "~3.0.2", - "mkdirp": "~0.5.1", + "mkdirp": "~1.0.3", "nopt": "~3.0.6", "path-is-absolute": "~1.0.0", "rimraf": "~2.6.2" }, "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "grunt-cli": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", @@ -2260,13 +2350,45 @@ "resolve": "~1.1.0" } }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } } } @@ -2308,42 +2430,53 @@ } }, "grunt-contrib-jasmine": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/grunt-contrib-jasmine/-/grunt-contrib-jasmine-2.0.2.tgz", - "integrity": "sha512-zRUbPAbnzEuLjRsJGHSmEoQnSa9CfVYSxoRglu9+nP23B05cEJU2WQCQg6lCTvNQ63MY4d3iW6SnuD7cBd1s8A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jasmine/-/grunt-contrib-jasmine-2.1.0.tgz", + "integrity": "sha512-nkOIG3Rvv9iedz/CC5hRKHUMJ1aSGOac87h5Xm4fuBUh9RQpbhiQ7xw1lWyhxrLUN3M0ksBKNWBB6KM+rgmI2A==", "dev": true, "requires": { - "chalk": "^1.0.0", - "grunt-eslint": "20.1.0", - "lodash": "~2.4.1", - "pacote": "8.1.3", - "puppeteer": "1.4.0", - "rimraf": "^2.1.4", - "sprintf-js": "~1.0.3" + "chalk": "^2.4.2", + "grunt-eslint": "^22.0.0", + "lodash": "^4.17.15", + "pacote": "^9.5.4", + "puppeteer": "^1.19.0", + "rimraf": "^2.6.3", + "sprintf-js": "^1.1.2" }, "dependencies": { "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -2355,106 +2488,104 @@ "color-convert": "^1.9.0" } }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.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", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", + "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", + "optionator": "^0.8.3", "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": { - "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" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" } }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { @@ -2463,19 +2594,65 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2487,85 +2664,116 @@ } }, "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", - "dev": true + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, "grunt-eslint": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-20.1.0.tgz", - "integrity": "sha512-VZlDOLrB2KKefDDcx/wR8rEEz7smDwDKVblmooa+itdt/2jWw3ee2AiZB5Ap4s4AoRY0pbHRjZ3HHwY8uKR9Rw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-22.0.0.tgz", + "integrity": "sha512-I7vIU4x/mb20fmA6TAmLx6Wzn7mfs8ZXeuk7LbP2ujKVFV7KZmJ3qXUyqe2wnD+v/74Rs5uYOZrLL8EoBmlG9Q==", "dev": true, "requires": { "chalk": "^2.1.0", - "eslint": "^4.0.0" - }, - "dependencies": { - "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" - } - } + "eslint": "^6.0.1" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.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", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "color-name": "~1.1.4" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -2573,101 +2781,151 @@ } }, "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, - "pluralize": { - "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 + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "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", + "word-wrap": "~1.2.3" + } }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "is-promise": "^2.1.0" + "glob": "^7.1.3" } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "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=", + "dev": true + } } }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } } }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, "supports-color": { @@ -2680,78 +2938,111 @@ } }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { - "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" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "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=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true } } + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } } } }, "grunt-contrib-jshint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-2.0.0.tgz", - "integrity": "sha512-4qR411I1bhvVrPkKBzCUcrWkTEtBuWioXi9ABWRXHoplRScg03jiMqLDpzS4pDhVsLOTx5F9l+0cnMc+Gd2MWg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.0.0.tgz", + "integrity": "sha512-o0V3HNK54+w2Lss/AP0LsAUCEmPDQIcgsDFvTy0sE8sdPXq/8vHdNdMEitK9Wcfoq7H6v02v6soiiwJ0wavT7A==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^4.1.0", "hooker": "^0.2.3", - "jshint": "~2.9.6" + "jshint": "~2.12.0" }, "dependencies": { "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } @@ -2769,25 +3060,25 @@ }, "dependencies": { "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.14" } } } }, "grunt-contrib-uglify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-4.0.0.tgz", - "integrity": "sha512-vy3Vop2KDqdiwcGOGAjyKvjHFrRD/YK4KPQWR3Yt6OdYlgFw1z7HCuk66+IJ9s7oJmp9uRQXuuSHyawKRAgiMw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.0.0.tgz", + "integrity": "sha512-rIFFPJMWKnh6oxDe2b810Ysg5SKoiI0u/FvuvAVpvJ7VHILkKtGqA4jgJ1JWruWQ+1m5FtB1lVSK81YyzIgDUw==", "dev": true, "requires": { "chalk": "^2.4.1", "maxmin": "^2.1.0", - "uglify-js": "~3.4.8", + "uglify-js": "^3.5.0", "uri-path": "^1.0.0" }, "dependencies": { @@ -2801,9 +3092,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -2846,21 +3137,13 @@ } }, "grunt-env": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/grunt-env/-/grunt-env-0.4.4.tgz", - "integrity": "sha1-OziEOo1zcXfdyfiTh5+2nOGgvC8=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-env/-/grunt-env-1.0.1.tgz", + "integrity": "sha512-Hw4iIJ58yYA8kJaP4UUyfw807DUI1FRnow9hhRMnq366bwCnxiBWOgfZsYilcs3Jh1qsGC/i3+G+7/W18hA1TA==", "dev": true, "requires": { - "ini": "~1.3.0", - "lodash": "~2.4.1" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - } + "ini": "^1.3.5", + "lodash": "^4.17.14" } }, "grunt-eslint": { @@ -2874,9 +3157,9 @@ } }, "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", "dev": true }, "grunt-legacy-log": { @@ -2911,9 +3194,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -2922,9 +3205,9 @@ } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -2945,23 +3228,12 @@ "lodash": "~4.17.10", "underscore.string": "~3.3.4", "which": "~1.3.0" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "grunt-nuget": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/grunt-nuget/-/grunt-nuget-0.3.0.tgz", - "integrity": "sha1-A6KqGo8Db1HtOGg9OnvjkNctPd8=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/grunt-nuget/-/grunt-nuget-0.3.1.tgz", + "integrity": "sha512-jYPwNAkDRw7UNL2uytExr31fPZwcOIqz/5xdv+ZtOJLBHTt1v9f9qDCTniRHaNEDF6FwZPWWRG9gKLAVY13KNg==", "dev": true }, "grunt-string-replace": { @@ -2975,12 +3247,12 @@ }, "dependencies": { "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "^4.14.0" + "lodash": "^4.17.14" } } } @@ -2994,24 +3266,6 @@ "duplexer": "^0.1.1" } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "optional": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -3027,17 +3281,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "optional": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -3055,9 +3298,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "htmlparser2": { @@ -3081,7 +3324,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -3144,18 +3387,6 @@ } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "http2": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/http2/-/http2-3.3.7.tgz", @@ -3163,28 +3394,28 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { - "agent-base": "^4.1.0", + "agent-base": "^4.3.0", "debug": "^3.1.0" }, "dependencies": { "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -3199,9 +3430,9 @@ } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -3220,21 +3451,39 @@ "dev": true }, "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "requires": { "minimatch": "^3.0.4" } }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3250,6 +3499,12 @@ "repeating": "^2.0.0" } }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3267,9 +3522,9 @@ "dev": true }, "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, "inquirer": { @@ -3320,15 +3575,21 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "binary-extensions": "^2.0.0" } }, + "is-extglob": { + "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": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", @@ -3347,18 +3608,40 @@ "number-is-nan": "^1.0.0" } }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, "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": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", "dev": true, "requires": { "generate-function": "^2.0.0", "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", "jsonpointer": "^4.0.0", "xtend": "^4.0.0" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -3383,12 +3666,6 @@ "path-is-inside": "^1.0.1" } }, - "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-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -3404,20 +3681,6 @@ "tryit": "^1.0.1" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "optional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -3436,16 +3699,10 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", + "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" }, "js-tokens": { "version": "3.0.2", @@ -3454,22 +3711,15 @@ "dev": true }, "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "^1.0.2", - "esprima": "^2.6.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", @@ -3477,22 +3727,19 @@ "dev": true }, "jshint": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz", - "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.12.0.tgz", + "integrity": "sha512-TwuuaUDmra0JMkuqvqy+WGo2xGHSNjv1BA1nTIgtH2K5z1jHuAEeAgp7laaR+hLRmajRjcrM71+vByBDanCyYA==", "dev": true, "requires": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", - "lodash": "~4.17.10", + "lodash": "~4.17.19", "minimatch": "~3.0.2", - "phantom": "~4.0.1", - "phantomjs-prebuilt": "~2.1.7", "shelljs": "0.3.x", - "strip-json-comments": "1.0.x", - "unicode-5.2.0": "^0.7.5" + "strip-json-comments": "1.0.x" } }, "json-parse-better-errors": { @@ -3501,17 +3748,10 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "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 }, "json-stable-stringify": { @@ -3529,86 +3769,44 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "jsonfile": { - "version": "2.4.0", - "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "optional": true, - "requires": { - "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 }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "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", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", - "dev": true, - "optional": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, "less": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", - "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", "dev": true, "requires": { - "clone": "^2.1.2", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", + "make-dir": "^2.1.0", "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" + "native-request": "^1.0.5", + "source-map": "~0.6.0", + "tslib": "^1.10.0" }, "dependencies": { "source-map": { @@ -3637,15 +3835,23 @@ "dev": true }, "load-grunt-tasks": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.5.2.tgz", - "integrity": "sha1-ByhWEYD9IP+KaSdQWFL8WKrqDIg=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-5.1.0.tgz", + "integrity": "sha512-oNj0Jlka1TsfDe+9He0kcA1cRln+TMoTsEByW7ij6kyktNLxBKJtslCFEvFrLC2Dj0S19IWJh3fOCIjLby2Xrg==", "dev": true, "requires": { - "arrify": "^1.0.0", - "multimatch": "^2.0.0", - "pkg-up": "^1.0.0", - "resolve-pkg": "^0.1.0" + "arrify": "^2.0.1", + "multimatch": "^4.0.0", + "pkg-up": "^3.1.0", + "resolve-pkg": "^2.0.0" + }, + "dependencies": { + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + } } }, "load-json-file": { @@ -3661,10 +3867,28 @@ "strip-bom": "^2.0.0" } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "loose-envify": { @@ -3687,27 +3911,46 @@ } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "optional": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + } } }, "make-fetch-happen": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", - "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", "dev": true, "requires": { "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", + "cacache": "^12.0.0", "http-cache-semantics": "^3.8.1", "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "node-fetch-npm": "^2.0.2", "promise-retry": "^1.1.1", @@ -3773,9 +4016,9 @@ } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { @@ -3788,15 +4031,15 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "minipass": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", - "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -3804,26 +4047,20 @@ }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true } } }, "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mississippi": { @@ -3845,46 +4082,46 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moment-timezone": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", - "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=", + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz", + "integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==", "requires": { - "moment": ">= 2.6.0" + "moment": ">= 2.9.0" } }, "morgan": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", - "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "dev": true, "requires": { - "basic-auth": "~2.0.0", + "basic-auth": "~2.0.1", "debug": "2.6.9", - "depd": "~1.1.1", + "depd": "~2.0.0", "on-finished": "~2.3.0", - "on-headers": "~1.0.1" + "on-headers": "~1.0.2" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + } } }, "move-concurrently": { @@ -3901,13 +4138,27 @@ "run-queue": "^1.0.3" }, "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } } } @@ -3919,15 +4170,30 @@ "dev": true }, "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + } } }, "mute-stream": { @@ -3936,6 +4202,13 @@ "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, + "native-request": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", + "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", + "dev": true, + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3948,10 +4221,16 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node-fetch-npm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", "dev": true, "requires": { "encoding": "^0.1.11", @@ -3969,76 +4248,112 @@ } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "npm-bundled": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", - "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true }, "npm-package-arg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", - "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", "dev": true, "requires": { - "hosted-git-info": "^2.6.0", + "hosted-git-info": "^2.7.1", "osenv": "^0.1.5", - "semver": "^5.5.0", + "semver": "^5.6.0", "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true - } } }, "npm-packlist": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", - "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npm-pick-manifest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", - "integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", "dev": true, "requires": { + "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", "semver": "^5.4.1" } }, + "npm-registry-fetch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "optional": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4055,9 +4370,9 @@ } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, "once": { @@ -4069,6 +4384,70 @@ "wrappy": "1" } }, + "onchange": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/onchange/-/onchange-7.0.2.tgz", + "integrity": "sha512-pyJroR9gZKilbJtdGsuyxhFhwaeYSpYVle9hAORGJ5vQQH8n7QT+qWpncJTMEk9dlIXI9tOMjdJwbPaTSPTKFA==", + "dev": true, + "requires": { + "@blakeembrey/deque": "^1.0.5", + "@blakeembrey/template": "^1.0.0", + "arg": "^4.1.3", + "chokidar": "^3.3.1", + "cross-spawn": "^7.0.1", + "ignore": "^5.1.4", + "tree-kill": "^1.2.2" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "onetime": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", @@ -4121,43 +4500,72 @@ "os-tmpdir": "^1.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "pacote": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-8.1.3.tgz", - "integrity": "sha512-1mQvUgCBA9Bq1MtWCxuDzhDNZn0bhiOEUpiHHj/KepINGhb16NS8osaEsKEDTaNBwPZWm0aJJsZe04+6TEOkZQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "cacache": "^11.0.2", - "get-stream": "^3.0.0", - "glob": "^7.1.2", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", "minimatch": "^3.0.4", - "minipass": "^2.3.1", + "minipass": "^2.3.5", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", + "protoduck": "^5.0.1", "rimraf": "^2.6.2", "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "ssri": "^6.0.0", - "tar": "^4.4.1", - "unique-filename": "^1.1.0", - "which": "^1.3.0" + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -4169,39 +4577,50 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true } } }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -4238,6 +4657,18 @@ "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.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -4255,42 +4686,11 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true, - "optional": true - }, - "phantom": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz", - "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==", - "dev": true, - "optional": true, - "requires": { - "phantomjs-prebuilt": "^2.1.16", - "split": "^1.0.1", - "winston": "^2.4.0" - } - }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "dev": true, - "optional": true, - "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" - } + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true }, "pify": { "version": "2.3.0", @@ -4314,12 +4714,23 @@ } }, "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + } } }, "pluralize": { @@ -4370,16 +4781,6 @@ "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -4397,18 +4798,18 @@ } }, "protoduck": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", - "integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", "dev": true, "requires": { - "genfun": "^4.0.1" + "genfun": "^5.0.0" } }, "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, "prr": { @@ -4418,19 +4819,6 @@ "dev": true, "optional": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true, - "optional": true - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -4465,62 +4853,75 @@ } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true + "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 }, "puppeteer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.4.0.tgz", - "integrity": "sha512-WDnC1FSHTedvRSS8BZB73tPAx2svUCWFdcxVjrybw8pbKOAB1v5S/pW0EamkqQoL1mXiBc+v8lyYjhhzMHIk1Q==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", "dev": true, "requires": { - "debug": "^3.1.0", - "extract-zip": "^1.6.5", - "https-proxy-agent": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", "mime": "^2.0.3", - "progress": "^2.0.0", + "progress": "^2.0.1", "proxy-from-env": "^1.0.0", "rimraf": "^2.6.1", - "ws": "^3.0.0" + "ws": "^6.1.0" }, "dependencies": { "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } } } @@ -4591,6 +4992,15 @@ "util-deprecate": "~1.0.1" } }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "readline2": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", @@ -4645,9 +5055,9 @@ } }, "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "regexpu-core": { @@ -4685,78 +5095,6 @@ "is-finite": "^1.0.0" } }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "optional": true, - "requires": { - "mime-db": "~1.36.0" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "optional": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - } - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "optional": true, - "requires": { - "throttleit": "^1.0.0" - } - }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -4780,18 +5118,18 @@ "dev": true }, "resolve-pkg": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-0.1.0.tgz", - "integrity": "sha1-AsyZNBDik2livZcWahsHfalyVTE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", "dev": true, "requires": { - "resolve-from": "^2.0.0" + "resolve-from": "^5.0.0" }, "dependencies": { "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } @@ -4842,13 +5180,13 @@ "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "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=", + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { - "rx-lite": "*" + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -4870,9 +5208,9 @@ "dev": true }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "send": { @@ -4951,9 +5289,9 @@ "dev": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "slash": { @@ -4969,29 +5307,40 @@ "dev": true }, "smart-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", - "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", "dev": true }, "socks": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz", - "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", "dev": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.0.1" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", - "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dev": true, "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } } }, "source-map": { @@ -5010,9 +5359,9 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -5020,9 +5369,9 @@ } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { @@ -5036,45 +5385,17 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "optional": true, - "requires": { - "through": "2" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -5084,13 +5405,6 @@ "figgy-pudding": "^3.5.1" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true, - "optional": true - }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -5108,9 +5422,9 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "string-template": { @@ -5236,30 +5550,24 @@ } }, "tar": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", - "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true } } @@ -5270,13 +5578,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true, - "optional": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -5284,13 +5585,45 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "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": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "tiny-lr": { @@ -5333,17 +5666,21 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "optional": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "is-number": "^7.0.0" } }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -5362,22 +5699,11 @@ "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true }, "type-check": { "version": "0.3.2", @@ -5388,6 +5714,12 @@ "prelude-ls": "~1.1.2" } }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -5395,45 +5727,21 @@ "dev": true }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, - "requires": { - "commander": "~2.17.1", - "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 - } - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.6.tgz", + "integrity": "sha512-oASI1FOJ7BBFkSCNDZ446EgkSuHkOZBuqRFrwXIKWCoXw8ZXQETooTQjkAcBS03Acab7ubCKsXnwuV2svy061g==", "dev": true }, "underscore.string": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", + "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", "dev": true, "requires": { "sprintf-js": "^1.0.3", "util-deprecate": "^1.0.2" } }, - "unicode-5.2.0": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz", - "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==", - "dev": true - }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -5444,9 +5752,9 @@ } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -5458,6 +5766,15 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "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" + } + }, "uri-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", @@ -5485,17 +5802,16 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true, - "optional": true + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -5511,18 +5827,6 @@ "builtins": "^1.0.3" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "websocket-driver": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", @@ -5548,36 +5852,11 @@ "isexe": "^2.0.0" } }, - "winston": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", - "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", - "dev": true, - "optional": true, - "requires": { - "async": "~1.0.0", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "async": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", - "dev": true, - "optional": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true, - "optional": true - } - } + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, "wordwrap": { "version": "1.0.0", @@ -5601,14 +5880,12 @@ } }, "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "async-limiter": "~1.0.0" } }, "xtend": { @@ -5624,18 +5901,19 @@ "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "requires": { - "fd-slicer": "~1.0.1" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } } } diff --git a/package.json b/package.json index 4244977..5701e32 100644 --- a/package.json +++ b/package.json @@ -6,39 +6,51 @@ "author": { "name": "Jonathan Peterson" }, + "contributors": [ + "Anton Bagdatyev (Tonix)" + ], "bugs": { - "url": "https://github.com/tempusdominus/core/issues" + "url": "https://github.com/tonix-tuft/tempusdominus/pulls" + }, + "scripts": { + "watch": "./node_modules/.bin/onchange './src/js/**' -- npm run build", + "build": "grunt build", + "build-all": "npm run build", + "git-add-cm": "git add . && git commit -am", + "publish-patch": "npm version patch && npm run build && ((npm run git-add-cm -- \"Next patch version\" 2>/dev/null) || echo) && npm publish && git push && git push --tags", + "publish-minor": "npm version minor && npm run build && ((npm run git-add-cm -- \"Next minor version\" 2>/dev/null) || echo) && npm publish && git push && git push --tags", + "publish-major": "npm version major && npm run build && ((npm run git-add-cm -- \"Next major version\" 2>/dev/null) || echo) && npm publish && git push && git push --tags" }, "dependencies": { - "jquery": "^3.0", - "moment": "^2.22.2", - "moment-timezone": "^0.4.0" + "jquery": "^3.5.0", + "moment": "~2.24.0", + "moment-timezone": "^0.5.28" }, - "peerDependenciesd": { + "peerDependencies": { "jquery": "^3.0", "moment": "^2.10", - "moment-timezone": "^0.4.0" + "moment-timezone": "^0.5.0" }, - "description": "A date/time picker component designed for Momentjs. For usage, installation and demos see Project Site on GitHub", + "description": "A date/time picker component designed for Momentjs.", "devDependencies": { "babel-plugin-transform-es2015-modules-strip": "^0.1.0", "babel-preset-es2015": "^6.16.0", - "grunt": "^1.0.3", + "grunt": "^1.1.0", "grunt-babel": "6.0.0", "grunt-contrib-concat": "^1.0.1", "grunt-contrib-connect": "^1.0.1", - "grunt-contrib-jasmine": "^2.0.2", + "grunt-contrib-jasmine": "^2.1.0", "grunt-contrib-jshint": "latest", "grunt-contrib-less": "latest", "grunt-contrib-uglify": "latest", "grunt-contrib-watch": "^1.1.0", - "grunt-env": "^0.4.4", + "grunt-env": "^1.0.1", "grunt-eslint": "^19.0.0", - "grunt-nuget": "^0.3.0", + "grunt-nuget": "^0.3.1", "grunt-string-replace": "latest", - "load-grunt-tasks": "latest" + "load-grunt-tasks": "latest", + "onchange": "^7.0.2" }, - "homepage": "https://github.com/tempusdominus/core", "keywords": [ "datepicker", "datetimepicker", @@ -49,7 +61,7 @@ "type": "git", "url": "https://github.com/tempusdominus/core.git" }, - "version": "5.0.3", + "version": "5.16.0", "files": [ "build", "src/js/**/*.js", diff --git a/src/docs/theme/nav.html b/src/docs/theme/nav.html index 6b29107..3f832c5 100644 --- a/src/docs/theme/nav.html +++ b/src/docs/theme/nav.html @@ -12,7 +12,7 @@ - {{ config.site_name }} + {{ config.site_name }} @@ -26,14 +26,14 @@ {% else %}
  • - {{ nav_item.title }} + {{ nav_item.title }}
  • {% endif %} {% endfor %} diff --git a/src/js/tempusdominus-core.js b/src/js/tempusdominus-core.js index 8c4b5b3..80bfd45 100644 --- a/src/js/tempusdominus-core.js +++ b/src/js/tempusdominus-core.js @@ -3,8 +3,21 @@ import moment from 'moment'; // ReSharper disable once InconsistentNaming const DateTimePicker = (($, moment) => { + function escapeRegExp(text) { + return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + } + + function isValidDate(date) { + return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime()); + } + + function isValidDateTimeStr(str) { + return isValidDate(new Date(str)); + } + // ReSharper disable InconsistentNaming - const NAME = 'datetimepicker', + const trim = str => str.replace(/(^\s+)|(\s+$)/g, ''), + NAME = 'datetimepicker', DATA_KEY = `${NAME}`, EVENT_KEY = `.${DATA_KEY}`, DATA_API_KEY = '.data-api', @@ -76,7 +89,82 @@ const DateTimePicker = (($, moment) => { }, ViewModes = ['times', 'days', 'months', 'years', 'decades'], keyState = {}, - keyPressHandled = {}; + keyPressHandled = {}, + optionsSortMap = { + timeZone: -39, + format: -38, + dayViewHeaderFormat: -37, + extraFormats: -36, + stepping: -35, + minDate: -34, + maxDate: -33, + useCurrent: -32, + collapse: -31, + locale: -30, + defaultDate: -29, + disabledDates: -28, + enabledDates: -27, + icons: -26, + tooltips: -25, + useStrict: -24, + sideBySide: -23, + daysOfWeekDisabled: -22, + calendarWeeks: -21, + viewMode: -20, + toolbarPlacement: -19, + buttons: -18, + widgetPositioning: -17, + widgetParent: -16, + ignoreReadonly: -15, + keepOpen: -14, + focusOnShow: -13, + inline: -12, + keepInvalid: -11, + keyBinds: -10, + debug: -9, + allowInputToggle: -8, + disabledTimeIntervals: -7, + disabledHours: -6, + enabledHours: -5, + viewDate: -4, + allowMultidate: -3, + multidateSeparator: -2, + updateOnlyThroughDateOption: -1, + date: 1 + }, + defaultFeatherIcons = { + time: 'clock', + date: 'calendar', + up: 'arrow-up', + down: 'arrow-down', + previous: 'arrow-left', + next: 'arrow-right', + today: 'arrow-down-circle', + clear: 'trash-2', + close: 'x' + }; + + function optionsSortFn(optionKeyA, optionKeyB) { + if (optionsSortMap[optionKeyA] && optionsSortMap[optionKeyB]) { + if (optionsSortMap[optionKeyA] < 0 && optionsSortMap[optionKeyB] < 0) { + return Math.abs(optionsSortMap[optionKeyB]) - Math.abs(optionsSortMap[optionKeyA]); + } + else if (optionsSortMap[optionKeyA] < 0) { + return -1; + } + else if (optionsSortMap[optionKeyB] < 0) { + return 1; + } + return optionsSortMap[optionKeyA] - optionsSortMap[optionKeyB]; + } + else if (optionsSortMap[optionKeyA]) { + return optionsSortMap[optionKeyA]; + } + else if (optionsSortMap[optionKeyB]) { + return optionsSortMap[optionKeyB]; + } + return 0; + } let Default = { timeZone: '', @@ -93,6 +181,7 @@ const DateTimePicker = (($, moment) => { disabledDates: false, enabledDates: false, icons: { + type: 'class', time: 'fa fa-clock-o', date: 'fa fa-calendar', up: 'fa fa-arrow-up', @@ -100,7 +189,7 @@ const DateTimePicker = (($, moment) => { previous: 'fa fa-chevron-left', next: 'fa fa-chevron-right', today: 'fa fa-calendar-check-o', - clear: 'fa fa-delete', + clear: 'fa fa-trash', close: 'fa fa-times' }, tooltips: { @@ -147,6 +236,7 @@ const DateTimePicker = (($, moment) => { vertical: 'auto' }, widgetParent: null, + readonly: false, ignoreReadonly: false, keepOpen: false, focusOnShow: true, @@ -287,7 +377,10 @@ const DateTimePicker = (($, moment) => { enabledHours: false, viewDate: false, allowMultidate: false, - multidateSeparator: ',' + multidateSeparator: ', ', + updateOnlyThroughDateOption: false, + promptTimeOnDateChange: false, + promptTimeOnDateChangeTransitionDelay: 200 }; // ReSharper restore InconsistentNaming @@ -312,6 +405,13 @@ const DateTimePicker = (($, moment) => { this.parseFormats = null; this.currentViewMode = null; this.MinViewModeNumber = 0; + this.isInitFormatting = false; + this.isInit = false; + this.isDateUpdateThroughDateOptionFromClientCode = false; + this.hasInitDate = false; + this.initDate = void 0; + this._notifyChangeEventContext = void 0; + this._currentPromptTimeTimeout = null; this._int(); } @@ -375,6 +475,7 @@ const DateTimePicker = (($, moment) => { //private _int() { + this.isInit = true; const targetInput = this._element.data('target-input'); if (this._element.is('input')) { this.input = this._element; @@ -392,18 +493,27 @@ const DateTimePicker = (($, moment) => { $.extend(true, this._options, this._dataToOptions()); + this.hasInitDate = false; + this.initDate = void 0; this.options(this._options); + this.isInitFormatting = true; this._initFormatting(); + this.isInitFormatting = false; if (this.input !== undefined && this.input.is('input') && this.input.val().trim().length !== 0) { this._setValue(this._parseInputDate(this.input.val().trim()), 0); } else if (this._options.defaultDate && this.input !== undefined && this.input.attr('placeholder') === undefined) { this._setValue(this._options.defaultDate, 0); } + if (this.hasInitDate) { + this.date(this.initDate); + } + if (this._options.inline) { this.show(); } + this.isInit = false; } _update() { @@ -415,20 +525,44 @@ const DateTimePicker = (($, moment) => { } _setValue(targetMoment, index) { - const oldDate = this.unset ? null : this._dates[index]; - let outpValue = ''; + const noIndex = (typeof index === 'undefined'), + isClear = !targetMoment && noIndex, + isDateUpdateThroughDateOptionFromClientCode = this.isDateUpdateThroughDateOptionFromClientCode, + isNotAllowedProgrammaticUpdate = !this.isInit && this._options.updateOnlyThroughDateOption && !isDateUpdateThroughDateOptionFromClientCode; + let outpValue = '', isInvalid = false, oldDate = this.unset ? null : this._dates[index]; + if (!oldDate && !this.unset && noIndex && isClear) { + oldDate = this._dates[this._dates.length - 1]; + } + // case of calling setValue(null or false) if (!targetMoment) { - if (!this._options.allowMultidate || this._dates.length === 1) { + if (isNotAllowedProgrammaticUpdate) { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment, + oldDate: oldDate, + isClear, + isInvalid, + isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + return; + } + if (!this._options.allowMultidate || this._dates.length === 1 || isClear) { this.unset = true; this._dates = []; this._datesFormatted = []; } else { - outpValue = `${this._element.data('date')},`; - outpValue = outpValue.replace(`${oldDate.format(this.actualFormat)},`, '').replace(',,', '').replace(/,\s*$/, ''); + outpValue = `${this._element.data('date')}${this._options.multidateSeparator}`; + outpValue = (oldDate && outpValue.replace( + `${oldDate.format(this.actualFormat)}${this._options.multidateSeparator}`, '' + ) + .replace(`${this._options.multidateSeparator}${this._options.multidateSeparator}`, '') + .replace(new RegExp(`${escapeRegExp(this._options.multidateSeparator)}\\s*$`), '')) || ''; this._dates.splice(index, 1); this._datesFormatted.splice(index, 1); } + outpValue = trim(outpValue); if (this.input !== undefined) { this.input.val(outpValue); this.input.trigger('input'); @@ -437,7 +571,11 @@ const DateTimePicker = (($, moment) => { this._notifyEvent({ type: DateTimePicker.Event.CHANGE, date: false, - oldDate: oldDate + oldDate: oldDate, + isClear, + isInvalid, + isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit }); this._update(); return; @@ -454,6 +592,18 @@ const DateTimePicker = (($, moment) => { } if (this._isValid(targetMoment)) { + if (isNotAllowedProgrammaticUpdate) { + this._notifyEvent({ + type: DateTimePicker.Event.CHANGE, + date: targetMoment.clone(), + oldDate: oldDate, + isClear, + isInvalid, + isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit + }); + return; + } this._dates[index] = targetMoment; this._datesFormatted[index] = targetMoment.format('YYYY-MM-DD'); this._viewDate = targetMoment.clone(); @@ -461,10 +611,11 @@ const DateTimePicker = (($, moment) => { for (let i = 0; i < this._dates.length; i++) { outpValue += `${this._dates[i].format(this.actualFormat)}${this._options.multidateSeparator}`; } - outpValue = outpValue.replace(/,\s*$/, ''); + outpValue = outpValue.replace(new RegExp(`${this._options.multidateSeparator}\\s*$`), ''); } else { outpValue = this._dates[index].format(this.actualFormat); } + outpValue = trim(outpValue) if (this.input !== undefined) { this.input.val(outpValue); this.input.trigger('input'); @@ -476,9 +627,14 @@ const DateTimePicker = (($, moment) => { this._notifyEvent({ type: DateTimePicker.Event.CHANGE, date: this._dates[index].clone(), - oldDate: oldDate + oldDate: oldDate, + isClear, + isInvalid, + isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit }); } else { + isInvalid = true; if (!this._options.keepInvalid) { if (this.input !== undefined) { this.input.val(`${this.unset ? '' : this._dates[index].format(this.actualFormat)}`); @@ -488,7 +644,11 @@ const DateTimePicker = (($, moment) => { this._notifyEvent({ type: DateTimePicker.Event.CHANGE, date: targetMoment, - oldDate: oldDate + oldDate: oldDate, + isClear, + isInvalid, + isDateUpdateThroughDateOptionFromClientCode, + isInit: this.isInit }); } this._notifyEvent({ @@ -502,14 +662,21 @@ const DateTimePicker = (($, moment) => { _change(e) { const val = $(e.target).val().trim(), parsedDate = val ? this._parseInputDate(val) : null; - this._setValue(parsedDate); + this._setValue(parsedDate, 0); e.stopImmediatePropagation(); return false; } //noinspection JSMethodCanBeStatic _getOptions(options) { - options = $.extend(true, {}, Default, options); + options = $.extend(true, {}, Default, ( + options && options.icons && options.icons.type === 'feather' ? + { + icons: defaultFeatherIcons + } + : + {} + ), options); return options; } @@ -570,11 +737,67 @@ const DateTimePicker = (($, moment) => { return dataOptions; } + _format() { + return this._options.format || 'YYYY-MM-DD HH:mm'; + } + + _areSameDates(a, b) { + const format = this._format(); + return a && b && (a.isSame(b) || moment(a.format(format), format).isSame(moment(b.format(format), format))); + } + _notifyEvent(e) { - if ((e.type === DateTimePicker.Event.CHANGE && (e.date && e.date.isSame(e.oldDate)) || !e.date && !e.oldDate)) { - return; + if (e.type === DateTimePicker.Event.CHANGE) { + this._notifyChangeEventContext = this._notifyChangeEventContext || 0; + this._notifyChangeEventContext++; + if ( + (e.date && this._areSameDates(e.date, e.oldDate)) + || + (!e.isClear && !e.date && !e.oldDate) + || + (this._notifyChangeEventContext > 1) + ) { + this._notifyChangeEventContext = void 0; + return; + } + this._handlePromptTimeIfNeeded(e); } this._element.trigger(e); + this._notifyChangeEventContext = void 0; + } + + _handlePromptTimeIfNeeded(e) { + if (this._options.promptTimeOnDateChange) { + if (!e.oldDate && this._options.useCurrent) { + // First time ever. If useCurrent option is set to true (default), do nothing + // because the first date is selected automatically. + return; + } + else if ( + e.oldDate && + e.date && + ( + (e.oldDate.format('YYYY-MM-DD') === e.date.format('YYYY-MM-DD')) + || + ( + e.oldDate.format('YYYY-MM-DD') !== e.date.format('YYYY-MM-DD') + && + e.oldDate.format('HH:mm:ss') !== e.date.format('HH:mm:ss') + ) + ) + ) { + // Date didn't change (time did) or date changed because time did. + return; + } + + const that = this; + clearTimeout(this._currentPromptTimeTimeout); + this._currentPromptTimeTimeout = setTimeout(function() { + if (that.widget) { + that.widget.find('[data-action="togglePicker"]').click(); + } + }, this._options.promptTimeOnDateChangeTransitionDelay); + } } _viewUpdate(e) { @@ -615,7 +838,7 @@ const DateTimePicker = (($, moment) => { } _isValid(targetMoment, granularity) { - if (!targetMoment.isValid()) { + if (!targetMoment || !targetMoment.isValid()) { return false; } if (this._options.disabledDates && granularity === 'd' && this._isInDisabledDates(targetMoment)) { @@ -654,8 +877,8 @@ const DateTimePicker = (($, moment) => { return true; } - _parseInputDate(inputDate) { - if (this._options.parseInputDate === undefined) { + _parseInputDate(inputDate, { isPickerShow = false } = {}) { + if (this._options.parseInputDate === undefined || isPickerShow) { if (!moment.isMoment(inputDate)) { inputDate = this.getMoment(inputDate); } @@ -755,7 +978,7 @@ const DateTimePicker = (($, moment) => { const format = this._options.format || 'L LT', self = this; this.actualFormat = format.replace(/(\[[^\[]*])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput) { - return self._dates[0].localeData().longDateFormat(formatInput) || formatInput; //todo taking the first date should be ok + return ((self.isInitFormatting && self._options.date === null ? self.getMoment() : self._dates[0]).localeData().longDateFormat(formatInput)) || formatInput; //todo taking the first date should be ok }); this.parseFormats = this._options.extraFormats ? this._options.extraFormats.slice() : []; @@ -783,7 +1006,11 @@ const DateTimePicker = (($, moment) => { } _getLastPickedDate() { - return this._dates[this._getLastPickedDateIndex()]; + let lastPickedDate = this._dates[this._getLastPickedDateIndex()]; + if (!lastPickedDate && this._options.allowMultidate) { + lastPickedDate = moment(new Date()); + } + return lastPickedDate; } _getLastPickedDateIndex() { @@ -795,7 +1022,8 @@ const DateTimePicker = (($, moment) => { let returnMoment; if (d === undefined || d === null) { - returnMoment = moment(); //TODO should this use format? and locale? + // TODO: Should this use format? + returnMoment = moment().clone().locale(this._options.locale); } else if (this._hasTimeZone()) { // There is a string to parse and a default time zone // parse with the tz function which takes a default time zone if it is not in the format string @@ -815,12 +1043,30 @@ const DateTimePicker = (($, moment) => { return this.widget ? this.hide() : this.show(); } + readonly(readonly) { + if (arguments.length === 0) { + return this._options.readonly; + } + if (typeof readonly !== 'boolean') { + throw new TypeError('readonly() expects a boolean parameter'); + } + this._options.readonly = readonly; + if (this.input !== undefined) { + this.input.prop('readonly', this._options.readonly); + } + if (this.widget) { + this.hide(); + this.show(); + } + } + + ignoreReadonly(ignoreReadonly) { if (arguments.length === 0) { return this._options.ignoreReadonly; } if (typeof ignoreReadonly !== 'boolean') { - throw new TypeError('ignoreReadonly () expects a boolean parameter'); + throw new TypeError('ignoreReadonly() expects a boolean parameter'); } this._options.ignoreReadonly = ignoreReadonly; } @@ -834,9 +1080,16 @@ const DateTimePicker = (($, moment) => { throw new TypeError('options() this.options parameter should be an object'); } $.extend(true, this._options, newOptions); - const self = this; - $.each(this._options, function (key, value) { + const self = this, + optionsKeys = Object.keys(this._options).sort(optionsSortFn); + $.each(optionsKeys, function (i, key) { + const value = self._options[key]; if (self[key] !== undefined) { + if (self.isInit && key === 'date') { + self.hasInitDate = true; + self.initDate = value; + return; + } self[key](value); } }); @@ -860,9 +1113,21 @@ const DateTimePicker = (($, moment) => { throw new TypeError('date() parameter must be one of [null, string, moment or Date]'); } + if (typeof newDate === 'string' && isValidDateTimeStr(newDate)) { + newDate = new Date(newDate); + } + this._setValue(newDate === null ? null : this._parseInputDate(newDate), index); } + updateOnlyThroughDateOption(updateOnlyThroughDateOption) { + if (typeof updateOnlyThroughDateOption !== 'boolean') { + throw new TypeError('updateOnlyThroughDateOption() expects a boolean parameter'); + } + + this._options.updateOnlyThroughDateOption = updateOnlyThroughDateOption; + } + format(newFormat) { if (arguments.length === 0) { return this._options.format; @@ -1483,7 +1748,14 @@ const DateTimePicker = (($, moment) => { } this._viewDate = this._parseInputDate(newDate); - this._viewUpdate(); + this._update(); + this._viewUpdate(DatePickerModes[this.currentViewMode] && DatePickerModes[this.currentViewMode].NAV_FUNCTION); + } + + _fillDate() {} + + _useFeatherIcons() { + return this._options.icons.type === 'feather'; } allowMultidate(allowMultidate) { @@ -1499,8 +1771,8 @@ const DateTimePicker = (($, moment) => { return this._options.multidateSeparator; } - if (typeof multidateSeparator !== 'string' || multidateSeparator.length > 1) { - throw new TypeError('multidateSeparator expects a single character string parameter'); + if (typeof multidateSeparator !== 'string') { + throw new TypeError('multidateSeparator expects a string parameter'); } this._options.multidateSeparator = multidateSeparator; diff --git a/tasks/bump-version.js b/tasks/bump-version.js index b06d50e..6d40088 100644 --- a/tasks/bump-version.js +++ b/tasks/bump-version.js @@ -3,7 +3,7 @@ module.exports = function (grunt) { if (!version || version.split('.').length !== 3) { grunt.fail.fatal('malformed version. Use\n\n grunt bump_version:1.2.3'); } - + grunt.config('string-replace.package-json', { files: {'package.json': 'package.json'}, options: {