diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..ff5a41a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "kb"] + path = kb + url = https://github.com/daisy/kb diff --git a/README_KB.md b/README_KB.md new file mode 100644 index 0000000..be56b09 --- /dev/null +++ b/README_KB.md @@ -0,0 +1,12 @@ +# DAISY Knowledge Base + +Deployed website: +https://kb.daisy.org/ + +Source GitHub repository (master branch): +https://github.com/daisy/kb + +Git submodule revision: +8bbd34fb44c7b2bdcd7f1886c03355183209b5b4 +https://github.com/daisy/kb/commits/8bbd34fb44c7b2bdcd7f1886c03355183209b5b4 +https://github.com/daisy/kb/compare/8bbd34fb44c7b2bdcd7f1886c03355183209b5b4...master diff --git a/kb b/kb new file mode 160000 index 0000000..8bbd34f --- /dev/null +++ b/kb @@ -0,0 +1 @@ +Subproject commit 8bbd34fb44c7b2bdcd7f1886c03355183209b5b4 diff --git a/package.json b/package.json index 327a8cf..6ff8f71 100755 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "ace-gui", "productName": "Ace by DAISY", "description": "Ace, the EPUB accessibility checker by the DAISY Consortium (desktop application)", - "version": "1.0.0-beta.0", + "version": "1.0.0-beta.2", "author": "DAISY Consortium", "homepage": "http://daisy.github.io/ace", "repository": "daisy/ace-gui", @@ -43,7 +43,7 @@ "clean": "cross-env BUILD_TARGET=clean node build/build.js", "build:bundle": "webpack --config=build/webpack.app.config.js --env=production", "build:chromium": "cross-env BUILD_TARGET=fetch-chromium node build/build.js", - "build": "yarn build:bundle && electron-builder", + "build": "yarn build:bundle && cpy --cwd=\"./kb\" --parents \"**/*\" \"../app/kb/\" && electron-builder", "postinstall": "electron-builder install-app-deps", "release": "build -mw -p always", "start": "node build/start.js", @@ -54,12 +54,14 @@ "@daisy/ace-core": "^1.0.2", "@material-ui/core": "^3.0.0", "@material-ui/icons": "^3.0.0", + "@mrmlnc/readdir-enhanced": "^2.2.1", "about-window": "^1.12.1", "electron-debug": "^2.0.0", - "@mrmlnc/readdir-enhanced": "^2.2.1", "electron-redux": "^1.3.1", + "express": "^4.16.4", "fs-jetpack": "^2.1.0", "jszip": "^3.1.5", + "portfinder": "^1.0.20", "prop-types": "^15.6.2", "react": "^16.3.0", "react-dom": "^16.2.0", @@ -69,17 +71,21 @@ "redux": "^4.0.0", "redux-promise": "^0.6.0", "redux-thunk": "^2.3.0", + "selfsigned": "^1.10.4", "tmp": "^0.0.33", - "typeface-roboto": "^0.0.54" + "typeface-roboto": "^0.0.54", + "uuid": "^3.3.2" }, "devDependencies": { "@babel/core": "^7.0.0", "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", + "@types/express": "^4.16.1", "babel-loader": "^8.0.2", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-object-rest-spread": "^7.0.0-beta.3", "chalk": "^2.4.1", + "cpy-cli": "^2.0.0", "cross-env": "^5.2.0", "css-loader": "^1.0.0", "devtron": "^1.4.0", diff --git a/src/main/kb.js b/src/main/kb.js new file mode 100644 index 0000000..3fd08e2 --- /dev/null +++ b/src/main/kb.js @@ -0,0 +1,586 @@ +const path = require('path'); +const fs = require('fs'); +const { BrowserWindow, webContents } = require('electron'); +import { app, shell, session, ipcMain, Menu } from 'electron'; + +import * as AboutBoxHelper from './../shared/helpers/about'; + +import * as express from "express"; +import * as portfinder from "portfinder"; +// import * as http from "http"; +import * as https from "https"; + +import * as selfsigned from "selfsigned"; +import * as uuid from "uuid"; + +const LOG_DEBUG = false; +const KB_LOG_PREFIX = "[KB]"; + +const SESSION_PARTITION = "persist:kb"; + +const wins = []; +export function closeKnowledgeBaseWindows() { + if (!wins.length) { + return; + } + for (var i = (wins.length - 1); i >= 0; i--) { + wins[i].close(); + } +} + +let expressApp; +let httpServer; +let port; +let ip; +let proto; +let rootUrl; + +function httpReady() { + ipcMain.on('KB_URL', (event, arg) => { + const regexp = /http[s]?:\/\/kb.daisy.org\//; + if (!arg.match(regexp)) { + shell.openExternal(arg); + return; + } + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} link ${arg}`); + const offlineUrl = arg.replace(regexp, `${rootUrl}/`); + const urlPath = offlineUrl.replace(rootUrl, ""); + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} urlPath ${urlPath}`); + new KnowledgeBase(undefined, urlPath); + }); +} + +export function stopKnowledgeBaseServer() { + // closeKnowledgeBaseWindows(); + + if (httpServer) { + httpServer.close(); + } + + const sess = session.fromPartition(SESSION_PARTITION, { cache: true }) || session.defaultSession; + if (sess) { + sess.clearCache(() => { + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} session cache cleared`); + }); + + sess.clearStorageData({ + origin: "*", + quotas: [ + "temporary", + "persistent", + "syncable", + ], + storages: [ + "appcache", + "cookies", + "filesystem", + "indexdb", + "localstorage", + "shadercache", + "websql", + "serviceworkers", + ], + }, () => { + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} session storage cleared`); + }); + } +} +export function startKnowledgeBaseServer(kbRootPath) { + + app.on("certificate-error", (event, webContents, url, error, certificate, callback) => { + if (url.indexOf(`${rootUrl}/`) === 0) { + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} HTTPS cert error OKAY ${url}`); + callback(true); + return; + } + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} HTTPS cert error FAIL ${url}`); + callback(false); + }); + + const filter = { urls: ["*", "*://*/*"] }; + + const onHeadersReceivedCB = (details, callback) => { + if (!details.url) { + callback({}); + return; + } + + if (details.url.indexOf(`${rootUrl}/`) === 0) { + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} CSP ${details.url}`); + callback({ + // responseHeaders: { + // ...details.responseHeaders, + // "Content-Security-Policy": + // [`default-src 'self' 'unsafe-inline' 'unsafe-eval' data: http: https: ${rootUrl}`], + // }, + }); + } else { + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} !CSP ${details.url}`); + callback({}); + } + }; + + const setCertificateVerifyProcCB = (request, callback) => { + + if (request.hostname === ip) { + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} HTTPS cert verify OKAY ${request.hostname}`); + callback(0); // OK + return; + } + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} HTTPS cert verify FALLBACK ${request.hostname}`); + callback(-3); // Chromium + // callback(-2); // Fail + }; + + const sess = session.fromPartition(SESSION_PARTITION, { cache: true }) || session.defaultSession; + + if (sess) { + sess.webRequest.onHeadersReceived(filter, onHeadersReceivedCB); + // sess.webRequest.onBeforeSendHeaders(filter, onBeforeSendHeadersCB); + sess.setCertificateVerifyProc(setCertificateVerifyProcCB); + } + + return new Promise((resolve, reject) => { + expressApp = express(); + // expressApp.enable('strict routing'); + + // expressApp.use("/", (req, res, next) => { + // if (LOG_DEBUG) console.log("HTTP: " + req.url); + // next(); + // }); + + const jsInitPath = "js/init.js"; + expressApp.use(`/${jsInitPath}`, (req, res, next) => { + + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} HTTP intercept /${jsInitPath}`); + + let js = fs.readFileSync(path.join(kbRootPath, jsInitPath), { encoding: "utf8" }); + + const toMatch1 = "document.location.host == 'localhost'"; + const toMatch2 = "KB.prototype.generateFooter = function () {"; + const link = "GO ONLINE"; + const online = ` +var zhref = document.location.href.replace('${rootUrl}/', 'http://kb.daisy.org/'); +var zdiv = document.createElement('div'); +zdiv.setAttribute('style','position: fixed; right: 1em; width: auto; background: transparent; margin: 0; padding: 0; padding-top: 0.5em; font-size: 100%; font-weight: bold; font-family: sans-serif; border: 0'); + +var za = document.createElement('a'); +za.setAttribute('href',zhref); +za.setAttribute('target','_BLANK'); +za.setAttribute('style','color: red;'); +za.appendChild(document.createTextNode('${link}')); + +zdiv.appendChild(za); + +document.querySelector('header').insertAdjacentElement('beforeEnd', zdiv); +`; + // js = js.replace("kb.initializePage('ace')", "kb.initializePage('kb')"); + js = js.replace(toMatch1, `${toMatch1} || document.location.hostname == '${rootUrl.replace(/http[s]?:\/\/(.+):[0-9]+/, "$1")}' || document.location.host == '${rootUrl.replace(/http[s]?:\/\//, "")}'`); + js = js.replace(/http[s]?:\/\/kb.daisy.org\//g, `${rootUrl}/`); + js = js.replace(toMatch2, `${toMatch2}\n\n${online}\n\n`); + res.send(js); + // next(); + }); + // https://expressjs.com/en/4x/api.html#express.static + const staticOptions = { + dotfiles: "ignore", + etag: true, + // fallthrough: false, + immutable: true, + index: "index.html", + maxAge: "1d", + redirect: true, + // extensions: ["css", "otf"], + // setHeaders: (res, _path, _stat) => { + // // res.set('x-timestamp', Date.now()) + // setResponseCORS(res); + // }, + }; + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} HTTP static path ${kbRootPath}`); + expressApp.use("/", express.static(kbRootPath, staticOptions)); + + const startHttp = function () { + generateSelfSignedData().then((certData) => { + httpServer = https.createServer({ key: certData.private, cert: certData.cert }, expressApp).listen(port, () => { + const p = httpServer.address().port; + + port = p; + ip = "127.0.0.1"; + proto = "https"; + rootUrl = `${proto}://${ip}:${port}`; + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} URL ${rootUrl}`); + + resolve(); + httpReady(); + }); + }).catch((err) => { + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} ${err}`); + if (LOG_DEBUG) console.log(err); + httpServer = expressApp.listen(port, () => { + const p = httpServer.address().port; + + port = p; + ip = "127.0.0.1"; + proto = "http"; + rootUrl = `${proto}://${ip}:${port}`; + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} URL ${rootUrl}`); + + resolve(); + httpReady(); + }); + }); + } + + portfinder.getPortPromise().then((p) => { + port = p; + startHttp(); + }).catch((err) => { + debug(err); + port = 3000; + startHttp(); + }); + }); +} + +function buildMenuTemplate(win) { + + const defaultTemplate = { + subMenuEdit: { + label: 'Edit', + submenu: [ + { + label: "Undo", + accelerator: "CmdOrCtrl+Z", + selector: "undo:" + }, + { + label: "Redo", + accelerator: "Shift+CmdOrCtrl+Z", + selector: "redo:" + }, + { type: "separator" }, + { + label: "Cut", + accelerator: "CmdOrCtrl+X", + selector: "cut:" + }, + { + label: "Copy", + accelerator: "CmdOrCtrl+C", + selector: "copy:" + }, + { + label: "Paste", + accelerator: "CmdOrCtrl+V", + selector: "paste:" + }, + { + label: "Select All", + accelerator: "CmdOrCtrl+A", + selector: "selectAll:" + }, + ], + }, + subMenuDev: { + label: 'Dev', + submenu: [ + { + label: 'Reload', + accelerator: 'CmdOrCtrl+R', + click: () => { + const bw = BrowserWindow.getFocusedWindow(); + if (bw) { + bw.webContents.reload(); + } else { + win.webContents.reload(); + + // const arr = BrowserWindow.getAllWindows(); + // arr.forEach((bww) => { + // bww.webContents.openDevTools({ mode: "detach" }); + // }); + + // for (const wc of webContents.getAllWebContents()) { + // // if (wc.hostWebContents && + // // wc.hostWebContents.id === win.webContents.id) { + // // } + // wc.openDevTools({ mode: "detach" }); + // } + } + } + }, + { + label: 'Toggle Developer Tools', + accelerator: 'Alt+CmdOrCtrl+I', + click: () => { + // win.toggleDevTools(); + const arr = BrowserWindow.getAllWindows(); + arr.forEach((bww) => { + bww.webContents.toggleDevTools(); + }); + + // const bw = BrowserWindow.getFocusedWindow(); + // if (bw) { + // bw.webContents.openDevTools({ mode: "detach" }); + // } else { + // const arr = BrowserWindow.getAllWindows(); + // arr.forEach((bww) => { + // bww.webContents.openDevTools({ mode: "detach" }); + // }); + + // // for (const wc of webContents.getAllWebContents()) { + // // // if (wc.hostWebContents && + // // // wc.hostWebContents.id === win.webContents.id) { + // // // } + // // wc.openDevTools({ mode: "detach" }); + // // } + // } + } + } + ] + }, + subMenuHelp: { + label: 'Help', + role: 'help', + submenu: [ + { + label: 'Learn more', + click: () => shell.openExternal('http://daisy.github.io/ace') + }, + { + label: 'Report an Issue', + click: () => shell.openExternal('http://github.com/DAISY/ace-gui/issues') + }, + ] + }, + subMenuAbout: { + label: 'Ace', + submenu: [ + { + label: 'About Ace', + id: 'about', + click: () => AboutBoxHelper.showAbout() + }, + { + type: 'separator' + }, + { + // label: 'Services', + role: 'services', + submenu: [] + }, + { + type: 'separator' + }, + { + // label: 'Hide Ace', + // accelerator: 'CmdOrCtrl+H', + role: 'hide' + }, + { + // label: 'Hide Others', + // accelerator: 'CmdOrCtrl+Alt+H', + role: 'hideothers' + }, + { + // label: 'Show All', + role: 'unhide' + }, + { + type: 'separator' + }, + { + role: 'quit' + } + ] + }, + subMenuWindow: { + label: 'Window', + role: 'window', + submenu: [ + // { + // label: 'Toggle Full Screen', + // type: 'checkbox', + // accelerator: process.platform === 'darwin' + // ? 'Ctrl+Command+F' + // : 'F11', + // click: () => win.setFullScreen(!win.isFullScreen()) + // }, + { + role: "togglefullscreen", + }, + { + role: "minimize", + }, + { + role: "close", + }, + // { + // label: 'Minimize', + // role: 'minimize' + // }, + { type: 'separator' }, + { + // label: 'Bring All to Front', + role: 'front' + } + ] + } + }; + + + // On Windows and Linux, open dialogs do not support selecting both files and + // folders and files, so add an extra menu item so there is one for each type. + if (process.platform === 'linux' || process.platform === 'win32') { + + // insert item into Help submenu + defaultTemplate.subMenuHelp.submenu.push( + { + type: 'separator' + }, + { + label: 'About Ace', + id: 'about', + click: () => AboutBoxHelper.showAbout() + } + ); + } + + let isDev = process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; + + let menuTemplate = process.platform === 'darwin' ? + [ + defaultTemplate.subMenuAbout, + defaultTemplate.subMenuWindow, + defaultTemplate.subMenuEdit, + defaultTemplate.subMenuHelp + ] + : + [ + defaultTemplate.subMenuWindow, + defaultTemplate.subMenuEdit, + defaultTemplate.subMenuHelp + ]; + + return isDev ? menuTemplate.concat(defaultTemplate.subMenuDev) : menuTemplate; +} + +const WIN_OFFSET = 60; +let winOffset = 0; + +export class KnowledgeBase { + + win = null; + + constructor(mainWin, urlPath) { + this.mainWin = mainWin; + this.urlPath = urlPath; + this.launch(); + } + + launch() { + this.win = new BrowserWindow({ + show: false, + webPreferences: { + allowRunningInsecureContent: false, + contextIsolation: false, + // devTools: true, + nodeIntegration: false, + nodeIntegrationInWorker: false, + sandbox: false, + webSecurity: true, + webviewTag: false, + partition: SESSION_PARTITION + }, + }); + wins.push(this.win); + + const template = buildMenuTemplate(this.win); + this.win.setMenu(Menu.buildFromTemplate(template)); + + // this.win.maximize(); + // let sz = this.win.getSize(); + // // open a window that's not quite full screen ... makes sense on mac, anyway + // this.win.setSize(Math.min(Math.round(sz[0] * .75), 1200), Math.min(Math.round(sz[1] * .85), 800)); + // // win.setPosition(Math.round(sz[0] * .10), Math.round(sz[1] * .10)); + // this.win.setPosition(Math.round(sz[0] * 0.4 - this.win.getSize()[0] * 0.4), Math.round(sz[1] * 0.4 - this.win.getSize()[1] * 0.4)); + + this.win.setSize(1024, 768); + winOffset += WIN_OFFSET; + if (winOffset > 300) { + winOffset = WIN_OFFSET; + } + this.win.setPosition(winOffset, winOffset); + + this.win.show(); + + this.win.webContents.on("new-window", (event, url) => { + + const wcUrl = event.sender.getURL(); + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} new-window ${wcUrl} => ${url}`); + + event.preventDefault(); + + if (url.indexOf(rootUrl) !== 0) { + shell.openExternal(url); + return; + } + + this.win.loadURL(url); + }); + + this.win.webContents.on("will-navigate", (event, url) => { + + const wcUrl = event.sender.getURL(); + if (LOG_DEBUG) console.log(`${KB_LOG_PREFIX} will-navigate ${wcUrl} => ${url}`); + + if (url.indexOf(rootUrl) !== 0) { + event.preventDefault(); + shell.openExternal(url); + } + }); + + // http://kb.daisy.org/publishing/docs/index.html + if (this.urlPath) { + this.win.loadURL(`${rootUrl}${this.urlPath}`); + } else { + this.win.loadURL(`${rootUrl}/publishing/docs/index.html`); + } + + this.win.on('closed', function () { + const i = wins.indexOf(this.win); + if (i >= 0) { + wins.splice(i, 1); + } + this.win = null; + }); + } +} + +function generateSelfSignedData() { + return new Promise((resolve, reject) => { + const opts = { + algorithm: "sha256", + // clientCertificate: true, + // clientCertificateCN: "KB insecure client", + days: 30, + extensions: [{ + altNames: [{ + type: 2, // DNSName + value: "localhost", + }], + name: "subjectAltName", + }], + }; + const rand = uuid.v4(); + const attributes = [{ name: "commonName", value: "KB insecure server " + rand }]; + + selfsigned.generate(attributes, opts, (err, keys) => { + if (err) { + reject(err); + return; + } + + resolve(keys); + }); + }); +} diff --git a/src/main/main.js b/src/main/main.js index d6c00cb..1148d38 100755 --- a/src/main/main.js +++ b/src/main/main.js @@ -1,42 +1,92 @@ -const { app, BrowserWindow} = require('electron'); +const path = require('path'); +const { app, BrowserWindow, webContents} = require('electron'); + import MenuBuilder from './menu'; import configureStore from './../shared/store/configureStore'; require('electron-debug')(); +import {startKnowledgeBaseServer, stopKnowledgeBaseServer, closeKnowledgeBaseWindows} from './kb'; + +function openAllDevTools() { + for (const wc of webContents.getAllWebContents()) { + // if (wc.hostWebContents && + // wc.hostWebContents.id === mainWin.webContents.id) { + // } + wc.openDevTools({ mode: "detach" }); + } +} + +function openTopLevelDevTools() { + const bw = BrowserWindow.getFocusedWindow(); + if (bw) { + bw.webContents.openDevTools({ mode: "detach" }); + } else { + const arr = BrowserWindow.getAllWindows(); + arr.forEach((bww) => { + bww.webContents.openDevTools({ mode: "detach" }); + }); + } +} + const store = configureStore(undefined, 'main'); let win; - function createWindow() { win = new BrowserWindow({ show: false }); win.maximize(); let sz = win.getSize(); + const sz0 = sz[0]; + const sz1 = sz[1]; + win.unmaximize(); // open a window that's not quite full screen ... makes sense on mac, anyway - win.setSize(Math.min(Math.round(sz[0] * .75),1200), Math.min(Math.round(sz[1] * .85), 800)); + win.setSize(Math.min(Math.round(sz0 * .75),1200), Math.min(Math.round(sz1 * .85), 800)); // win.setPosition(Math.round(sz[0] * .10), Math.round(sz[1] * .10)); - win.setPosition(Math.round(sz[0]*0.5-win.getSize()[0]*0.5), Math.round(sz[1]*0.5-win.getSize()[1]*0.5)); + win.setPosition(Math.round(sz0*0.5-win.getSize()[0]*0.5), Math.round(sz1*0.5-win.getSize()[1]*0.5)); win.show(); const menuBuilder = new MenuBuilder(win, store); - menuBuilder.buildMenu(); + menuBuilder.buildMenu(win); win.loadURL(`file://${__dirname}/index.html`); win.on('closed', function () { win = null; + app.quit(); + + // closeKnowledgeBaseWindows(); + + // // about box + // const arr = BrowserWindow.getAllWindows(); + // arr.forEach((bw) => { + // bw.close(); + // }); + + // will trigger window-all-closed event => app quit }); } app.setAccessibilitySupportEnabled(true); -app.on('ready', createWindow); +app.on('ready', () => { + let isDev = process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; + const kbRootPath = isDev ? path.join(process.cwd(), "kb") : path.join(__dirname, "kb"); + startKnowledgeBaseServer(kbRootPath).then(() => { + createWindow(); + }).catch((err) => { + console.log(err); + createWindow(); + }); +}); +app.on('quit', () => { + stopKnowledgeBaseServer(); +}); app.on('window-all-closed', function () { // we could enable this typical macos behavior if we wanted but not sure it makes sense /*if (process.platform !== 'darwin') { quit(); }*/ - app.quit(); + // app.quit(); }); app.on('activate', function () { diff --git a/src/main/menu.js b/src/main/menu.js index 244784e..8486bc8 100644 --- a/src/main/menu.js +++ b/src/main/menu.js @@ -1,4 +1,4 @@ -import { app, Menu, shell, dialog, clipboard } from 'electron'; +import { app, Menu, shell, dialog, clipboard, webContents, BrowserWindow } from 'electron'; import { runAce, openReport, @@ -8,6 +8,8 @@ import { import {selectTab} from './../shared/actions/reportView'; import * as FileDialogHelpers from './../shared/helpers/fileDialogs'; import * as AboutBoxHelper from './../shared/helpers/about'; +import {KnowledgeBase} from './kb'; + export default class MenuBuilder { constructor(mainWindow, store) { @@ -104,17 +106,6 @@ export default class MenuBuilder { subMenuView: { label: 'View', submenu: [ - { - label: 'Toggle Full Screen', - type: 'checkbox', - accelerator: process.platform === 'darwin' - ? 'Ctrl+Command+F' - : 'F11', - click: () => this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()) - }, - { - type: 'separator' - }, { label: 'Go to Summary', id: 'gotoSummary', @@ -156,18 +147,96 @@ export default class MenuBuilder { } ] }, + subMenuEdit: { + label: 'Edit', + submenu: [ + { + label: "Undo", + accelerator: "CmdOrCtrl+Z", + selector: "undo:" + }, + { + label: "Redo", + accelerator: "Shift+CmdOrCtrl+Z", + selector: "redo:" + }, + { type: "separator" }, + { + label: "Cut", + accelerator: "CmdOrCtrl+X", + selector: "cut:" + }, + { + label: "Copy", + accelerator: "CmdOrCtrl+C", + selector: "copy:" + }, + { + label: "Paste", + accelerator: "CmdOrCtrl+V", + selector: "paste:" + }, + { + label: "Select All", + accelerator: "CmdOrCtrl+A", + selector: "selectAll:" + }, + ], + }, subMenuDev: { label: 'Dev', submenu: [ { label: 'Reload', - accelerator: 'Command+R', - click: () => this.mainWindow.webContents.reload() + accelerator: 'CmdOrCtrl+R', + click: () => { + const bw = BrowserWindow.getFocusedWindow(); + if (bw) { + bw.webContents.reload(); + } else { + this.mainWindow.webContents.reload(); + + // const arr = BrowserWindow.getAllWindows(); + // arr.forEach((bww) => { + // bww.webContents.openDevTools({ mode: "detach" }); + // }); + + // for (const wc of webContents.getAllWebContents()) { + // // if (wc.hostWebContents && + // // wc.hostWebContents.id === this.mainWindow.webContents.id) { + // // } + // wc.openDevTools({ mode: "detach" }); + // } + } + } }, { label: 'Toggle Developer Tools', - accelerator: 'Alt+Command+I', - click: () => this.mainWindow.toggleDevTools() + accelerator: 'Alt+CmdOrCtrl+I', + click: () => { + // this.mainWindow.toggleDevTools(); + const arr = BrowserWindow.getAllWindows(); + arr.forEach((bww) => { + bww.webContents.toggleDevTools(); + }); + + // const bw = BrowserWindow.getFocusedWindow(); + // if (bw) { + // bw.webContents.openDevTools({ mode: "detach" }); + // } else { + // const arr = BrowserWindow.getAllWindows(); + // arr.forEach((bww) => { + // bww.webContents.openDevTools({ mode: "detach" }); + // }); + + // // for (const wc of webContents.getAllWebContents()) { + // // // if (wc.hostWebContents && + // // // wc.hostWebContents.id === this.mainWindow.webContents.id) { + // // // } + // // wc.openDevTools({ mode: "detach" }); + // // } + // } + } } ] }, @@ -177,7 +246,20 @@ export default class MenuBuilder { submenu: [ { label: 'Knowledge Base', - click: () => shell.openExternal('http://kb.daisy.org/publishing/') + submenu: [ + { + label: 'Local (offline)', + click: () => { + new KnowledgeBase(this.mainWindow, undefined); + } + }, + { + label: 'Web (online)', + click: () => { + shell.openExternal('http://kb.daisy.org/publishing/docs/index.html'); + } + } + ] }, { label: 'Learn more', @@ -209,7 +291,7 @@ export default class MenuBuilder { type: 'separator' }, { - label: 'Services', + // label: 'Services', role: 'services', submenu: [] }, @@ -217,17 +299,17 @@ export default class MenuBuilder { type: 'separator' }, { - label: 'Hide Ace', - accelerator: 'Command+H', + // label: 'Hide Ace', + // accelerator: 'CmdOrCtrl+H', role: 'hide' }, { - label: 'Hide Others', - accelerator: 'Command+Alt+H', + // label: 'Hide Others', + // accelerator: 'CmdOrCtrl+Alt+H', role: 'hideothers' }, { - label: 'Show All', + // label: 'Show All', role: 'unhide' }, { @@ -242,13 +324,30 @@ export default class MenuBuilder { label: 'Window', role: 'window', submenu: [ + // { + // label: 'Toggle Full Screen', + // type: 'checkbox', + // accelerator: process.platform === 'darwin' + // ? 'Ctrl+Command+F' + // : 'F11', + // click: () => this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()) + // }, + { + role: "togglefullscreen", + }, { - label: 'Minimize', - role: 'minimize' + role: "minimize", }, + { + role: "close", + }, + // { + // label: 'Minimize', + // role: 'minimize' + // }, { type: 'separator' }, { - label: 'Bring All to Front', + // label: 'Bring All to Front', role: 'front' } ] @@ -279,9 +378,12 @@ export default class MenuBuilder { } // Add "File > Quit" menu item so Linux distros where the system tray icon is // missing will have a way to quit the app. - if (process.platform === 'linux') { - // File menu (Linux) - defaultTemplate.subMenuFile.submenu.push({ + if (process.platform === 'linux' || process.platform === 'win32') { + defaultTemplate.subMenuFile.submenu.push( + { + type: 'separator' + }, + { label: 'Quit', click: () => app.quit() }); @@ -294,6 +396,7 @@ export default class MenuBuilder { defaultTemplate.subMenuAbout, defaultTemplate.subMenuFile, defaultTemplate.subMenuView, + defaultTemplate.subMenuEdit, defaultTemplate.subMenuWindow, defaultTemplate.subMenuHelp ] @@ -301,6 +404,8 @@ export default class MenuBuilder { [ defaultTemplate.subMenuFile, defaultTemplate.subMenuView, + defaultTemplate.subMenuEdit, + defaultTemplate.subMenuWindow, defaultTemplate.subMenuHelp ]; @@ -323,17 +428,18 @@ export default class MenuBuilder { }); } - buildMenu() { - if ( - process.env.NODE_ENV === 'development' || - process.env.DEBUG_PROD === 'true' - ) { + buildMenu(win) { + let isDev = process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; + if (isDev) { this.setupDevelopmentEnvironment(); } const template = this.buildTemplate(); const menu = Menu.buildFromTemplate(template); - Menu.setApplicationMenu(menu); + + Menu.setApplicationMenu(menu); // necessary for app-wide menu on MacOS + // win.setMenu(menu); + this.refreshMenuItemsEnabled(); return menu; } diff --git a/src/renderer/components/ReportSections/Violations.js b/src/renderer/components/ReportSections/Violations.js index 3be8625..5e5418c 100644 --- a/src/renderer/components/ReportSections/Violations.js +++ b/src/renderer/components/ReportSections/Violations.js @@ -2,7 +2,7 @@ import EnhancedTable from './../Table/EnhancedTable'; import PropTypes from 'prop-types'; import React from 'react'; import TableCell from '@material-ui/core/TableCell'; -const {shell} = require('electron'); +const {ipcRenderer} = require('electron'); // the violations page of the report export default class Violations extends React.Component { @@ -19,7 +19,10 @@ export default class Violations extends React.Component { setTableFiltersExpanded: PropTypes.func.isRequired }; - onExternalLinkClick = url => shell.openExternal(url); + onExternalLinkClick = url => { + ipcRenderer.send('KB_URL', url); + // shell.openExternal(url); + } render() { let {violations, diff --git a/src/renderer/components/Sidebar.js b/src/renderer/components/Sidebar.js index 11d5fee..0a82aba 100644 --- a/src/renderer/components/Sidebar.js +++ b/src/renderer/components/Sidebar.js @@ -130,8 +130,11 @@ class Sidebar extends React.Component { onDrop = e => { e.preventDefault(); - let filepath = e.dataTransfer.files[0].path; this.setState({fileHover: false}); + if (!e.dataTransfer.files || !e.dataTransfer.files.length) { + return false; + } + let filepath = e.dataTransfer.files[0].path; this.props.openFile(filepath); return false; }; diff --git a/src/renderer/components/Splash.js b/src/renderer/components/Splash.js index 430c498..2f86ccb 100644 --- a/src/renderer/components/Splash.js +++ b/src/renderer/components/Splash.js @@ -45,8 +45,11 @@ class Splash extends React.Component { onDrop = e => { e.preventDefault(); - let filepath = e.dataTransfer.files[0].path; this.setState({fileHover: false}); + if (!e.dataTransfer.files || !e.dataTransfer.files.length) { + return false; + } + let filepath = e.dataTransfer.files[0].path; this.props.openFile(filepath); return false; }; diff --git a/src/shared/helpers/about.js b/src/shared/helpers/about.js index d0c6482..6cbb071 100644 --- a/src/shared/helpers/about.js +++ b/src/shared/helpers/about.js @@ -4,13 +4,15 @@ const BrowserWindow = electron.BrowserWindow || electron.remote.BrowserWindow; const openAboutWindow = require('about-window').default; const join = require('path').join; +let isDev = process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; + module.exports = { showAbout: callback => { return openAboutWindow({ icon_path: join(__dirname, 'logo.svg'), copyright: 'Copyright (c) 2018 DAISY Consortium', package_json_dir: __dirname, - open_devtools: process.env.NODE_ENV !== 'production', + open_devtools: isDev, }); }, }; diff --git a/yarn.lock b/yarn.lock index 7ecc2f5..ef29068 100644 --- a/yarn.lock +++ b/yarn.lock @@ -822,6 +822,57 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@types/body-parser@*": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== + dependencies: + "@types/node" "*" + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/express-serve-static-core@*": + version "4.16.4" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.4.tgz#56bb8be4559401d68af4a3624ae9dd3166103e60" + integrity sha512-x/8h6FHm14rPWnW2HP5likD/rsqJ3t/77OWx2PLxym0hXbeBWQmcPyHmwX+CtCQpjIfgrUdEoDFcLPwPZWiqzQ== + dependencies: + "@types/node" "*" + "@types/range-parser" "*" + +"@types/express@^4.16.1": + version "4.16.1" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0" + integrity sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + "@types/jss@^9.5.3": version "9.5.4" resolved "https://registry.yarnpkg.com/@types/jss/-/jss-9.5.4.tgz#89a4ee32a14a8d2937187b1a7f443750e964a74d" @@ -830,6 +881,21 @@ csstype "^2.0.0" indefinite-observable "^1.0.1" +"@types/mime@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" + integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "11.13.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.8.tgz#e5d71173c95533be9842b2c798978f095f912aab" + integrity sha512-szA3x/3miL90ZJxUCzx9haNbK5/zmPieGraZEe4WI+3srN0eGLiT22NXeMHmyhNEopn+IrxqMc7wdVwvPl8meg== + "@types/node@^8.0.24": version "8.10.28" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.28.tgz#03bf70dd7f1de7826251331ce57beddf7f9dd253" @@ -842,6 +908,11 @@ dependencies: "@types/react" "*" +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + "@types/react-transition-group@^2.0.8": version "2.0.13" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.0.13.tgz#7769fb61eb71d64d087a713956f086a42c3ee171" @@ -857,6 +928,14 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/serve-static@*": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + "@webassemblyjs/ast@1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.6.tgz#3ef8c45b3e5e943a153a05281317474fef63e21e" @@ -1024,6 +1103,14 @@ about-window@^1.12.1: resolved "https://registry.yarnpkg.com/about-window/-/about-window-1.12.1.tgz#b81c10f6de58d38bce2aa5f31f61a82e6c3d6c2b" integrity sha512-P/fJACq7RBFpv5Ql0kIqpOYgFqQ8WdoZoB7wrKmDvwTSKVOMbUZMYnQYtnOW6dHmMCYuNrmQFf+MxvuhE+KrzQ== +accepts@~1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + accessibility-developer-tools@^2.11.0: version "2.12.0" resolved "https://registry.yarnpkg.com/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz#3da0cce9d6ec6373964b84f35db7cfc3df7ab514" @@ -1204,11 +1291,33 @@ array-find-index@^1.0.1: resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1267,7 +1376,7 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async@^1.4.0: +async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= @@ -1583,6 +1692,22 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -1775,6 +1900,11 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" @@ -1822,6 +1952,15 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -2119,6 +2258,16 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + convert-source-map@^1.1.0, convert-source-map@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" @@ -2131,6 +2280,16 @@ convert-source-map@^1.5.1: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -2177,6 +2336,35 @@ cosmiconfig@^5.0.5: js-yaml "^3.9.0" parse-json "^4.0.0" +cp-file@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" + integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== + dependencies: + graceful-fs "^4.1.2" + make-dir "^2.0.0" + nested-error-stacks "^2.0.0" + pify "^4.0.1" + safe-buffer "^5.0.1" + +cpy-cli@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-2.0.0.tgz#13f1528a231605c52ee7b7f74848e4be82253274" + integrity sha512-LzrtY3lBWvFZcw4lXgkEbbDUd7y78juC3C5l7gj3UyezMEZF0Be9fjCVLN1HoZAzdMDeC3KHehWpHBJvgVAPkw== + dependencies: + cpy "^7.0.0" + meow "^5.0.0" + +cpy@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-7.2.0.tgz#6f0f39ec720712628b4702c32263816f4720a364" + integrity sha512-CUYi9WYd7vdtEcq1NKqiS/yY2WdaDCNOBA/AoTQHVJzlpJMqctB8py9JrHgGIft6TgO5m8ZidI4l1ZD+RMr/wA== + dependencies: + arrify "^1.0.1" + cp-file "^6.1.0" + globby "^9.2.0" + nested-error-stacks "^2.1.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -2378,7 +2566,15 @@ debug@^3.1.0: dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -2444,6 +2640,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -2452,6 +2653,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -2482,6 +2688,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + dmg-builder@5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-5.3.1.tgz#b4d66d1dd010e1c9e7a5787bf1369e8157cac3cf" @@ -2546,6 +2759,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + ejs@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" @@ -2692,6 +2910,11 @@ emotion@^9.1.2: babel-plugin-emotion "^9.2.9" create-emotion "^9.2.6" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" @@ -2778,7 +3001,7 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -escape-html@^1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -2818,6 +3041,11 @@ esutils@^2.0.0, esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -2870,6 +3098,42 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +express@^4.16.4: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -2939,6 +3203,18 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-glob@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" + integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -2992,6 +3268,19 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -3014,7 +3303,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.1.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" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -3081,6 +3370,11 @@ form-data@~2.3.1, form-data@~2.3.2: combined-stream "1.0.6" mime-types "^2.1.12" +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -3088,6 +3382,11 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + friendly-errors-webpack-plugin@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz#efc86cbb816224565861a1be7a9d84d0aafea136" @@ -3258,6 +3557,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -3280,6 +3591,20 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + globule@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" @@ -3461,6 +3786,16 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -3493,6 +3828,13 @@ hyphenate-style-name@^1.0.2: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b" integrity sha1-MRYKNpMK2vH8BMYHT360FGXU7Es= +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3529,6 +3871,11 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -3571,6 +3918,11 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -3621,6 +3973,11 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -3805,6 +4162,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -4210,6 +4572,16 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -4325,6 +4697,14 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" @@ -4347,6 +4727,11 @@ map-obj@^1.0.0, map-obj@^1.0.1: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -4362,6 +4747,11 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" @@ -4407,7 +4797,37 @@ meow@^3.1.0, meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -micromatch@^3.1.4, micromatch@^3.1.8: +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge2@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -4434,6 +4854,11 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.36.0: version "1.36.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" @@ -4446,6 +4871,18 @@ mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19: dependencies: mime-db "~1.36.0" +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + mime@^2.0.3, mime@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" @@ -4473,6 +4910,14 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: dependencies: brace-expansion "^1.1.7" +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + minimist@0.0.8: version "0.0.8" resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -4535,7 +4980,7 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -4590,11 +5035,21 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + neo-async@^2.5.0: version "2.5.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" integrity sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw== +nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" + integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -4608,6 +5063,11 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== + node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" @@ -4851,6 +5311,13 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -5029,6 +5496,11 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parseurl@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -5076,6 +5548,11 @@ path-parse@^1.0.5: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -5085,6 +5562,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + pbkdf2@^3.0.3: version "3.0.16" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" @@ -5116,6 +5600,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -5172,6 +5661,15 @@ popper.js@^1.14.1: resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz#8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6" integrity sha1-juwdj/AqWjoVLdQ0FKFce3n9abY= +portfinder@^1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -5288,6 +5786,14 @@ prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" +proxy-addr@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -5365,7 +5871,7 @@ puppeteer@^1.0.0: rimraf "^2.6.1" ws "^5.1.1" -qs@~6.5.1, qs@~6.5.2: +qs@6.5.2, qs@~6.5.1, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== @@ -5380,6 +5886,11 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + raf@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" @@ -5402,6 +5913,21 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -5527,6 +6053,14 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.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" @@ -5536,6 +6070,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -5613,6 +6156,14 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + redux-promise@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/redux-promise/-/redux-promise-0.6.0.tgz#c64723b5213bb5603c11b74302883b682e06b319" @@ -5883,7 +6434,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -5966,6 +6517,13 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" +selfsigned@^1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" + integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== + dependencies: + node-forge "0.7.5" + semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" @@ -5978,16 +6536,50 @@ semver-diff@^2.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== +semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -6023,6 +6615,11 @@ setimmediate@^1.0.4, setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -6069,6 +6666,11 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6246,6 +6848,16 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + stdout-stream@^1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" @@ -6335,6 +6947,11 @@ 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" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -6347,6 +6964,11 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -6566,6 +7188,11 @@ trim-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -6607,6 +7234,14 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-is@~1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -6718,6 +7353,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -6816,6 +7456,11 @@ util@^0.10.3: dependencies: inherits "2.0.3" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + uuid@^3.1.0, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -6834,6 +7479,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -7113,7 +7763,7 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= -yargs-parser@^10.1.0: +yargs-parser@^10.0.0, yargs-parser@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==