From 0a13f9890d09f347f6d2a98b9db82ca1f8e55227 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 23 Jan 2019 13:01:59 +0100 Subject: [PATCH 1/4] MOBILE-2814 localnotif: Update cordova plugin and ionic native --- config.xml | 2 +- package-lock.json | 19 +++++++------------ package.json | 7 +++---- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/config.xml b/config.xml index eba7301fa..a5eb4c297 100644 --- a/config.xml +++ b/config.xml @@ -111,7 +111,7 @@ - + diff --git a/package-lock.json b/package-lock.json index 595f96ad1..0d1a7b001 100644 --- a/package-lock.json +++ b/package-lock.json @@ -161,9 +161,9 @@ "integrity": "sha512-2BHO1bV4mehWZNfdsWQ/uojxYFNvk4I6u0KYnNb61RiJRY83joCEw3oFkOMRGLZthPf6TN1cueZUIAGMHXA3nA==" }, "@ionic-native/local-notifications": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/@ionic-native/local-notifications/-/local-notifications-4.5.2.tgz", - "integrity": "sha512-/O2hNsWW6ixlAPY9Tw6wfIIUmNOPmd11DcxCTQ5vR8+oGPyYPj3IXkgUCI/U29Y3hDikSxdWTI19FtCxnzYKNA==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@ionic-native/local-notifications/-/local-notifications-4.17.0.tgz", + "integrity": "sha512-NGLGtGRduRU3f/4N2nv4hF550+NkJ9CP7mOS9vlZcZJBzlIup9X67u1M2j/+KFOpWqzS2avZ1gvZbxOmCjPNPw==" }, "@ionic-native/media-capture": { "version": "4.17.0", @@ -2233,11 +2233,6 @@ } } }, - "cordova-plugin-app-event": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cordova-plugin-app-event/-/cordova-plugin-app-event-1.2.1.tgz", - "integrity": "sha1-DuuxQTKqQ7suXAgamr29l8otgTI=" - }, "cordova-plugin-badge": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/cordova-plugin-badge/-/cordova-plugin-badge-0.8.8.tgz", @@ -2288,10 +2283,10 @@ "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.1.3.tgz", "integrity": "sha512-6ucQ6FdlLdBm8kJfFnzozmBTjru/0xekHP/dAhjoCZggkGRlgs8TsUJFkxa/bV+qi7Dlo50JjmpE4UMWAO+aOQ==" }, - "cordova-plugin-local-notifications-mm": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/cordova-plugin-local-notifications-mm/-/cordova-plugin-local-notifications-mm-1.0.13.tgz", - "integrity": "sha512-uZjYumhkvLH6tYU7cmR9Qx9ho8xPS2/lBGgKRsejVDtBFNnkSkkR3X/at2MuBe3ZJ7qAnJdFAN4rMY3yd+dG/g==" + "cordova-plugin-local-notification": { + "version": "0.9.0-beta.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-local-notification/-/cordova-plugin-local-notification-0.9.0-beta.2.tgz", + "integrity": "sha512-63n77K1pt8dnbWnNR8QWETi9Glezi1bvNHvHWmGNIOv0xCb0phZnm+Ku49BQ+omwe8Z5voMvrA4I03SYPpv38w==" }, "cordova-plugin-media-capture": { "version": "3.0.2", diff --git a/package.json b/package.json index 0d89d571b..7b9a7e4ed 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "@ionic-native/globalization": "^4.17.0", "@ionic-native/in-app-browser": "^4.17.0", "@ionic-native/keyboard": "^4.17.0", - "@ionic-native/local-notifications": "4.5.2", + "@ionic-native/local-notifications": "^4.17.0", "@ionic-native/media-capture": "^4.17.0", "@ionic-native/network": "^4.17.0", "@ionic-native/push": "^4.17.0", @@ -83,7 +83,6 @@ "cordova-android-support-gradle-release": "^2.0.1", "cordova-clipboard": "^1.2.1", "cordova-ios": "4.5.5", - "cordova-plugin-app-event": "1.2.1", "cordova-plugin-badge": "^0.8.8", "cordova-plugin-camera": "^4.0.3", "cordova-plugin-customurlscheme": "^4.3.0", @@ -94,7 +93,7 @@ "cordova-plugin-globalization": "^1.11.0", "cordova-plugin-inappbrowser": "^3.0.0", "cordova-plugin-ionic-keyboard": "^2.1.3", - "cordova-plugin-local-notifications-mm": "^1.0.13", + "cordova-plugin-local-notification": "^0.9.0-beta.2", "cordova-plugin-media-capture": "^3.0.2", "cordova-plugin-network-information": "^2.0.1", "cordova-plugin-screen-orientation": "^3.0.1", @@ -159,7 +158,7 @@ "cordova-plugin-globalization": {}, "cordova-plugin-inappbrowser": {}, "cordova-plugin-ionic-keyboard": {}, - "cordova-plugin-local-notifications-mm": {}, + "cordova-plugin-local-notification": {}, "cordova-plugin-media-capture": {}, "cordova-plugin-network-information": {}, "cordova-plugin-screen-orientation": {}, From 3f84adca9a55322cf9c1c0376a7ea80a472f2bc3 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 23 Jan 2019 13:08:45 +0100 Subject: [PATCH 2/4] MOBILE-2814 localnotif: Adapt the code to the new API --- src/addon/calendar/providers/calendar.ts | 15 ++-- .../providers/pushnotifications.ts | 14 ++-- src/providers/local-notifications.ts | 75 +++++++++---------- upgrade.txt | 4 + 4 files changed, 48 insertions(+), 60 deletions(-) diff --git a/src/addon/calendar/providers/calendar.ts b/src/addon/calendar/providers/calendar.ts index b02765ed0..d59bd9ce8 100644 --- a/src/addon/calendar/providers/calendar.ts +++ b/src/addon/calendar/providers/calendar.ts @@ -13,7 +13,6 @@ // limitations under the License. import { Injectable } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; import { CoreLoggerProvider } from '@providers/logger'; import { CoreSitesProvider } from '@providers/sites'; import { CoreSite } from '@classes/site'; @@ -23,6 +22,7 @@ import { CoreGroupsProvider } from '@providers/groups'; import { CoreConstants } from '@core/constants'; import { CoreLocalNotificationsProvider } from '@providers/local-notifications'; import { CoreConfigProvider } from '@providers/config'; +import { ILocalNotification } from '@ionic-native/local-notifications'; /** * Service to handle calendar events. @@ -132,8 +132,7 @@ export class AddonCalendarProvider { constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider, private groupsProvider: CoreGroupsProvider, private coursesProvider: CoreCoursesProvider, private timeUtils: CoreTimeUtilsProvider, - private localNotificationsProvider: CoreLocalNotificationsProvider, private configProvider: CoreConfigProvider, - private translate: TranslateService) { + private localNotificationsProvider: CoreLocalNotificationsProvider, private configProvider: CoreConfigProvider) { this.logger = logger.getInstance('AddonCalendarProvider'); this.sitesProvider.createTablesFromSchema(this.tablesSchema); } @@ -526,16 +525,12 @@ export class AddonCalendarProvider { return Promise.resolve(); } - const dateTriggered = new Date((event.timestart - (time * 60)) * 1000), - notification = { + const notification: ILocalNotification = { id: event.id, title: event.name, text: this.timeUtils.userDate(event.timestart * 1000, 'core.strftimedaydatetime', true), - at: dateTriggered, - channelParams: { - channelID: 'notifications', - channelName: this.translate.instant('addon.notifications.notifications'), - importance: 4 // IMPORTANCE_HIGH + trigger: { + at: new Date((event.timestart - (time * 60)) * 1000) }, data: { eventid: event.id, diff --git a/src/addon/pushnotifications/providers/pushnotifications.ts b/src/addon/pushnotifications/providers/pushnotifications.ts index 0d6c03283..01ac2318c 100644 --- a/src/addon/pushnotifications/providers/pushnotifications.ts +++ b/src/addon/pushnotifications/providers/pushnotifications.ts @@ -13,7 +13,6 @@ // limitations under the License. import { Injectable, NgZone } from '@angular/core'; -import { TranslateService } from '@ngx-translate/core'; import { Badge } from '@ionic-native/badge'; import { Push, PushObject, PushOptions } from '@ionic-native/push'; import { Device } from '@ionic-native/device'; @@ -28,6 +27,7 @@ import { CoreTextUtilsProvider } from '@providers/utils/text'; import { CoreConfigProvider } from '@providers/config'; import { CoreConstants } from '@core/constants'; import { CoreConfigConstants } from '../../../configconstants'; +import { ILocalNotification } from '@ionic-native/local-notifications'; /** * Service to handle push notifications. @@ -66,8 +66,7 @@ export class AddonPushNotificationsProvider { protected pushNotificationsDelegate: AddonPushNotificationsDelegate, protected sitesProvider: CoreSitesProvider, private badge: Badge, private localNotificationsProvider: CoreLocalNotificationsProvider, private utils: CoreUtilsProvider, private textUtils: CoreTextUtilsProvider, private push: Push, - private configProvider: CoreConfigProvider, private device: Device, private zone: NgZone, - private translate: TranslateService) { + private configProvider: CoreConfigProvider, private device: Device, private zone: NgZone) { this.logger = logger.getInstance('AddonPushNotificationsProvider'); this.appDB = appProvider.getDB(); this.appDB.createTablesFromSchema(this.tablesSchema); @@ -153,13 +152,10 @@ export class AddonPushNotificationsProvider { if (this.utils.isTrueOrOne(data.foreground)) { // If the app is in foreground when the notification is received, it's not shown. Let's show it ourselves. if (this.localNotificationsProvider.isAvailable()) { - const localNotif = { + const localNotif: ILocalNotification = { id: 1, - at: new Date(), - channelParams: { - channelID: 'notifications', - channelName: this.translate.instant('addon.notifications.notifications'), - importance: 4 // IMPORTANCE_HIGH + trigger: { + at: new Date() }, data: { notif: data.notif, diff --git a/src/providers/local-notifications.ts b/src/providers/local-notifications.ts index 85b5e30fc..5b64a5f64 100644 --- a/src/providers/local-notifications.ts +++ b/src/providers/local-notifications.ts @@ -24,24 +24,7 @@ import { CoreTextUtilsProvider } from './utils/text'; import { CoreUtilsProvider } from './utils/utils'; import { SQLiteDB } from '@classes/sqlitedb'; import { CoreConstants } from '@core/constants'; -import { Subject } from 'rxjs'; - -/** - * Local notification. - */ -export interface CoreILocalNotification extends ILocalNotification { - /** - * Number of milliseconds to turn the led on (Android only). - * @type {number} - */ - ledOnTime?: number; - - /** - * Number of milliseconds to turn the led off (Android only). - * @type {number} - */ - ledOffTime?: number; -} +import { Subject, Subscription } from 'rxjs'; /* * Generated class for the LocalNotificationsProvider provider. @@ -115,6 +98,8 @@ export class CoreLocalNotificationsProvider { ids: [], timeouts: [] }; + protected triggerSubscription: Subscription; + protected clickSubscription: Subscription; constructor(logger: CoreLoggerProvider, private localNotifications: LocalNotifications, private platform: Platform, private appProvider: CoreAppProvider, private utils: CoreUtilsProvider, private configProvider: CoreConfigProvider, @@ -126,16 +111,15 @@ export class CoreLocalNotificationsProvider { this.appDB.createTablesFromSchema(this.tablesSchema); platform.ready().then(() => { - localNotifications.on('trigger', (notification, state) => { + this.triggerSubscription = localNotifications.on('trigger').subscribe((notification: ILocalNotification) => { this.trigger(notification); }); - localNotifications.on('click', (notification, state) => { + this.clickSubscription = localNotifications.on('click').subscribe((notification: ILocalNotification) => { if (notification && notification.data) { this.logger.debug('Notification clicked: ', notification.data); - const data = textUtils.parseJSON(notification.data); - this.notifyClick(data); + this.notifyClick(notification.data); } }); }); @@ -175,7 +159,7 @@ export class CoreLocalNotificationsProvider { return Promise.reject(null); } - return this.localNotifications.getAllScheduled().then((scheduled) => { + return this.localNotifications.getScheduled().then((scheduled) => { const ids = []; scheduled.forEach((notif) => { @@ -291,12 +275,18 @@ export class CoreLocalNotificationsProvider { /** * Check if a notification has been triggered with the same trigger time. * - * @param {CoreILocalNotification} notification Notification to check. + * @param {ILocalNotification} notification Notification to check. * @return {Promise} Promise resolved with a boolean indicating if promise is triggered (true) or not. */ - isTriggered(notification: CoreILocalNotification): Promise { + isTriggered(notification: ILocalNotification): Promise { return this.appDB.getRecord(this.TRIGGERED_TABLE, { id: notification.id }).then((stored) => { - return stored.at === notification.at.getTime() / 1000; + let triggered = (notification.trigger && notification.trigger.at) || 0; + + if (typeof triggered != 'number') { + triggered = triggered.getTime(); + } + + return stored.at === triggered; }).catch(() => { return this.localNotifications.isTriggered(notification.id); }); @@ -426,12 +416,11 @@ export class CoreLocalNotificationsProvider { */ rescheduleAll(): Promise { // Get all the scheduled notifications. - return this.localNotifications.getAllScheduled().then((notifications) => { + return this.localNotifications.getScheduled().then((notifications) => { const promises = []; notifications.forEach((notification) => { // Convert some properties to the needed types. - notification.at = new Date(notification.at * 1000); notification.data = notification.data ? this.textUtils.parseJSON(notification.data, {}) : {}; promises.push(this.scheduleNotification(notification)); @@ -444,13 +433,13 @@ export class CoreLocalNotificationsProvider { /** * Schedule a local notification. * - * @param {CoreILocalNotification} notification Notification to schedule. Its ID should be lower than 10000000 and it should - * be unique inside its component and site. + * @param {ILocalNotification} notification Notification to schedule. Its ID should be lower than 10000000 and it should + * be unique inside its component and site. * @param {string} component Component triggering the notification. It is used to generate unique IDs. * @param {string} siteId Site ID. * @return {Promise} Promise resolved when the notification is scheduled. */ - schedule(notification: CoreILocalNotification, component: string, siteId: string): Promise { + schedule(notification: ILocalNotification, component: string, siteId: string): Promise { return this.getUniqueNotificationId(notification.id, component, siteId).then((uniqueId) => { notification.id = uniqueId; notification.data = notification.data || {}; @@ -460,9 +449,13 @@ export class CoreLocalNotificationsProvider { if (this.platform.is('android')) { notification.icon = notification.icon || 'res://icon'; notification.smallIcon = notification.smallIcon || 'res://icon'; - notification.led = notification.led || 'FF9900'; - notification.ledOnTime = notification.ledOnTime || 1000; - notification.ledOffTime = notification.ledOffTime || 1000; + + const led: any = notification.led || {}; + notification.led = { + color: led.color || 'FF9900', + on: led.on || 1000, + off: led.off || 1000 + }; } return this.scheduleNotification(notification); @@ -472,10 +465,10 @@ export class CoreLocalNotificationsProvider { /** * Helper function to schedule a notification object if it hasn't been triggered already. * - * @param {CoreILocalNotification} notification Notification to schedule. + * @param {ILocalNotification} notification Notification to schedule. * @return {Promise} Promise resolved when scheduled. */ - protected scheduleNotification(notification: CoreILocalNotification): Promise { + protected scheduleNotification(notification: ILocalNotification): Promise { // Check if the notification has been triggered already. return this.isTriggered(notification).then((triggered) => { // Cancel the current notification in case it gets scheduled twice. @@ -503,9 +496,9 @@ export class CoreLocalNotificationsProvider { * This function was used because local notifications weren't displayed when the app was in foreground in iOS10+, * but the issue was fixed in the plugin and this function is no longer used. * - * @param {CoreILocalNotification} notification Notification. + * @param {ILocalNotification} notification Notification. */ - showNotificationPopover(notification: CoreILocalNotification): void { + showNotificationPopover(notification: ILocalNotification): void { if (!notification || !notification.title || !notification.text) { // Invalid data. @@ -595,13 +588,13 @@ export class CoreLocalNotificationsProvider { * Function to call when a notification is triggered. Stores the notification so it's not scheduled again unless the * time is changed. * - * @param {CoreILocalNotification} notification Triggered notification. + * @param {ILocalNotification} notification Triggered notification. * @return {Promise} Promise resolved when stored, rejected otherwise. */ - trigger(notification: CoreILocalNotification): Promise { + trigger(notification: ILocalNotification): Promise { const entry = { id: notification.id, - at: parseInt(notification.at, 10) + at: notification.trigger && notification.trigger.at ? notification.trigger.at : Date.now() }; return this.appDB.insertRecord(this.TRIGGERED_TABLE, entry); diff --git a/upgrade.txt b/upgrade.txt index 695c38d0f..1e31823f2 100644 --- a/upgrade.txt +++ b/upgrade.txt @@ -1,6 +1,10 @@ This files describes API changes in the Moodle Mobile app, information provided here is intended especially for developers. +=== 3.6.1 === + +- The local notifications plugin was updated to its latest version. The new API has some breaking changes, so please check its documentation if you're using local notifications. Also, you need to run "npm install" to update the ionic-native library. + === 3.6.0 === - gulp was updated to v4. In order for gulp to work, you need to install gulp-cli: npm install -g gulp-cli From 5c85a3345ada9d82d8836d45b03c1b3aeabc482f Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 23 Jan 2019 13:20:25 +0100 Subject: [PATCH 3/4] MOBILE-2814 localnotif: Adapt emulator to the new API --- src/core/emulator/providers/helper.ts | 8 +- .../emulator/providers/local-notifications.ts | 552 +++++++++++++----- 2 files changed, 425 insertions(+), 135 deletions(-) diff --git a/src/core/emulator/providers/helper.ts b/src/core/emulator/providers/helper.ts index 53317da62..4c866ebc8 100644 --- a/src/core/emulator/providers/helper.ts +++ b/src/core/emulator/providers/helper.ts @@ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; import { CoreFileProvider } from '@providers/file'; import { CoreUtilsProvider } from '@providers/utils/utils'; import { File } from '@ionic-native/file'; -import { LocalNotifications } from '@ionic-native/local-notifications'; +import { LocalNotifications, ILocalNotification } from '@ionic-native/local-notifications'; import { CoreAppProvider } from '@providers/app'; import { CoreInitDelegate, CoreInitHandler } from '@providers/init'; import { CoreLoggerProvider } from '@providers/logger'; @@ -157,9 +157,11 @@ export class CoreEmulatorHelperProvider implements CoreInitHandler { // There is a new notification, show it. return getDataFn(notification).then((titleAndText) => { - const localNotif = { + const localNotif: ILocalNotification = { id: 1, - at: new Date(), + trigger: { + at: new Date() + }, title: titleAndText.title, text: titleAndText.text, data: { diff --git a/src/core/emulator/providers/local-notifications.ts b/src/core/emulator/providers/local-notifications.ts index d1685ec80..0936960e7 100644 --- a/src/core/emulator/providers/local-notifications.ts +++ b/src/core/emulator/providers/local-notifications.ts @@ -13,7 +13,7 @@ // limitations under the License. import { Injectable } from '@angular/core'; -import { LocalNotifications, ILocalNotification } from '@ionic-native/local-notifications'; +import { LocalNotifications, ILocalNotification, ILocalNotificationAction } from '@ionic-native/local-notifications'; import { CoreAppProvider } from '@providers/app'; import { CoreTextUtilsProvider } from '@providers/utils/text'; import { CoreUtilsProvider } from '@providers/utils/utils'; @@ -21,6 +21,7 @@ import { SQLiteDB } from '@classes/sqlitedb'; import { CoreConstants } from '@core/constants'; import { CoreConfigConstants } from '../../../configconstants'; import * as moment from 'moment'; +import { Subject, Observable } from 'rxjs'; /** * Emulates the Cordova Globalization plugin in desktop apps and in browser. @@ -76,16 +77,40 @@ export class LocalNotificationsMock extends LocalNotifications { protected appDB: SQLiteDB; protected scheduled: { [i: number]: any } = {}; protected triggered: { [i: number]: any } = {}; - protected observers; + protected observers: {[event: string]: Subject}; protected defaults = { - text: '', - title: '', - sound: '', - badge: 0, - id: 0, - data: undefined, - every: undefined, - at: undefined + actions : [], + attachments : [], + autoClear : true, + badge : null, + channel : null, + clock : true, + color : null, + data : null, + defaults : 0, + foreground : null, + group : null, + groupSummary : false, + icon : null, + id : 0, + launch : true, + led : true, + lockscreen : true, + mediaSession : null, + number : 0, + priority : 0, + progressBar : false, + silent : false, + smallIcon : 'res://icon', + sound : true, + sticky : false, + summary : null, + text : '', + timeoutAfter : false, + title : '', + trigger : { type : 'calendar' }, + vibrate : false, + wakeup : true }; constructor(private appProvider: CoreAppProvider, private utils: CoreUtilsProvider, private textUtils: CoreTextUtilsProvider) { @@ -96,20 +121,32 @@ export class LocalNotificationsMock extends LocalNotifications { // Initialize observers. this.observers = { - schedule: [], - trigger: [], - click: [], - update: [], - clear: [], - clearall: [], - cancel: [], - cancelall: [] + schedule: new Subject(), + trigger: new Subject(), + click: new Subject(), + update: new Subject(), + clear: new Subject(), + clearall: new Subject(), + cancel: new Subject(), + cancelall: new Subject(), }; } /** - * Cancels single or multiple notifications - * @param notificationId {any} A single notification id, or an array of notification ids. + * Adds a group of actions. + * + * @param {any} groupId The id of the action group + * @param {ILocalNotificationAction[]} actions The actions of this group + * @returns {Promise} + */ + addActions(groupId: any, actions: ILocalNotificationAction[]): Promise { + return Promise.reject('Not supported in desktop apps.'); + } + + /** + * Cancels single or multiple notifications. + * + * @param {any} notificationId A single notification id, or an array of notification ids. * @returns {Promise} Returns a promise when the notification is canceled */ cancel(notificationId: any): Promise { @@ -135,7 +172,11 @@ export class LocalNotificationsMock extends LocalNotifications { */ cancelAll(): Promise { return this.cancel(Object.keys(this.scheduled)).then(() => { - this.triggerEvent('cancelall', 'foreground'); + this.fireEvent('cancelall', { + event: 'cancelall', + foreground: true, + queued: false + }); }); } @@ -162,7 +203,7 @@ export class LocalNotificationsMock extends LocalNotifications { this.removeNotification(id); if (!omitEvent) { - this.triggerEvent(eventName, notification, 'foreground'); + this.fireEvent(eventName, notification); } } @@ -181,7 +222,8 @@ export class LocalNotificationsMock extends LocalNotifications { // Clear the notifications. notificationId.forEach((id) => { // Cancel only the notifications that aren't repeating. - if (this.scheduled[id] && this.scheduled[id].notification && !this.scheduled[id].notification.every) { + if (this.scheduled[id] && this.scheduled[id].notification && + (!this.scheduled[id].notification.trigger || !this.scheduled[id].notification.trigger.every)) { promises.push(this.cancelNotification(id, false, 'clear')); } }); @@ -195,7 +237,11 @@ export class LocalNotificationsMock extends LocalNotifications { */ clearAll(): Promise { return this.clear(Object.keys(this.scheduled)).then(() => { - this.triggerEvent('clearall', 'foreground'); + this.fireEvent('clearall', { + event: 'clearall', + foreground: true, + queued: false + }); }); } @@ -225,44 +271,251 @@ export class LocalNotificationsMock extends LocalNotifications { */ protected convertProperties(notification: ILocalNotification): ILocalNotification { if (notification.id) { - if (isNaN(notification.id)) { - notification.id = this.defaults.id; - } else { - notification.id = Number(notification.id); - } + notification.id = this.parseToInt('id', notification); } if (notification.title) { notification.title = notification.title.toString(); } - if (notification.text) { - notification.text = notification.text.toString(); - } - if (notification.badge) { - if (isNaN(notification.badge)) { - notification.badge = this.defaults.badge; - } else { - notification.badge = Number(notification.badge); - } + notification.badge = this.parseToInt('badge', notification); } - if (notification.at) { - if (typeof notification.at == 'object') { - notification.at = notification.at.getTime(); - } + if (notification.defaults) { + notification.defaults = this.parseToInt('defaults', notification); + } - notification.at = Math.round(notification.at / 1000); + if (typeof notification.timeoutAfter === 'boolean') { + notification.timeoutAfter = notification.timeoutAfter ? 3600000 : null; + } + + if (notification.timeoutAfter) { + notification.timeoutAfter = this.parseToInt('timeoutAfter', notification); } if (typeof notification.data == 'object') { notification.data = JSON.stringify(notification.data); } + this.convertPriority(notification); + this.convertTrigger(notification); + this.convertActions(notification); + this.convertProgressBar(notification); + return notification; } + /** + * Parse a property to number, returning the default value if not valid. + * Code extracted from the Cordova plugin. + * + * @param {string} prop Name of property to convert. + * @param {any} notification Notification where to search the property. + * @return {number} Converted number or default value. + */ + protected parseToInt(prop: string, notification: any): number { + if (isNaN(notification[prop])) { + return this.defaults[prop]; + } else { + return Number(notification[prop]); + } + } + + /** + * Convert the priority of a notification. + * Code extracted from the Cordova plugin. + * + * @param {any} notification Notification. + * @return {any} Notification. + */ + protected convertPriority(notification: any): any { + let prio = notification.priority || notification.prio || 0; + + if (typeof prio === 'string') { + prio = { min: -2, low: -1, high: 1, max: 2 }[prio] || 0; + } + + if (notification.foreground === true) { + prio = Math.max(prio, 1); + } + + if (notification.foreground === false) { + prio = Math.min(prio, 0); + } + + notification.priority = prio; + + return notification; + } + + /** + * Convert the actions of a notification. + * Code extracted from the Cordova plugin. + * + * @param {any} notification Notification. + * @return {any} Notification. + */ + protected convertActions(notification: any): any { + const actions = []; + + if (!notification.actions || typeof notification.actions === 'string') { + return notification; + } + + for (let i = 0, len = notification.actions.length; i < len; i++) { + const action = notification.actions[i]; + + if (!action.id) { + // Ignore action, it has no ID. + continue; + } + + action.id = action.id.toString(); + + actions.push(action); + } + + notification.actions = actions; + + return notification; + } + + /** + * Convert the trigger of a notification. + * Code extracted from the Cordova plugin. + * + * @param {any} notification Notification. + * @return {any} Notification. + */ + protected convertTrigger(notification: any): any { + const trigger = notification.trigger || {}; + let date = this.getValueFor(trigger, 'at', 'firstAt', 'date'); + + const dateToNum = (date: any): number => { + const num = typeof date == 'object' ? date.getTime() : date; + + return Math.round(num); + }; + + if (!notification.trigger) { + return notification; + } + + if (!trigger.type) { + trigger.type = trigger.center ? 'location' : 'calendar'; + } + + const isCal = trigger.type == 'calendar'; + + if (isCal && !date) { + date = this.getValueFor(notification, 'at', 'firstAt', 'date'); + } + + if (isCal && !trigger.every && notification.every) { + trigger.every = notification.every; + } + + if (isCal && (trigger.in || trigger.every)) { + date = null; + } + + if (isCal && date) { + trigger.at = dateToNum(date); + } + + if (isCal && trigger.firstAt) { + trigger.firstAt = dateToNum(trigger.firstAt); + } + + if (isCal && trigger.before) { + trigger.before = dateToNum(trigger.before); + } + + if (isCal && trigger.after) { + trigger.after = dateToNum(trigger.after); + } + + if (!trigger.count) { + trigger.count = trigger.every ? 5 : 1; + } + + if (!isCal) { + trigger.notifyOnEntry = !!trigger.notifyOnEntry; + trigger.notifyOnExit = trigger.notifyOnExit === true; + trigger.radius = trigger.radius || 5; + trigger.single = !!trigger.single; + } + + if (!isCal || trigger.at) { + delete trigger.every; + } + + delete notification.every; + delete notification.at; + delete notification.firstAt; + delete notification.date; + + notification.trigger = trigger; + + return notification; + } + + /** + * Convert the progress bar of a notification. + * Code extracted from the Cordova plugin. + * + * @param {any} notification Notification. + * @return {any} Notification. + */ + protected convertProgressBar(notification: any): any { + let cfg = notification.progressBar; + + if (cfg === undefined) { + return notification; + } + + if (typeof cfg === 'boolean') { + cfg = notification.progressBar = { enabled: cfg }; + } + + if (typeof cfg.enabled !== 'boolean') { + cfg.enabled = !!(cfg.value || cfg.maxValue || cfg.indeterminate !== null); + } + + cfg.value = cfg.value || 0; + + cfg.enabled = !!cfg.enabled; + + if (cfg.enabled && notification.clock === true) { + notification.clock = 'chronometer'; + } + + return notification; + } + + /** + * Not an official interface, however its possible to manually fire events. + * + * @param {string} eventName The name of the event. Available events: schedule, trigger, click, update, clear, clearall, cancel, + * cancelall. Custom event names are possible for actions + * @param {any} args Optional arguments + */ + fireEvent(eventName: string, args: any): void { + if (this.observers[eventName]) { + this.observers[eventName].next(args); + } + } + + /** + * Fire queued events once the device is ready and all listeners are registered. + * + * @returns {Promise} + */ + fireQueuedEvents(): Promise { + return Promise.resolve(); + } + /** * Get a notification object. * @@ -282,12 +535,21 @@ export class LocalNotificationsMock extends LocalNotifications { return Promise.resolve(this.getNotifications(undefined, true, true)); } + /** + * Gets the (platform specific) default settings. + * + * @returns {Promise} An object with all default settings + */ + getDefaults(): Promise { + return Promise.resolve(this.defaults); + } + /** * Get all the notification ids. * * @returns {Promise>} */ - getAllIds(): Promise> { + getIds(): Promise> { let ids = this.utils.mergeArraysWithoutDuplicates(Object.keys(this.scheduled), Object.keys(this.triggered)); ids = ids.map((id) => { return Number(id); @@ -304,9 +566,13 @@ export class LocalNotificationsMock extends LocalNotifications { protected getAllNotifications(): Promise { return this.appDB.getAllRecords(this.DESKTOP_NOTIFS_TABLE).then((notifications) => { notifications.forEach((notification) => { - notification.at = new Date(notification.at); + notification.trigger = { + at: new Date(notification.at) + }; notification.data = this.textUtils.parseJSON(notification.data); notification.triggered = !!notification.triggered; + + this.mergeWithDefaults(notification); }); return notifications; @@ -318,7 +584,7 @@ export class LocalNotificationsMock extends LocalNotifications { * * @returns {Promise>} */ - getAllScheduled(): Promise> { + getScheduled(): Promise> { return Promise.resolve(this.getNotifications(undefined, true, false)); } @@ -327,14 +593,14 @@ export class LocalNotificationsMock extends LocalNotifications { * * @returns {Promise>} */ - getAllTriggered(): Promise> { + getTriggered(): Promise> { return Promise.resolve(this.getNotifications(undefined, false, true)); } /** * Get a set of notifications. If ids isn't specified, return all the notifications. * - * @param {Number[]} [ids] Ids of notifications to get. If not specified, get all notifications. + * @param {number[]} [ids] Ids of notifications to get. If not specified, get all notifications. * @param {boolean} [getScheduled] Get scheduled notifications. * @param {boolean} [getTriggered] Get triggered notifications. * @return {ILocalNotification[]} List of notifications. @@ -362,13 +628,19 @@ export class LocalNotificationsMock extends LocalNotifications { } /** - * Get a scheduled notification object. + * Get the trigger "at" in milliseconds. * - * @param {any} notificationId The id of the notification to ge. - * @returns {Promise} + * @param {ILocalNotification} notification Notification to get the trigger from. + * @return {number} Trigger time. */ - getScheduled(notificationId: any): Promise { - return Promise.resolve(this.getNotifications([Number(notificationId)], true, false)[0]); + protected getNotificationTriggerAt(notification: ILocalNotification): number { + const triggerAt = (notification.trigger && notification.trigger.at) || 0; + + if (typeof triggerAt != 'number') { + return triggerAt.getTime(); + } + + return triggerAt; } /** @@ -384,16 +656,6 @@ export class LocalNotificationsMock extends LocalNotifications { return Promise.resolve(ids); } - /** - * Get a triggered notification object. - * - * @param {any} notificationId The id of the notification to get. - * @returns {Promise} - */ - getTriggered(notificationId: any): Promise { - return Promise.resolve(this.getNotifications([Number(notificationId)], false, true)[0]); - } - /** * Get the ids of triggered notifications. * @@ -407,12 +669,28 @@ export class LocalNotificationsMock extends LocalNotifications { return Promise.resolve(ids); } + /** + * Get the type (triggered, scheduled) for the notification. + * + * @param {number} id The ID of the notification. + * @return {Promise} + */ + getType(id: number): Promise { + if (this.scheduled[id]) { + return Promise.resolve('scheduled'); + } else if (this.triggered[id]) { + return Promise.resolve('triggered'); + } else { + return Promise.resolve('unknown'); + } + } + /** * Given an object of options and a list of properties, return the first property that exists. * Code extracted from the Cordova plugin. * * @param {ILocalNotification} notification Notification. - * @param {any} ...args List of keys to check. + * @param {any[]} ...args List of keys to check. * @return {any} First value found. */ protected getValueFor(notification: ILocalNotification, ...args: any[]): any { @@ -424,6 +702,16 @@ export class LocalNotificationsMock extends LocalNotifications { } } + /** + * Checks if a group of actions is defined. + * + * @param {any} groupId The id of the action group + * @returns {Promise} Whether the group is defined. + */ + hasActions(groupId: any): Promise { + return Promise.resolve(false); + } + /** * Informs if the app has the permission to show notifications. * @@ -433,6 +721,19 @@ export class LocalNotificationsMock extends LocalNotifications { return Promise.resolve(true); } + /** + * Check if a notification has a given type. + * + * @param {number} id The ID of the notification. + * @param {string} type The type of the notification. + * @returns {Promise} Promise resolved with boolean: whether it has the type. + */ + hasType(id: number, type: string): Promise { + return this.getType(id).then((notifType) => { + return type == notifType; + }); + } + /** * Checks presence of a notification. * @@ -512,26 +813,22 @@ export class LocalNotificationsMock extends LocalNotifications { * @return {ILocalNotification} Treated notification. */ protected mergeWithDefaults(notification: ILocalNotification): ILocalNotification { - notification.at = this.getValueFor(notification, 'at', 'firstAt', 'date'); - notification.text = this.getValueFor(notification, 'text', 'message'); - notification.data = this.getValueFor(notification, 'data', 'json'); + const values = this.getDefaults(); - if (notification.at === undefined || notification.at === null) { - notification.at = new Date(); + if (values.hasOwnProperty('sticky')) { + notification.sticky = this.getValueFor(notification, 'sticky', 'ongoing'); } - for (const key in this.defaults) { - if (notification[key] === null || notification[key] === undefined) { - if (notification.hasOwnProperty(key) && ['data', 'sound'].indexOf(key) > -1) { - notification[key] = undefined; - } else { - notification[key] = this.defaults[key]; - } - } + if (notification.sticky && notification.autoClear !== true) { + notification.autoClear = false; } - for (const key in notification) { - if (!this.defaults.hasOwnProperty(key)) { + Object.assign(values, notification); + + for (const key in values) { + if (values[key] !== null) { + notification[key] = values[key]; + } else { delete notification[key]; } } @@ -545,7 +842,7 @@ export class LocalNotificationsMock extends LocalNotifications { * @param {ILocalNotification} notification Clicked notification. */ protected notificationClicked(notification: ILocalNotification): void { - this.triggerEvent('click', notification, 'foreground'); + this.fireEvent('click', notification); // Focus the app. require('electron').ipcRenderer.send('focusApp'); } @@ -553,20 +850,16 @@ export class LocalNotificationsMock extends LocalNotifications { /** * Sets a callback for a specific event. * - * @param {string} eventName Name of the event. Events: schedule, trigger, click, update, clear, clearall, cancel, cancelall - * @param {any} callback Call back function. + * @param {string} eventName The name of the event. Events: schedule, trigger, click, update, clear, clearall, cancel, + * cancelall. Custom event names are possible for actions. + * @return {Observable} Observable */ - on(eventName: string, callback: any): void { - if (!this.observers[eventName] || typeof callback != 'function') { - // Event not supported, stop. - return; - } - this.observers[eventName].push(callback); + on(eventName: string): Observable { + return this.observers[eventName]; } /** * Parse a interval and convert it to a number of milliseconds (0 if not valid). - * Code extracted from the Cordova plugin. * * @param {string} every Interval to convert. * @return {number} Number of milliseconds of the interval- @@ -607,12 +900,13 @@ export class LocalNotificationsMock extends LocalNotifications { } /** - * Register permission to show notifications if not already granted. + * Removes a group of actions. * - * @returns {Promise} + * @param {any} groupId The id of the action group + * @returns {Promise} */ - registerPermission(): Promise { - return Promise.resolve(true); + removeActions(groupId: any): Promise { + return Promise.reject('Not supported in desktop apps.'); } /** @@ -625,6 +919,15 @@ export class LocalNotificationsMock extends LocalNotifications { return this.appDB.deleteRecords(this.DESKTOP_NOTIFS_TABLE, { id: id }); } + /** + * Request permission to show notifications if not already granted. + * + * @returns {Promise} + */ + requestPermission(): Promise { + return Promise.resolve(true); + } + /** * Schedules a single or multiple notifications. * @@ -656,13 +959,15 @@ export class LocalNotificationsMock extends LocalNotifications { }; this.storeNotification(notification, false); - if (Math.abs(moment().diff(notification.at * 1000, 'days')) > 15) { + const triggerAt = this.getNotificationTriggerAt(notification); + + if (Math.abs(moment().diff(triggerAt, 'days')) > 15) { // Notification should trigger more than 15 days from now, don't schedule it. return; } // Schedule the notification. - const toTriggerTime = notification.at * 1000 - Date.now(), + const toTriggerTime = triggerAt - Date.now(), trigger = (): void => { // Trigger the notification. this.triggerNotification(notification); @@ -672,10 +977,12 @@ export class LocalNotificationsMock extends LocalNotifications { this.storeNotification(notification, true); // Launch the trigger event. - this.triggerEvent('trigger', notification, 'foreground'); + this.fireEvent('trigger', notification); - if (notification.every && this.scheduled[notification.id] && !this.scheduled[notification.id].interval) { - const interval = this.parseInterval(notification.every); + if (notification.trigger.every && this.scheduled[notification.id] && + !this.scheduled[notification.id].interval) { + + const interval = this.parseInterval(notification.trigger.every); if (interval > 0) { this.scheduled[notification.id].interval = setInterval(trigger, interval); } @@ -685,10 +992,22 @@ export class LocalNotificationsMock extends LocalNotifications { this.scheduled[notification.id].timeout = setTimeout(trigger, toTriggerTime); // Launch the scheduled/update event. - this.triggerEvent(eventName, notification, 'foreground'); + this.fireEvent(eventName, notification); }); } + /** + * Overwrites the (platform specific) default settings. + * + * @param {any} defaults The defaults to set. + * @returns {Promise} + */ + setDefaults(defaults: any): Promise { + this.defaults = defaults; + + return Promise.resolve(); + } + /** * Store a notification in local DB. * @@ -702,7 +1021,7 @@ export class LocalNotificationsMock extends LocalNotifications { id : notification.id, title: notification.title, text: notification.text, - at: notification.at ? (typeof notification.at == 'object' ? notification.at.getTime() : notification.at) : 0, + at: this.getNotificationTriggerAt(notification), data: notification.data ? JSON.stringify(notification.data) : '{}', triggered: triggered ? 1 : 0 }; @@ -710,20 +1029,6 @@ export class LocalNotificationsMock extends LocalNotifications { return this.appDB.insertRecord(this.DESKTOP_NOTIFS_TABLE, entry); } - /** - * Trigger an event. - * - * @param {string} eventName Event name. - * @param {any[]} ...args List of parameters to pass. - */ - protected triggerEvent(eventName: string, ...args: any[]): void { - if (this.observers[eventName]) { - this.observers[eventName].forEach((callback) => { - callback.apply(null, args); - }); - } - } - /** * Trigger a notification, using the best method depending on the OS. * @@ -763,7 +1068,7 @@ export class LocalNotificationsMock extends LocalNotifications { } else { // Use Electron default notifications. const notifInstance = new Notification(notification.title, { - body: notification.text + body: notification.text }); // Listen for click events. @@ -773,23 +1078,6 @@ export class LocalNotificationsMock extends LocalNotifications { } } - /** - * Removes a callback of a specific event. - * - * @param {string} eventName Name of the event. Events: schedule, trigger, click, update, clear, clearall, cancel, cancelall - * @param {any} callback Call back function. - */ - un(eventName: string, callback: any): void { - if (this.observers[eventName] && this.observers[eventName].length) { - for (let i = 0; i < this.observers[eventName].length; i++) { - if (this.observers[eventName][i] == callback) { - this.observers[eventName].splice(i, 1); - break; - } - } - } - } - /** * Updates a previously scheduled notification. Must include the id in the options parameter. * From b4a0fe9a39cd180b171a6246d783a3a1fc9194d5 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 24 Jan 2019 09:26:34 +0100 Subject: [PATCH 4/4] MOBILE-2814 npm: Fix vulnerabilities --- package-lock.json | 777 +++++++++++++++++++++------------------------- package.json | 4 +- 2 files changed, 348 insertions(+), 433 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0d1a7b001..f5fe1237d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -211,35 +211,36 @@ "integrity": "sha512-tv3R0fvOsGRHQO8ILKElG2DAJESsMsRJqdZ7VkvzepXu2WAYYMNIK/YNNJESy9sQWfGruq9aj94d6p0NMOdtng==" }, "@ionic/app-scripts": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@ionic/app-scripts/-/app-scripts-3.1.9.tgz", - "integrity": "sha512-Vf2t9X+Zu5Q+lAKNOM0cwePKul5z1qWhcpyaI/Br7/1vs/ERF+iL4gJUbfYDYC47FFPdxJmhsHrfhnv+RoXJ/A==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@ionic/app-scripts/-/app-scripts-3.2.1.tgz", + "integrity": "sha512-HEGTPTpcw/qYIP6tbeLV84YABOxeSBhd+92vbz63sS3yowNe8CZxTn3QjyMVVd+Wn00lmFpiuQUclSW5C6o0sg==", "dev": true, "requires": { "@angular-devkit/build-optimizer": "0.0.35", - "autoprefixer": "^7.1.6", - "chalk": "^2.3.0", + "autoprefixer": "^7.2.6", + "chalk": "^2.4.0", "chokidar": "^1.7.0", - "clean-css": "^4.1.9", + "clean-css": "^4.1.11", "cross-spawn": "^5.1.0", - "express": "^4.16.2", + "dotenv-webpack": "^1.5.7", + "express": "^4.16.3", "fs-extra": "^4.0.2", "glob": "^7.1.2", "json-loader": "^0.5.7", - "node-sass": "4.7.2", + "node-sass": "^4.10.0", "os-name": "^2.0.1", - "postcss": "^6.0.13", + "postcss": "^6.0.21", "proxy-middleware": "^0.15.0", "reflect-metadata": "^0.1.10", "rollup": "0.50.0", "rollup-plugin-commonjs": "8.2.6", "rollup-plugin-node-resolve": "3.0.0", "source-map": "^0.6.1", - "tiny-lr": "^1.0.5", + "tiny-lr": "^1.1.1", "tslint": "^5.8.0", "tslint-eslint-rules": "^4.1.1", "uglify-es": "3.2.2", - "webpack": "3.8.1", + "webpack": "3.12.0", "ws": "3.3.2", "xml2js": "^0.4.19" } @@ -312,9 +313,9 @@ } }, "acorn": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", - "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, "acorn-dynamic-import": { @@ -347,9 +348,9 @@ } }, "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, "align-text": { @@ -668,9 +669,9 @@ } }, "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assign-symbols": { @@ -767,15 +768,15 @@ } }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "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 }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "babel-code-frame": { @@ -928,9 +929,9 @@ "dev": true }, "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, "binary-extensions": { @@ -1005,30 +1006,21 @@ } }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" } }, "brace-expansion": { @@ -1057,9 +1049,9 @@ "dev": true }, "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, "requires": { "resolve": "1.1.7" @@ -1099,14 +1091,15 @@ } }, "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -1320,15 +1313,15 @@ } }, "caniuse-lite": { - "version": "1.0.30000852", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000852.tgz", - "integrity": "sha512-NOuitABlrRbIpjtC8HdDnHL9Fi+yH5phDoXlXT7Im++48kll2bUps9dWWdAnBwqT/oEsjobuOLnnJCBjVqadCw==", + "version": "1.0.30000930", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000930.tgz", + "integrity": "sha512-KD+pw9DderBLB8CGqBzYyFWpnrPVOEjsjargU/CvkNyg60od3cxSPTcTeMPhxJhDbkQPWvOz5BAyBzNl/St9vg==", "dev": true }, "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "center-align": { @@ -1446,20 +1439,12 @@ } }, "clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "source-map": "0.5.x" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "source-map": "~0.6.0" } }, "cli-cursor": { @@ -1598,9 +1583,9 @@ } }, "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, "compare-version": { @@ -2394,15 +2379,6 @@ "which": "^1.2.9" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -2674,12 +2650,30 @@ "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", "dev": true }, + "dotenv-defaults": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-1.0.2.tgz", + "integrity": "sha512-iXFvHtXl/hZPiFj++1hBg4lbKwGM+t/GlvELDnRtOFdjXyWP7mubkVr+eZGWG62kdsbulXAef6v/j6kiWc/xGA==", + "dev": true, + "requires": { + "dotenv": "^6.2.0" + } + }, "dotenv-expand": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", "dev": true }, + "dotenv-webpack": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.7.0.tgz", + "integrity": "sha512-wwNtOBW/6gLQSkb8p43y0Wts970A3xtNiG/mpwj9MLUhtPCQG6i+/DSXXoNN7fbPCU/vQ7JjwGmgOeGZSSZnsw==", + "dev": true, + "requires": { + "dotenv-defaults": "^1.0.2" + } + }, "duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", @@ -2964,15 +2958,15 @@ } }, "electron-to-chromium": { - "version": "1.3.48", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", - "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=", + "version": "1.3.106", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.106.tgz", + "integrity": "sha512-eXX45p4q9CRxG0G8D3ZBZYSdN3DnrcZfrFvt6VUr1u7aKITEtRY/xwWzJ/UZcWXa7DMqPu/pYwuZ6Nm+bl0GmA==", "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -3228,9 +3222,9 @@ } }, "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "evp_bytestokey": { @@ -3284,14 +3278,14 @@ } }, "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "dev": true, "requires": { "accepts": "~1.3.5", "array-flatten": "1.1.1", - "body-parser": "1.18.2", + "body-parser": "1.18.3", "content-disposition": "0.5.2", "content-type": "~1.0.4", "cookie": "0.3.1", @@ -3308,10 +3302,10 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", @@ -3326,12 +3320,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true } } }, @@ -3812,13 +3800,13 @@ "dev": true }, "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -4397,21 +4385,6 @@ "globule": "^1.0.0" } }, - "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 - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", @@ -5160,40 +5133,37 @@ "dev": true }, "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true } } @@ -5313,25 +5283,13 @@ } }, "hash.js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz", - "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" + "minimalistic-assert": "^1.0.1" } }, "hmac-drbg": { @@ -5345,12 +5303,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", @@ -5379,18 +5331,18 @@ } }, "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", "dev": true }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "^0.2.0", + "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } @@ -5402,10 +5354,13 @@ "dev": true }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ieee754": { "version": "1.1.12", @@ -5483,9 +5438,9 @@ "integrity": "sha1-QLja9P16MRUL0AIWD2ZJbiKpjDw=" }, "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", "dev": true }, "is-absolute": { @@ -5637,25 +5592,6 @@ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, - "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.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", - "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-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -5714,12 +5650,6 @@ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -5816,9 +5746,9 @@ "dev": true }, "js-base64": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", - "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true }, "js-tokens": { @@ -5878,10 +5808,13 @@ "dev": true }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } }, "jsonfile": { "version": "4.0.0", @@ -5898,12 +5831,6 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -6049,9 +5976,9 @@ } }, "livereload-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", - "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", "dev": true }, "load-json-file": { @@ -6068,20 +5995,20 @@ } }, "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { - "big.js": "^3.1.3", + "big.js": "^5.2.2", "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "json5": "^1.0.1" } }, "locate-path": { @@ -6277,9 +6204,9 @@ } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -6633,13 +6560,14 @@ "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "media-typer": { @@ -6734,18 +6662,18 @@ "dev": true }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", "dev": true }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "~1.37.0" } }, "mimic-fn": { @@ -6893,9 +6821,9 @@ "dev": true }, "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", "dev": true }, "next-tick": { @@ -7089,9 +7017,9 @@ } }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { "assert": "^1.1.1", @@ -7101,7 +7029,7 @@ "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", - "events": "^1.0.0", + "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.0", @@ -7115,7 +7043,7 @@ "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", - "util": "^0.10.3", + "util": "^0.11.0", "vm-browserify": "0.0.4" } }, @@ -7126,9 +7054,9 @@ "dev": true }, "node-sass": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", - "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", + "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -7143,10 +7071,10 @@ "lodash.mergewith": "^4.6.0", "meow": "^3.7.0", "mkdirp": "^0.5.1", - "nan": "^2.3.2", - "node-gyp": "^3.3.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", "npmlog": "^4.0.0", - "request": "~2.79.0", + "request": "^2.88.0", "sass-graph": "^2.2.4", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" @@ -7267,9 +7195,9 @@ "dev": true }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { @@ -7562,16 +7490,17 @@ "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" }, "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-filepath": { @@ -7703,9 +7632,9 @@ } }, "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -7821,9 +7750,9 @@ "dev": true }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -7832,9 +7761,9 @@ } }, "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "preserve": { @@ -7870,13 +7799,13 @@ } }, "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.6.0" + "ipaddr.js": "1.8.0" } }, "proxy-middleware": { @@ -7904,16 +7833,17 @@ "dev": true }, "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { @@ -7944,9 +7874,9 @@ "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "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 }, "querystring": { @@ -8009,41 +7939,15 @@ "dev": true }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "dev": true, "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } } }, "read-config-file": { @@ -8255,37 +8159,37 @@ } }, "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", + "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.1.1", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", + "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.7", - "oauth-sign": "~0.8.1", - "qs": "~6.3.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1", - "uuid": "^3.0.0" + "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": { - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true } } @@ -8412,9 +8316,9 @@ } }, "rollup-pluginutils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz", - "integrity": "sha512-xB6hsRsjdJdIYWEyYUJy/3ki5g69wrf0luHPGNK3ZSocV6HLNfio59l3dZ3TL4xUwEKgROhFi9jOCt6c5gfUWw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", + "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", "dev": true, "requires": { "estree-walker": "^0.5.2", @@ -8752,19 +8656,10 @@ "kind-of": "^3.2.0" } }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { @@ -8929,18 +8824,18 @@ "dev": true }, "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "requires": { "readable-stream": "^2.0.1" } }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -8997,12 +8892,6 @@ "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -9079,9 +8968,9 @@ "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" }, "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", "dev": true }, "tar": { @@ -9163,13 +9052,19 @@ }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "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==", + "dev": true } } }, @@ -9241,11 +9136,12 @@ } }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "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==", "dev": true, "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" } }, @@ -9256,27 +9152,12 @@ "dev": true }, "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { - "glob": "^6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "glob": "^7.1.2" } }, "truncate-utf8-bytes": { @@ -9310,9 +9191,9 @@ "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==" }, "tslint": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", - "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", + "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -9326,7 +9207,7 @@ "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.12.1" + "tsutils": "^2.27.2" } }, "tslint-eslint-rules": { @@ -9349,9 +9230,9 @@ } }, "tsutils": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.1.tgz", - "integrity": "sha512-AE/7uzp32MmaHvNNFES85hhUDHFdFZp6OAiZcd6y4ZKKIg6orJTm8keYWBhIhrJQH3a4LzNKat7ZPXZt5aTf6w==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -9364,10 +9245,13 @@ "dev": true }, "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } }, "tweetnacl": { "version": "0.14.5", @@ -9691,9 +9575,9 @@ "dev": true }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" @@ -9711,9 +9595,9 @@ "dev": true }, "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "v8flags": { @@ -9898,23 +9782,24 @@ } }, "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.0", "braces": "^2.3.0", - "fsevents": "^1.1.2", + "fsevents": "^1.2.2", "glob-parent": "^3.1.0", "inherits": "^2.0.1", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", "normalize-path": "^2.1.1", "path-is-absolute": "^1.0.0", "readdirp": "^2.0.0", - "upath": "^1.0.0" + "upath": "^1.0.5" } }, "expand-brackets": { @@ -10194,15 +10079,15 @@ "integrity": "sha1-Om2bwVGWN3qQ+OKAP6UmIWWwRRA=" }, "webpack": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "dev": true, "requires": { "acorn": "^5.0.0", "acorn-dynamic-import": "^2.0.0", - "ajv": "^5.1.5", - "ajv-keywords": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", "async": "^2.1.2", "enhanced-resolve": "^3.4.0", "escope": "^3.6.0", @@ -10223,6 +10108,18 @@ "yargs": "^8.0.2" }, "dependencies": { + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -10235,6 +10132,12 @@ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -10256,6 +10159,18 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -10397,9 +10312,9 @@ } }, "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { "source-list-map": "^2.0.0", diff --git a/package.json b/package.json index 7b9a7e4ed..3d53b5171 100644 --- a/package.json +++ b/package.json @@ -118,9 +118,9 @@ "zone.js": "^0.8.26" }, "devDependencies": { - "@ionic/app-scripts": "3.1.9", - "electron-rebuild": "^1.8.1", + "@ionic/app-scripts": "^3.2.1", "electron-builder-lib": "^20.23.1", + "electron-rebuild": "^1.8.1", "gulp": "^4.0.0", "gulp-clip-empty-files": "^0.1.2", "gulp-flatten": "^0.4.0",