diff --git a/RELEASENOTES.json b/RELEASENOTES.json index 6e61498d..eefed5c8 100644 --- a/RELEASENOTES.json +++ b/RELEASENOTES.json @@ -1,10 +1,35 @@ { + "6.3.1": { + "🍾 features": [ + "Rich Notifications: Automatic Fetch & display of Favicons for all received URL pushes", + "YouTube Thumbnails: Pushed YouTube URLs include thumbnail of the linked video" + ], + "💎 improved": [ + "Show & focus the main window on tray menu click (Windows, Linux) (#57)" + ], + "👷 internals": [ + "Exposed internal tooling as atomic modules within development namespace (`@sidneys`)", + "Upgrades `node_modules`" + ] + }, + "6.2.7": { + "🚨 fixed": [ + "Fixes rendering of release notes after update completion" + ], + "💎 improved": [ + "Changed application configuration file to reflect application name", + "Added `.json` extension to application configuration file" + ], + "👷 internals": [ + "Upgrades `node_modules`" + ] + }, "6.2.6": { "🍾 features": [ "Adds package repositories for `Debian`, `elementary OS`, `Enterprise Linux`, `Fedora`, `openSUSE`, `LinuxMint`, `Ubuntu` (Linux) (#56)" ], "📒 documentation": [ - "Adds new section: `Installation via Linux package manager`" + "Adds `README.md` section: `Installation via Linux package manager`" ], "👷 internals": [ "Upgrades `node_modules`" diff --git a/app/scripts/main/components/application.js b/app/scripts/main/components/application.js index f16699bc..2762977f 100755 --- a/app/scripts/main/components/application.js +++ b/app/scripts/main/components/application.js @@ -23,6 +23,7 @@ const { app, BrowserWindow } = electron; * @constant */ const appRootPath = require('app-root-path'); +const logger = require('@sidneys/logger')({ write: true }); /** * Modules @@ -46,15 +47,14 @@ app.disableHardwareAcceleration(); */ /* eslint-disable no-unused-vars */ const globals = require(path.join(appRootPath['path'], 'app', 'scripts', 'main', 'components', 'globals')); -const logger = require(path.join(appRootPath.path, 'lib', 'logger'))({ write: true }); -const appMenu = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'menus', 'app-menu')); // jshint ignore:line -const mainWindow = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'windows', 'main-window')); // jshint ignore:line -const configurationManager = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'managers', 'configuration-manager')); // jshint ignore:line -const trayMenu = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'menus', 'tray-menu')); // jshint ignore:line -const updaterService = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'services', 'updater-service')); // jshint ignore:line -const powerService = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'services', 'power-service')); // jshint ignore:line -const debugService = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'services', 'debug-service')); // jshint ignore:line -const snoozerService = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'services', 'snoozer-service')); // jshint ignore:line +const appMenu = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'menus', 'app-menu')); +const mainWindow = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'windows', 'main-window')); +const configurationManager = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'managers', 'configuration-manager')); +const trayMenu = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'menus', 'tray-menu')); +const updaterService = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'services', 'updater-service')); +const powerService = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'services', 'power-service')); +const debugService = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'services', 'debug-service')); +const snoozerService = require(path.join(appRootPath.path, 'app', 'scripts', 'main', 'services', 'snoozer-service')); /* eslint-enable */ diff --git a/app/scripts/main/managers/configuration-manager.js b/app/scripts/main/managers/configuration-manager.js index 221a00f6..6d2258ec 100644 --- a/app/scripts/main/managers/configuration-manager.js +++ b/app/scripts/main/managers/configuration-manager.js @@ -8,7 +8,6 @@ */ const fs = require('fs-extra'); const path = require('path'); -const util = require('util'); /** * Modules @@ -35,8 +34,8 @@ const electronSettings = require('electron-settings'); * Internal * @constant */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); -const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')); +const logger = require('@sidneys/logger')({ write: true }); +const platformTools = require('@sidneys/platform-tools'); /** @@ -47,26 +46,22 @@ const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')) const appName = global.manifest.name; const appCurrentVersion = global.manifest.version; -/** - * Modules - * Configuration - */ -const autoLauncher = new AutoLaunch({ name: appName, mac: { useLaunchAgent: true } }); -/** @namespace electronSettings.delete */ -/** @namespace electronSettings.file */ -/** @namespace electronSettings.get */ -/** @namespace electronSettings.getAll */ -/** @namespace electronSettings.set */ -/** @namespace electronSettings.setAll */ - /** * Filesystem * @constant * @default */ const appLogDirectory = (new Appdirectory(appName)).userLogs(); +const appSettingsFilepath = path.join(path.dirname(electronSettings.file()), `${appName}.json`); const appSoundDirectory = path.join(appRootPath, 'sounds').replace('app.asar', 'app.asar.unpacked'); +/** + * Modules + * Configuration + */ +const autoLauncher = new AutoLaunch({ name: appName, mac: { useLaunchAgent: true } }); +electronSettings.setPath(appSettingsFilepath); + /** * @constant * @default @@ -94,7 +89,7 @@ let setAppTrayOnly = (trayOnly) => { if (!primaryWindow.getBounds()) { return; } - switch (platformHelper.type) { + switch (platformTools.type) { case 'darwin': if (trayOnly) { app.dock.hide(); @@ -112,9 +107,17 @@ let setAppTrayOnly = (trayOnly) => { }, defaultInterval); }; +/** @namespace electronSettings.delete */ +/** @namespace electronSettings.deleteAll */ +/** @namespace electronSettings.file */ +/** @namespace electronSettings.get */ +/** @namespace electronSettings.getAll */ +/** @namespace electronSettings.set */ +/** @namespace electronSettings.setAll */ +/** @namespace electronSettings.setPath */ + /** * Configuration Items - * @namespace */ let configurationItems = { /** diff --git a/app/scripts/main/menus/app-menu.js b/app/scripts/main/menus/app-menu.js index 603c0a4e..ca211f48 100644 --- a/app/scripts/main/menus/app-menu.js +++ b/app/scripts/main/menus/app-menu.js @@ -20,16 +20,9 @@ const { app, Menu, shell, webContents } = require('electron'); * External * @constant */ -const appRootPath = require('app-root-path')['path']; const Appdirectory = require('appdirectory'); - -/** - * Modules - * Internal - * @constant - */ -const isDebug = require(path.join(appRootPath, 'lib', 'is-env'))('debug'); -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: false }); +const isDebug = require('@sidneys/is-env')('debug'); +const logger = require('@sidneys/logger')({ write: false }); /** diff --git a/app/scripts/main/menus/tray-menu.js b/app/scripts/main/menus/tray-menu.js index a72df75f..2241e6f0 100644 --- a/app/scripts/main/menus/tray-menu.js +++ b/app/scripts/main/menus/tray-menu.js @@ -22,6 +22,8 @@ const { app, ipcMain, Menu, Tray, webContents } = require('electron'); * @constant */ const appRootPath = require('app-root-path')['path']; +const logger = require('@sidneys/logger')({ write: true }); +const platformTools = require('@sidneys/platform-tools'); /** * Modules @@ -29,9 +31,7 @@ const appRootPath = require('app-root-path')['path']; * @constant */ const configurationManager = require(path.join(appRootPath, 'app', 'scripts', 'main', 'managers', 'configuration-manager')); -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); const dialogProvider = require(path.join(appRootPath, 'app', 'scripts', 'main', 'providers', 'dialog-provider')); -const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')); /** @@ -53,26 +53,26 @@ const appSoundDirectory = global.filesystem.directories.sounds; * Tray icons * @constant */ -const trayIconDefault = path.join(appRootPath, 'app', 'images', `${platformHelper.type}-tray-icon-default${platformHelper.templateImageExtension(platformHelper.type)}`); -const trayIconTransparent = path.join(appRootPath, 'app', 'images', `${platformHelper.type}-tray-icon-transparent${platformHelper.templateImageExtension(platformHelper.type)}`); -const trayIconTransparentPause = path.join(appRootPath, 'app', 'images', `${platformHelper.type}-tray-icon-transparent-pause${platformHelper.templateImageExtension(platformHelper.type)}`); +const trayIconDefault = path.join(appRootPath, 'app', 'images', `${platformTools.type}-tray-icon-default${platformTools.templateImageExtension(platformTools.type)}`); +const trayIconTransparent = path.join(appRootPath, 'app', 'images', `${platformTools.type}-tray-icon-transparent${platformTools.templateImageExtension(platformTools.type)}`); +const trayIconTransparentPause = path.join(appRootPath, 'app', 'images', `${platformTools.type}-tray-icon-transparent-pause${platformTools.templateImageExtension(platformTools.type)}`); /** * Tray images * @constant */ -const trayMenuItemImageAppLaunchOnStartup = path.join(appRootPath, 'app', 'images', `tray-item-appLaunchOnStartup${platformHelper.menuItemImageExtension}`); -const trayMenuItemImageAppShowBadgeCount = path.join(appRootPath, 'app', 'images', `tray-item-appShowBadgeCount${platformHelper.menuItemImageExtension}`); -const trayMenuItemImageAppTrayOnly = path.join(appRootPath, 'app', 'images', `tray-item-appTrayOnly${platformHelper.menuItemImageExtension}`); -const trayMenuItemImagePushbulletHideNotificationBody = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletHideNotificationBody${platformHelper.menuItemImageExtension}`); -const trayMenuItemImagePushbulletRepeatRecentNotifications = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletRepeatRecentNotifications${platformHelper.menuItemImageExtension}`); -const trayMenuItemImagePushbulletSmsEnabled = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletSmsEnabled${platformHelper.menuItemImageExtension}`); -const trayMenuItemImagePushbulletSoundEnabled = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletSoundEnabled${platformHelper.menuItemImageExtension}`); -const trayMenuItemImagePushbulletSoundFile = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletSoundFile${platformHelper.menuItemImageExtension}`); -const trayMenuItemImageReconnect = path.join(appRootPath, 'app', 'images', `tray-item-reconnect${platformHelper.menuItemImageExtension}`); -const trayMenuItemImageReset = path.join(appRootPath, 'app', 'images', `tray-item-reset${platformHelper.menuItemImageExtension}`); -const trayMenuItemImageSnooze = path.join(appRootPath, 'app', 'images', `tray-item-snooze${platformHelper.menuItemImageExtension}`); -const trayMenuItemImageWindowTopmost = path.join(appRootPath, 'app', 'images', `tray-item-windowTopmost${platformHelper.menuItemImageExtension}`); +const trayMenuItemImageAppLaunchOnStartup = path.join(appRootPath, 'app', 'images', `tray-item-appLaunchOnStartup${platformTools.menuItemImageExtension}`); +const trayMenuItemImageAppShowBadgeCount = path.join(appRootPath, 'app', 'images', `tray-item-appShowBadgeCount${platformTools.menuItemImageExtension}`); +const trayMenuItemImageAppTrayOnly = path.join(appRootPath, 'app', 'images', `tray-item-appTrayOnly${platformTools.menuItemImageExtension}`); +const trayMenuItemImagePushbulletHideNotificationBody = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletHideNotificationBody${platformTools.menuItemImageExtension}`); +const trayMenuItemImagePushbulletRepeatRecentNotifications = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletRepeatRecentNotifications${platformTools.menuItemImageExtension}`); +const trayMenuItemImagePushbulletSmsEnabled = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletSmsEnabled${platformTools.menuItemImageExtension}`); +const trayMenuItemImagePushbulletSoundEnabled = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletSoundEnabled${platformTools.menuItemImageExtension}`); +const trayMenuItemImagePushbulletSoundFile = path.join(appRootPath, 'app', 'images', `tray-item-pushbulletSoundFile${platformTools.menuItemImageExtension}`); +const trayMenuItemImageReconnect = path.join(appRootPath, 'app', 'images', `tray-item-reconnect${platformTools.menuItemImageExtension}`); +const trayMenuItemImageReset = path.join(appRootPath, 'app', 'images', `tray-item-reset${platformTools.menuItemImageExtension}`); +const trayMenuItemImageSnooze = path.join(appRootPath, 'app', 'images', `tray-item-snooze${platformTools.menuItemImageExtension}`); +const trayMenuItemImageWindowTopmost = path.join(appRootPath, 'app', 'images', `tray-item-windowTopmost${platformTools.menuItemImageExtension}`); /** @@ -237,7 +237,7 @@ let createTrayMenuTemplate = () => { }, { id: 'appTrayOnly', - label: platformHelper.isMacOS ? 'Hide Dock Icon' : 'Minimize to Tray', + label: platformTools.isMacOS ? 'Hide Dock Icon' : 'Minimize to Tray', icon: trayMenuItemImageAppTrayOnly, type: 'checkbox', checked: configurationManager('appTrayOnly').get(), @@ -247,7 +247,7 @@ let createTrayMenuTemplate = () => { }, { id: 'appShowBadgeCount', - visible: platformHelper.isMacOS, + visible: platformTools.isMacOS, label: 'Dock Icon Count', icon: trayMenuItemImageAppShowBadgeCount, type: 'checkbox', @@ -357,7 +357,8 @@ class TrayMenu extends Tray { * Init */ init() { - this.setToolTip(appProductName); + logger.debug('init'); + this.setContextMenu(this.menu); /** @@ -366,15 +367,16 @@ class TrayMenu extends Tray { this.on('click', () => { logger.debug('TrayMenu#click'); - if (platformHelper.isWindows) { - const mainWindow = getMainWindow(); - if (!mainWindow) { return; } + if (platformTools.isMacOS) { return; } - if (mainWindow.isVisible()) { - mainWindow.hide(); - } else { - mainWindow.show(); - } + const mainWindow = getMainWindow(); + if (!mainWindow) { return; } + + if (mainWindow.isVisible()) { + mainWindow.hide(); + } else { + mainWindow.show(); + app.focus(); } }); diff --git a/app/scripts/main/providers/dialog-provider.js b/app/scripts/main/providers/dialog-provider.js index 76e8c58c..2d4ace11 100644 --- a/app/scripts/main/providers/dialog-provider.js +++ b/app/scripts/main/providers/dialog-provider.js @@ -23,15 +23,8 @@ const { app, BrowserWindow, dialog } = electron || electron.remote; * External * @constant */ -const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); -const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')); +const logger = require('@sidneys/logger')({ write: true }); +const platformTools = require('@sidneys/platform-tools'); /** @@ -55,6 +48,8 @@ const appProductName = global.manifest.productName; let showMessage = (title = appProductName, message = title, buttonList = ['OK'], type = 'info', callback = () => {}) => { logger.debug('showMessage'); + logger.debug('showMessage', 'title', title, 'message', message, 'buttonList', buttonList, 'type', type); + dialog.showMessageBox(BrowserWindow.getFocusedWindow(), { type: type, title: title, @@ -145,7 +140,7 @@ let file = (dialogTitle = appProductName, extensionList = ['*'], initialFolder = let error = (message, callback = () => {}) => { logger.debug('error'); - if (platformHelper.isMacOS) { + if (platformTools.isMacOS) { app.dock.bounce('critical'); } @@ -187,6 +182,8 @@ let info = (title, message, callback = () => {}) => { * @public */ let question = (title, message, callback = () => {}) => { + logger.debug('question'); + app.focus(); showMessage(title, message, ['Yes', 'No'], 'question', callback); diff --git a/app/scripts/main/providers/notification-provider.js b/app/scripts/main/providers/notification-provider.js index 02723c16..3876a542 100644 --- a/app/scripts/main/providers/notification-provider.js +++ b/app/scripts/main/providers/notification-provider.js @@ -1,13 +1,6 @@ 'use strict'; -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - /** * Modules * Electron @@ -22,14 +15,7 @@ const { Notification } = electron; * @constant */ const _ = require('lodash'); -const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); +const logger = require('@sidneys/logger')({ write: true }); /** diff --git a/app/scripts/main/services/debug-service.js b/app/scripts/main/services/debug-service.js index 902cf569..8fbb004f 100644 --- a/app/scripts/main/services/debug-service.js +++ b/app/scripts/main/services/debug-service.js @@ -1,13 +1,6 @@ 'use strict'; -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - /** * Modules * Electron @@ -21,21 +14,14 @@ const { app, webContents } = electron || electron.remote; * External * @constant */ -const appRootPath = require('app-root-path')['path']; +const isDebug = require('@sidneys/is-env')('debug'); +const isLivereload = require('@sidneys/is-env')('livereload'); +const logger = require('@sidneys/logger')({ write: true }); /* eslint-disable no-unused-vars */ const filesize = require('filesize'); const tryRequire = require('try-require'); /* eslint-enable */ -/** - * Modules - * Internal - * @constant - */ -const isDebug = require(path.join(appRootPath, 'lib', 'is-env'))('debug'); -const isLivereload = require(path.join(appRootPath, 'lib', 'is-env'))('livereload'); -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); - /** * @constant @@ -43,7 +29,6 @@ const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }) */ const defaultTimeout = 5000; - /** * Init */ @@ -58,7 +43,7 @@ let init = () => { if (isDebug) { logger.info('opening developer tools:', `"${contents.getURL()}"`); - contents.openDevTools({ mode: 'undocked' }); + contents.openDevTools(); } /** diff --git a/app/scripts/main/services/power-service.js b/app/scripts/main/services/power-service.js index 82fc02be..d4645e42 100644 --- a/app/scripts/main/services/power-service.js +++ b/app/scripts/main/services/power-service.js @@ -1,13 +1,6 @@ 'use strict'; -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - /** * Modules * Electron @@ -21,14 +14,7 @@ const { app } = electron || electron.remote; * External * @constant */ -const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); +const logger = require('@sidneys/logger')({ write: true }); /** @@ -48,22 +34,22 @@ let init = () => { * @listens Electron.powerMonitor#suspend */ electron.powerMonitor.on('suspend', () => { - logger.log('webview#suspend'); + logger.log('electron.powerMonitor#suspend'); }); /** * @listens Electron.powerMonitor#resume */ electron.powerMonitor.on('resume', () => { - logger.log('webview#resume'); + logger.log('electron.powerMonitor#resume'); let timeout = setTimeout(() => { - logger.log('webview#resume', 'relaunching app'); + logger.log('electron.powerMonitor#resume', 'relaunching app'); + + clearTimeout(timeout); app.relaunch(); app.exit(); - - clearTimeout(timeout); }, defaultTimeout); }); }; diff --git a/app/scripts/main/services/snoozer-service.js b/app/scripts/main/services/snoozer-service.js index a4ff659a..76069ea6 100644 --- a/app/scripts/main/services/snoozer-service.js +++ b/app/scripts/main/services/snoozer-service.js @@ -21,13 +21,13 @@ const { app, ipcMain } = require('electron'); * @constant */ const appRootPath = require('app-root-path')['path']; +const logger = require('@sidneys/logger')({ write: true }); /** * Modules * Internal * @constant */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); const notificationProvider = require(path.join(appRootPath, 'app', 'scripts', 'main', 'providers', 'notification-provider')); diff --git a/app/scripts/main/services/updater-service.js b/app/scripts/main/services/updater-service.js index 182416a7..72f0f7a5 100644 --- a/app/scripts/main/services/updater-service.js +++ b/app/scripts/main/services/updater-service.js @@ -25,6 +25,8 @@ const { app, BrowserWindow } = electron; const appRootPath = require('app-root-path')['path']; const removeMarkdown = require('remove-markdown'); const semverCompare = require('semver-compare'); +const logger = require('@sidneys/logger')({ write: true }); +const platformTools = require('@sidneys/platform-tools'); const { autoUpdater } = require('electron-updater'); /** @@ -32,10 +34,8 @@ const { autoUpdater } = require('electron-updater'); * Internal * @constant */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); const dialogProvider = require(path.join(appRootPath, 'app', 'scripts', 'main', 'providers', 'dialog-provider')); const notificationProvider = require(path.join(appRootPath, 'app', 'scripts', 'main', 'providers', 'notification-provider')); -const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')); const configurationManager = require(path.join(appRootPath, 'app', 'scripts', 'main', 'managers', 'configuration-manager')); /** @@ -95,7 +95,7 @@ class UpdaterService { if (process.defaultApp) { return; } // Do not run on Linux - if (platformHelper.isLinux) { return; } + if (platformTools.isLinux) { return; } this.autoUpdater = autoUpdater; this.isUpdating = false; @@ -174,7 +174,7 @@ class UpdaterService { /** * Show update progress (Windows) */ - if (platformHelper.isWindows) { + if (platformTools.isWindows) { const mainWindow = getMainWindow(); if (!mainWindow) { return; } @@ -186,19 +186,17 @@ class UpdaterService { * @listens Electron.AutoUpdater#update-downloaded */ this.autoUpdater.on('update-downloaded', (info) => { - logger.debug('UpdaterService#update-downloaded', info); - - logger.info('application update', 'download', 'complete'); + logger.info('UpdaterService#update-downloaded', info); this.isUpdating = true; const notification = notificationProvider.create({ title: `Update ready to install for ${appProductName}`, subtitle: info.version }); notification.show(); - if (Boolean(info.releaseNotes)) { + if (!!info.releaseNotes) { const releaseNotesPlaintext = removeMarkdown(info.releaseNotes); - logger.info('application update', 'release notes', releaseNotesPlaintext); + logger.info('UpdaterService#update-downloaded', 'releaseNotesPlaintext', releaseNotesPlaintext); storeAppChangelog(releaseNotesPlaintext); } @@ -223,6 +221,7 @@ class UpdaterService { /** * Bump last app version + * @static */ bumpAppLastVersion() { const appLastVersion = retrieveAppLastVersion(); @@ -241,14 +240,14 @@ class UpdaterService { if (wasUpdated) { storeAppLastVersion(appCurrentVersion); - const changelog = removeMarkdown(retrieveAppChangelog()); + const changelogPlaintext = retrieveAppChangelog(); + + logger.debug('bumpAppLastVersion', 'changelogPlaintext', changelogPlaintext); - if (Boolean(changelog)) { - dialogProvider.info(`${appProductName} has been updated to ${appCurrentVersion}.`, `Release Notes:${os.EOL}${os.EOL}${changelog}`); - logger.info(`${appProductName} has been updated to ${appCurrentVersion}.`, `Release Notes:${os.EOL}${os.EOL}${changelog}`); + if (!!changelogPlaintext) { + dialogProvider.info(`${appProductName} has been updated to ${appCurrentVersion}`, changelogPlaintext); } else { - dialogProvider.info(`Update complete`, `${appProductName} has been updated to ${appCurrentVersion}.`); - logger.info(`Update complete`, `${appProductName} has been updated to ${appCurrentVersion}.`); + dialogProvider.info(`${appProductName} has been updated to ${appCurrentVersion}`, `Update completed successfully.`); } const notification = notificationProvider.create({ title: `Update installed for ${appProductName}`, subtitle: appCurrentVersion }); diff --git a/app/scripts/main/windows/main-window.js b/app/scripts/main/windows/main-window.js index f4619349..e2ed4ffe 100644 --- a/app/scripts/main/windows/main-window.js +++ b/app/scripts/main/windows/main-window.js @@ -23,14 +23,8 @@ const { app, BrowserWindow, shell } = electron; * @constant */ const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); -const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')); +const logger = require('@sidneys/logger')({ write: true }); +const platformTools = require('@sidneys/platform-tools'); /** @@ -59,26 +53,26 @@ class MainWindow extends BrowserWindow { super({ acceptFirstMouse: true, autoHideMenuBar: true, - backgroundColor: platformHelper.isMacOS ? void 0 : '#95A5A6', + backgroundColor: platformTools.isMacOS ? void 0 : '#95A5A6', frame: true, - hasShadow: platformHelper.isMacOS ? true : void 0, + hasShadow: platformTools.isMacOS ? true : void 0, height: void 0, minHeight: 256, minWidth: 128, partition: 'persist:app', show: true, - thickFrame: platformHelper.isWindows ? true : void 0, + thickFrame: platformTools.isWindows ? true : void 0, title: windowTitle, - titleBarStyle: platformHelper.isMacOS ? 'hiddenInset' : void 0, - transparent: false, - vibrancy: platformHelper.isMacOS ? 'ultra-dark' : void 0, + titleBarStyle: platformTools.isMacOS ? 'hiddenInset' : void 0, + transparent: platformTools.isMacOS ? true : false, + vibrancy: platformTools.isMacOS ? 'ultra-dark' : void 0, webPreferences: { allowRunningInsecureContent: true, backgroundThrottling: true, experimentalCanvasFeatures: true, experimentalFeatures: true, nodeIntegration: true, - scrollBounce: platformHelper.isMacOS ? true : void 0, + scrollBounce: platformTools.isMacOS ? true : void 0, webaudio: true, webgl: false, webSecurity: false diff --git a/app/scripts/renderer/main.js b/app/scripts/renderer/main.js index 50918819..4f35c29c 100644 --- a/app/scripts/renderer/main.js +++ b/app/scripts/renderer/main.js @@ -23,6 +23,7 @@ const { ipcRenderer, remote } = electron; * @constant */ const appRootPath = require('app-root-path')['path']; +const logger = require('@sidneys/logger')({ write: true }); const parseDomain = require('parse-domain'); /** @@ -30,8 +31,7 @@ const parseDomain = require('parse-domain'); * Internal * @constant */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); -const domManager = require(path.join(appRootPath, 'lib', 'dom-manager')); +const domTools = require('@sidneys/dom-tools'); const configurationManager = remote.require(path.join(appRootPath, 'app', 'scripts', 'main', 'managers', 'configuration-manager')); @@ -93,7 +93,7 @@ let onOffline = () => { logger.debug('onOffline'); // Show Spinner - domManager.show(spinnerViewElement); + domTools.show(spinnerViewElement); }; /** @@ -106,7 +106,7 @@ let onOnline = () => { registerNavigation(); // Hide Spinner - domManager.hide(spinnerViewElement); + domTools.hide(spinnerViewElement); }; /** @@ -115,7 +115,7 @@ let onOnline = () => { let onLogin = () => { logger.debug('onLogin'); - domManager.setText(spinnerTextElement, 'logged in'); + domTools.setText(spinnerTextElement, 'logged in'); }; /** @@ -190,7 +190,7 @@ webviewViewElement.addEventListener('did-navigate-in-page', (event) => { webviewViewElement.addEventListener('dom-ready', () => { logger.debug('webviewViewElement#dom-ready'); - domManager.injectCSS(webviewViewElement, stylesheetFilepath); + domTools.injectCSS(webviewViewElement, stylesheetFilepath); }); /** @namespace event.args */ @@ -226,7 +226,7 @@ webviewViewElement.addEventListener('ipc-message', (event) => { webviewViewElement.addEventListener('load-commit', (event) => { logger.debug('webviewViewElement#load-commit'); - domManager.injectCSS(webviewViewElement, stylesheetFilepath); + domTools.injectCSS(webviewViewElement, stylesheetFilepath); if (!parseDomain(event.url)) { return; } @@ -239,16 +239,16 @@ webviewViewElement.addEventListener('load-commit', (event) => { case 'google': case 'youtube': case 'facebook': - domManager.setVisibility(supplementalMenuElement, true); + domTools.setVisibility(supplementalMenuElement, true); body.style.backgroundColor = 'rgb(236, 240, 240)'; break; case 'pushbullet': // Pushbullet 'help' if (subdomain.includes('help')) { - domManager.setVisibility(supplementalMenuElement, true); + domTools.setVisibility(supplementalMenuElement, true); } else { - domManager.setVisibility(supplementalMenuElement, false); + domTools.setVisibility(supplementalMenuElement, false); } // Pushbullet 'signin' @@ -289,5 +289,5 @@ window.addEventListener('load', () => { logger.debug('window#load'); // Add Platform CSS - domManager.addPlatformClass(); + domTools.addPlatformClass(); }); \ No newline at end of file diff --git a/app/scripts/renderer/pushbullet/clipboard.js b/app/scripts/renderer/pushbullet/clipboard.js index 7d7dc025..7b6a6c10 100644 --- a/app/scripts/renderer/pushbullet/clipboard.js +++ b/app/scripts/renderer/pushbullet/clipboard.js @@ -1,13 +1,6 @@ 'use strict'; -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - /** * Modules * Electron @@ -21,14 +14,7 @@ const { clipboard } = remote; * External * @constant */ -const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); +const logger = require('@sidneys/logger')({ write: true }); /** @@ -38,6 +24,7 @@ const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }) const defaultInterval = 2000; +/** @namespace pb.account.pro */ /** @namespace pb.e2e.encrypt */ @@ -184,7 +171,7 @@ let init = () => { /** - * @listens window#load + * @listens window:UIEvent#load */ window.addEventListener('load', () => { logger.debug('window#load'); diff --git a/app/scripts/renderer/pushbullet/device.js b/app/scripts/renderer/pushbullet/device.js index f0f9e217..027f8e52 100644 --- a/app/scripts/renderer/pushbullet/device.js +++ b/app/scripts/renderer/pushbullet/device.js @@ -1,26 +1,12 @@ 'use strict'; -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - /** * Modules * External * @constant */ -const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); +const logger = require('@sidneys/logger')({ write: true }); /** * @constant @@ -176,7 +162,7 @@ let init = () => { /** - * @listens window#load + * @listens window:UIEvent#load */ window.addEventListener('load', () => { logger.debug('window#load'); diff --git a/app/scripts/renderer/pushbullet/push.js b/app/scripts/renderer/pushbullet/push.js index 107fce4d..11f945c6 100644 --- a/app/scripts/renderer/pushbullet/push.js +++ b/app/scripts/renderer/pushbullet/push.js @@ -16,7 +16,6 @@ const path = require('path'); */ const electron = require('electron'); const { remote } = electron; -// const { nativeImage } = electron; /** * Modules @@ -26,7 +25,14 @@ const { remote } = electron; const _ = require('lodash'); const appRootPath = require('app-root-path')['path']; const fileUrl = require('file-url'); +const fileType = require('file-type'); +const logger = require('@sidneys/logger')({ write: true }); +const isDebug = require('@sidneys/is-env')('debug'); +const ICO = require('icojs'); +const imageDownloader = require('image-downloader'); +const jimp = require('jimp'); const moment = require('moment'); +const opn = require('opn'); const getYouTubeID = require('get-youtube-id'); /** @@ -34,11 +40,18 @@ const getYouTubeID = require('get-youtube-id'); * Internal * @constant */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); const configurationManager = remote.require(path.join(appRootPath, 'app', 'scripts', 'main', 'managers', 'configuration-manager')); const notificationProvider = remote.require(path.join(appRootPath, 'app', 'scripts', 'main', 'providers', 'notification-provider')); const pbSms = require(path.join(appRootPath, 'app', 'scripts', 'renderer', 'pushbullet', 'sms')); +/** + * Application + * @constant + * @default + */ +const appName = remote.getGlobal('manifest').name; +const appTemporaryDirectory = isDebug ? appRootPath : os.tmpdir(); + /** @namespace Audio */ /** @namespace pb.api.accounts */ /** @namespace pb.api.grants */ @@ -54,12 +67,14 @@ const pbSms = require(path.join(appRootPath, 'app', 'scripts', 'renderer', 'push /** - * Notification + * Notifications * @constant * @default */ const notificationInterval = 2000; const maxRecentNotifications = 5; +const faviconImageSize = 120; +const notificationImageSize = 88; /** @@ -148,19 +163,14 @@ let playSound = (file, callback = () => {}) => { /** * @listens audio:MediaEvent#error */ - AudioElement.addEventListener('error', (err) => { - return callback(err); - }); - - /** - * @listens audio:MediaEvent#ended - */ - AudioElement.addEventListener('ended', () => { - callback(null, url); + AudioElement.addEventListener('error', (error) => { + logger.error('playSound', error); + callback(error); }); AudioElement.play().then(() => { - logger.debug('playSound', 'complete'); + logger.debug('playSound', url); + callback(null); }); }; @@ -236,9 +246,9 @@ let generateImageUrl = (push) => { if (push['type'] === 'link') { // YouTube if (getYouTubeID(push['url'])) { - iconWebsite = `https://img.youtube.com/vi/${getYouTubeID(push['url'])}/hqdefault.jpg`; + iconWebsite = `http://img.youtube.com/vi/${getYouTubeID(push['url'])}/hqdefault.jpg`; } else { - iconWebsite = `https://icons.better-idea.org/icon?size=128&url=${push['url']}`; + iconWebsite = `http://icons.better-idea.org/icon?fallback_icon_color=4AB367&formats=ico,png&size=1..${faviconImageSize}..200&url=${push['url']}`; } } @@ -407,86 +417,33 @@ let decoratePushbulletPush = (push) => { }; /** - * Create Notification from Push Objects - * @param {Object} push - Push Object + * Show Notification + * @param {Object} notificationOptions - NotificationConfiguration + * @param {Object} pushObject - Pushbullet Push */ -let createNotification = (push) => { - logger.debug('createNotification'); - - /** - * Decorate Push object - */ - push = decoratePushbulletPush(push); - +let showNotification = (notificationOptions, pushObject) => { /** - * Read Settings + * Show Notification */ - - /** - * Create Options - */ - const options = { - body: push.body, - icon: push.icon, - subtitle: push.subtitle, - tag: push.iden, - title: push.title, - url: push.url - }; - - /** - * Body - */ - const hideNotificationBody = retrievePushbulletHideNotificationBody(); - if (hideNotificationBody) { - options.body = void 0; - } - - /** - * Body - */ - if (push.type === 'sms_changed') { - options.hasReply = true; - options.replyPlaceholder = 'Your SMS Reply'; - } - - /** - * Sound - */ - const soundEnabled = retrievePushbulletSoundEnabled(); - if (soundEnabled) { - const soundFile = retrievePushbulletSoundFile(); - playSound(soundFile, (error) => { - if (error) { logger.error(error); } - }); - } - - /** - * Create - */ - const notification = notificationProvider.create(options); - + const notification = notificationProvider.create(notificationOptions); /** * @listens notification:PointerEvent#click */ notification.on('click', () => { logger.debug('notification#click'); - // Open url - if (push.url) { - remote.shell.openExternal(push.url, { activate: false }, () => {}); + if (notificationOptions.url) { + opn(notificationOptions.url, { wait: false }); } // Dismiss push - dismissPushbulletPush(push); + dismissPushbulletPush(pushObject); }); /** * @listens notification:PointerEvent#close */ - notification.on('close', () => { - logger.debug('notification#close'); - }); + notification.on('close', () => logger.debug('notification#close')); /** * @listens notification:PointerEvent#reply @@ -496,32 +453,152 @@ let createNotification = (push) => { pbSms.sendReply(reply, (error) => { if (error) { - return logger.error(error); + logger.error('notification#reply', error); } - - logger.info('sms reply sent', reply); }); }); /** * @listens notification:PointerEvent#error - * @param {Error} error - Error */ - notification.on('error', (error) => { - logger.error('notification#error', error); - }); + notification.on('error', (error) => logger.error('notification#error', error)); /** * @listens notification:PointerEvent#show */ - notification.on('show', (event) => { - logger.debug('notification#show', event); - }); + notification.on('show', (event) => logger.debug('notification#show', event)); // Show notification.show(); }; +/** + * Write & resize image + * @param {Buffer|*} source - Source image + * @param {String} target - Target file + * @param {Function=} callback - Callback + */ +let writeResizeImage = (source, target, callback = () => {}) => { + logger.debug('writeResizeImage'); + + jimp.read(source, (error, result) => { + if (error) { + logger.error('writeResizeImage', 'jimp.read', error); + callback(error); + return; + } + + result.resize(notificationImageSize, jimp.AUTO).write(target, (error) => { + if (error) { + logger.error('writeResizeImage', 'result.resize', error); + callback(error); + return; + } + + callback(null, target); + }); + }); +}; + +/** + * Create Notification from Push Objects + * @param {Object} push - Push Object + */ +let convertPushToNotification = (push) => { + logger.debug('convertPushToNotification'); + + /** + * Decorate Push object + */ + push = decoratePushbulletPush(push); + + /** + * Create Options + */ + const notificationOptions = { + body: push.body, + icon: push.icon, + subtitle: push.subtitle, + tag: push.iden, + title: push.title, + url: push.url + }; + + /** + * Body + */ + const hideNotificationBody = retrievePushbulletHideNotificationBody(); + if (hideNotificationBody) { + notificationOptions.body = void 0; + } + + /** + * Body + */ + if (push.type === 'sms_changed') { + notificationOptions.hasReply = true; + notificationOptions.replyPlaceholder = 'Your SMS Reply'; + } + + /** + * Fetch Favicon + */ + const imageUrl = push.icon; + const imageFilepath = path.join(appTemporaryDirectory, `${appName}.push.icon.png`); + + imageDownloader.image({ url: imageUrl, dest: imageFilepath }) + .then(({ image }) => { + const imageBuffer = image; + const imageType = fileType(imageBuffer); + const isIco = ICO.isICO(imageBuffer); + const isPng = imageType.mime === 'image/png'; + const isJpeg = imageType.mime === 'image/jpg' || imageType.mime === 'image/jpeg'; + + logger.debug('convertPushToNotification', 'imageUrl', imageUrl); + logger.debug('convertPushToNotification', 'imageType', imageType); + + /** + * .PNG + */ + if (isPng || isJpeg) { + writeResizeImage(imageBuffer, imageFilepath, (error, target) => { + if (error) { return; } + + if (retrievePushbulletSoundEnabled()) { + playSound(retrievePushbulletSoundFile()); + } + notificationOptions.icon = target; + showNotification(notificationOptions, push); + }); + + return; + } + + /** + * .ICO -> .PNG + */ + if (isIco) { + ICO.parse(imageBuffer, 'image/png').then(imageList => { + const imageMaximum = imageList[imageList.length - 1]; + // noinspection JSCheckFunctionSignatures + writeResizeImage(Buffer.from(imageMaximum.buffer), imageFilepath, (error, target) => { + if (error) { return; } + + if (retrievePushbulletSoundEnabled()) { + playSound(retrievePushbulletSoundFile()); + } + notificationOptions.icon = target; + showNotification(notificationOptions, push); + }); + }); + } + + }) + .catch((error) => { + logger.error('convertPushToNotification', error); + }); +}; + /** * Test if a notification should be shown for this push * @param {Object} push - Push Object @@ -534,7 +611,7 @@ let shouldShowPush = (push) => { if (push.hasOwnProperty('active')) { // Push is not active if (Boolean(push.active) === false) { - logger.debug('shouldShowPush', false, 'push is not active'); + // logger.debug('shouldShowPush', false, 'push is not active'); return false; } } @@ -543,7 +620,7 @@ let shouldShowPush = (push) => { if (push.direction === 'self') { // Don't show if Push was dismissed if (Boolean(push.dismissed) === true) { - logger.debug('shouldShowPush', false, 'push was dismissed already'); + // logger.debug('shouldShowPush', false, 'push was dismissed already'); return false; } } @@ -553,17 +630,17 @@ let shouldShowPush = (push) => { // Don't show if SMS is disabled const pushbulletSmsEnabled = retrievePushbulletSmsEnabled(); if (!pushbulletSmsEnabled) { - logger.debug('shouldShowPush', false, 'sms mirroring is not enabled'); + // logger.debug('shouldShowPush', false, 'sms mirroring is not enabled'); return false; } // Don't show if SMS has no attached notifications if (push.notifications.length === 0) { - logger.debug('shouldShowPush', false, 'sms push is empty'); + // logger.debug('shouldShowPush', false, 'sms push is empty'); return false; } } - logger.debug('shouldShowPush:', true, 'type:', push.type); + // logger.debug('shouldShowPush:', true, 'type:', push.type); return true; }; @@ -579,7 +656,7 @@ let showPush = (push) => { const isSnoozing = (Date.now() < remote.getGlobal('snoozeUntil')); if (!isSnoozing && shouldShowPush(push)) { - createNotification(push); + convertPushToNotification(push); } }; @@ -629,7 +706,6 @@ let getRecentPushesList = (queueLimit = 0) => { * @param {Boolean} ignoreDate - Ignore time of push, always show * @param {Boolean} updateBadgeCount - Update badge counter * @param {Function=} callback - Callback - * @returns {*} */ let enqueuePush = (pushes, ignoreDate = false, updateBadgeCount = true, callback = () => {}) => { logger.debug('enqueuePush'); @@ -638,7 +714,8 @@ let enqueuePush = (pushes, ignoreDate = false, updateBadgeCount = true, callback if (pushes.length === 0) { logger.warn('enqueuePush', 'pushes list was empty'); - return callback(null, 0); + callback(null, 0); + return; } let nextPushesList = pushes; @@ -689,10 +766,11 @@ let enqueueRecentPushes = (callback = () => {}) => { const pushesList = getRecentPushesList(maxRecentNotifications); - enqueuePush(pushesList, true, false, (err, count) => { - if (err) { - logger.error('enqueueRecentPushes', err); - return callback(err); + enqueuePush(pushesList, true, false, (error, count) => { + if (error) { + logger.error('enqueueRecentPushes', error); + callback(error); + return; } callback(null, count); @@ -711,7 +789,7 @@ let init = () => { /** - * @listens window#load + * @listens window:UIEvent#load */ window.addEventListener('load', () => { logger.debug('window#load'); diff --git a/app/scripts/renderer/pushbullet/sms.js b/app/scripts/renderer/pushbullet/sms.js index 90ada806..1ecf5129 100644 --- a/app/scripts/renderer/pushbullet/sms.js +++ b/app/scripts/renderer/pushbullet/sms.js @@ -14,14 +14,7 @@ const path = require('path'); * @constant */ const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); - +const logger = require('@sidneys/logger')({ write: true }); /** @namespace onecup.refresh */ /** @namespace pb.api.accounts */ diff --git a/app/scripts/renderer/webviews/pushbullet-webview.js b/app/scripts/renderer/webviews/pushbullet-webview.js index cd24ef93..a28e3ac1 100644 --- a/app/scripts/renderer/webviews/pushbullet-webview.js +++ b/app/scripts/renderer/webviews/pushbullet-webview.js @@ -32,10 +32,10 @@ const electronEditorContextMenu = remote.require('electron-editor-context-menu') * Internal * @constant */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); -const domManager = require(path.join(appRootPath, 'lib', 'dom-manager')); -const isDebug = require(path.join(appRootPath, 'lib', 'is-env'))('debug'); -const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')); +const logger = require('@sidneys/logger')({ write: true }); +const domTools = require('@sidneys/dom-tools'); +const isDebug = require('@sidneys/is-env')('debug'); +const platformTools = require('@sidneys/platform-tools'); const configurationManager = remote.require(path.join(appRootPath, 'app', 'scripts', 'main', 'managers', 'configuration-manager')); /* eslint-disable no-unused-vars */ const pbClipboard = require(path.join(appRootPath, 'app', 'scripts', 'renderer', 'pushbullet', 'clipboard')); @@ -48,7 +48,7 @@ const pbPush = require(path.join(appRootPath, 'app', 'scripts', 'renderer', 'pus * @constant * @default */ -const appIcon = path.join(appRootPath, 'icons', platformHelper.type, `icon${platformHelper.iconImageExtension(platformHelper.type)}`); +const appIcon = path.join(appRootPath, 'icons', platformTools.type, `icon${platformTools.iconImageExtension(platformTools.type)}`); /** * @constant @@ -416,7 +416,7 @@ window.addEventListener('online', () => { window.addEventListener('load', () => { logger.debug('window#load'); - domManager.addPlatformClass(); + domTools.addPlatformClass(); init(); }); diff --git a/gulpfile.babel.js b/gulpfile.babel.js index fa1de2ce..4f9b568e 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -24,6 +24,7 @@ const { app } = electron; const appRootPath = require('app-root-path'); const electronConnect = require('electron-connect'); const gulp = require('gulp'); +const logger = require('@sidneys/logger')({ write: true }); const minimist = require('minimist'); @@ -38,7 +39,6 @@ appRootPath.setPath(path.join(__dirname)); * Internal * @constant */ -const logger = require(path.join(appRootPath.path, 'lib', 'logger'))({ write: true }); const packageJson = require(path.join(appRootPath.path, 'package.json')); diff --git a/lib/build.js b/lib/build.js deleted file mode 100644 index 8414f8e1..00000000 --- a/lib/build.js +++ /dev/null @@ -1,360 +0,0 @@ -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const child_process = require('child_process'); -const fs = require('fs-extra'); -const path = require('path'); - -/** - * Modules - * External - * @constant - */ -const _ = require('lodash'); -const appRootPath = require('app-root-path')['path']; -const globby = require('globby'); -const hashFiles = require('hash-files'); -const minimist = require('minimist'); -const YAML = require('yamljs'); - -/** - * Modules - * Internal - * @constant - */ -const deploy = require(path.join(appRootPath, 'lib', 'deploy')); -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ timestamp: false }); -const packageJson = require(path.join(appRootPath, 'package.json')); -const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')); -const releasenotes = require(path.join(appRootPath, 'lib', 'releasenotes')); - - -/** - * Application - * @constant - * @default - */ -const appProductName = packageJson.productName || packageJson.name; - -/** - * Filesystem - * @constant - * @default - */ -const electronBuildScript = path.join(appRootPath, 'node_modules', '.bin', 'build'); -const installerDirectory = path.join(appRootPath, packageJson.build.directories.output); - - -/** - * Glob patterns for application files - * @see [electron-builder](https://www.electron.build/file-patterns) - * @constant - * @default - */ -const basePatternList = ['**/*']; -const exclusionPatternList = packageJson.build.files; - - -/** @namespace fs.renameSync */ - -/** - * Renames installers to -- - */ -let renameArtifacts = () => { - logger.debug('renameArtifacts'); - - // Get release configuration - const releaseConfiguration = deploy.getConfiguration(); - - if (!releaseConfiguration) { - logger.error('releaseConfiguration required'); - return; - } - - - // Lookup assets - releaseConfiguration.assets.forEach((assetFilepath) => { - let currentExtension = path.extname(assetFilepath); - let currentDirectory = path.dirname(assetFilepath); - - let newFilename = path.basename(assetFilepath, currentExtension); - // convert: lowercase - newFilename = _.toLower(newFilename); - // replace: productName > name - newFilename = newFilename.replace(packageJson.productName, packageJson.name); - // remove: version - // newFilename = _(newFilename).replace(packageJson.version, ''); - // replace: whitespace -> underscore -> hyphen - newFilename = newFilename.replace(/ /g, '_'); - newFilename = newFilename.replace(/_/g, '-'); - // remove: consecutive special characters - newFilename = newFilename.replace(/\s\s+/g, ' '); - newFilename = newFilename.replace(/[-]+/g, '-'); - newFilename = newFilename.replace(/[_]+/g, '_'); - // trim: special characters - newFilename = _(newFilename).trim(' '); - newFilename = _(newFilename).trim('-'); - newFilename = _(newFilename).trim('_'); - - let newFilepath = path.join(currentDirectory, `${newFilename}${currentExtension}`); - - if (assetFilepath !== newFilepath) { - fs.renameSync(assetFilepath, newFilepath); - logger.debug('renamed installer', `'${path.basename(assetFilepath)}' --> '${newFilename}${currentExtension}'`); - } - }); -}; - -/** @namespace fs.mkdirpSync */ -/** @namespace fs.writeFileSync */ - -/** - * Generates Release Metadata (latest-mac.json, latest.yml) - */ -let writeMetadata = () => { - logger.debug('writeMetadata'); - - // Get release configuration - const releaseConfiguration = deploy.getConfiguration(); - - if (!releaseConfiguration) { - logger.error('releaseConfiguration required'); - return; - } - - // Lookup assets - releaseConfiguration.assets.forEach((assetFilepath) => { - /** - * Write latest-mac.json - */ - if (assetFilepath.includes('-mac.zip')) { - const content = { - releaseDate: new Date().toISOString(), - releaseName: releaseConfiguration.name, - releaseNotes: releaseConfiguration.notes, - url: `https://github.com/${releaseConfiguration.owner}/${releaseConfiguration.repo}/releases/download/${releaseConfiguration.tag}/${path.basename(assetFilepath)}`, - version: _(releaseConfiguration.tag).trim('v') - }; - - const file = path.join(installerDirectory, 'github', 'latest-mac.json'); - - fs.mkdirpSync(path.dirname(file)); - fs.writeFileSync(file, JSON.stringify(content, null, 2)); - - logger.debug('writeMetadata', path.relative(appRootPath, file)); - } - - /** - * Write latest.yml - */ - if (path.extname(assetFilepath) === '.exe') { - const content = { - releaseDate: new Date().toISOString(), - releaseName: releaseConfiguration.name, - releaseNotes: releaseConfiguration.notes, - githubArtifactName: path.basename(assetFilepath), - path: path.basename(assetFilepath), - sha2: hashFiles.sync({ algorithm: 'sha256', files: [assetFilepath] }), - version: _(releaseConfiguration.tag).trim('v') - }; - - const file = path.join(installerDirectory, 'latest.yml'); - - fs.mkdirpSync(path.dirname(file)); - fs.writeFileSync(file, YAML.stringify(content, 2)); - - logger.debug('writeMetadata', path.relative(appRootPath, file)); - } - }); -}; - - -/** - * Main, wraps electron-builder - * @param {Array=} targetList - Platforms to build - */ -let buildPlatform = (targetList) => { - logger.debug('main'); - - targetList.forEach((targetName) => { - logger.info('building platform', targetName); - - targetName = targetName === 'darwin' ? 'macos' : targetName; - targetName = targetName === 'win32' ? 'windows' : targetName; - child_process.execSync(`${electronBuildScript} --${targetName} --ia32 --x64`, { - cwd: appRootPath, - stdio: [0, 1, 2] - }); - }); - - // Rename - logger.info('renaming artifacts', `for ${targetList.length} platforms`); - renameArtifacts(); -}; - -/** @namespace fs.existsSync */ -/** @namespace fs.ensureDirSync */ -/** @namespace fs.unlinkSync */ - -/** - * Copy instead of overwriting - * @param {Array=} platformNameList - List of platforms to build - * @param {Boolean} skipModules - Do not copy 'node_modules' folder - * @param {function(*)} callback - Platforms to build - */ -let copyPlatform = (platformNameList, skipModules, callback = () => {}) => { - logger.debug('copyPlatform'); - - const copyPatternList = basePatternList.concat(exclusionPatternList); - const deletePatternList = basePatternList; - - if (skipModules) { - copyPatternList.push('!**/node_modules/**/*'); - deletePatternList.push('!**/node_modules/**/*'); - logger.info('copying', `skipping copy of 'node_modules'`); - } - - - platformNameList.forEach((platformName) => { - logger.info('copying', platformName); - - platformName = platformName === 'darwin' ? 'macos' : platformName; - platformName = platformName === 'win32' ? 'windows' : platformName; - - /** - * macOS - */ - - if (platformName !== 'macos') { - logger.warn('copying only supported on platform macOS'); - return; - } - - // Lookup electron app path within package - const applicationPackage = path.join(installerDirectory, 'mac', `${appProductName}.app`); - const packageDirectory = path.join(applicationPackage, 'Contents', 'Resources', 'app'); - - if (!fs.existsSync(applicationPackage)) { - callback(new Error(`could not locate ${applicationPackage}`)); - return; - } - - // Create helper directory for deletion glob to (match at least 1) - fs.ensureDirSync(packageDirectory); - - if (!fs.existsSync(packageDirectory)) { - callback(new Error(`could not locate Electron './app' folder within ${applicationPackage}`)); - return; - } - - // Create helper directory for deletion glob to (match at least 1) - fs.ensureDirSync(path.join(packageDirectory, 'temp')); - - // Delete: start - logger.debug('copyPlatform', 'delete', 'deletePatternList', deletePatternList); - logger.info('copying', 'looking up files to delete'); - globby(deletePatternList, { cwd: packageDirectory, dot: false }).then((filepathList) => { - - logger.info('copying', `starting deletion of ${filepathList.length} files`); - filepathList.forEach((filepath, filepathIndex) => { - const source = path.join(packageDirectory, filepath); - logger.debug('copyPlatform', 'delete', path.relative(appRootPath, source)); - - fs.removeSync(source); - - // Delete: last file - if (filepathIndex === filepathList.length - 1) { - logger.info('copying', `delete complete`); - - // Copy: start - logger.debug('copyPlatform', 'copy', 'copyPatternList', copyPatternList); - logger.info('copying', 'looking up files to copy'); - globby(copyPatternList, { cwd: appRootPath, dot: false }).then((filepathList) => { - logger.info('copying', `starting copy of ${filepathList.length} files`); - let lastPercentage = 0; - filepathList.forEach((filepath, filepathIndex) => { - const source = path.join(appRootPath, filepath); - const target = path.join(packageDirectory, filepath); - // logger.debug('copyPlatform', 'copy', path.relative(appRootPath, source), '->', path.relative(appRootPath, target)); - - fs.copySync(source, target, { dereference: true, overwrite: true }); - - const percentage = Math.floor((filepathIndex / filepathList.length) * 100); - if ((percentage > lastPercentage) && (percentage % 10 === 0)) { - lastPercentage = percentage; - logger.info('copying', `completed ${percentage}%`); - } - - // Copy: last file - if (filepathIndex === filepathList.length - 1) { - logger.info('copying', `copy complete`); - - callback(null, filepathList.length); - } - }); - }).catch(error => callback(error)); - } - }); - }).catch(error => callback(error)); - }); -}; - - -/** - * Init - * @param {Boolean=} metadata - Generate latest-mac.json, latest.yml - * @param {Boolean=} releasenotes - Update release notes - * @param {Boolean=} copy - Copy - * @param {Boolean=} skip-modules - Skip modules - */ -if (require.main === module) { - let argv; - let targetList = []; - - try { - argv = minimist(JSON.parse(process.env.npm_config_argv).original, { - 'boolean': ['macos', 'windows', 'linux', 'metadata', 'releasenotes', 'copy', 'skip-modules'], - 'unknown': () => { return false; } - }); - - targetList = Object.keys(argv).filter((prop) => { - return argv[prop] === true && prop !== 'metadata' && prop !== 'releasenotes' && prop !== 'copy' && prop !== 'skip-modules'; - }); - - targetList = targetList.length === 0 ? [platformHelper.type] : targetList; - } catch (err) {} - - // Overwrite built packages - if (argv.copy) { - return copyPlatform(targetList, argv['skip-modules'], (error, result) => { - if (error) { - logger.error(error); - } - logger.info('copy platform complete', result); - }); - } - - // Generate RELEASENOTES.md - logger.info('generating release notes'); - releasenotes.writeAsMarkdown(); - - // Build platforms - buildPlatform(targetList); - - // Generate latest.yml - logger.info('generating metadata'); - writeMetadata(); -} - -/** - * @exports - */ -module.exports = { - copy: copyPlatform -}; - diff --git a/lib/deploy.js b/lib/deploy.js deleted file mode 100644 index 82d74625..00000000 --- a/lib/deploy.js +++ /dev/null @@ -1,262 +0,0 @@ -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - -/** - * Modules - * External - * @constant - */ -const _ = require('lodash'); -const gitBranch = require('git-branch'); -const appRootPath = require('app-root-path')['path']; -const globby = require('globby'); -const isCi = require('is-ci'); -const ProgressBar = require('progress'); -const publishRelease = require('publish-release'); - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ timestamp: false }); -const packageJson = require(path.join(appRootPath, 'package.json')); -const releasenotes = require(path.join(appRootPath, 'lib', 'releasenotes')); - - -/** - * Filesystem - * @constant - * @default - */ -const installerDirectory = path.join(appRootPath, packageJson.build.directories.output); - - -/** - * Release defaults - * @const - * @default - */ -const defaultConfiguration = { - draft: true, - prerelease: false, - reuseDraftOnly: false, - reuseRelease: true -}; - - -/** - * Create list of absolute paths of build artifacts - * @returns {Array|undefined} List of absolute paths to files to be published - */ -let getArtifactFilepathList = () => { - logger.debug('getArtifactFilepathList'); - - // Find installers - const installerPatternList = [ - `**/*${packageJson.version}*.{AppImage,deb,dmg,exe,pacman,rpm,snap,zip}` - ]; - - // Find release metadata - const metadataPatternList = [ - '**/*.{json,yml}' - ]; - - // Exclusions - const exclusionPatternList = [ - '!mac/*.app/**/*', - '!*-unpacked/**/*' - ]; - - const patternList = installerPatternList.concat(metadataPatternList, exclusionPatternList); - - const filepathList = globby.sync(patternList, { absolute: true, cwd: installerDirectory }); - - logger.debug('getArtifactFilepathList', 'filepathList', filepathList); - - return filepathList; -}; - -/** - * Create Release Configuration - * @returns {Object|void} - Release Configuration - */ -let getConfiguration = () => { - logger.debug('getConfiguration'); - - const artifactFilepathList = getArtifactFilepathList(); - - if (artifactFilepathList.length === 0) { - logger.error('no artifacts for release found'); - return; - } - - /** - * Release configuration - */ - let releaseConfiguration = { - assets: artifactFilepathList, - branch: process.env.TRAVIS_BRANCH || process.env.APPVEYOR_REPO_BRANCH || gitBranch.sync(), - name: `${packageJson.productName} v${packageJson.version}`, - notes: releasenotes.readAsMarkdown(packageJson.version), - tag: `v${packageJson.version}`, - owner: packageJson.author.name || packageJson.author, - repo: packageJson.name, - token: process.env.GH_TOKEN - }; - - releaseConfiguration = _.defaults(releaseConfiguration, defaultConfiguration); - - logger.debug('getConfiguration', 'releaseConfiguration', releaseConfiguration); - - - return releaseConfiguration; -}; - -/** - * Add upload progress event handler - * @param {Object} publishReleaseObject - PublishRelease object - */ -let addProgressHandlers = (publishReleaseObject) => { - logger.debug('addProgressHandlers'); - - if (!publishReleaseObject || !_.isObject(publishReleaseObject)) { - logger.error('addProgressHandlers', 'release missing or wrong format.'); - return; - } - - let bar = {}; - let uploaded = {}; - - // Upload started - publishReleaseObject.on('upload-asset', (fileName) => { - logger.info('release', `upload started: ${fileName}`); - }); - - // Release created - publishReleaseObject.on('created-release', () => { - logger.info('release', 'created'); - }); - - // Release reused - publishReleaseObject.on('reuse-release', () => { - logger.info('release', 're-using'); - }); - - // Upload complete - publishReleaseObject.on('uploaded-asset', (fileName) => { - // Complete Progressbar - if (bar[fileName]) { - bar[fileName].update(1); - } - - logger.info('release', `upload complete: ${fileName}`); - }); - - // Upload progress update - publishReleaseObject.on('upload-progress', (fileName, event) => { - if (!uploaded[fileName]) { uploaded[fileName] = { size: 0, percentage: 0 }; } - - let currentPercentage = uploaded[fileName].percentage; - - uploaded[fileName].size += event['delta']; - uploaded[fileName].percentage = parseInt((uploaded[fileName].size / event.length) * 100); - - // Continuous Environment - if (isCi) { - if (currentPercentage !== uploaded[fileName].percentage) { - logger.info('release', `uploading: ${fileName} (${uploaded[fileName].percentage} %)`); - } - return; - } - - // Interactive Environment - if (!bar[fileName]) { - bar[fileName] = new ProgressBar(`'Release uploading: ${fileName} [:bar] :percent (ETA: :etas)`, { - complete: 'x', - incomplete: ' ', - width: 30, - total: event.length, - clear: true - }); - return; - } - - if (!bar[fileName].complete) { - bar[fileName].tick(event['delta']); - } - }); -}; - -/** - * Deploys all Release artifacts - * @param {Function=} callback - Callback - */ -let deployLatestRelease = (callback = () => {}) => { - logger.debug('deployLatestRelease'); - - // Create Configuration - let releaseConfiguration = getConfiguration(); - if (!releaseConfiguration) { - callback(new Error('releaseConfiguration missing.')); - return; - } - - // Call publish-release module - let publishReleaseHandler = publishRelease(releaseConfiguration, (error, result) => { - if (error) { - callback(error); - return; - } - - callback(null, result); - }); - - // Add progress handlers - addProgressHandlers(publishReleaseHandler); -}; - -/** - * Main - * - * @public - */ -let main = () => { - logger.debug('main'); - - deployLatestRelease((error, result) => { - if (error) { - logger.error(error); - return process.exit(1); - } - - logger.log('release complete'); - logger.debug('result', result); - - process.exit(0); - }); -}; - - -/** - * Main - */ -if (require.main === module) { - main(); -} - - -/** - * @exports - */ -module.exports = { - getConfiguration: getConfiguration, - getArtifacts: getArtifactFilepathList -}; diff --git a/lib/dom-manager.js b/lib/dom-manager.js deleted file mode 100644 index 09f5c576..00000000 --- a/lib/dom-manager.js +++ /dev/null @@ -1,409 +0,0 @@ -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const fs = require('fs'); -const os = require('os'); -const path = require('path'); - -/** - * Modules - * External - * @constant - */ -const _ = require('lodash'); -const appRootPath = require('app-root-path')['path']; -const CleanCSS = require('clean-css'); -const fileUrl = require('file-url'); -const moment = require('moment'); - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); -const language = require(path.join(appRootPath, 'lib', 'language')); - - -/** - * @constant - * @default - */ -const defaultDebounce = 50; - - -/** - * Add platform name as class to element - * @param {HTMLElement=} element - Element (Default: ) - */ -let addPlatformClass = (element = document.querySelector('html')) => { - - // Add nodejs platform name - element.classList.add(process.platform); - - // Add readable platform name - switch (process.platform) { - case 'darwin': - element.classList.add('macos'); - element.classList.add('osx'); - element.classList.add('platform--darwin'); - - break; - case 'win32': - element.classList.add('platform--win32'); - element.classList.add('win'); - element.classList.add('win32'); - element.classList.add('windows'); - - break; - case 'linux': - element.classList.add('unix'); - - break; - } -}; - -/** - * Get background-image url attribute - * @param {String} url - Image url - * @return {String} background-image url - */ -let backgroundUrl = (url) => `url(\"${url}\")`; - -/** - * Get child item index - * @param {HTMLElement} element - Element - * @return {Number} Index - */ -let getElementIndex = (element) => { - const childList = element.parentNode.childNodes; - - let index = 0; - for (index; index < childList.length; index++) { - if (element === childList[index]) {break;} - } - - return index; -}; - -/** @namespace getEventListeners */ - -/** - * Get all event listeners (Chrome only) - * @param {HTMLElement} element - Element - * @return {Object} Event listeners - */ -let getListeners = (element) => { - logger.debug('getListeners'); - - return getEventListeners(element); -}; - -/** - * Inject CSS - * @param {Electron.webviewTag|HTMLElement|Electron.WebContents} webview - Electron Webview - * @param {String|Array} stylesheets - Stylesheet(s) filepath - * @param {Function=} callback - Callback Function - */ -let injectCSS = (webview, stylesheets, callback = () => {}) => { - logger.debug('injectCSS'); - - let stylesheetList = Array.isArray(stylesheets) ? stylesheets : [stylesheets]; - - // Retrieve list of already injected stylesheets - const codeAlreadyInjectedStylesheetList = `document.querySelector('html').dataset.injectcss`; - webview.executeJavaScript(codeAlreadyInjectedStylesheetList, false, (result) => { - const alreadyInjectedStylesheetList = result ? JSON.parse(result) : void 0; - // Filtering redundant stylesheets - // Create difference array of already injected files and new list of filter () - if (alreadyInjectedStylesheetList && Array.isArray(alreadyInjectedStylesheetList)) { - stylesheetList = stylesheetList.filter((stylesheet) => alreadyInjectedStylesheetList.indexOf(stylesheet) < 0); - } - - // Empty CSS string - let css = ''; - - stylesheetList.forEach((filepath, index, list) => { - fs.readFile(filepath, 'utf-8', (err, data) => { - if (err) { - logger.error('injectCSS', err); - return callback(err); - } - - // Concat, trim - css = css + os.EOL + data.toString(); - css = css.trim(); - - // Inject - if (index === (list.length - 1)) { - // Minify - const minified = new CleanCSS().minify(css); - - logger.debug('injectCSS', `Minified stylesheets (${(minified.stats.efficiency * 100).toFixed(2)}% size reduction)`); - // Insert - webview.insertCSS(minified.styles); - - // Store list of injected stylesheets - const codeInjectedStylesheetList = `document.querySelector('html').dataset.injectcss = JSON.stringify([ '${stylesheetList.join(`', '`) }' ])`; - webview.executeJavaScript(codeInjectedStylesheetList, false, () => { - callback(null, minified.styles); - }); - } - }); - }); - - }); -}; - -/** - * Check if Object is an HTML Element - * @param {*} object - Object - * @returns {Boolean} - Type - */ -let isHtmlElement = (object) => { - return language.getPrototypes(object).indexOf('HTMLElement') === 1; -}; - -/** - * Check if descendant elements of a given list have been scrolled into view, given a fixed percentage threshold. - * @param {NodeList} elementList - Element to test - * @param {Number=} threshold - Percentage of list after which loading starts - * @param {Number} fixedCount - Use a fixed base list item count instead of the actual item count, e.g. for dynamically growing lists. - * @returns {Boolean|void} - */ -let didScrollIntoViewport = (elementList, threshold = 0.75, fixedCount = elementList.length) => { - // logger.debug('shouldLoadMore'); - - if (elementList.length === 0) { return; } - - // Calculated on basis of percentage of length - let targetIndex = Math.floor(elementList.length - (1 - threshold) * fixedCount); - - const targetElement = elementList[targetIndex - 1]; - const targetElementRect = targetElement.getBoundingClientRect(); - - // DEBUG - // targetElement.style.background = 'red'; - - return targetElementRect.top <= document.documentElement.clientHeight; -}; - -/** - * Format duration as HH:MM:SS - * @param {String} duration - Duration - * @returns {String} Formatted duration - */ -let formatDuration = (duration) => { - // logger.debug('formatDuration'); - - duration = moment.duration(duration).format('h:mm:ss'); - duration = duration === '0' ? '∞' : duration; - - return duration; -}; - -/** - * Load external scripts - * @param {String} filePath - Path to JavaScript - */ -let loadScript = (filePath) => { - let url = fileUrl(filePath); - - let script = document.createElement('script'); - script.src = url; - script.type = 'text/javascript'; - - script.onload = () => { - console.debug('dom-helper', 'loadScript', 'complete', url); - }; - - document.getElementsByTagName('head')[0].appendChild(script); -}; - -/** - * Load external stylesheets - * @param {String} filePath - Path to CSS - */ -let loadStylesheet = (filePath) => { - let url = fileUrl(filePath); - - let link = document.createElement('link'); - link.href = url; - link.type = 'text/css'; - link.rel = 'stylesheet'; - - link.onload = () => { - console.debug('dom-helper', 'loadStylesheet', 'complete', url); - }; - - document.getElementsByTagName('head')[0].appendChild(link); -}; - -/** - * Remove element from DOM - * @param {HTMLElement} element - Element - * @param {Number=} delay - Delay - */ -let remove = function(element, delay = 0) { - logger.debug('remove'); - - let timeout = setTimeout(() => { - if (element.parentNode) { - element.parentNode.removeChild(element); - } - - clearTimeout(timeout); - }, delay); -}; - -/** @namespace eventListener.useCapture */ - -/** - * Remove all event listeners - * @param {HTMLElement} element - Element - */ -let removeListeners = (element) => { - logger.debug('removeListeners'); - - const eventListenerTypeList = getListeners(element); - - Object.keys(eventListenerTypeList).forEach((eventListenerType) => { - - const eventListenerList = eventListenerTypeList[eventListenerType]; - - eventListenerList.forEach((eventListener) => { - element.removeEventListener(eventListener.type, eventListener.listener, eventListener.useCapture) - }) - }); -}; - -/** - * Keep elements at same size - * @param {HTMLElement} source - Source element - * @param {HTMLElement} target - Target element - */ -let scaleToFill = (source, target) => { - //logger.debug('scaleToFill'); - - let debounce = _.debounce(() => { - source.style.height = target.clientHeight + 'px'; - source.style.width = target.clientWidth + 'px'; - }, defaultDebounce); - - debounce(); -}; - -/** - * Show materializeCSS toast - * @param {String} message - Text - * @param {Number} displayLength - Time displayed - */ -let toast = (message, displayLength = 3000) => { - logger.debug('toast'); - - if (!window.Materialize) { return; } - - window.Materialize.toast(message, displayLength); -}; - -/** - * Find list item by list element - * @param {HTMLElement} element - Element list - * @param {String} value - itemElement - * @param {String=} tag - Tag name - * @returns {HTMLLIElement|void} - * - * @public - */ -let findChildElementByDatasetValue = (element, value, tag = 'li') => { - logger.debug('findChildElementByDatasetValue'); - - if (!element) { return; } - if (!value) { return; } - - const itemElementList = Array.from(element.querySelectorAll(tag)); - const child = itemElementList.find((itemElement) => Object.values(itemElement.dataset).indexOf(value) !== -1); - - return child; -}; - -/** - * Set element text content - * @param {HTMLElement} element - Element - * @param {String} text - Text - * @param {Number=} delay - Delay - */ -let setText = (element, text = '', delay = 0) => { - let timeout = setTimeout(() => { - element.innerText = text; - clearTimeout(timeout); - }, delay); -}; - -/** - * Set element visibility - * @param {HTMLElement} element - Element - * @param {Boolean} visible - Show or hide - * @param {Number=} delay - Delay - */ -let setVisibility = (element, visible, delay = 0) => { - let timeout = setTimeout(() => { - if (visible) { - element.classList.add('show'); - element.classList.remove('hide'); - } else { - element.classList.add('hide'); - element.classList.remove('show'); - } - clearTimeout(timeout); - }, delay); -}; - -/** - * Show element - * @param {HTMLElement} element - Element - * @param {Number=} delay - Delay - */ -let hide = (element, delay = 0) => { - setVisibility(element, false, delay); -}; - -/** - * Hide element - * @param {HTMLElement} element - Element - * @param {Number=} delay - Delay - */ -let show = (element, delay = 0) => { - setVisibility(element, true, delay); -}; - - -/** - * @exports - */ -module.exports = { - addPlatformClass: addPlatformClass, - backgroundUrl: backgroundUrl, - didScrollIntoViewport: didScrollIntoViewport, - findChildElementByDatasetValue: findChildElementByDatasetValue, - formatDuration: formatDuration, - getElementIndex: getElementIndex, - getListeners: getListeners, - hide: hide, - injectCSS: injectCSS, - isHtmlElement: isHtmlElement, - loadScript: loadScript, - loadStylesheet: loadStylesheet, - remove: remove, - removeListeners: removeListeners, - scaleToFill: scaleToFill, - setText: setText, - setVisibility: setVisibility, - show: show, - toast: toast -}; diff --git a/lib/ellipsis.js b/lib/ellipsis.js deleted file mode 100644 index 58520231..00000000 --- a/lib/ellipsis.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - - -/** - * Trim strings and append an ellipsis ('...') - * @param {String} text - Text to trim - * @param {Number=} maximumLength - Maximum length (default: 80) - * @param {String=} ellipsisText - Ellipsis string (default: '...') - * @returns {String} Trimmed text - * @private - */ -let ellipsis = (text, maximumLength = 80, ellipsisText = '...') => { - return (text.length > maximumLength) ? text.substr(0, ((maximumLength / (ellipsisText.length - 1)) + (ellipsisText.length - 1))) + ellipsisText + text.substr(text.length - ((maximumLength / (ellipsisText.length - 1)) + (ellipsisText.length - 1)), text.length) : text; -}; - - -/** - * @exports - */ -module.exports = ellipsis; - diff --git a/lib/h264ify.js b/lib/h264ify.js deleted file mode 100644 index b2dad024..00000000 --- a/lib/h264ify.js +++ /dev/null @@ -1,81 +0,0 @@ -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - -/** - * Modules - * External - * @constant - */ -const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); - - -/** - * h264ify - * @namespace video.canPlayType - * @namespace window.MediaSource - * @returns {void} - */ -let h264ify = () => { - logger.debug('h264ify'); - - /** - * Override video.canPlayType - * @return {String} - Video MIME-Type - */ - const videoElement = document.createElement('video'); - const defaultCanPlayType = videoElement.canPlayType.bind(videoElement); - videoElement.__proto__.canPlayType = (type) => { - // Don't support webm, vp8, vp9 - if (!type) { return ''; } - if (['webm', 'vp8', 'vp9'].some(typeString => type.indexOf(typeString) >= 0)) { return ''; } - - // Fallback: Browser default - return defaultCanPlayType(type); - }; - - /** - * Override window.MediaSource.isTypeSupported - * @return {String} - Video MIME-Type - */ - const defaultIsTypeSupported = window.MediaSource.isTypeSupported.bind(window.MediaSource); - window.MediaSource.isTypeSupported = (type) => { - // Don't support webm, vp8, vp9 - if (!type) { return ''; } - if (['webm', 'vp8', 'vp9'].some(typeString => type.indexOf(typeString) >= 0)) { return ''; } - - // Fallback: Browser default - return defaultIsTypeSupported(type); - }; -}; - - -/** - * Init - * @returns {void} - */ -let init = () => { - logger.debug('init'); - - h264ify(); -}; - - -/** - * Run on import - */ -init(); - diff --git a/lib/is-env.js b/lib/is-env.js deleted file mode 100644 index bfe9cf55..00000000 --- a/lib/is-env.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const chalk = require('chalk'); -const chalkline = require('chalkline'); -const minimist = require('minimist'); -const path = require('path'); -const _ = require('lodash'); - -/** - * Modules - * External - * @constant - */ -const appRootPath = require('app-root-path')['path']; -const tryRequire = require('try-require'); - - -/** - * Modules - * Internal - * @constant - */ -const requiredCount = require(path.join(appRootPath, 'lib', 'required-count')); - -/** @namespace remote.process */ - -/** - * @return {Boolean} - * @function - * - * @public - */ -let lookupEnvironment = () => { - let name = _.lowerCase(module.exports.environmentName); - - // Lookup global CLI arguments - let globalArgvObj = {}; - try { globalArgvObj = minimist(process.argv); } catch (err) {} - - // Lookup "npm run script" arguments - let npmArgvObj = {}; - try { npmArgvObj = minimist(JSON.parse(process.env.npm_config_argv).original); } catch (err) {} - - // Lookup Electron arguments - let electronArgvObj = {}; - const { remote } = tryRequire('electron'); - if (remote && remote.process) { - try { electronArgvObj = minimist(remote.process.argv); } catch (err) {} - } - - // Node - const nodeEnvName = process.env['NODE_ENV']; - const npmScriptName = process.env.hasOwnProperty('npm_lifecycle_event') ? process.env['npm_lifecycle_event'] : false; - - // Global - const globalValue = process.env[_.lowerCase(name)] || process.env[_.upperCase(name)]; - - let isEnv = - // if DEBUG=1, not if DEBUG=0 - globalValue && _.isFinite(parseInt(globalValue)) && parseInt(globalValue) > 0 || - // if DEBUG=text - globalValue && !_.isFinite(parseInt(globalValue)) && Boolean(globalValue) === true || - // if NODE_ENV=environmentName - nodeEnvName === name || - // global CLI arguments - globalArgvObj[name] === true || - // "npm run script" arguments - npmArgvObj[name] === true || - // Electron arguments - electronArgvObj[name] === true || - // npm script name from package.json - npmScriptName && npmScriptName.includes(`:${name}`); - - return Boolean(isEnv); -}; - -/** @namespace chalkline.white */ - -/** - * Prints Environment once - */ -let printEnvironmentName = () => { - const active = lookupEnvironment(); - const count = requiredCount.getCount(); - const name = module.exports.environmentName; - const style = chalk['white'].bold; - const title = 'environment'; - - if (count === 0 && active) { - if (process.type === 'renderer') { - // Chrome Developer Console - console.log( - `%c${title}: ${name}`, - 'padding: 0.5rem 50% 0.5rem 0.5rem; white-space: nowrap; background-color: rgb(100, 100, 100); color: white; text-transform: uppercase; font-weight: bold; line-height: 2rem;' - ); - } else { - // Terminal - chalkline.white(); - console.log( - style('ENVIRONMENT:'), - style(_.upperCase(name)) - ); - chalkline.white(); - } - } -}; - - -let init = () => { - - printEnvironmentName(); -}; - - -/** - * @exports - * @param {String} name - Environment name - * @return {Boolean} Environment status - */ -module.exports = (name) => { - module.exports.environmentName = name; - module.exports.environmentActive = lookupEnvironment(); - - init(); - - return module.exports.environmentActive; -}; diff --git a/lib/language.js b/lib/language.js deleted file mode 100644 index 1fd12a14..00000000 --- a/lib/language.js +++ /dev/null @@ -1,83 +0,0 @@ -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - -/** - * Modules - * External - * @constant - */ -const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const isDebug = require(path.join(appRootPath, 'lib', 'is-env'))('debug'); - -/** - * List Event Handlers - * @param {HTMLElement} target - Target Element - * @return {Array|undefined} - List Event Handlers - * @function - * - * @public - */ -let getEventHandlersList = (target) => { - if (!isDebug || !window.chrome) { return; } - - //noinspection JSUnresolvedFunction,JSHint - return getEventListeners(target); -}; - -/** - * Get Prototype chain - * @param {*} object - Variable - * @returns {Array} - List of prototypes names - * @function - * - * @public - */ -let getPrototypeList = (object) => { - let prototypeList = []; - let parent = object; - - while (true) { - parent = Object.getPrototypeOf(parent); - if (parent === null) { - break; - } - prototypeList.push(Object.prototype.toString.call(parent).match(/^\[object\s(.*)]$/)[1]); - } - return prototypeList; -}; - -/** - * Get root Prototype - * @param {*} object - Variable - * @returns {String} - Type - * @function - * - * @public - */ -let getPrototype = (object) => { - return getPrototypeList(object)[0]; -}; - - -/** - * @exports - */ -module.exports = { - getEventHandlers: getEventHandlersList, - getPrototype: getPrototype, - getPrototypes: getPrototypeList -}; - diff --git a/lib/localsetup.js b/lib/localsetup.js deleted file mode 100644 index 7f072a8e..00000000 --- a/lib/localsetup.js +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env node -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const childProcess = require('child_process'); -const fs = require('fs-extra'); -const os = require('os'); -const path = require('path'); - -/** - * Modules - * External - * @constant - */ -const appRootPath = require('app-root-path')['path']; -const fkill = require('fkill'); -const globby = require('globby'); -const minimist = require('minimist'); - -/** - * Modules - * Internal - * @constant - */ -const isDebug = require(path.join(appRootPath, 'lib', 'is-env'))('debug'); -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ timestamp: false }); -const packageJson = require(path.join(appRootPath, 'package.json')); -const platformHelper = require(path.join(appRootPath, 'lib', 'platform-helper')); - - -/** - * Application - * @constant - * @default - */ -const appProductName = packageJson.productName || packageJson.name; -const appName = packageJson.name; -const appVersion = packageJson.version; - -/** - * Filesystem - * @constant - * @default - */ -const buildCommand = packageJson.scripts.build; -const installerDirectory = path.join(appRootPath, packageJson.build.directories.output); - - -/** - * Init - * @default - */ -let startInDebug = false; - - -/** - * Build - */ -let build = () => { - logger.debug('build'); - - childProcess.execSync(buildCommand, { cwd: appRootPath, stdio: [0, 1, 2] }); -}; - -/** @namespace fs.copySync */ -/** @namespace fs.execSync */ -/** @namespace fs.removeSync */ - -/** - * Quit application, install and launch - */ -let main = () => { - /** - * Forward debug setting - */ - if (startInDebug === true) { - process.env.DEBUG = true; - } - - /** - * macOS - */ - if (platformHelper.isMacOS) { - let sourceFilePath = path.normalize(path.join(installerDirectory, 'mac', `${appProductName}.app`)); - let destinationFilePath = path.join('/Applications', `${appProductName}.app`); - - // DEBUG - logger.debug('macos', 'sourceFilePath', sourceFilePath); - logger.debug('macos', 'destinationFilePath', destinationFilePath); - - logger.info('closing'); - fkill(appProductName, { force: true }); - logger.info('removing application'); - fs.removeSync(destinationFilePath); - logger.info('installing application'); - fs.copySync(sourceFilePath, destinationFilePath, { overwrite: true }); - logger.info('starting'); - childProcess.execSync(`open "${destinationFilePath}"`); - } - - /** - * Windows - */ - if (platformHelper.isWindows) { - let installerFilePathPattern = path.join(installerDirectory, 'win', `*${appProductName}*${appVersion}.exe`); - let installerFilePathList = globby.sync(installerFilePathPattern); - let installerFilePath = installerFilePathList[0]; - - // DEBUG - logger.debug('windows', 'installerFilePathPattern', installerFilePathPattern); - logger.debug('windows', 'installerFilePathList', installerFilePathList); - logger.debug('windows', 'installerFilePath', installerFilePath); - - logger.info('closing'); - fkill(appProductName, { force: true }); - logger.info('starting'); - childProcess.execSync(`start "" "${installerFilePath}"`, { stdio: [0, 1, 2] }); - } - - /** - * Linux - */ - if (platformHelper.isLinux) { - let installerArch; - - switch (os.arch()) { - case 'arm7l': - installerArch = 'arm'; - break; - case 'x64': - installerArch = 'amd64'; - break; - case 'ia32': - installerArch = 'i386'; - break; - } - - let installerFilePathPattern = path.normalize(path.join(installerDirectory, `*${appName}*${appVersion}*${installerArch}*.deb`)); - let installerFilePathList = globby.sync(installerFilePathPattern); - let installerFilePath = installerFilePathList[0]; - let destinationFilePath = path.join('/usr/bin', appName); - - // DEBUG - logger.debug('linux', 'installerFilePathPattern', installerFilePathPattern); - logger.debug('linux', 'installerFilePathList', installerFilePathList); - logger.debug('linux', 'destinationFilePath', destinationFilePath); - - logger.info('closing'); - fkill(appName, { force: true }); - logger.info('installing'); - childProcess.execSync(`sudo dpkg --install --force-overwrite "${installerFilePath}"`); - logger.info('starting'); - let child = childProcess.spawn(destinationFilePath, [], { detached: true, stdio: 'ignore' }); - child.unref(); - } -}; - - -/** - * Main - * @namespace process.env.npm_config_argv.original - */ -if (require.main === module) { - // Arguments - let npmArgvObj = {}; - try { npmArgvObj = minimist(JSON.parse(process.env.npm_config_argv).original); } catch (err) {} - - if (npmArgvObj['build']) { build(); } - - startInDebug = isDebug; - - main(); - - process.exit(0); -} diff --git a/lib/logger.js b/lib/logger.js deleted file mode 100644 index 88ec2e22..00000000 --- a/lib/logger.js +++ /dev/null @@ -1,315 +0,0 @@ -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const fs = require('fs-extra'); -const os = require('os'); -const path = require('path'); -const util = require('util'); - -/** - * Modules - * External - * @constant - */ -const Appdirectory = require('appdirectory'); -const chalk = require('chalk'); -const present = require('present'); -const _ = require('lodash'); - -/** - * Modules - * External - * @constant - */ -const appRootPath = require('app-root-path')['path']; - -/** - * Modules - * Internal - * @constant - */ -const isDebug = require(path.join(appRootPath, 'lib', 'is-env'))('debug'); -const isNolog = require(path.join(appRootPath, 'lib', 'is-env'))('nolog'); -const packageJson = require(path.join(appRootPath, 'package.json')); - - -/** - * Application - * @constant - * @default - */ -const appName = packageJson.name; - -/** - * Filesystem - * @constant - * @default - */ -const appLogDirectory = (new Appdirectory(appName)).userLogs(); -const appLogFile = path.join(appLogDirectory, `${appName}.log`); - - -/** - * @constant - * @default - */ -const typeToChalkStyle = { - debug: 'cyan', - log: 'cyan', - info: 'magenta', - warn: 'yellow', - error: 'red' -}; - -/** - * @constant - * @default - */ -let typeToRgb = { - debug: [100, 100, 100], - log: [0, 128, 255], - info: [255, 100, 150], - warn: [200, 100, 30], - error: [230, 70, 50] -}; - -/** - * @constant - * @default - */ -const typeEmojiMap = { - debug: '🔧', - log: '📝', - info: 'ℹ️', - warn: '⚠️', - error: '🚨' -}; - -/** @namespace fs.mkdirp */ -/** @namespace fs.appendFile */ - -/** - * Log to console and file - * @param {*} entry - Log Message - */ -let writeToFile = function(entry) { - const globalOptions = module.exports.options; - - if (!globalOptions.write || isNolog) { return; } - - const date = (new Date()); - const dateString = date.toISOString().replace(/Z|T|\..+/gi, ' ').trim().split(' ').reverse().join(' '); - const logEntry = '[' + dateString + '] ' + entry; - - // Create Directory - fs.mkdirp(path.dirname(appLogFile), (err) => { - if (err) { - console.error('logger', 'writeToFile', 'fs.mkdirp', err); - return; - } - // Append Log - fs.appendFile(appLogFile, (`${logEntry}${os.EOL}`), (err) => { - if (err) { - console.error('logger', 'writeToFile', 'fs.appendFile', err); - } - }); - }); -}; - -/** - * Format log messages - * @param {string} type - Type - * @param {array} message - Message - * @returns {Object} - */ -let previousTimestamp; -let parseMessage = (type, message) => { - const globalOptions = module.exports.options; - - const namespace = globalOptions.namespace; - const namespaceList = _.map(global[packageJson.name].namespaces, 'namespace'); - - const namespacePosition = namespaceList.indexOf(namespace); - const namespaceThread = namespacePosition & 1; - - const chalkStyle = chalk[typeToChalkStyle[type]]; - - const indent = (process.type !== 'renderer') ? `i [${namespace}] `.length : `i [${namespace}] `.length; - - let body; - let title; - let timestamp; - - for (let index in message) { - if (message.hasOwnProperty(index)) { - if (_.isObjectLike(message[index])) { - if (_.isArray(message[index])) { - message[index] = os.EOL + ' '.repeat(indent) + '[' + os.EOL + ' '.repeat(indent + 2) + message[index].join(',' + os.EOL + ' '.repeat(indent + 2)) + os.EOL + ' '.repeat(indent) + ']'; - } else { - message[index] = os.EOL + util.inspect(message[index], { - depth: null, showProxy: true, showHidden: true - }); - message[index] = message[index].replace(new RegExp(os.EOL, 'gi'), `${os.EOL}${' '.repeat(indent)}`); - } - - message[index - 1] = `${message[index - 1]}`; - } - } - } - - if (message.length > 1) { - title = message[0]; - message.shift(); - } - - body = message.join(' '); - - // if there's no title, remove body - if (!title) { title = body; } - - // consolidate title, body - if (title === body) { body = ''; } - - // timestamp - if (globalOptions.timestamp) { - if (!previousTimestamp) { previousTimestamp = present(); } - timestamp = `${(present() - previousTimestamp).toFixed(4)} ms`; - previousTimestamp = present(); - } else { - timestamp = ''; - } - - return { - chalk: chalkStyle, - emoji: typeEmojiMap[type], - body: body, - namespace: namespace, - rgb: typeToRgb[type].join(), - timestamp: timestamp, - title: title, - type: _.toUpper(type), - thread: namespaceThread - }; -}; - -/** - * Print Devtools - * @param {String} type - Logtype - * @param {Array} message - Message - * @returns {void} - */ -let printBrowser = function(type, message) { - if (message.length === 0) { return; } - - const parsed = parseMessage(type, message); - - console.log( - `${parsed.emoji} %c[%s] %c %c%s%c %c%s%c %s`, - //%c - `background-color: rgba(${parsed.rgb}, 0.2); color: rgba(${parsed.rgb}, 0.8); padding: 0 0px; font-weight: normal`, - //%s - parsed.namespace, - //%c - '', - //%c - `background-color: rgba(${parsed.rgb}, 0.0); color: rgba(${parsed.rgb}, 1.0); padding: 0 0px; font-weight: bold`, - //%s - parsed.title, - //%c - '', - //%c - `background-color: rgba(${parsed.rgb}, 0.1); color: rgba(${parsed.rgb}, 1.0); padding: 0 0px; font-weight: normal`, - //%s - parsed.body, - //%c - `background-color: rgba(${parsed.rgb}, 0.0); color: rgba(${parsed.rgb}, 0.5); padding: 0 0px; font-weight: normal`, - //%s - parsed.timestamp - ); - - writeToFile(util.format( - `[renderer] [${parsed.type}] [%s] %s %s`, - parsed.namespace, parsed.title, parsed.body - )); -}; - -/** - * Print Terminal - * @param {String} type - Logtype - * @param {Array} message - Message - * @returns {void} - */ -let printCli = function(type, message) { - if (message.length === 0) { return; } - - const parsed = parseMessage(type, message); - - console.log(util.format( - `${parsed.emoji} [%s] %s %s %s`, - //[%s] - parsed.thread ? parsed.chalk(parsed.namespace) : parsed.chalk.underline(parsed.namespace), - //%s - parsed.chalk.bold(parsed.title), - //%s - parsed.chalk(parsed.body), - //%s - parsed.timestamp - )); - - writeToFile(util.format( - `[main] [${parsed.type}] [%s] %s %s`, - parsed.namespace, parsed.title, parsed.body - )); -}; - -/** - * Print - * @returns {Function} - */ -let print = (process.type === 'renderer') ? printBrowser.bind(console) : printCli; - - -/** - * @exports - * @param {Object} options - Logger options - * @returns {Object} - */ -module.exports = (options) => { - - const file = (module.parent && module.parent.filename) || module.filename; - const namespace = path.basename(file) || packageJson.name; - - // Instance Options - let defaultOptions = { - namespace: namespace, - timestamp: true, - write: false - }; - - options = _.defaultsDeep(options, defaultOptions); - module.exports.options = options; - - // Global Configuration - global[packageJson.name] = { - namespaces: [] - }; - - global[packageJson.name].namespaces.push(options); - - // Remove filename from cache, enables detection of requiring module names - delete require.cache[__filename]; - - return { - debug() { if (isDebug) { print('debug', Array.from(arguments))} }, - log() { print('log', Array.from(arguments)) }, - info() { print('log', Array.from(arguments)) }, - warn() { print('warn', Array.from(arguments)) }, - error() { print('error', Array.from(arguments)) } - }; -}; - diff --git a/lib/platform-helper.js b/lib/platform-helper.js deleted file mode 100644 index c14d1ff6..00000000 --- a/lib/platform-helper.js +++ /dev/null @@ -1,125 +0,0 @@ -'use strict'; - - -/** - * Modules - * Node - * @constant - */ -const path = require('path'); - -/** - * Modules - * External - * @constant - */ -const _ = require('lodash'); - -/** - * Modules - * Internal - * @constant - */ -const appRootPath = require('app-root-path')['path']; -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ write: true }); - - -/** - * @constant - */ -const hidpiSuffix = '@2x'; -const templateSuffix = '-Template'; - - -/** - * Current platform name - * @type {string} - */ -let getName = process.platform.indexOf('win') === 0 ? 'win' : process.platform.indexOf('darwin') === 0 ? 'darwin' : 'linux'; - -/** - * Current Architecture - * @type {string} - */ -let getArch = process.arch === 'ia32' ? '32' : '64'; - -/** - * Get standard image extension for current Platform - * @param {String} platformName - Platform Name - * @returns {string} - */ -let getIconImageExtension = (platformName) => { - return platformName.indexOf('win') === 0 ? '.ico' : platformName.indexOf('darwin') === 0 ? '.icns' : '.png'; -}; - -/** - * Get standard icon extension for current Platform - * @param {String} platformName - Platform Name - * @returns {string} - */ -let getTemplateImageExtension = (platformName) => { - return platformName.indexOf('darwin') === 0 ? `${templateSuffix}.png` : '.png'; -}; - -/** - * Get HiDPI / Retina image filename - * @param {String} imageFilepath - Platform Name - * @returns {string} - */ -let getHidpiImage = (imageFilepath) => { - const directory = path.dirname(imageFilepath); - const extension = path.extname((imageFilepath)); - const name = path.basename(imageFilepath, extension); - - // Ensure "@2x" suffix - if (!_(name).endsWith(hidpiSuffix)) { - imageFilepath = path.join(directory, `${name}${hidpiSuffix}${extension}`); - } - - return imageFilepath; -}; - -/** - * Get SVG image filename - * @param {String} imageFilepath - Platform Name - * @returns {string} - */ -let getSvgImage = (imageFilepath) => { - const directory = path.dirname(imageFilepath); - let extension = path.extname((imageFilepath)); - let name = path.basename(imageFilepath, extension); - - // Remove "@2x" suffix - name = name.replace(hidpiSuffix, ''); - - // Remove "-Template" suffix - name = name.replace(templateSuffix, ''); - - // Ensure ".svg" extension - extension = '.svg'; - imageFilepath = path.join(directory, `${name}${extension}`); - - return imageFilepath; -}; - - -/** - * @exports - */ -module.exports = { - isDarwin: getName === 'darwin', - isOSX: getName === 'darwin', - isMacOS: getName === 'darwin', - isWin: getName === 'win', - isWindows: getName === 'win', - isLinux: getName === 'linux', - name: process.platform + getArch, - type: process.platform, - arch: getArch, - trayImageExtension: '.png', - menuItemImageExtension: '-Template.png', - iconImageExtension: getIconImageExtension, - templateImageExtension: getTemplateImageExtension, - getHidpiImage: getHidpiImage, - getSvgImage: getSvgImage -}; diff --git a/lib/releasenotes.js b/lib/releasenotes.js deleted file mode 100644 index b9a5f82c..00000000 --- a/lib/releasenotes.js +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Modules - * Node - * @constant - */ -'use strict'; - - -const fs = require('fs-extra'); -const os = require('os'); -const path = require('path'); - -/** - * Modules - * External - * @constant - */ -const _ = require('lodash'); -const appRootPath = require('app-root-path')['path']; -const json2md = require('json2md'); -const removeMarkdown = require('remove-markdown'); - -/** - * Modules - * Internal - * @constant - */ -const logger = require(path.join(appRootPath, 'lib', 'logger'))({ timestamp: false }); -const packageJson = require(path.join(appRootPath, 'package.json')); - - -/** - * Filesystem - * @constant - * @default - */ -const filename = 'RELEASENOTES'; -const inputFilepath = path.join(appRootPath, `${filename}.json`); -const outputFilepath = path.join(appRootPath, `${filename}.md`); - - -/** - * @typedef {Object} ReleaseNotes - * @property {String[]} features - * @property {String[]} bugfixes - * @property {String[]} documentation - * @property {String[]} internals - */ -/** - * @typedef {String} ReleaseNotesVersion - */ -/** - * @typedef {Object.} ReleaseNotesCollection - */ - -/** @namespace fs.readFileSync */ - -/** - * Read release notes object from RELEASENOTES.json - * @param {String=} version - Specific version - * @returns {Object|void} - Release notes object - * @namespace fs - * - * @private - */ -let readJson = (version) => { - logger.debug('readJson'); - - let notesVersionsObject; - - try { - notesVersionsObject = JSON.parse(fs.readFileSync(inputFilepath).toString()); - } catch (err) { - logger.error(`could not parse release notes`, inputFilepath); - } - - if (version) { - Object.keys(notesVersionsObject).forEach((notesVersion) => { - if (notesVersion !== packageJson.version) { - delete notesVersionsObject[notesVersion]; - } - }) - } - - return notesVersionsObject; -}; - -/** - * Transform single release note object to markdown format - * @param {ReleaseNotes} versionObject - Release notes object - * @returns {Array} - Markdown-formatted line feed for release notes object - * - * @private - */ -let transformItemToMarkdown = (versionObject) => { - logger.debug('transformItemToMarkdown'); - - let lineList = []; - - Object.keys(versionObject).forEach((value) => { - lineList.push(json2md({ h4: _.startCase(value) })); - - let entryContent = { ul: [] }; - versionObject[value].forEach((note) => { - entryContent.ul.push(note); - }); - - lineList.push(json2md(entryContent) + os.EOL); - }); - - return lineList; -}; - -/** - * Transform release notes collection to markdown format - * @param {ReleaseNotesCollection} collection - Hash Map of release notes objects - * @returns {String} - Markdown-formatted release notes collection - * - * @private - */ -let transformCollectionToMarkdown = (collection) => { - logger.debug('transformCollectionToMarkdown'); - - let collectionList = []; - - Object.keys(collection).forEach((version) => { - collectionList.push(json2md({ h2: version }) + os.EOL); - collectionList = collectionList.concat(transformItemToMarkdown(collection[version])); - }); - - return collectionList.join(''); -}; - -/** @namespace fs.writeFileSync */ - -/** - * Write RELEASENOTES.json as RELEASENOTES.md - * @param {String=} version - Specific version - */ -let writeAsMarkdown = (version) => { - logger.debug('writeAsMarkdown'); - - // Write as to disk - fs.writeFileSync(outputFilepath, transformCollectionToMarkdown(readJson(version))); - - logger.info('created release notes', outputFilepath); -}; - -/** - * Read as Markdown - * @param {String=} version - Specific version - * @returns {String} - Markdown release notes - */ -let readAsMarkdown = (version) => { - logger.debug('readAsMarkdown'); - - return transformCollectionToMarkdown(readJson(version)); -}; - -/** - * Read as Plaintext - * @param {String=} version - Specific version - * @returns {String} - Plaintext release notes - */ -let readAsPlaintext = (version) => { - logger.debug('readAsPlaintext'); - - return removeMarkdown(readAsMarkdown(version)); -}; - - -/** - * Main - */ -if (require.main === module) { - writeAsMarkdown(); -} - - -/** - * @exports - */ -module.exports = { - writeAsMarkdown: writeAsMarkdown, - readAsMarkdown: readAsMarkdown, - readAsPlaintext: readAsPlaintext -}; diff --git a/lib/required-count.js b/lib/required-count.js deleted file mode 100644 index 8f5be5fe..00000000 --- a/lib/required-count.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - - -/** - * Modules - * Internal - */ -let count; - -let isFirst = () => { - return Boolean(count); -}; - -let getCount = () => { - let moduleCache = require.cache[__filename]; - if (moduleCache.hasOwnProperty('requireCount')) { - moduleCache['requireCount'] = moduleCache['requireCount'] + 1; - } - else { - moduleCache['requireCount'] = 0; - } - - return count = moduleCache['requireCount']; -}; - - -/** - * @exports - */ -module.exports = { - isFirst: isFirst, - getCount: getCount -}; - diff --git a/package-lock.json b/package-lock.json index d5d6d098..97061b1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pb-for-desktop", - "version": "6.2.6", + "version": "6.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -69,6 +69,134 @@ } } }, + "@sidneys/dom-tools": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sidneys/dom-tools/-/dom-tools-1.0.1.tgz", + "integrity": "sha512-E+TdXlFtfGbVidnY1FNbS9eyZ9bEurbDA7c5wqpS2+GZJv4z5XONnVI2xc1r/zTc5BlbKxFctjGkhoabJGNZCQ==", + "requires": { + "@sidneys/logger": "1.0.7", + "app-root-path": "2.0.1", + "clean-css": "4.1.9", + "file-url": "2.0.2", + "lodash": "4.17.4", + "moment": "2.19.1" + } + }, + "@sidneys/electron-build": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sidneys/electron-build/-/electron-build-1.0.2.tgz", + "integrity": "sha512-WJnhimm0Pl3Hf6+tKciSlycSnITOAWFHNKOHr8Q2WCL28f99v8xRHQ0IEyqtT2XvCi8HitywxPJsKA86UVPIbA==", + "requires": { + "@sidneys/electron-deploy-github": "1.0.1", + "@sidneys/logger": "1.0.7", + "@sidneys/platform-tools": "1.0.0", + "@sidneys/releasenotes": "1.0.1", + "app-root-path": "2.0.1", + "globby": "6.1.0", + "hash-files": "1.1.1", + "lodash": "4.17.4", + "minimist": "1.2.0", + "yamljs": "0.3.0" + } + }, + "@sidneys/electron-deploy-github": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sidneys/electron-deploy-github/-/electron-deploy-github-1.0.1.tgz", + "integrity": "sha512-Lh3kupFLyEinQk7KlL1aC1SdcZTCC/pqhUZlxqc/xq1AcZ54txuSTcpl/R0fUxzjmB6Wy3yJetngfTjN8TSqUQ==", + "requires": { + "@sidneys/logger": "1.0.7", + "@sidneys/releasenotes": "1.0.1", + "app-root-path": "2.0.1", + "git-branch": "1.0.0", + "globby": "6.1.0", + "is-ci": "1.0.10", + "lodash": "4.17.4", + "progress": "2.0.0", + "publish-release": "1.3.3" + } + }, + "@sidneys/electron-localsetup": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sidneys/electron-localsetup/-/electron-localsetup-1.0.1.tgz", + "integrity": "sha512-EBH5sGVYNwV3lkga9SX8kcDuETJIbJZ2uHW7CqreqvznbzvBfu3xjAst5r/r4pxnujpjxdP/Gc53eM8LvSTtKg==", + "requires": { + "@sidneys/is-env": "1.0.4", + "@sidneys/logger": "1.0.7", + "@sidneys/platform-tools": "1.0.0", + "app-root-path": "2.0.1", + "fkill": "5.1.0", + "globby": "6.1.0", + "minimist": "1.2.0" + } + }, + "@sidneys/h264ify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sidneys/h264ify/-/h264ify-1.0.2.tgz", + "integrity": "sha512-i2kUXK2A0NHKn3U98EQEzq6dTZXzG0eWy2dHZPzLoA7e8w/NBlOYMAuBcnYzAqCvdxenNXRBK4rZ+wbxNCzvng==", + "requires": { + "@sidneys/logger": "1.0.7", + "app-root-path": "2.0.1" + } + }, + "@sidneys/is-env": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@sidneys/is-env/-/is-env-1.0.4.tgz", + "integrity": "sha512-/k8u0BMHMeohj7UOlFZVYaNjoqMPtBlGlPu/PHmJjd4X8oz7XENynBBpHMnsanM2enXb/4a6uulScGSRZMmr+A==", + "requires": { + "@sidneys/required-count": "1.0.1", + "app-root-path": "2.0.1", + "chalk": "2.3.0", + "chalkline": "0.0.5", + "lodash": "4.17.4", + "minimist": "1.2.0", + "try-require": "1.2.1" + } + }, + "@sidneys/logger": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@sidneys/logger/-/logger-1.0.7.tgz", + "integrity": "sha512-8CyXvycmTZ7u5KBi8HR0qpYy0YLprjFOvu76I8vIeDzf6Z0lDFdx71TYww7eqLC0mp4jZFA6M37DGtaWVUty2Q==", + "requires": { + "@sidneys/is-env": "1.0.4", + "app-root-path": "2.0.1", + "appdirectory": "0.1.0", + "chalk": "2.3.0", + "lodash": "4.17.4", + "present": "1.0.0" + } + }, + "@sidneys/platform-tools": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sidneys/platform-tools/-/platform-tools-1.0.0.tgz", + "integrity": "sha512-BjFIQtXqX8b903FJj2XC11HEmxL9UPFjFWs3c5p5gc8lSeheF+TFOI4J5/4BogL9SyzgmgEQUX1vRo5ySrZAMg==", + "requires": { + "@sidneys/logger": "1.0.7", + "app-root-path": "2.0.1", + "lodash": "4.17.4" + } + }, + "@sidneys/releasenotes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sidneys/releasenotes/-/releasenotes-1.0.1.tgz", + "integrity": "sha512-FnJeyY1vvBqxjqfcDMy5qAdENy8A3EkobxGRJWxiHXDdrC1nzRhr8ewPb2+ii3mk/nKAHq9SDu+DH99bwYbAKg==", + "requires": { + "@sidneys/logger": "1.0.7", + "app-root-path": "2.0.1", + "json2md": "1.5.10", + "lodash": "4.17.4", + "remove-markdown": "0.2.2" + } + }, + "@sidneys/required-count": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sidneys/required-count/-/required-count-1.0.1.tgz", + "integrity": "sha512-oQ0aLQ4P4coxrfYCbiGixbrFCtpwirzD/g4sNrj0al0d4nVTEgW6L2wmTBXN72yNPJn/4kkWTFL7TXNAylCpDQ==" + }, + "@sidneys/text-ellipsis": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sidneys/text-ellipsis/-/text-ellipsis-1.0.1.tgz", + "integrity": "sha512-SCua79sjcCc1HVio29hFdLbATLGHp7Yna7ra/U9IKZW0Mb6a3W5iLBVBJ3o4PJ7n+4ubexijRwk6QbzJAkgj0A==" + }, "@types/node": { "version": "7.0.46", "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.46.tgz", @@ -133,7 +261,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", - "dev": true, "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", @@ -238,21 +365,6 @@ "normalize-path": "2.1.1" } }, - "app-package-builder": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/app-package-builder/-/app-package-builder-1.2.1.tgz", - "integrity": "sha512-LVf6CxVQBGJD0D5bsKxp7wXSFSwD5FjxxPsKA3omzOvhCFf7IWGJCLwnI1XW2pg9L55F7Ep7VKooVW3YeNc6aA==", - "dev": true, - "requires": { - "bluebird-lst": "1.0.5", - "builder-util": "3.0.12", - "builder-util-runtime": "2.4.0", - "fs-extra-p": "4.4.4", - "int64-buffer": "0.1.9", - "js-yaml": "3.10.0", - "rabin-bindings": "1.7.3" - } - }, "app-root-path": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", @@ -326,8 +438,7 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-slice": { "version": "1.0.0", @@ -339,7 +450,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, "requires": { "array-uniq": "1.0.3" } @@ -347,8 +457,7 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.2.1", @@ -367,9 +476,9 @@ "dev": true }, "asar-integrity": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/asar-integrity/-/asar-integrity-0.2.2.tgz", - "integrity": "sha512-/hDVITh3FqX+OBLWEfDuPmfJZUoMZG8QwNs8ikOgq40BjX4NjUcsd8/l0MCjnxi3CfG7ZWS3K2G3wQj/FHp3wg==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asar-integrity/-/asar-integrity-0.2.3.tgz", + "integrity": "sha512-c+oMuxlpKRDv9Kv6WdjbnkySfSYATAmW+cvy8NIdMg9twY9RMvSdvOoPssroWlTpSra1qX9vLew2ROpV4jQm7w==", "dev": true, "requires": { "bluebird-lst": "1.0.5", @@ -379,20 +488,17 @@ "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "async-each": { "version": "1.0.1", @@ -415,8 +521,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "auto-launch": { "version": "git://github.com/sidneys/node-auto-launch.git#3633815aa682553e67e4b259478c61c56379890c", @@ -445,14 +550,12 @@ "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 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, "babel-cli": { "version": "6.26.0", @@ -1402,7 +1505,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, "optional": true, "requires": { "tweetnacl": "0.14.5" @@ -1414,6 +1516,11 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, + "bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" + }, "binary-extensions": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", @@ -1448,6 +1555,11 @@ "bluebird": "3.5.1" } }, + "bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=" + }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -1458,7 +1570,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, "requires": { "hoek": "4.2.0" } @@ -1558,55 +1669,10 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, - "builder-util": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-3.0.12.tgz", - "integrity": "sha512-THcVUxJOBkSbQrH59u6i2/pElCUU8i79yjEs+r6akr99ihNPBHvw0C+5C7szn5HT/f/sUaKbYRMoSwkfyMDGsg==", - "dev": true, - "requires": { - "7zip-bin": "2.2.7", - "bluebird-lst": "1.0.5", - "builder-util-runtime": "2.4.0", - "chalk": "2.3.0", - "debug": "3.1.0", - "fs-extra-p": "4.4.4", - "ini": "1.3.4", - "is-ci": "1.0.10", - "js-yaml": "3.10.0", - "lazy-val": "1.0.2", - "node-emoji": "1.8.1", - "semver": "5.4.1", - "source-map-support": "0.5.0", - "stat-mode": "0.2.2", - "temp-file": "2.0.3", - "tunnel-agent": "0.6.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "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 - }, - "source-map-support": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", - "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==", - "dev": true, - "requires": { - "source-map": "0.6.1" - } - } - } + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" }, "builder-util-runtime": { "version": "2.4.0", @@ -1632,8 +1698,7 @@ "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "caller-path": { "version": "0.1.0", @@ -1653,14 +1718,12 @@ "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" }, "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, "requires": { "camelcase": "2.1.1", "map-obj": "1.0.1" @@ -1699,8 +1762,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "catharsis": { "version": "0.8.9", @@ -1825,8 +1887,7 @@ "ci-info": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz", - "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==", - "dev": true + "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==" }, "circular-json": { "version": "0.3.3", @@ -1917,8 +1978,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "coa": { "version": "1.0.4", @@ -2003,7 +2063,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, "requires": { "delayed-stream": "1.0.0" } @@ -2092,7 +2151,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "4.1.1", "shebang-command": "1.2.0", @@ -2103,7 +2161,6 @@ "version": "2.2.5", "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", - "dev": true, "requires": { "lru-cache": "4.1.1", "which": "1.3.0" @@ -2113,7 +2170,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, "requires": { "boom": "5.2.0" }, @@ -2122,7 +2178,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, "requires": { "hoek": "4.2.0" } @@ -2279,7 +2334,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, "requires": { "array-find-index": "1.0.2" } @@ -2288,7 +2342,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "1.0.0" } @@ -2316,8 +2369,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decompress-response": { "version": "3.3.0", @@ -2402,8 +2454,7 @@ "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 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", @@ -2512,32 +2563,6 @@ "integrity": "sha1-UK7n24uruZA4HwEMY/q7pbWOVM0=", "dev": true }, - "dmg-builder": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-2.1.2.tgz", - "integrity": "sha512-fG4XlmI4wBI0+o+IiJtBqPi5epTBb9XJKvA3Us+1kw2hcbn99sgJh6RyXzuCAoMtJ+9Vr/+qRUIsW0USdhMo0w==", - "dev": true, - "requires": { - "bluebird-lst": "1.0.5", - "builder-util": "3.0.12", - "debug": "3.1.0", - "fs-extra-p": "4.4.4", - "iconv-lite": "0.4.19", - "js-yaml": "3.10.0", - "parse-color": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "docdash": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/docdash/-/docdash-0.4.0.tgz", @@ -2572,6 +2597,11 @@ } } }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", @@ -2622,7 +2652,6 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, "requires": { "readable-stream": "1.1.14" }, @@ -2630,14 +2659,12 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -2648,8 +2675,7 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, @@ -2672,7 +2698,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, "optional": true, "requires": { "jsbn": "0.1.1" @@ -2687,8 +2712,7 @@ "editor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", - "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=", - "dev": true + "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=" }, "ejs": { "version": "2.5.7", @@ -2708,27 +2732,27 @@ } }, "electron-builder": { - "version": "19.37.2", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-19.37.2.tgz", - "integrity": "sha512-a7OFQqnWUI12bxbn6YG1eqld5gmSPWSEIfQsbHAzNzbZb1M4KUwjMPpJDQp9t1ekmpc2bNO+VsntRDVETpaXkg==", + "version": "19.43.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-19.43.0.tgz", + "integrity": "sha512-IuK/fPQBQn//i+Pf6yt5iu7+SUhJ/3Mae4p9GAvWvbpZ0q9+590PniQDoruEnUH51gtnJywy+680KmqXACPAsg==", "dev": true, "requires": { "7zip-bin": "2.2.7", - "app-package-builder": "1.2.1", - "asar-integrity": "0.2.2", + "app-package-builder": "1.3.3", + "asar-integrity": "0.2.3", "async-exit-hook": "2.0.1", "bluebird-lst": "1.0.5", - "builder-util": "3.0.12", - "builder-util-runtime": "2.1.0", + "builder-util": "3.2.0", + "builder-util-runtime": "2.5.0", "chalk": "2.3.0", "chromium-pickle-js": "0.2.0", "cuint": "0.2.2", "debug": "3.1.0", - "dmg-builder": "2.1.2", + "dmg-builder": "2.1.5", "ejs": "2.5.7", "electron-download-tf": "4.3.4", "electron-osx-sign": "0.4.7", - "electron-publish": "19.37.0", + "electron-publish": "19.43.0", "fs-extra-p": "4.4.4", "hosted-git-info": "2.5.0", "is-ci": "1.0.10", @@ -2743,13 +2767,52 @@ "semver": "5.4.1", "temp-file": "2.0.3", "update-notifier": "2.3.0", - "yargs": "9.0.1" + "yargs": "10.0.3" }, "dependencies": { + "app-package-builder": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/app-package-builder/-/app-package-builder-1.3.3.tgz", + "integrity": "sha512-aBcCNFQ4GDQ0AOYvTmd/g2L2zoV+RnK6TQnNm3IoakdonQ4iqiyOZFGc6i53SYEnB5JRcZEdpO7RjXeO8Nr9sg==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "3.2.0", + "builder-util-runtime": "2.5.0", + "fs-extra-p": "4.4.4", + "int64-buffer": "0.1.9", + "js-yaml": "3.10.0", + "rabin-bindings": "1.7.3" + } + }, + "builder-util": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-3.2.0.tgz", + "integrity": "sha512-TWvixCYS4fyZgrn4tSeKfsO1j13zX8MGWRgLdsWP0op4SD0Lp4NJJVJjvwBzHIfOCcxpQsszgbcSMBE2lrMVjA==", + "dev": true, + "requires": { + "7zip-bin": "2.2.7", + "bluebird-lst": "1.0.5", + "builder-util-runtime": "2.5.0", + "chalk": "2.3.0", + "debug": "3.1.0", + "fs-extra-p": "4.4.4", + "ini": "1.3.4", + "is-ci": "1.0.10", + "js-yaml": "3.10.0", + "lazy-val": "1.0.2", + "node-emoji": "1.8.1", + "semver": "5.4.1", + "source-map-support": "0.5.0", + "stat-mode": "0.2.2", + "temp-file": "2.0.3", + "tunnel-agent": "0.6.0" + } + }, "builder-util-runtime": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-2.1.0.tgz", - "integrity": "sha512-bJMylNsVXcmalU2A1WyU6Yxfv2/cbcdYuh1DM4xvQK3Jr3mRb1NHbM8No09spo4LelrFtlm6iVdRpMbEnKbiTQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-2.5.0.tgz", + "integrity": "sha512-1D/jB5FDc8RP8UxPvUo7UwcChNiDviJks57LUkWeGY8TLCoQLljDUamOBAUYXeZ4HnAqwuTsVgWgx5jxmayl5Q==", "dev": true, "requires": { "bluebird-lst": "1.0.5", @@ -2767,47 +2830,48 @@ "ms": "2.0.0" } }, - "electron-download-tf": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/electron-download-tf/-/electron-download-tf-4.3.4.tgz", - "integrity": "sha512-SQYDGMLpTgty1bx3NycuDb7dNPzktVSdK2sqPZjyRocauq/uN/V4S2lcpFVLupaHhKlD8zozm9fTpm5UdohvTg==", + "dmg-builder": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-2.1.5.tgz", + "integrity": "sha512-KbldWIhaP3XSI7sYPGrBcNwSPxvB2ImIMSqz1tKcIqVZ9P+9UvYtdIJvM6Og6DSyAQlwX37E0soKwD/eddGFUA==", "dev": true, "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "3.2.0", "debug": "3.1.0", - "env-paths": "1.0.0", - "fs-extra": "4.0.2", - "minimist": "1.2.0", - "nugget": "2.0.1", - "path-exists": "3.0.0", - "rc": "1.2.2", - "semver": "5.4.1", - "sumchecker": "2.0.2" + "fs-extra-p": "4.4.4", + "iconv-lite": "0.4.19", + "js-yaml": "3.10.0", + "parse-color": "1.0.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "electron-publish": { + "version": "19.43.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-19.43.0.tgz", + "integrity": "sha512-gsFmUsdzfB2EXtMHJD+jRJgvREgUUJasGbZsoaRiJQr5kJZruUQOkIq+NMRsN9o3eQvu0fhxdotDhH4W+U1ebA==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "3.2.0", + "builder-util-runtime": "2.5.0", + "chalk": "2.3.0", + "fs-extra-p": "4.4.4", + "mime": "2.0.3" + } + }, + "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 }, - "sumchecker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", - "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "source-map-support": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", + "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==", "dev": true, "requires": { - "debug": "2.6.9" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "source-map": "0.6.1" } } } @@ -2983,6 +3047,60 @@ } } }, + "electron-download-tf": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/electron-download-tf/-/electron-download-tf-4.3.4.tgz", + "integrity": "sha512-SQYDGMLpTgty1bx3NycuDb7dNPzktVSdK2sqPZjyRocauq/uN/V4S2lcpFVLupaHhKlD8zozm9fTpm5UdohvTg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "env-paths": "1.0.0", + "fs-extra": "4.0.2", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "3.0.0", + "rc": "1.2.2", + "semver": "5.4.1", + "sumchecker": "2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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 + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "2.6.9" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, "electron-editor-context-menu": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/electron-editor-context-menu/-/electron-editor-context-menu-1.1.1.tgz", @@ -3083,20 +3201,6 @@ } } }, - "electron-publish": { - "version": "19.37.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-19.37.0.tgz", - "integrity": "sha512-2Ly4XVmnK4cd9P1+a28DRhhj0UJghXOUmIyB47OOSWtanUE7Gggnfpd1JzHP+0iGLZog7TvvI9TsGr8epoSMyg==", - "dev": true, - "requires": { - "bluebird-lst": "1.0.5", - "builder-util": "3.0.12", - "builder-util-runtime": "2.4.0", - "chalk": "2.3.0", - "fs-extra-p": "4.4.4", - "mime": "2.0.3" - } - }, "electron-settings": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/electron-settings/-/electron-settings-3.1.3.tgz", @@ -3178,7 +3282,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -3218,9 +3321,9 @@ } }, "eslint": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.9.0.tgz", - "integrity": "sha1-doedJ0BoJhsZH+Dy9Wx0wvQgjos=", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", + "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", "dev": true, "requires": { "ajv": "5.3.0", @@ -3239,7 +3342,7 @@ "functional-red-black-tree": "1.0.1", "glob": "7.1.2", "globals": "9.18.0", - "ignore": "3.3.6", + "ignore": "3.3.7", "imurmurhash": "0.1.4", "inquirer": "3.3.0", "is-resolvable": "1.0.0", @@ -3366,6 +3469,11 @@ "strip-eof": "1.0.0" } }, + "exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -3400,8 +3508,7 @@ "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "external-editor": { "version": "2.0.5", @@ -3410,7 +3517,7 @@ "dev": true, "requires": { "iconv-lite": "0.4.19", - "jschardet": "1.5.1", + "jschardet": "1.6.0", "tmp": "0.0.33" } }, @@ -3480,8 +3587,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fancy-log": { "version": "1.3.0", @@ -3511,14 +3617,12 @@ "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=", - "dev": true + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -3554,6 +3658,11 @@ "object-assign": "4.1.1" } }, + "file-type": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.2.0.tgz", + "integrity": "sha1-ETz+1S4daVmrgCSJBuLyWozcy3Q=" + }, "file-url": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/file-url/-/file-url-2.0.2.tgz", @@ -3591,7 +3700,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, "requires": { "path-exists": "2.1.0", "pinkie-promise": "2.0.1" @@ -3643,7 +3751,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/fkill/-/fkill-5.1.0.tgz", "integrity": "sha512-Zl4rPQPwG89E9Xd9nV2Mc7RXyVe8RbJGMcFBvLoYvjEC0pXdrY6tgLshD+vJq6oMtB65d81ZTHxj5m/K76mxlw==", - "dev": true, "requires": { "aggregate-error": "1.0.0", "arrify": "1.0.1", @@ -3655,7 +3762,6 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -3692,6 +3798,14 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", "dev": true }, + "for-each": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", + "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", + "requires": { + "is-function": "1.0.1" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -3708,14 +3822,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "dev": true, "requires": { "asynckit": "0.4.0", "combined-stream": "1.0.5", @@ -4588,8 +4700,7 @@ "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { "version": "3.0.0", @@ -4605,7 +4716,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "1.0.0" } @@ -4614,7 +4724,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ghauth/-/ghauth-2.0.1.tgz", "integrity": "sha1-ebfWiwvPjn0IUqI7FHU539MUrPY=", - "dev": true, "requires": { "bl": "0.9.5", "hyperquest": "1.2.0", @@ -4627,7 +4736,6 @@ "version": "0.9.5", "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "dev": true, "requires": { "readable-stream": "1.0.34" } @@ -4635,14 +4743,12 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -4653,22 +4759,19 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } }, "git-branch": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/git-branch/-/git-branch-1.0.0.tgz", - "integrity": "sha512-ZTzuqw5Df8fyLXQWrX6hK+4FpNCdKzMcERlxENEGO5aKcLmG7MAszhrMhluUKNKmOS/JAGijDMQDXDCDw1mE/A==", - "dev": true + "integrity": "sha512-ZTzuqw5Df8fyLXQWrX6hK+4FpNCdKzMcERlxENEGO5aKcLmG7MAszhrMhluUKNKmOS/JAGijDMQDXDCDw1mE/A==" }, "github-from-package": { "version": "0.0.0", @@ -4680,7 +4783,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/github-url-to-object/-/github-url-to-object-1.6.0.tgz", "integrity": "sha1-iR73+7+rqP7XFRCs2xtOk0apcNw=", - "dev": true, "requires": { "is-url": "1.2.2" } @@ -4702,7 +4804,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", - "dev": true, "requires": { "glob": "7.1.2", "yargs": "1.2.6" @@ -4711,14 +4812,12 @@ "minimist": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", - "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", - "dev": true + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=" }, "yargs": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", - "dev": true, "requires": { "minimist": "0.1.0" } @@ -4837,6 +4936,15 @@ "find-index": "0.1.1" } }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "2.19.0", + "process": "0.5.2" + } + }, "global-dirs": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", @@ -4877,7 +4985,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, "requires": { "array-union": "1.0.2", "glob": "7.1.2", @@ -4889,8 +4996,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -5180,14 +5286,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, "requires": { "ajv": "5.3.0", "har-schema": "2.0.0" @@ -5247,7 +5351,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/hash-files/-/hash-files-1.1.1.tgz", "integrity": "sha1-X4nGTvIezmnIJhJUt2Wb1A6R2N4=", - "dev": true, "requires": { "async": "1.5.2", "glob-all": "3.1.0", @@ -5266,7 +5369,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, "requires": { "boom": "4.3.1", "cryptiles": "3.1.2", @@ -5283,8 +5385,7 @@ "hoek": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", - "dev": true + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" }, "home-or-tmp": { "version": "2.0.0", @@ -5313,8 +5414,7 @@ "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" }, "html-comment-regex": { "version": "1.1.1", @@ -5371,7 +5471,6 @@ "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": "1.0.0", "jsprim": "1.4.1", @@ -5382,7 +5481,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/hyperquest/-/hyperquest-1.2.0.tgz", "integrity": "sha1-OeH+9miI3Hzg3sbA3YFPb8iUStU=", - "dev": true, "requires": { "duplexer2": "0.0.2", "through2": "0.6.5" @@ -5391,14 +5489,12 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -5409,14 +5505,12 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, "requires": { "readable-stream": "1.0.34", "xtend": "4.0.1" @@ -5425,11 +5519,19 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } }, + "icojs": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/icojs/-/icojs-0.8.1.tgz", + "integrity": "sha1-T23ykOaWMMeWq0EHNHY22FQnvWA=", + "requires": { + "jimp": "0.2.28", + "safe-buffer": "5.1.1" + } + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", @@ -5437,11 +5539,19 @@ "dev": true }, "ignore": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.6.tgz", - "integrity": "sha512-HrxmNxKTGZ9a3uAl/FNG66Sdt0G9L4TtMbbUQjP1WhGmSj0FOyHvSgx7623aGJvXfPOur8MwmarlHT+37jmzlw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, + "image-downloader": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/image-downloader/-/image-downloader-3.3.0.tgz", + "integrity": "sha1-/vB+qPRZCJKm8xhXupfsi9qq0MQ=", + "requires": { + "request": "2.83.0" + } + }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -5469,8 +5579,7 @@ "indento": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/indento/-/indento-1.1.10.tgz", - "integrity": "sha1-jioHVjO6z6QQPOaCVenG7rf5vX8=", - "dev": true + "integrity": "sha1-jioHVjO6z6QQPOaCVenG7rf5vX8=" }, "indexes-of": { "version": "1.0.1", @@ -5579,6 +5688,11 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=" + }, "is-absolute": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", @@ -5598,8 +5712,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-binary-path": { "version": "1.0.1", @@ -5619,7 +5732,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, "requires": { "builtin-modules": "1.1.1" } @@ -5628,7 +5740,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", - "dev": true, "requires": { "ci-info": "1.1.1" } @@ -5673,6 +5784,11 @@ "number-is-nan": "1.0.1" } }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -5852,8 +5968,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-unc-path": { "version": "0.1.2", @@ -5867,14 +5982,12 @@ "is-url": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=", - "dev": true + "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=" }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-windows": { "version": "0.2.0", @@ -5882,6 +5995,11 @@ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5896,8 +6014,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "2.1.0", @@ -5910,8 +6027,7 @@ "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 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul": { "version": "0.4.5", @@ -6077,6 +6193,51 @@ } } }, + "jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "requires": { + "bignumber.js": "2.4.0", + "bmp-js": "0.0.3", + "es6-promise": "3.3.1", + "exif-parser": "0.1.12", + "file-type": "3.9.0", + "jpeg-js": "0.2.0", + "load-bmfont": "1.3.0", + "mime": "1.4.1", + "mkdirp": "0.5.1", + "pixelmatch": "4.0.2", + "pngjs": "3.3.0", + "read-chunk": "1.0.1", + "request": "2.83.0", + "stream-to-buffer": "0.1.0", + "tinycolor2": "1.4.1", + "url-regex": "3.2.0" + }, + "dependencies": { + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + } + } + }, + "jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=" + }, "js-base64": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", @@ -6116,13 +6277,12 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, "optional": true }, "jschardet": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz", + "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ==", "dev": true }, "jsdoc": { @@ -6194,14 +6354,12 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "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=", - "dev": true + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stable-stringify": { "version": "1.0.1", @@ -6215,14 +6373,12 @@ "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 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json2md": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/json2md/-/json2md-1.5.10.tgz", "integrity": "sha1-TV6wtCXPCV6xXNR8VdhC06jkpLc=", - "dev": true, "requires": { "indento": "1.1.10" } @@ -6250,7 +6406,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -6548,11 +6703,36 @@ "resolve": "1.4.0" } }, + "load-bmfont": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.3.0.tgz", + "integrity": "sha1-u358cQ3mvK/LE8s7jIHgwBMey8k=", + "requires": { + "buffer-equal": "0.0.1", + "mime": "1.4.1", + "parse-bmfont-ascii": "1.0.6", + "parse-bmfont-binary": "1.0.6", + "parse-bmfont-xml": "1.1.3", + "xhr": "2.4.0", + "xtend": "4.0.1" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, "requires": { "graceful-fs": "4.1.11", "parse-json": "2.2.0", @@ -6564,8 +6744,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -6674,8 +6853,7 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "lodash.isarguments": { "version": "3.1.0", @@ -6809,7 +6987,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "0.4.1", "signal-exit": "3.0.2" @@ -6824,7 +7001,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -6854,8 +7030,7 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "marked": { "version": "0.3.6", @@ -6882,7 +7057,6 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, "requires": { "camelcase-keys": "2.1.0", "decamelize": "1.2.0", @@ -6925,14 +7099,12 @@ "mime-db": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", - "dev": true + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" }, "mime-types": { "version": "2.1.17", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "dev": true, "requires": { "mime-db": "1.30.0" } @@ -6948,6 +7120,14 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "0.1.1" + } + }, "minami": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", @@ -7004,8 +7184,7 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { "version": "2.7.0", @@ -7076,7 +7255,6 @@ "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==", - "dev": true, "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", @@ -7114,7 +7292,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "2.0.1" } @@ -7176,8 +7353,7 @@ "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { "version": "4.1.1", @@ -7187,14 +7363,12 @@ "object-keys": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" }, "object-path": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" }, "object.defaults": { "version": "1.1.0", @@ -7268,11 +7442,18 @@ "mimic-fn": "1.1.0" } }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "requires": { + "is-wsl": "1.1.0" + } + }, "opter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/opter/-/opter-1.1.0.tgz", "integrity": "sha1-JZiuu2Cz8acyKvEJcIb055jISnY=", - "dev": true, "requires": { "commander": "2.11.0", "js-yaml": "3.10.0", @@ -7476,6 +7657,25 @@ } } }, + "parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" + }, + "parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" + }, + "parse-bmfont-xml": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.3.tgz", + "integrity": "sha1-1rZqNxr9OcUAfZ8O6yYqTyzOe3w=", + "requires": { + "xml-parse-from-string": "1.0.1", + "xml2js": "0.4.19" + } + }, "parse-color": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", @@ -7520,11 +7720,19 @@ "is-glob": "2.0.1" } }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "requires": { + "for-each": "0.3.2", + "trim": "0.0.1" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, "requires": { "error-ex": "1.3.1" } @@ -7554,7 +7762,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, "requires": { "pinkie-promise": "2.0.1" } @@ -7573,8 +7780,7 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", @@ -7601,7 +7807,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, "requires": { "graceful-fs": "4.1.11", "pify": "2.3.0", @@ -7611,8 +7816,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -7625,8 +7829,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "3.0.0", @@ -7636,23 +7839,28 @@ "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "2.0.4" } }, + "pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "requires": { + "pngjs": "3.3.0" + } + }, "pkginfo": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", - "dev": true + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" }, "plist": { "version": "2.1.0", @@ -7671,6 +7879,11 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "pngjs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.0.tgz", + "integrity": "sha1-H1cwwYnJSTO4G+2iqy+OKFUmOo8=" + }, "port-numbers": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/port-numbers/-/port-numbers-2.0.9.tgz", @@ -8065,7 +8278,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, "requires": { "get-stdin": "4.0.1", "meow": "3.7.0" @@ -8082,6 +8294,11 @@ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", @@ -8090,14 +8307,12 @@ "progress": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" }, "progress-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", - "dev": true, "requires": { "speedometer": "0.1.4", "through2": "0.2.3" @@ -8122,14 +8337,12 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "publish-release": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/publish-release/-/publish-release-1.3.3.tgz", "integrity": "sha1-bNEd+DXhTBOw4Io10/uZK5GL7Dw=", - "dev": true, "requires": { "async": "0.9.2", "ghauth": "2.0.1", @@ -8149,20 +8362,17 @@ "ansi-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", - "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", - "dev": true + "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=" }, "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -8174,14 +8384,12 @@ "cli-width": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", - "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=", - "dev": true + "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=" }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, "requires": { "escape-string-regexp": "1.0.5", "object-assign": "4.1.1" @@ -8191,7 +8399,6 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.8.5.tgz", "integrity": "sha1-29dAz2yjtzEpamPOb22WGFHzNt8=", - "dev": true, "requires": { "ansi-regex": "1.1.1", "chalk": "1.1.3", @@ -8206,20 +8413,17 @@ "lodash": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" }, "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, "single-line-log": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-0.4.1.tgz", - "integrity": "sha1-h6VWSfdJ14PsDc2AToFA2Yc8fO4=", - "dev": true + "integrity": "sha1-h6VWSfdJ14PsDc2AToFA2Yc8fO4=" } } }, @@ -8236,8 +8440,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "q": { "version": "1.5.1", @@ -8248,8 +8451,7 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "query-string": { "version": "4.3.4", @@ -8330,11 +8532,15 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, "requires": { "mute-stream": "0.0.7" } }, + "read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=" + }, "read-config-file": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-1.2.0.tgz", @@ -8355,14 +8561,12 @@ "read-files": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/read-files/-/read-files-0.1.0.tgz", - "integrity": "sha1-YGu3oBd5Utai+YPVmAlglDFNMh4=", - "dev": true + "integrity": "sha1-YGu3oBd5Utai+YPVmAlglDFNMh4=" }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, "requires": { "load-json-file": "1.1.0", "normalize-package-data": "2.4.0", @@ -8373,7 +8577,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, "requires": { "find-up": "1.1.2", "read-pkg": "1.1.0" @@ -8409,7 +8612,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", "integrity": "sha1-mUQ7pug7gw7zBRv9fcJBqCco1Wg=", - "dev": true, "requires": { "mute-stream": "0.0.4", "strip-ansi": "2.0.1" @@ -8418,20 +8620,17 @@ "ansi-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", - "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", - "dev": true + "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=" }, "mute-stream": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha1-qSGZYKbV1dBGWXruUSUsZlX3F34=", - "dev": true + "integrity": "sha1-qSGZYKbV1dBGWXruUSUsZlX3F34=" }, "strip-ansi": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", - "dev": true, "requires": { "ansi-regex": "1.1.1" } @@ -8451,7 +8650,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, "requires": { "indent-string": "2.1.0", "strip-indent": "1.0.1" @@ -8461,7 +8659,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, "requires": { "repeating": "2.0.1" } @@ -8625,7 +8822,6 @@ "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "dev": true, "requires": { "aws-sign2": "0.7.0", "aws4": "1.6.0", @@ -8774,8 +8970,7 @@ "rx": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", - "integrity": "sha1-Ia3H2A8CACr1Da6X/Z2/JIdV9WY=", - "dev": true + "integrity": "sha1-Ia3H2A8CACr1Da6X/Z2/JIdV9WY=" }, "rx-lite": { "version": "4.0.8", @@ -8918,7 +9113,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -8926,8 +9120,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "sigmund": { "version": "1.0.1", @@ -8938,8 +9131,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "simple-get": { "version": "1.4.3", @@ -9000,7 +9192,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", - "dev": true, "requires": { "hoek": "4.2.0" } @@ -9069,7 +9260,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, "requires": { "spdx-license-ids": "1.2.2" } @@ -9077,20 +9267,17 @@ "spdx-expression-parse": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" }, "spdx-license-ids": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" }, "speedometer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", - "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", - "dev": true + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" }, "sprintf-js": { "version": "1.0.3", @@ -9101,7 +9288,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, "requires": { "asn1": "0.2.3", "assert-plus": "1.0.0", @@ -9125,6 +9311,19 @@ "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", "dev": true }, + "stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=" + }, + "stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", + "requires": { + "stream-to": "0.2.2" + } + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -9135,7 +9334,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/string-editor/-/string-editor-0.1.2.tgz", "integrity": "sha1-9f8bWsSu16xsL7jeI20VUbIPYdA=", - "dev": true, "requires": { "editor": "1.0.0" } @@ -9162,8 +9360,7 @@ "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { "version": "3.0.1", @@ -9177,7 +9374,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, "requires": { "is-utf8": "0.2.1" } @@ -9185,14 +9381,12 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, "requires": { "get-stdin": "4.0.1" } @@ -9441,7 +9635,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/taskkill/-/taskkill-2.0.0.tgz", "integrity": "sha1-o1QwVwKpZDVwMwJ6qUnq7VMxt4Q=", - "dev": true, "requires": { "arrify": "1.0.1", "execa": "0.1.1" @@ -9451,7 +9644,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-0.1.1.tgz", "integrity": "sha1-sJwqkwm8DvBQFHlHLbMYD41MPt0=", - "dev": true, "requires": { "cross-spawn-async": "2.2.5", "object-assign": "4.1.1", @@ -9496,14 +9688,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true, "requires": { "readable-stream": "1.1.14", "xtend": "2.1.2" @@ -9512,14 +9702,12 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -9530,8 +9718,7 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, @@ -9555,6 +9742,11 @@ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9573,7 +9765,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "dev": true, "requires": { "punycode": "1.4.1" } @@ -9663,11 +9854,15 @@ "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", "dev": true }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, "trim-right": { "version": "1.0.1", @@ -9698,7 +9893,6 @@ "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.1.1" } @@ -9707,7 +9901,6 @@ "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 }, "type-check": { @@ -9816,8 +10009,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "underscore-contrib": { "version": "0.3.0", @@ -9922,6 +10114,14 @@ "prepend-http": "1.0.4" } }, + "url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "requires": { + "ip-regex": "1.0.3" + } + }, "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", @@ -9946,8 +10146,7 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, "v8flags": { "version": "2.1.1", @@ -9961,7 +10160,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, "requires": { "spdx-correct": "1.0.2", "spdx-expression-parse": "1.0.4" @@ -9970,8 +10168,7 @@ "validator": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", - "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==", - "dev": true + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==" }, "vendors": { "version": "1.0.1", @@ -9983,7 +10180,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "1.0.0", "core-util-is": "1.0.2", @@ -10163,7 +10359,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -10279,6 +10474,24 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xhr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.0.tgz", + "integrity": "sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM=", + "requires": { + "global": "4.3.2", + "is-function": "1.0.1", + "parse-headers": "2.0.1", + "xtend": "4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, "xml-name-validator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", @@ -10286,6 +10499,27 @@ "dev": true, "optional": true }, + "xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": "1.2.4", + "xmlbuilder": "9.0.4" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", + "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=" + } + } + }, "xmlbuilder": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", @@ -10308,7 +10542,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, "requires": { "object-keys": "0.4.0" } @@ -10322,38 +10555,35 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yamljs": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "dev": true, "requires": { "argparse": "1.0.9", "glob": "7.1.2" } }, "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz", + "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", "dev": true, "requires": { - "camelcase": "4.1.0", "cliui": "3.2.0", "decamelize": "1.2.0", + "find-up": "2.1.0", "get-caller-file": "1.0.2", "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", "require-directory": "2.1.1", "require-main-filename": "1.0.1", "set-blocking": "2.0.0", "string-width": "2.1.1", "which-module": "2.0.0", "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "yargs-parser": "8.0.0" }, "dependencies": { "ansi-regex": { @@ -10362,12 +10592,6 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -10383,54 +10607,6 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -10449,19 +10625,13 @@ "requires": { "ansi-regex": "3.0.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz", + "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=", "dev": true, "requires": { "camelcase": "4.1.0" @@ -10488,7 +10658,6 @@ "version": "3.18.4", "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz", "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==", - "dev": true, "requires": { "commander": "2.11.0", "lodash.get": "4.4.2", @@ -10500,7 +10669,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/z-schema-errors/-/z-schema-errors-0.0.1.tgz", "integrity": "sha1-4GJwpMpDklcp8ldkeJyp9Gv/D30=", - "dev": true, "requires": { "xtend": "4.0.1" }, @@ -10508,8 +10676,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } } diff --git a/package.json b/package.json index 212ab70b..acb00680 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pb-for-desktop", "productName": "PB for Desktop", - "version": "6.2.6", + "version": "6.3.1", "description": "Pushbullet Desktop app for macOS, Windows and Linux.", "license": "MIT", "homepage": "https://sidneys.github.io/pb-for-desktop", @@ -44,6 +44,17 @@ ], "preferGlobal": true, "dependencies": { + "@sidneys/dom-tools": "^1.0.1", + "@sidneys/electron-build": "^1.0.2", + "@sidneys/electron-deploy-github": "^1.0.1", + "@sidneys/electron-localsetup": "^1.0.1", + "@sidneys/h264ify": "^1.0.2", + "@sidneys/is-env": "^1.0.4", + "@sidneys/logger": "^1.0.7", + "@sidneys/platform-tools": "^1.0.0", + "@sidneys/releasenotes": "^1.0.1", + "@sidneys/required-count": "^1.0.1", + "@sidneys/text-ellipsis": "^1.0.1", "app-root-path": "^2.0.1", "appdirectory": "^0.1.0", "auto-launch": "git://github.com/sidneys/node-auto-launch.git#master", @@ -55,15 +66,20 @@ "electron-editor-context-menu": "^1.1.1", "electron-settings": "^3.1.3", "electron-updater": "^2.15.0", + "file-type": "^7.2.0", "file-url": "^2.0.2", "filesize": "^3.5.11", "fs-extra": "^4.0.2", "get-youtube-id": "^1.0.0", + "icojs": "^0.8.1", + "image-downloader": "^3.3.0", "is-reachable": "^2.3.3", + "jimp": "^0.2.28", "keypath": "^0.0.1", "lodash": "^4.17.4", "minimist": "^1.2.0", "moment": "^2.19.1", + "opn": "^5.1.0", "parse-domain": "^1.1.0", "parse-semver": "^1.1.1", "present": "^1.0.0", @@ -75,10 +91,10 @@ "devDependencies": { "docdash": "^0.4.0", "electron": "1.7.9", - "electron-builder": "19.37.2", + "electron-builder": "19.43.0", "electron-connect": "^0.6.2", "electron-prebuilt-compile": "1.7.9", - "eslint": "^4.9.0", + "eslint": "^4.10.0", "fkill": "^5.1.0", "git-branch": "^1.0.0", "globby": "^6.1.0", @@ -98,12 +114,12 @@ "pb-for-desktop": "./bin/cli.js" }, "scripts": { - "build": "node ./lib/build.js", - "deploy": "node ./lib/deploy.js", - "generate-docs": "./node_modules/.bin/jsdoc --verbose --configure .jsdoc.json", + "build": "node ./node_modules/@sidneys/electron-build/index.js", + "deploy": "node ./node_modules/@sidneys/electron-deploy-github/index.js", + "docs": "./node_modules/.bin/jsdoc --verbose --configure .jsdoc.json", "livereload": "./node_modules/.bin/gulp", - "localsetup": "./node_modules/.bin/babel-node ./lib/localsetup.js", - "releasenotes": "node ./lib/releasenotes.js", + "localsetup": "node ./node_modules/@sidneys/electron-localsetup/index.js", + "releasenotes": "node ./node_modules/@sidneys/releasenotes/index.js", "start": "./node_modules/.bin/electron ./app/scripts/main/components/application.js" }, "build": { diff --git a/sounds/android-10.wav b/sounds/android-10.wav new file mode 100644 index 00000000..1a7c0600 Binary files /dev/null and b/sounds/android-10.wav differ diff --git a/sounds/android-11.wav b/sounds/android-11.wav new file mode 100644 index 00000000..af525eda Binary files /dev/null and b/sounds/android-11.wav differ diff --git a/sounds/android-12.wav b/sounds/android-12.wav new file mode 100644 index 00000000..8eacb09e Binary files /dev/null and b/sounds/android-12.wav differ diff --git a/sounds/android-13.wav b/sounds/android-13.wav new file mode 100644 index 00000000..ff94b324 Binary files /dev/null and b/sounds/android-13.wav differ diff --git a/sounds/android-14.wav b/sounds/android-14.wav new file mode 100644 index 00000000..e76d9d22 Binary files /dev/null and b/sounds/android-14.wav differ diff --git a/sounds/android-15.wav b/sounds/android-15.wav new file mode 100644 index 00000000..2822c64b Binary files /dev/null and b/sounds/android-15.wav differ diff --git a/sounds/android-16.wav b/sounds/android-16.wav new file mode 100644 index 00000000..15544681 Binary files /dev/null and b/sounds/android-16.wav differ diff --git a/sounds/android-17.wav b/sounds/android-17.wav new file mode 100644 index 00000000..484ac307 Binary files /dev/null and b/sounds/android-17.wav differ diff --git a/sounds/android-18.wav b/sounds/android-18.wav new file mode 100644 index 00000000..af9af16d Binary files /dev/null and b/sounds/android-18.wav differ diff --git a/sounds/android-9.wav b/sounds/android-9.wav new file mode 100644 index 00000000..8ea04a7b Binary files /dev/null and b/sounds/android-9.wav differ diff --git a/sounds/notificationsounds.com-1.wav b/sounds/generic-1.wav similarity index 100% rename from sounds/notificationsounds.com-1.wav rename to sounds/generic-1.wav diff --git a/sounds/notificationsounds.com-2.wav b/sounds/generic-2.wav similarity index 100% rename from sounds/notificationsounds.com-2.wav rename to sounds/generic-2.wav diff --git a/sounds/notificationsounds.com-3.wav b/sounds/generic-3.wav similarity index 100% rename from sounds/notificationsounds.com-3.wav rename to sounds/generic-3.wav diff --git a/sounds/windows-1.wav b/sounds/windows-1.wav old mode 100644 new mode 100755 index b3127d1e..e1c691cb Binary files a/sounds/windows-1.wav and b/sounds/windows-1.wav differ diff --git a/sounds/windows-10.wav b/sounds/windows-10.wav new file mode 100755 index 00000000..d0ea2b97 Binary files /dev/null and b/sounds/windows-10.wav differ diff --git a/sounds/windows-11.wav b/sounds/windows-11.wav new file mode 100755 index 00000000..82a4cc74 Binary files /dev/null and b/sounds/windows-11.wav differ diff --git a/sounds/windows-12.wav b/sounds/windows-12.wav new file mode 100755 index 00000000..122f3013 Binary files /dev/null and b/sounds/windows-12.wav differ diff --git a/sounds/windows-13.wav b/sounds/windows-13.wav new file mode 100755 index 00000000..4c33eb49 Binary files /dev/null and b/sounds/windows-13.wav differ diff --git a/sounds/windows-14.wav b/sounds/windows-14.wav new file mode 100755 index 00000000..ee6e2c0c Binary files /dev/null and b/sounds/windows-14.wav differ diff --git a/sounds/windows-15.wav b/sounds/windows-15.wav new file mode 100755 index 00000000..00de1d66 Binary files /dev/null and b/sounds/windows-15.wav differ diff --git a/sounds/windows-16.wav b/sounds/windows-16.wav new file mode 100755 index 00000000..b6d05c05 Binary files /dev/null and b/sounds/windows-16.wav differ diff --git a/sounds/windows-17.wav b/sounds/windows-17.wav new file mode 100755 index 00000000..0ef7d1b4 Binary files /dev/null and b/sounds/windows-17.wav differ diff --git a/sounds/windows-18.wav b/sounds/windows-18.wav new file mode 100755 index 00000000..172c19fb Binary files /dev/null and b/sounds/windows-18.wav differ diff --git a/sounds/windows-19.wav b/sounds/windows-19.wav new file mode 100644 index 00000000..b3127d1e Binary files /dev/null and b/sounds/windows-19.wav differ diff --git a/sounds/windows-2.wav b/sounds/windows-2.wav old mode 100644 new mode 100755 index 83e872d4..7d014469 Binary files a/sounds/windows-2.wav and b/sounds/windows-2.wav differ diff --git a/sounds/windows-20.wav b/sounds/windows-20.wav new file mode 100644 index 00000000..83e872d4 Binary files /dev/null and b/sounds/windows-20.wav differ diff --git a/sounds/windows-3.wav b/sounds/windows-3.wav new file mode 100755 index 00000000..a4f01a2f Binary files /dev/null and b/sounds/windows-3.wav differ diff --git a/sounds/windows-4.wav b/sounds/windows-4.wav new file mode 100755 index 00000000..9e981a98 Binary files /dev/null and b/sounds/windows-4.wav differ diff --git a/sounds/windows-5.wav b/sounds/windows-5.wav new file mode 100755 index 00000000..11a6d368 Binary files /dev/null and b/sounds/windows-5.wav differ diff --git a/sounds/windows-6.wav b/sounds/windows-6.wav new file mode 100755 index 00000000..d9179d3c Binary files /dev/null and b/sounds/windows-6.wav differ diff --git a/sounds/windows-7.wav b/sounds/windows-7.wav new file mode 100755 index 00000000..26ef1c76 Binary files /dev/null and b/sounds/windows-7.wav differ diff --git a/sounds/windows-8.wav b/sounds/windows-8.wav new file mode 100755 index 00000000..b6423d1c Binary files /dev/null and b/sounds/windows-8.wav differ diff --git a/sounds/windows-9.wav b/sounds/windows-9.wav new file mode 100755 index 00000000..59324cb1 Binary files /dev/null and b/sounds/windows-9.wav differ diff --git a/yarn.lock b/yarn.lock index aab42d6c..79d479a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,6 +48,114 @@ vue-template-compiler "^2.0.0-alpha.8" vue-template-es2015-compiler "^1.4.2" +"@sidneys/dom-tools@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@sidneys/dom-tools/-/dom-tools-1.0.1.tgz#2c8046d9cb7862e225bf74aee39bb8d458616f0c" + dependencies: + "@sidneys/logger" "^1.0.7" + app-root-path "^2.0.1" + clean-css "^4.1.9" + file-url "^2.0.2" + lodash "^4.17.4" + moment "^2.19.1" + +"@sidneys/electron-build@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@sidneys/electron-build/-/electron-build-1.0.2.tgz#335521f690cec8c687515cb6d135114779c2c258" + dependencies: + "@sidneys/electron-deploy-github" "^1.0.0" + "@sidneys/logger" "^1.0.7" + "@sidneys/platform-tools" "^1.0.0" + "@sidneys/releasenotes" "^1.0.1" + app-root-path "^2.0.1" + globby "^6.1.0" + hash-files "^1.1.1" + lodash "^4.17.4" + minimist "^1.2.0" + yamljs "^0.3.0" + +"@sidneys/electron-deploy-github@^1.0.0", "@sidneys/electron-deploy-github@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@sidneys/electron-deploy-github/-/electron-deploy-github-1.0.1.tgz#de0d9d3c1d9afb06121dc128d5fdeb7a5fd5f0de" + dependencies: + "@sidneys/logger" "^1.0.7" + "@sidneys/releasenotes" "^1.0.1" + app-root-path "^2.0.1" + git-branch "^1.0.0" + globby "^6.1.0" + is-ci "^1.0.10" + lodash "^4.17.4" + progress "^2.0.0" + publish-release "^1.3.3" + +"@sidneys/electron-localsetup@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@sidneys/electron-localsetup/-/electron-localsetup-1.0.1.tgz#476757b58954ed68b7ac19abf0a362f14e4b1cea" + dependencies: + "@sidneys/is-env" "^1.0.4" + "@sidneys/logger" "^1.0.7" + "@sidneys/platform-tools" "^1.0.0" + app-root-path "^2.0.1" + fkill "^5.1.0" + globby "^6.1.0" + minimist "^1.2.0" + +"@sidneys/h264ify@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@sidneys/h264ify/-/h264ify-1.0.2.tgz#68ff90b2c3c9139239efd45e28f6769490263e75" + dependencies: + "@sidneys/logger" "^1.0.0" + app-root-path "^2.0.1" + +"@sidneys/is-env@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@sidneys/is-env/-/is-env-1.0.4.tgz#7e9b5466bb1f268ee395414a5650f8fbc0e7d74d" + dependencies: + "@sidneys/required-count" "^1.0.1" + app-root-path "^2.0.1" + chalk "^2.3.0" + chalkline "^0.0.5" + lodash "^4.17.4" + minimist "^1.2.0" + try-require "^1.2.1" + +"@sidneys/logger@^1.0.0", "@sidneys/logger@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@sidneys/logger/-/logger-1.0.7.tgz#9704ebc7f35eb72a5c30ccf674b2fe08d0515c8f" + dependencies: + "@sidneys/is-env" "^1.0.4" + app-root-path "^2.0.1" + appdirectory "^0.1.0" + chalk "^2.3.0" + lodash "^4.17.4" + present "^1.0.0" + +"@sidneys/platform-tools@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sidneys/platform-tools/-/platform-tools-1.0.0.tgz#f6e78fdb78badbaacca4b0437c530c8d20012f94" + dependencies: + "@sidneys/logger" "^1.0.0" + app-root-path "^2.0.1" + lodash "^4.17.4" + +"@sidneys/releasenotes@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@sidneys/releasenotes/-/releasenotes-1.0.1.tgz#1f0bafef4e4e5bb2c302f9a44d01e2d8d4f0bb67" + dependencies: + "@sidneys/logger" "^1.0.0" + app-root-path "^2.0.1" + json2md "^1.5.10" + lodash "^4.17.4" + remove-markdown "^0.2.2" + +"@sidneys/required-count@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@sidneys/required-count/-/required-count-1.0.1.tgz#ce2bc116cced7cec00459c1ddc211f58aaad7094" + +"@sidneys/text-ellipsis@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@sidneys/text-ellipsis/-/text-ellipsis-1.0.1.tgz#efa28e905a2ff5b1e0be9d152e11210d3dc6aaeb" + "@types/node@^7.0.12", "@types/node@^7.0.18": version "7.0.46" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.46.tgz#c3dedd25558c676b3d6303e51799abb9c3f8f314" @@ -178,13 +286,13 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" -app-package-builder@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/app-package-builder/-/app-package-builder-1.2.1.tgz#59465e88c114af32e714ce5e65fade6920dd79cf" +app-package-builder@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/app-package-builder/-/app-package-builder-1.3.3.tgz#252489ebd9e99fded822d01c7d6042d37aa6d844" dependencies: - bluebird-lst "^1.0.4" - builder-util "^3.0.12" - builder-util-runtime "^2.0.1" + bluebird-lst "^1.0.5" + builder-util "^3.2.0" + builder-util-runtime "^2.5.0" fs-extra-p "^4.4.4" int64-buffer "^0.1.9" js-yaml "^3.10.0" @@ -275,12 +383,12 @@ asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" -asar-integrity@0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/asar-integrity/-/asar-integrity-0.2.2.tgz#ccfacebc3e417a23c65b0549b9824f10684ad9a2" +asar-integrity@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asar-integrity/-/asar-integrity-0.2.3.tgz#b238a68ef1218561b4904db8400c0943fbc62c62" dependencies: - bluebird-lst "^1.0.4" - fs-extra-p "^4.4.3" + bluebird-lst "^1.0.5" + fs-extra-p "^4.4.4" asn1@~0.2.3: version "0.2.3" @@ -1080,6 +1188,10 @@ beeper@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" +bignumber.js@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" + binary-extensions@^1.0.0: version "1.10.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" @@ -1116,6 +1228,10 @@ bluebird@^3.5.0, bluebird@^3.5.1, bluebird@~3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" +bmp-js@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -1187,16 +1303,20 @@ buffer-crc32@^0.2.5: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" -builder-util-runtime@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-2.1.0.tgz#82362a92e202ee8315334391bbb23b2ea9099765" +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + +builder-util-runtime@2.5.0, builder-util-runtime@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-2.5.0.tgz#22373d4faab8d89e0b077630aef76538deb38476" dependencies: - bluebird-lst "^1.0.4" + bluebird-lst "^1.0.5" debug "^3.1.0" fs-extra-p "^4.4.4" sax "^1.2.4" -builder-util-runtime@^2.0.1, builder-util-runtime@^2.3.0, builder-util-runtime@~2.4.0: +builder-util-runtime@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-2.4.0.tgz#403b3c17aed596752a56e4a7d696c5eee59142c1" dependencies: @@ -1205,35 +1325,14 @@ builder-util-runtime@^2.0.1, builder-util-runtime@^2.3.0, builder-util-runtime@~ fs-extra-p "^4.4.4" sax "^1.2.4" -builder-util@3.0.12: - version "3.0.12" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-3.0.12.tgz#01e822becee89b9660b4aaa42250e11920923ab9" - dependencies: - "7zip-bin" "^2.2.7" - bluebird-lst "^1.0.4" - builder-util-runtime "^2.0.1" - chalk "^2.1.0" - debug "^3.1.0" - fs-extra-p "^4.4.4" - ini "^1.3.4" - is-ci "^1.0.10" - js-yaml "^3.10.0" - lazy-val "^1.0.2" - node-emoji "^1.8.1" - semver "^5.4.1" - source-map-support "^0.5.0" - stat-mode "^0.2.2" - temp-file "^2.0.3" - tunnel-agent "^0.6.0" - -builder-util@^3.0.12: - version "3.0.13" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-3.0.13.tgz#f35612b06c546dac4d31c44317b992290a0e6b08" +builder-util@3.2.0, builder-util@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-3.2.0.tgz#08900f046c6b09c22a1f235f18644ae9eb963bc4" dependencies: "7zip-bin" "^2.2.7" bluebird-lst "^1.0.5" - builder-util-runtime "^2.3.0" - chalk "2.1.0" + builder-util-runtime "^2.5.0" + chalk "^2.3.0" debug "^3.1.0" fs-extra-p "^4.4.4" ini "^1.3.4" @@ -1322,14 +1421,6 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1348,7 +1439,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" -chalkline@0.0.5: +chalkline@0.0.5, chalkline@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/chalkline/-/chalkline-0.0.5.tgz#db16dc2e85efe178c2bde4759984aacacbaa7f23" dependencies: @@ -1880,12 +1971,12 @@ detective-stylus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-1.0.0.tgz#50aee7db8babb990381f010c63fabba5b58e54cd" -dmg-builder@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-2.1.2.tgz#a67418839f2d35fec7c4cfe45270b3ad1e08c03a" +dmg-builder@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-2.1.5.tgz#f1f7d68d75cfb834e793c0681c7f50ced0a3038d" dependencies: - bluebird-lst "^1.0.4" - builder-util "^3.0.12" + bluebird-lst "^1.0.5" + builder-util "^3.2.0" debug "^3.1.0" fs-extra-p "^4.4.4" iconv-lite "^0.4.19" @@ -1910,6 +2001,10 @@ dom-serializer@0, dom-serializer@~0.1.0: domelementtype "~1.1.1" entities "~1.1.1" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + domelementtype@1: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" @@ -1980,26 +2075,26 @@ ejs@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" -electron-builder@19.37.2: - version "19.37.2" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.37.2.tgz#30aaa24cd90b0ba2d8cef74c5ab8e9a1b2a33fb3" +electron-builder@19.43.0: + version "19.43.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.43.0.tgz#0938989ec75c66ff577e49434b1433dc6165579f" dependencies: "7zip-bin" "^2.2.7" - app-package-builder "1.2.1" - asar-integrity "0.2.2" + app-package-builder "1.3.3" + asar-integrity "0.2.3" async-exit-hook "^2.0.1" - bluebird-lst "^1.0.4" - builder-util "3.0.12" - builder-util-runtime "2.1.0" - chalk "^2.1.0" + bluebird-lst "^1.0.5" + builder-util "3.2.0" + builder-util-runtime "2.5.0" + chalk "^2.3.0" chromium-pickle-js "^0.2.0" cuint "^0.2.2" debug "^3.1.0" - dmg-builder "2.1.2" + dmg-builder "2.1.5" ejs "^2.5.7" electron-download-tf "4.3.4" electron-osx-sign "0.4.7" - electron-publish "19.37.0" + electron-publish "19.43.0" fs-extra-p "^4.4.4" hosted-git-info "^2.5.0" is-ci "^1.0.10" @@ -2014,7 +2109,7 @@ electron-builder@19.37.2: semver "^5.4.1" temp-file "^2.0.3" update-notifier "^2.3.0" - yargs "^9.0.1" + yargs "^10.0.3" electron-compile@*: version "6.4.2" @@ -2142,14 +2237,14 @@ electron-prebuilt-compile@1.7.9: electron-compilers "*" yargs "^6.6.0" -electron-publish@19.37.0: - version "19.37.0" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-19.37.0.tgz#0ae15b4322e9d7fc39540bf7199b12e606be376d" +electron-publish@19.43.0: + version "19.43.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-19.43.0.tgz#3a5b8f6317a2a83faa008c26594220ffb4006664" dependencies: - bluebird-lst "^1.0.4" - builder-util "^3.0.12" - builder-util-runtime "^2.0.1" - chalk "^2.1.0" + bluebird-lst "^1.0.5" + builder-util "^3.2.0" + builder-util-runtime "^2.5.0" + chalk "^2.3.0" fs-extra-p "^4.4.4" mime "^2.0.3" @@ -2230,7 +2325,7 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es6-promise@^3.1.2: +es6-promise@^3.0.2, es6-promise@^3.1.2: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" @@ -2271,9 +2366,9 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.9.0.tgz#76879d274068261b191fe0f2f56c74c2f4208e8b" +eslint@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.10.0.tgz#f25d0d7955c81968c2309aa5c9a229e045176bb7" dependencies: ajv "^5.2.0" babel-code-frame "^6.22.0" @@ -2389,6 +2484,10 @@ execa@^0.8.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exif-parser@^0.1.9: + version "0.1.12" + resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" + expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -2501,6 +2600,14 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +file-type@^3.1.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + +file-type@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-7.2.0.tgz#113cfed52e1d6959ab80248906e2f25a8cdccb74" + file-url@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae" @@ -2534,7 +2641,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -2589,6 +2696,12 @@ flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +for-each@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" + dependencies: + is-function "~1.0.0" + for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2629,7 +2742,7 @@ fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" -fs-extra-p@^4.4.0, fs-extra-p@^4.4.3, fs-extra-p@^4.4.4: +fs-extra-p@^4.4.0, fs-extra-p@^4.4.4: version "4.4.4" resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.4.4.tgz#396ad6f914eb2954e1700fd0e18288301ed45f04" dependencies: @@ -2873,6 +2986,13 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" +global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3214,6 +3334,13 @@ hyperquest@~1.2.0: duplexer2 "~0.0.2" through2 "~0.6.3" +icojs@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/icojs/-/icojs-0.8.1.tgz#4f6df290e69630c796ab4107347636d85427bd60" + dependencies: + jimp "^0.2.24" + safe-buffer "^5.1.1" + iconv-lite@^0.4.17, iconv-lite@^0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -3222,6 +3349,12 @@ ignore@^3.3.3: version "3.3.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.6.tgz#b6f3196b38ed92f0c86e52f6f79b7fc4c8266c8d" +image-downloader@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/image-downloader/-/image-downloader-3.3.0.tgz#fef07ea8f4590892a6f31857ba97ec8bdaaad0c4" + dependencies: + request "^2.82.0" + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -3321,6 +3454,10 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -3392,6 +3529,10 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-function@^1.0.1, is-function@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -3546,6 +3687,10 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -3621,6 +3766,31 @@ jade@^1.11.0: void-elements "~2.0.1" with "~4.0.0" +jimp@^0.2.24, jimp@^0.2.28: + version "0.2.28" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" + dependencies: + bignumber.js "^2.1.0" + bmp-js "0.0.3" + es6-promise "^3.0.2" + exif-parser "^0.1.9" + file-type "^3.1.0" + jpeg-js "^0.2.0" + load-bmfont "^1.2.3" + mime "^1.3.4" + mkdirp "0.5.1" + pixelmatch "^4.0.0" + pngjs "^3.0.0" + read-chunk "^1.0.1" + request "^2.65.0" + stream-to-buffer "^0.1.0" + tinycolor2 "^1.1.2" + url-regex "^3.0.0" + +jpeg-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" + js-base64@^2.1.9: version "2.3.2" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" @@ -3848,6 +4018,18 @@ liftoff@^2.1.0: rechoir "^0.6.2" resolve "^1.1.7" +load-bmfont@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.3.0.tgz#bb7e7c710de6bcafcb13cb3b8c81e0c0131ecbc9" + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.0" + xhr "^2.0.1" + xtend "^4.0.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -3858,15 +4040,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -4148,6 +4321,12 @@ mimic-response@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + minami@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/minami/-/minami-1.2.3.tgz#99b6dcdfb2f0a54da1c9c8f7aa3a327787aaf9f8" @@ -4197,7 +4376,7 @@ mkdirp@0.5.0: dependencies: minimist "0.0.8" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -4428,6 +4607,12 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + opter@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/opter/-/opter-1.1.0.tgz#2598aebb60b3f1a7322af1097086f4e798c84a76" @@ -4557,6 +4742,21 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +parse-bmfont-ascii@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" + +parse-bmfont-binary@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" + +parse-bmfont-xml@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.3.tgz#d6b66a371afd39c5007d9f0eeb262a4f2cce7b7c" + dependencies: + xml-parse-from-string "^1.0.0" + xml2js "^0.4.5" + parse-color@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" @@ -4584,6 +4784,13 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" +parse-headers@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" + dependencies: + for-each "^0.3.2" + trim "0.0.1" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -4648,12 +4855,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -4684,6 +4885,12 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pixelmatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" + dependencies: + pngjs "^3.0.0" + pkginfo@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" @@ -4700,6 +4907,10 @@ pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +pngjs@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.0.tgz#1f5730c189c94933b81beda2ab2f8e2855263a8f" + port-numbers@^2.0.3: version "2.0.9" resolved "https://registry.yarnpkg.com/port-numbers/-/port-numbers-2.0.9.tgz#05e4afcaf66577b37eee6addadfe1353e0b7db35" @@ -4969,6 +5180,10 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + progress-stream@^1.0.1, progress-stream@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" @@ -5082,6 +5297,10 @@ rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7, rc@^1.2.1: minimist "^1.2.0" strip-json-comments "~2.0.1" +read-chunk@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" + read-config-file@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-1.2.0.tgz#1fd7dc8ccdad838cac9f686182625290fc94f456" @@ -5107,13 +5326,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -5122,14 +5334,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -5328,7 +5532,7 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@^2.45.0, request@^2.54.0, request@^2.55.0: +request@^2.45.0, request@^2.54.0, request@^2.55.0, request@^2.65.0, request@^2.82.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: @@ -5497,7 +5701,7 @@ sax@0.5.x: version "0.5.8" resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" -sax@^1.1.4, sax@^1.2.4, sax@~1.2.1: +sax@>=0.6.0, sax@^1.1.4, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -5708,6 +5912,16 @@ stream-consume@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" +stream-to-buffer@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9" + dependencies: + stream-to "~0.2.0" + +stream-to@~0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -5778,10 +5992,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -5991,6 +6201,10 @@ timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" +tinycolor2@^1.1.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -6038,13 +6252,17 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" dependencies: utf8-byte-length "^1.0.1" -try-require@latest: +try-require@^1.2.1, try-require@latest: version "1.2.1" resolved "https://registry.yarnpkg.com/try-require/-/try-require-1.2.1.tgz#34489a2cac0c09c1cc10ed91ba011594d4333be2" @@ -6195,6 +6413,12 @@ url-parse@^1.1.9: querystringify "~1.0.0" requires-port "1.0.x" +url-regex@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" + dependencies: + ip-regex "^1.0.1" + url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" @@ -6403,14 +6627,38 @@ xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" +xhr@^2.0.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993" + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + "xml-name-validator@>= 2.0.1 < 3.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" +xml-parse-from-string@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" + +xml2js@^0.4.5: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + xmlbuilder@8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" +xmlbuilder@~9.0.1: + version "9.0.4" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f" + xmlcreate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-1.0.2.tgz#fa6bf762a60a413fb3dd8f4b03c5b269238d308f" @@ -6457,12 +6705,29 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" +yargs-parser@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.0.0.tgz#21d476330e5a82279a4b881345bf066102e219c6" dependencies: camelcase "^4.1.0" +yargs@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.0.0" + yargs@^4.8.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" @@ -6500,24 +6765,6 @@ yargs@^6.6.0: y18n "^3.2.1" yargs-parser "^4.2.0" -yargs@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - yargs@~1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b"