From 53e822964e2cbbb9d9b36e7bb7d16075562ba76b Mon Sep 17 00:00:00 2001 From: Danny Coates Date: Thu, 24 Aug 2017 14:54:02 -0700 Subject: [PATCH] a few changes to make A/B testing easier --- .dockerignore | 10 +- .eslintignore | 4 +- .gitignore | 6 +- Dockerfile | 2 +- README.md | 5 +- {frontend/src => app}/.eslintrc.yml | 2 +- app/dragManager.js | 24 + app/fileManager.js | 202 + {frontend/src => app}/fileReceiver.js | 30 +- {frontend/src => app}/fileSender.js | 58 +- app/main.js | 38 + {frontend/src => app}/metrics.js | 85 +- app/routes/download.js | 9 + app/routes/home.js | 9 + app/routes/index.js | 17 + {frontend/src => app}/storage.js | 58 +- app/templates/blank.js | 9 + app/templates/completed.js | 31 + app/templates/download.js | 28 + app/templates/error.js | 12 + app/templates/file.js | 84 + app/templates/fileList.js | 28 + app/templates/legal.js | 38 + app/templates/notFound.js | 27 + app/templates/preview.js | 65 + app/templates/progress.js | 21 + app/templates/share.js | 61 + app/templates/unsupported.js | 50 + app/templates/upload.js | 38 + app/templates/welcome.js | 55 + {frontend/src => app}/utils.js | 90 +- {public/resources => assets}/check-16.svg | 0 {public/resources => assets}/close-16.svg | 2 +- {public/resources => assets}/copy-16.svg | 0 {public => assets}/cryptofill.js | 0 .../resources => assets}/favicon-32x32.png | Bin {public/resources => assets}/feedback.svg | 0 .../firefox_logo-only.svg | 0 {public/resources => assets}/github-icon.svg | 0 .../illustration_download.svg | 0 .../illustration_error.svg | 0 .../illustration_expired.svg | 0 {frontend/src => assets}/main.css | 51 +- {public/resources => assets}/mozilla-logo.svg | 0 {public/resources => assets}/send-fb.jpg | Bin {public/resources => assets}/send-twitter.jpg | Bin {public/resources => assets}/send_bg.svg | 0 {public/resources => assets}/send_logo.svg | 0 {public/resources => assets}/twitter-icon.svg | 0 {public/resources => assets}/upload.svg | 0 build/fluent_loader.js | 38 + build/generate_asset_map.js | 19 + build/generate_l10n_map.js | 22 + build/package_json_loader.js | 11 + common/assets.js | 32 + common/locales.js | 51 + frontend/src/common.js | 20 - frontend/src/download.js | 119 - frontend/src/fileList.js | 163 - frontend/src/links.js | 21 - frontend/src/progress.js | 47 - frontend/src/upload.js | 257 - package-lock.json | 4957 +++++++++-------- package.json | 198 +- postcss.config.js | 4 +- public/favicon.ico | Bin 3410 -> 0 bytes scripts/version.js | 21 - server/dev.js | 13 + server/languages.js | 16 + server/layout.js | 98 + server/log.js | 2 +- server/prod.js | 26 + server/routes/delete.js | 30 + server/routes/download.js | 38 + server/routes/exists.js | 19 + server/routes/index.js | 80 + server/routes/jsconfig.js | 46 + server/routes/pages.js | 68 + server/routes/upload.js | 65 + server/server.js | 328 -- server/state.js | 20 + server/storage.js | 39 +- static/info.txt | 1 - test/frontend/frontend.bundle.js | 6 +- test/unit/aws.storage.test.js | 4 +- test/unit/local.storage.test.js | 4 +- views/jsconfig.handlebars | 28 - webpack.config.js | 137 +- webpack/download.hbs | 43 - webpack/layout.hbs | 69 - webpack/legal.hbs | 12 - webpack/notfound.hbs | 8 - webpack/unsupported.hbs | 20 - webpack/upload.hbs | 75 - 94 files changed, 4566 insertions(+), 3958 deletions(-) rename {frontend/src => app}/.eslintrc.yml (87%) create mode 100644 app/dragManager.js create mode 100644 app/fileManager.js rename {frontend/src => app}/fileReceiver.js (72%) rename {frontend/src => app}/fileSender.js (67%) create mode 100644 app/main.js rename {frontend/src => app}/metrics.js (73%) create mode 100644 app/routes/download.js create mode 100644 app/routes/home.js create mode 100644 app/routes/index.js rename {frontend/src => app}/storage.js (75%) create mode 100644 app/templates/blank.js create mode 100644 app/templates/completed.js create mode 100644 app/templates/download.js create mode 100644 app/templates/error.js create mode 100644 app/templates/file.js create mode 100644 app/templates/fileList.js create mode 100644 app/templates/legal.js create mode 100644 app/templates/notFound.js create mode 100644 app/templates/preview.js create mode 100644 app/templates/progress.js create mode 100644 app/templates/share.js create mode 100644 app/templates/unsupported.js create mode 100644 app/templates/upload.js create mode 100644 app/templates/welcome.js rename {frontend/src => app}/utils.js (68%) rename {public/resources => assets}/check-16.svg (100%) rename {public/resources => assets}/close-16.svg (66%) rename {public/resources => assets}/copy-16.svg (100%) rename {public => assets}/cryptofill.js (100%) rename {public/resources => assets}/favicon-32x32.png (100%) rename {public/resources => assets}/feedback.svg (100%) rename {public/resources => assets}/firefox_logo-only.svg (100%) rename {public/resources => assets}/github-icon.svg (100%) rename {public/resources => assets}/illustration_download.svg (100%) rename {public/resources => assets}/illustration_error.svg (100%) rename {public/resources => assets}/illustration_expired.svg (100%) rename {frontend/src => assets}/main.css (96%) rename {public/resources => assets}/mozilla-logo.svg (100%) rename {public/resources => assets}/send-fb.jpg (100%) rename {public/resources => assets}/send-twitter.jpg (100%) rename {public/resources => assets}/send_bg.svg (100%) rename {public/resources => assets}/send_logo.svg (100%) rename {public/resources => assets}/twitter-icon.svg (100%) rename {public/resources => assets}/upload.svg (100%) create mode 100644 build/fluent_loader.js create mode 100644 build/generate_asset_map.js create mode 100644 build/generate_l10n_map.js create mode 100644 build/package_json_loader.js create mode 100644 common/assets.js create mode 100644 common/locales.js delete mode 100644 frontend/src/common.js delete mode 100644 frontend/src/download.js delete mode 100644 frontend/src/fileList.js delete mode 100644 frontend/src/links.js delete mode 100644 frontend/src/progress.js delete mode 100644 frontend/src/upload.js delete mode 100644 public/favicon.ico delete mode 100755 scripts/version.js create mode 100644 server/dev.js create mode 100644 server/languages.js create mode 100644 server/layout.js create mode 100644 server/prod.js create mode 100644 server/routes/delete.js create mode 100644 server/routes/download.js create mode 100644 server/routes/exists.js create mode 100644 server/routes/index.js create mode 100644 server/routes/jsconfig.js create mode 100644 server/routes/pages.js create mode 100644 server/routes/upload.js delete mode 100644 server/server.js create mode 100644 server/state.js delete mode 100644 static/info.txt delete mode 100644 views/jsconfig.handlebars delete mode 100644 webpack/download.hbs delete mode 100644 webpack/layout.hbs delete mode 100644 webpack/legal.hbs delete mode 100644 webpack/notfound.hbs delete mode 100644 webpack/unsupported.hbs delete mode 100644 webpack/upload.hbs diff --git a/.dockerignore b/.dockerignore index 6c87ade9..eb85ddcc 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,12 +1,8 @@ node_modules .git .DS_Store -static -test -scripts -docs firefox +assets +docs public -views -webpack -frontend +test diff --git a/.eslintignore b/.eslintignore index a435bfcc..7540c39c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,3 @@ -public -test/frontend/bundle.js +dist +assets firefox diff --git a/.gitignore b/.gitignore index 2aa3a824..f06235c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,2 @@ -.DS_Store -dist node_modules -static/* -!static/info.txt -test/frontend/bundle.js +dist diff --git a/Dockerfile b/Dockerfile index 998c72b2..93f3a47b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,4 +12,4 @@ RUN npm install --production && npm cache clean --force ENV PORT=1443 EXPOSE $PORT -CMD ["npm", "start"] +CMD ["npm", "run", "prod"] diff --git a/README.md b/README.md index 4ded5ec1..114ee240 100644 --- a/README.md +++ b/README.md @@ -30,11 +30,12 @@ $ redis-server /usr/local/etc/redis.conf | Command | Description | |------------------|-------------| -| `npm run dev` | Builds and starts the web server locally for development. | `npm run format` | Formats the frontend and server code using **prettier**. | `npm run lint` | Lints the CSS and JavaScript code. -| `npm start` | Starts the Express web server. | `npm test` | Runs the suite of mocha tests. +| `npm start` | Runs the server in development configuration. +| `npm run build` | Builds the production assets. +| `npm run prod` | Runs the server in production configuration. --- diff --git a/frontend/src/.eslintrc.yml b/app/.eslintrc.yml similarity index 87% rename from frontend/src/.eslintrc.yml rename to app/.eslintrc.yml index d6d7fd0c..677cec88 100644 --- a/frontend/src/.eslintrc.yml +++ b/app/.eslintrc.yml @@ -1,6 +1,6 @@ env: browser: true - node: false + node: true parserOptions: sourceType: module diff --git a/app/dragManager.js b/app/dragManager.js new file mode 100644 index 00000000..a878853a --- /dev/null +++ b/app/dragManager.js @@ -0,0 +1,24 @@ +export default function(state, emitter) { + emitter.on('DOMContentLoaded', () => { + document.body.addEventListener('dragover', event => { + if (state.route === '/') { + event.preventDefault(); + } + }); + document.body.addEventListener('drop', event => { + if (state.route === '/' && !state.transfer) { + event.preventDefault(); + document.querySelector('.upload-window').classList.remove('ondrag'); + const target = event.dataTransfer; + if (target.files.length === 0) { + return; + } + if (target.files.length > 1 || target.files[0].size === 0) { + return alert(state.translate('uploadPageMultipleFilesAlert')); + } + const file = target.files[0]; + emitter.emit('upload', { file, type: 'drop' }); + } + }); + }); +} diff --git a/app/fileManager.js b/app/fileManager.js new file mode 100644 index 00000000..e7816324 --- /dev/null +++ b/app/fileManager.js @@ -0,0 +1,202 @@ +/* global EXPIRE_SECONDS */ +import FileSender from './fileSender'; +import FileReceiver from './fileReceiver'; +import { copyToClipboard, delay, fadeOut } from './utils'; +import * as metrics from './metrics'; + +function saveFile(file) { + const dataView = new DataView(file.plaintext); + const blob = new Blob([dataView], { type: file.type }); + const downloadUrl = URL.createObjectURL(blob); + + if (window.navigator.msSaveBlob) { + return window.navigator.msSaveBlob(blob, file.name); + } + const a = document.createElement('a'); + a.href = downloadUrl; + a.download = file.name; + document.body.appendChild(a); + a.click(); + URL.revokeObjectURL(downloadUrl); +} + +function openLinksInNewTab(links, should = true) { + links = links || Array.from(document.querySelectorAll('a:not([target])')); + if (should) { + links.forEach(l => { + l.setAttribute('target', '_blank'); + l.setAttribute('rel', 'noopener noreferrer'); + }); + } else { + links.forEach(l => { + l.removeAttribute('target'); + l.removeAttribute('rel'); + }); + } + return links; +} + +function exists(id) { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.onreadystatechange = () => { + if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) { + resolve(xhr.status === 200); + } + }; + xhr.onerror = () => resolve(false); + xhr.ontimeout = () => resolve(false); + xhr.open('get', '/api/exists/' + id); + xhr.timeout = 2000; + xhr.send(); + }); +} + +export default function(state, emitter) { + let lastRender = 0; + + function render() { + emitter.emit('render'); + } + + async function checkFiles() { + const files = state.storage.files; + let rerender = false; + for (const file of files) { + const ok = await exists(file.id); + if (!ok) { + state.storage.remove(file.id); + rerender = true; + } + } + if (rerender) { + render(); + } + } + + emitter.on('DOMContentLoaded', checkFiles); + + emitter.on('navigate', checkFiles); + + emitter.on('render', () => { + lastRender = Date.now(); + }); + + emitter.on('delete', async ({ file, location }) => { + try { + metrics.deletedUpload({ + size: file.size, + time: file.time, + speed: file.speed, + type: file.type, + ttl: file.expiresAt - Date.now(), + location + }); + state.storage.remove(file.id); + await FileSender.delete(file.id, file.deleteToken); + } catch (e) { + state.raven.captureException(e); + } + state.fileInfo = null; + }); + + emitter.on('cancel', () => { + state.transfer.cancel(); + }); + + emitter.on('upload', async ({ file, type }) => { + const size = file.size; + const sender = new FileSender(file); + sender.on('progress', render); + sender.on('encrypting', render); + state.transfer = sender; + render(); + const links = openLinksInNewTab(); + await delay(200); + try { + const start = Date.now(); + metrics.startedUpload({ size, type }); + const info = await sender.upload(); + const time = Date.now() - start; + const speed = size / (time / 1000); + metrics.completedUpload({ size, time, speed, type }); + await delay(1000); + await fadeOut('upload-progress'); + info.name = file.name; + info.size = size; + info.type = type; + info.time = time; + info.speed = speed; + info.createdAt = Date.now(); + info.url = `${info.url}#${info.secretKey}`; + info.expiresAt = Date.now() + EXPIRE_SECONDS * 1000; + state.fileInfo = info; + state.storage.addFile(state.fileInfo); + openLinksInNewTab(links, false); + state.transfer = null; + state.storage.totalUploads += 1; + emitter.emit('pushState', `/share/${info.id}`); + } catch (err) { + state.transfer = null; + if (err.message === '0') { + //cancelled. do nothing + metrics.cancelledUpload({ size, type }); + return render(); + } + state.raven.captureException(err); + metrics.stoppedUpload({ size, type, err }); + emitter.emit('replaceState', '/error'); + } + }); + + emitter.on('download', async file => { + const size = file.size; + const url = `/api/download/${file.id}`; + const receiver = new FileReceiver(url, file.key); + receiver.on('progress', render); + receiver.on('decrypting', render); + state.transfer = receiver; + const links = openLinksInNewTab(); + render(); + try { + const start = Date.now(); + metrics.startedDownload({ size: file.size, ttl: file.ttl }); + const f = await receiver.download(); + const time = Date.now() - start; + const speed = size / (time / 1000); + await delay(1000); + await fadeOut('download-progress'); + saveFile(f); + state.storage.totalDownloads += 1; + metrics.completedDownload({ size, time, speed }); + emitter.emit('pushState', '/completed'); + } catch (err) { + // TODO cancelled download + const location = err.message === 'notfound' ? '/404' : '/error'; + if (location === '/error') { + state.raven.captureException(err); + metrics.stoppedDownload({ size, err }); + } + emitter.emit('replaceState', location); + } finally { + state.transfer = null; + openLinksInNewTab(links, false); + } + }); + + emitter.on('copy', ({ url, location }) => { + copyToClipboard(url); + metrics.copiedLink({ location }); + }); + + setInterval(() => { + // poll for rerendering the file list countdown timers + if ( + state.route === '/' && + state.storage.files.length > 0 && + Date.now() - lastRender > 30000 + ) { + render(); + } + }, 60000); +} diff --git a/frontend/src/fileReceiver.js b/app/fileReceiver.js similarity index 72% rename from frontend/src/fileReceiver.js rename to app/fileReceiver.js index 13caafa5..5af6c34c 100644 --- a/frontend/src/fileReceiver.js +++ b/app/fileReceiver.js @@ -1,9 +1,9 @@ -import EventEmitter from 'events'; -import { hexToArray } from './utils'; +import Nanobus from 'nanobus'; +import { hexToArray, bytes } from './utils'; -export default class FileReceiver extends EventEmitter { +export default class FileReceiver extends Nanobus { constructor(url, k) { - super(); + super('FileReceiver'); this.key = window.crypto.subtle.importKey( 'jwk', { @@ -19,6 +19,23 @@ export default class FileReceiver extends EventEmitter { ['decrypt'] ); this.url = url; + this.msg = 'fileSizeProgress'; + this.progress = [0, 1]; + } + + get progressRatio() { + return this.progress[0] / this.progress[1]; + } + + get sizes() { + return { + partialSize: bytes(this.progress[0]), + totalSize: bytes(this.progress[1]) + }; + } + + cancel() { + // TODO } downloadFile() { @@ -27,7 +44,8 @@ export default class FileReceiver extends EventEmitter { xhr.onprogress = event => { if (event.lengthComputable && event.target.status !== 404) { - this.emit('progress', [event.loaded, event.total]); + this.progress = [event.loaded, event.total]; + this.emit('progress', this.progress); } }; @@ -61,6 +79,7 @@ export default class FileReceiver extends EventEmitter { async download() { const key = await this.key; const file = await this.downloadFile(); + this.msg = 'decryptingFile'; this.emit('decrypting'); const plaintext = await window.crypto.subtle.decrypt( { @@ -71,6 +90,7 @@ export default class FileReceiver extends EventEmitter { key, file.data ); + this.msg = 'downloadFinish'; return { plaintext, name: decodeURIComponent(file.name), diff --git a/frontend/src/fileSender.js b/app/fileSender.js similarity index 67% rename from frontend/src/fileSender.js rename to app/fileSender.js index 2073c121..37a5add1 100644 --- a/frontend/src/fileSender.js +++ b/app/fileSender.js @@ -1,10 +1,13 @@ -import EventEmitter from 'events'; -import { arrayToHex } from './utils'; +import Nanobus from 'nanobus'; +import { arrayToHex, bytes } from './utils'; -export default class FileSender extends EventEmitter { +export default class FileSender extends Nanobus { constructor(file) { - super(); + super('FileSender'); this.file = file; + this.msg = 'importingFile'; + this.progress = [0, 1]; + this.cancelled = false; this.iv = window.crypto.getRandomValues(new Uint8Array(12)); this.uploadXHR = new XMLHttpRequest(); this.key = window.crypto.subtle.generateKey( @@ -17,13 +20,13 @@ export default class FileSender extends EventEmitter { ); } - static delete(fileId, token) { + static delete(id, token) { return new Promise((resolve, reject) => { - if (!fileId || !token) { + if (!id || !token) { return reject(); } const xhr = new XMLHttpRequest(); - xhr.open('post', '/delete/' + fileId, true); + xhr.open('POST', `/api/delete/${id}`); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = () => { @@ -36,8 +39,22 @@ export default class FileSender extends EventEmitter { }); } + get progressRatio() { + return this.progress[0] / this.progress[1]; + } + + get sizes() { + return { + partialSize: bytes(this.progress[0]), + totalSize: bytes(this.progress[1]) + }; + } + cancel() { - this.uploadXHR.abort(); + this.cancelled = true; + if (this.msg === 'fileSizeProgress') { + this.uploadXHR.abort(); + } } readFile() { @@ -57,7 +74,7 @@ export default class FileSender extends EventEmitter { uploadFile(encrypted, keydata) { return new Promise((resolve, reject) => { const file = this.file; - const fileId = arrayToHex(this.iv); + const id = arrayToHex(this.iv); const dataView = new DataView(encrypted); const blob = new Blob([dataView], { type: file.type }); const fd = new FormData(); @@ -67,41 +84,49 @@ export default class FileSender extends EventEmitter { xhr.upload.addEventListener('progress', e => { if (e.lengthComputable) { - this.emit('progress', [e.loaded, e.total]); + this.progress = [e.loaded, e.total]; + this.emit('progress', this.progress); } }); xhr.onreadystatechange = () => { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { + this.progress = [1, 1]; + this.msg = 'notifyUploadDone'; const responseObj = JSON.parse(xhr.responseText); return resolve({ url: responseObj.url, - fileId: responseObj.id, + id: responseObj.id, secretKey: keydata.k, deleteToken: responseObj.delete }); } - reject(xhr.status); + this.msg = 'errorPageHeader'; + reject(new Error(xhr.status)); } }; - xhr.open('post', '/upload', true); + xhr.open('post', '/api/upload', true); xhr.setRequestHeader( 'X-File-Metadata', JSON.stringify({ - id: fileId, + id: id, filename: encodeURIComponent(file.name) }) ); xhr.send(fd); + this.msg = 'fileSizeProgress'; }); } async upload() { - this.emit('loading'); const key = await this.key; const plaintext = await this.readFile(); + if (this.cancelled) { + throw new Error(0); + } + this.msg = 'encryptingFile'; this.emit('encrypting'); const encrypted = await window.crypto.subtle.encrypt( { @@ -112,6 +137,9 @@ export default class FileSender extends EventEmitter { key, plaintext ); + if (this.cancelled) { + throw new Error(0); + } const keydata = await window.crypto.subtle.exportKey('jwk', key); return this.uploadFile(encrypted, keydata); } diff --git a/app/main.js b/app/main.js new file mode 100644 index 00000000..39494995 --- /dev/null +++ b/app/main.js @@ -0,0 +1,38 @@ +import app from './routes'; +import log from 'choo-log'; +import locale from '../common/locales'; +import fileManager from './fileManager'; +import dragManager from './dragManager'; +import { canHasSend } from './utils'; +import assets from '../common/assets'; +import storage from './storage'; +import metrics from './metrics'; +import Raven from 'raven-js'; + +if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) { + Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install(); +} + +app.use(log()); + +app.use((state, emitter) => { + // init state + state.transfer = null; + state.fileInfo = null; + state.translate = locale.getTranslator(); + state.storage = storage; + state.raven = Raven; + emitter.on('DOMContentLoaded', async () => { + const ok = await canHasSend(assets.get('cryptofill.js')); + if (!ok) { + const reason = /firefox/i.test(navigator.userAgent) ? 'outdated' : 'gcm'; + emitter.emit('replaceState', `/unsupported/${reason}`); + } + }); +}); + +app.use(metrics); +app.use(fileManager); +app.use(dragManager); + +app.mount('#page-one'); diff --git a/frontend/src/metrics.js b/app/metrics.js similarity index 73% rename from frontend/src/metrics.js rename to app/metrics.js index 9a0167d7..61f99971 100644 --- a/frontend/src/metrics.js +++ b/app/metrics.js @@ -1,12 +1,11 @@ import testPilotGA from 'testpilot-ga/src/TestPilotGA'; -import Storage from './storage'; -const storage = new Storage(); +import storage from './storage'; let hasLocalStorage = false; try { - hasLocalStorage = !!localStorage; + hasLocalStorage = typeof localStorage !== 'undefined'; } catch (e) { - // don't care + // when disabled, any mention of localStorage throws an error } const analytics = new testPilotGA({ @@ -15,14 +14,19 @@ const analytics = new testPilotGA({ tid: window.GOOGLE_ANALYTICS_ID }); -const category = location.pathname.includes('/download') - ? 'recipient' - : 'sender'; +let appState = null; -document.addEventListener('DOMContentLoaded', function() { - addExitHandlers(); - addRestartHandlers(); -}); +export default function initialize(state, emitter) { + appState = state; + emitter.on('DOMContentLoaded', () => { + addExitHandlers(); + //TODO restart handlers... somewhere + }); +} + +function category() { + return appState.route === '/' ? 'sender' : 'recipient'; +} function sendEvent() { return ( @@ -62,11 +66,11 @@ function urlToMetric(url) { } function setReferrer(state) { - if (category === 'sender') { + if (category() === 'sender') { if (state) { storage.referrer = `${state}-upload`; } - } else if (category === 'recipient') { + } else if (category() === 'recipient') { if (state) { storage.referrer = `${state}-download`; } @@ -87,10 +91,10 @@ function takeReferrer() { } function startedUpload(params) { - return sendEvent(category, 'upload-started', { + return sendEvent('sender', 'upload-started', { cm1: params.size, cm5: storage.totalUploads, - cm6: storage.numFiles + 1, + cm6: storage.files.length + 1, cm7: storage.totalDownloads, cd1: params.type, cd5: takeReferrer() @@ -99,10 +103,10 @@ function startedUpload(params) { function cancelledUpload(params) { setReferrer('cancelled'); - return sendEvent(category, 'upload-stopped', { + return sendEvent('sender', 'upload-stopped', { cm1: params.size, cm5: storage.totalUploads, - cm6: storage.numFiles, + cm6: storage.files.length, cm7: storage.totalDownloads, cd1: params.type, cd2: 'cancelled' @@ -110,12 +114,12 @@ function cancelledUpload(params) { } function completedUpload(params) { - return sendEvent(category, 'upload-stopped', { + return sendEvent('sender', 'upload-stopped', { cm1: params.size, cm2: params.time, cm3: params.speed, cm5: storage.totalUploads, - cm6: storage.numFiles, + cm6: storage.files.length, cm7: storage.totalDownloads, cd1: params.type, cd2: 'completed' @@ -123,20 +127,20 @@ function completedUpload(params) { } function startedDownload(params) { - return sendEvent(category, 'download-started', { + return sendEvent('recipient', 'download-started', { cm1: params.size, cm4: params.ttl, cm5: storage.totalUploads, - cm6: storage.numFiles, + cm6: storage.files.length, cm7: storage.totalDownloads }); } function stoppedDownload(params) { - return sendEvent(category, 'download-stopped', { + return sendEvent('recipient', 'download-stopped', { cm1: params.size, cm5: storage.totalUploads, - cm6: storage.numFiles, + cm6: storage.files.length, cm7: storage.totalDownloads, cd2: 'errored', cd6: params.err @@ -145,20 +149,20 @@ function stoppedDownload(params) { function cancelledDownload(params) { setReferrer('cancelled'); - return sendEvent(category, 'download-stopped', { + return sendEvent('recipient', 'download-stopped', { cm1: params.size, cm5: storage.totalUploads, - cm6: storage.numFiles, + cm6: storage.files.length, cm7: storage.totalDownloads, cd2: 'cancelled' }); } function stoppedUpload(params) { - return sendEvent(category, 'upload-stopped', { + return sendEvent('sender', 'upload-stopped', { cm1: params.size, cm5: storage.totalUploads, - cm6: storage.numFiles, + cm6: storage.files.length, cm7: storage.totalDownloads, cd1: params.type, cd2: 'errored', @@ -167,25 +171,25 @@ function stoppedUpload(params) { } function completedDownload(params) { - return sendEvent(category, 'download-stopped', { + return sendEvent('recipient', 'download-stopped', { cm1: params.size, cm2: params.time, cm3: params.speed, cm5: storage.totalUploads, - cm6: storage.numFiles, + cm6: storage.files.length, cm7: storage.totalDownloads, cd2: 'completed' }); } function deletedUpload(params) { - return sendEvent(category, 'upload-deleted', { + return sendEvent(category(), 'upload-deleted', { cm1: params.size, cm2: params.time, cm3: params.speed, cm4: params.ttl, cm5: storage.totalUploads, - cm6: storage.numFiles, + cm6: storage.files.length, cm7: storage.totalDownloads, cd1: params.type, cd4: params.location @@ -193,19 +197,19 @@ function deletedUpload(params) { } function unsupported(params) { - return sendEvent(category, 'unsupported', { + return sendEvent(category(), 'unsupported', { cd6: params.err }); } function copiedLink(params) { - return sendEvent(category, 'copied', { + return sendEvent('sender', 'copied', { cd4: params.location }); } function exitEvent(target) { - return sendEvent(category, 'exited', { + return sendEvent(category(), 'exited', { cd3: urlToMetric(target.currentTarget.href) }); } @@ -219,21 +223,13 @@ function addExitHandlers() { }); } -function restartEvent(state) { +function restart(state) { setReferrer(state); - return sendEvent(category, 'restarted', { + return sendEvent(category(), 'restarted', { cd2: state }); } -function addRestartHandlers() { - const elements = Array.from(document.querySelectorAll('.send-new')); - elements.forEach(el => { - const state = el.getAttribute('data-state'); - el.addEventListener('click', restartEvent.bind(null, state)); - }); -} - export { copiedLink, startedUpload, @@ -245,5 +241,6 @@ export { cancelledDownload, stoppedDownload, completedDownload, + restart, unsupported }; diff --git a/app/routes/download.js b/app/routes/download.js new file mode 100644 index 00000000..0b935028 --- /dev/null +++ b/app/routes/download.js @@ -0,0 +1,9 @@ +const preview = require('../templates/preview'); +const download = require('../templates/download'); + +module.exports = function(state, emit) { + if (state.transfer) { + return download(state, emit); + } + return preview(state, emit); +}; diff --git a/app/routes/home.js b/app/routes/home.js new file mode 100644 index 00000000..2be53047 --- /dev/null +++ b/app/routes/home.js @@ -0,0 +1,9 @@ +const welcome = require('../templates/welcome'); +const upload = require('../templates/upload'); + +module.exports = function(state, emit) { + if (state.transfer) { + return upload(state, emit); + } + return welcome(state, emit); +}; diff --git a/app/routes/index.js b/app/routes/index.js new file mode 100644 index 00000000..08b84705 --- /dev/null +++ b/app/routes/index.js @@ -0,0 +1,17 @@ +const choo = require('choo'); +const download = require('./download'); + +const app = choo(); + +app.route('/', require('./home')); +app.route('/share/:id', require('../templates/share')); +app.route('/download/:id', download); +app.route('/download/:id/:key', download); +app.route('/completed', require('../templates/completed')); +app.route('/unsupported/:reason', require('../templates/unsupported')); +app.route('/legal', require('../templates/legal')); +app.route('/error', require('../templates/error')); +app.route('/blank', require('../templates/blank')); +app.route('*', require('../templates/notFound')); + +module.exports = app; diff --git a/frontend/src/storage.js b/app/storage.js similarity index 75% rename from frontend/src/storage.js rename to app/storage.js index 28f14b89..75483b42 100644 --- a/frontend/src/storage.js +++ b/app/storage.js @@ -26,13 +26,30 @@ class Mem { } } -export default class Storage { +class Storage { constructor() { try { this.engine = localStorage || new Mem(); } catch (e) { this.engine = new Mem(); } + this._files = this.loadFiles(); + } + + loadFiles() { + const fs = []; + for (let i = 0; i < this.engine.length; i++) { + const k = this.engine.key(i); + if (isFile(k)) { + try { + fs.push(JSON.parse(this.engine.getItem(k))); + } catch (err) { + // obviously you're not a golfer + this.engine.removeItem(k); + } + } + } + return fs.sort((a, b) => a.createdAt - b.createdAt); } get totalDownloads() { @@ -55,34 +72,7 @@ export default class Storage { } get files() { - const fs = []; - for (let i = 0; i < this.engine.length; i++) { - const k = this.engine.key(i); - if (isFile(k)) { - try { - fs.push(JSON.parse(this.engine.getItem(k))); - } catch (err) { - // obviously you're not a golfer - this.engine.removeItem(k); - } - } - } - return fs.sort((file1, file2) => { - const creationDate1 = new Date(file1.creationDate); - const creationDate2 = new Date(file2.creationDate); - return creationDate1 - creationDate2; - }); - } - - get numFiles() { - let length = 0; - for (let i = 0; i < this.engine.length; i++) { - const k = this.engine.key(i); - if (isFile(k)) { - length += 1; - } - } - return length; + return this._files; } getFileById(id) { @@ -94,10 +84,16 @@ export default class Storage { } remove(property) { + if (isFile(property)) { + this._files.splice(this._files.findIndex(f => f.id === property), 1); + } this.engine.removeItem(property); } - addFile(id, file) { - this.engine.setItem(id, JSON.stringify(file)); + addFile(file) { + this._files.push(file); + this.engine.setItem(file.id, JSON.stringify(file)); } } + +export default new Storage(); diff --git a/app/templates/blank.js b/app/templates/blank.js new file mode 100644 index 00000000..377b9817 --- /dev/null +++ b/app/templates/blank.js @@ -0,0 +1,9 @@ +const html = require('choo/html'); + +module.exports = function(state) { + const div = html`
`; + if (state.layout) { + return state.layout(state, div); + } + return div; +}; diff --git a/app/templates/completed.js b/app/templates/completed.js new file mode 100644 index 00000000..3ebc5020 --- /dev/null +++ b/app/templates/completed.js @@ -0,0 +1,31 @@ +const html = require('choo/html'); +const progress = require('./progress'); +const { fadeOut } = require('../utils'); + +module.exports = function(state, emit) { + const div = html` +
+
+
${state.translate( + 'downloadFinish' + )}
+
+ ${progress(1)} +
+
+
+
+ ${state.translate( + 'sendYourFilesLink' + )} +
+ `; + + async function sendNew(e) { + e.preventDefault(); + await fadeOut('download'); + emit('pushState', '/'); + } + + return div; +}; diff --git a/app/templates/download.js b/app/templates/download.js new file mode 100644 index 00000000..38fff942 --- /dev/null +++ b/app/templates/download.js @@ -0,0 +1,28 @@ +const html = require('choo/html'); +const progress = require('./progress'); +const { bytes } = require('../utils'); + +module.exports = function(state) { + const transfer = state.transfer; + const div = html` +
+
${state.translate( + 'downloadingPageProgress', + { + filename: state.fileInfo.name, + size: bytes(state.fileInfo.size) + } + )}
+
${state.translate('downloadingPageMessage')}
+ ${progress(transfer.progressRatio)} +
+
${state.translate( + transfer.msg, + transfer.sizes + )}
+
+
+ `; + + return div; +}; diff --git a/app/templates/error.js b/app/templates/error.js new file mode 100644 index 00000000..074dba71 --- /dev/null +++ b/app/templates/error.js @@ -0,0 +1,12 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); + +module.exports = function(state) { + return html` +
+
${state.translate('errorPageHeader')}
+ +
`; +}; diff --git a/app/templates/file.js b/app/templates/file.js new file mode 100644 index 00000000..4c20d641 --- /dev/null +++ b/app/templates/file.js @@ -0,0 +1,84 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); + +function timeLeft(milliseconds) { + const minutes = Math.floor(milliseconds / 1000 / 60); + const hours = Math.floor(minutes / 60); + const seconds = Math.floor(milliseconds / 1000 % 60); + if (hours >= 1) { + return `${hours}h ${minutes % 60}m`; + } else if (hours === 0) { + return `${minutes}m ${seconds}s`; + } + return null; +} + +module.exports = function(file, state, emit) { + const ttl = file.expiresAt - Date.now(); + const remaining = timeLeft(ttl) || state.translate('linkExpiredAlt'); + const row = html` + + ${file.name} + + + + + ${remaining} + + + + + + `; + + function copyClick(e) { + emit('copy', { url: file.url, location: 'upload-list' }); + const icon = e.target; + const text = e.target.nextSibling; + icon.hidden = true; + text.hidden = false; + setTimeout(() => { + icon.hidden = false; + text.hidden = true; + }, 500); + } + + function showPopup() { + const tr = document.getElementById(file.id); + const popup = tr.querySelector('.popuptext'); + popup.classList.add('show'); + popup.focus(); + } + + function cancel(e) { + e.stopPropagation(); + const tr = document.getElementById(file.id); + const popup = tr.querySelector('.popuptext'); + popup.classList.remove('show'); + } + + function deleteFile() { + emit('delete', { file, location: 'upload-list' }); + emit('render'); + } + + return row; +}; diff --git a/app/templates/fileList.js b/app/templates/fileList.js new file mode 100644 index 00000000..c5961239 --- /dev/null +++ b/app/templates/fileList.js @@ -0,0 +1,28 @@ +const html = require('choo/html'); +const file = require('./file'); + +module.exports = function(state, emit) { + let table = ''; + if (state.storage.files.length) { + table = html` + + + + + + + + + + + ${state.storage.files.map(f => file(f, state, emit))} + +
${state.translate('uploadedFile')}${state.translate('copyFileList')}${state.translate('expiryFileList')}${state.translate('deleteFileList')}
+ `; + } + return html` +
+ ${table} +
+ `; +}; diff --git a/app/templates/legal.js b/app/templates/legal.js new file mode 100644 index 00000000..9fa3f0f5 --- /dev/null +++ b/app/templates/legal.js @@ -0,0 +1,38 @@ +const html = require('choo/html'); + +function replaceLinks(str, urls) { + let i = -1; + const s = str.replace(/([^<]+)<\/a>/g, (m, v) => { + i++; + return `${v}`; + }); + return [`
${s}
`]; +} + +module.exports = function(state) { + const div = html` +
+ +
+ `; + + if (state.layout) { + return state.layout(state, div); + } + return div; +}; diff --git a/app/templates/notFound.js b/app/templates/notFound.js new file mode 100644 index 00000000..c08a9ddf --- /dev/null +++ b/app/templates/notFound.js @@ -0,0 +1,27 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); + +module.exports = function(state) { + const div = html` +
+
+
${state.translate('expiredPageHeader')}
+ +
${state.translate( + 'uploadPageExplainer' + )}
+ ${state.translate( + 'sendYourFilesLink' + )} +
+
`; + + if (state.layout) { + return state.layout(state, div); + } + return div; +}; diff --git a/app/templates/preview.js b/app/templates/preview.js new file mode 100644 index 00000000..44ba951b --- /dev/null +++ b/app/templates/preview.js @@ -0,0 +1,65 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const notFound = require('./notFound'); +const { bytes } = require('../utils'); + +function getFileFromDOM() { + const el = document.getElementById('dl-file'); + if (!el) { + return null; + } + const data = el.dataset; + return { + name: data.name, + size: parseInt(data.size, 10), + ttl: parseInt(data.ttl, 10) + }; +} + +module.exports = function(state, emit) { + state.fileInfo = state.fileInfo || getFileFromDOM(); + if (!state.fileInfo) { + return notFound(state, emit); + } + state.fileInfo.id = state.params.id; + state.fileInfo.key = state.params.key; + const fileInfo = state.fileInfo; + const size = bytes(fileInfo.size); + const div = html` +
+
+
+
+ ${state.translate('downloadFileName', { + filename: fileInfo.name + })} + ${' ' + + state.translate('downloadFileSize', { size })} +
+
${state.translate('downloadMessage')}
+ ${state.translate('downloadAltText')} +
+ +
+
+ ${state.translate('sendYourFilesLink')} +
+
+ `; + function download(event) { + event.preventDefault(); + emit('download', fileInfo); + } + + if (state.layout) { + return state.layout(state, div); + } + return div; +}; diff --git a/app/templates/progress.js b/app/templates/progress.js new file mode 100644 index 00000000..c83a5e88 --- /dev/null +++ b/app/templates/progress.js @@ -0,0 +1,21 @@ +const html = require('choo/html'); + +const radius = 73; +const oRadius = radius + 10; +const oDiameter = oRadius * 2; +const circumference = 2 * Math.PI * radius; + +module.exports = function(progressRatio) { + const dashOffset = (1 - progressRatio) * circumference; + const percent = Math.floor(progressRatio * 100); + const div = html` +
+ + + + ${percent}% + +
+ `; + return div; +}; diff --git a/app/templates/share.js b/app/templates/share.js new file mode 100644 index 00000000..b16d9932 --- /dev/null +++ b/app/templates/share.js @@ -0,0 +1,61 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const notFound = require('./notFound'); +const { allowedCopy, delay, fadeOut } = require('../utils'); + +module.exports = function(state, emit) { + const file = state.storage.getFileById(state.params.id); + if (!file) { + return notFound(state, emit); + } + const div = html` + + `; + + async function sendNew(e) { + e.preventDefault(); + await fadeOut('share-link'); + emit('pushState', '/'); + } + + async function copyLink() { + if (allowedCopy()) { + emit('copy', { url: file.url, location: 'success-screen' }); + const copyBtn = document.getElementById('copy-btn'); + copyBtn.disabled = true; + copyBtn.replaceChild( + html``, + copyBtn.firstChild + ); + await delay(2000); + copyBtn.disabled = false; + copyBtn.textContent = state.translate('copyUrlFormButton'); + } + } + + async function deleteFile() { + emit('delete', { file, location: 'success-screen' }); + await fadeOut('share-link'); + emit('pushState', '/'); + } + return div; +}; diff --git a/app/templates/unsupported.js b/app/templates/unsupported.js new file mode 100644 index 00000000..a4a7a60d --- /dev/null +++ b/app/templates/unsupported.js @@ -0,0 +1,50 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); + +module.exports = function(state) { + const msg = + state.params.reason === 'outdated' + ? html` +
+
${state.translate('notSupportedHeader')}
+
${state.translate( + 'notSupportedOutdatedDetail' + )}
+ + +
${state.translate( + 'updateFirefox' + )}
+
+
${state.translate( + 'uploadPageExplainer' + )}
+
` + : html` +
+
${state.translate('notSupportedHeader')}
+
${state.translate('notSupportedDetail')}
+ + + +
Firefox
+ ${state.translate('downloadFirefoxButtonSub')} +
+
+
${state.translate( + 'uploadPageExplainer' + )}
+
`; + const div = html`
${msg}
`; + + if (state.layout) { + return state.layout(state, div); + } + return div; +}; diff --git a/app/templates/upload.js b/app/templates/upload.js new file mode 100644 index 00000000..15ab54c6 --- /dev/null +++ b/app/templates/upload.js @@ -0,0 +1,38 @@ +const html = require('choo/html'); +const progress = require('./progress'); +const { bytes } = require('../utils'); + +module.exports = function(state, emit) { + const transfer = state.transfer; + + const div = html` +
+
${state.translate( + 'uploadingPageProgress', + { + filename: transfer.file.name, + size: bytes(transfer.file.size) + } + )}
+
+ ${progress(transfer.progressRatio)} +
+
${state.translate( + transfer.msg, + transfer.sizes + )}
+ +
+
+ `; + + function cancel() { + const btn = document.getElementById('cancel-upload'); + btn.disabled = true; + btn.textContent = state.translate('uploadCancelNotification'); + emit('cancel'); + } + return div; +}; diff --git a/app/templates/welcome.js b/app/templates/welcome.js new file mode 100644 index 00000000..da7e753f --- /dev/null +++ b/app/templates/welcome.js @@ -0,0 +1,55 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const fileList = require('./fileList'); +const { fadeOut } = require('../utils'); + +module.exports = function(state, emit) { + const div = html` +
+
${state.translate('uploadPageHeader')}
+
+
${state.translate('uploadPageExplainer')}
+ ${state.translate( + 'uploadPageLearnMore' + )} +
+
+
+
${state.translate('uploadPageDropMessage')}
+ ${state.translate( + 'uploadPageSizeMessage' + )} +
+ + +
+
+ ${fileList(state, emit)} +
+ `; + + function dragover(event) { + event.target.classList.add('ondrag'); + } + + function dragleave(event) { + event.target.classList.remove('ondrag'); + } + + async function upload(event) { + event.preventDefault(); + const target = event.target; + const file = target.files[0]; + await fadeOut('page-one'); + emit('upload', { file, type: 'click' }); + } + + if (state.layout) { + return state.layout(state, div); + } + return div; +}; diff --git a/frontend/src/utils.js b/app/utils.js similarity index 68% rename from frontend/src/utils.js rename to app/utils.js index 8a7ae84e..61bf742a 100644 --- a/frontend/src/utils.js +++ b/app/utils.js @@ -35,47 +35,39 @@ function notify(str) { */ } -function gcmCompliant() { +function loadShim(polyfill) { + return new Promise((resolve, reject) => { + const shim = document.createElement('script'); + shim.src = polyfill; + shim.addEventListener('load', () => resolve(true)); + shim.addEventListener('error', () => resolve(false)); + document.head.appendChild(shim); + }); +} + +async function canHasSend(polyfill) { try { - return window.crypto.subtle - .generateKey( - { - name: 'AES-GCM', - length: 128 - }, - true, - ['encrypt', 'decrypt'] - ) - .then(key => { - return window.crypto.subtle - .encrypt( - { - name: 'AES-GCM', - iv: window.crypto.getRandomValues(new Uint8Array(12)), - additionalData: window.crypto.getRandomValues(new Uint8Array(6)), - tagLength: 128 - }, - key, - new ArrayBuffer(8) - ) - .then(() => { - return Promise.resolve(); - }); - }) - .catch(err => { - return loadShim(); - }); + const key = await window.crypto.subtle.generateKey( + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ); + + await window.crypto.subtle.encrypt( + { + name: 'AES-GCM', + iv: window.crypto.getRandomValues(new Uint8Array(12)), + tagLength: 128 + }, + key, + new ArrayBuffer(8) + ); + return true; } catch (err) { - return loadShim(); - } - function loadShim() { - return new Promise((resolve, reject) => { - const shim = document.createElement('script'); - shim.src = '/cryptofill.js'; - shim.addEventListener('load', resolve); - shim.addEventListener('error', reject); - document.head.appendChild(shim); - }); + return loadShim(polyfill); } } @@ -107,7 +99,8 @@ function copyToClipboard(str) { const LOCALIZE_NUMBERS = !!( typeof Intl === 'object' && Intl && - typeof Intl.NumberFormat === 'function' + typeof Intl.NumberFormat === 'function' && + typeof navigator === 'object' ); const UNITS = ['B', 'kB', 'MB', 'GB']; @@ -134,9 +127,22 @@ function allowedCopy() { return support ? document.queryCommandSupported('copy') : false; } +function delay(delay = 100) { + return new Promise(resolve => setTimeout(resolve, delay)); +} + +function fadeOut(id) { + const classes = document.getElementById(id).classList; + classes.remove('fadeIn'); + classes.add('fadeOut'); + return delay(300); +} + const ONE_DAY_IN_MS = 86400000; -export { +module.exports = { + fadeOut, + delay, allowedCopy, bytes, percent, @@ -144,7 +150,7 @@ export { arrayToHex, hexToArray, notify, - gcmCompliant, + canHasSend, isFile, ONE_DAY_IN_MS }; diff --git a/public/resources/check-16.svg b/assets/check-16.svg similarity index 100% rename from public/resources/check-16.svg rename to assets/check-16.svg diff --git a/public/resources/close-16.svg b/assets/close-16.svg similarity index 66% rename from public/resources/close-16.svg rename to assets/close-16.svg index 8f143c5b..21207a15 100644 --- a/public/resources/close-16.svg +++ b/assets/close-16.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/public/resources/copy-16.svg b/assets/copy-16.svg similarity index 100% rename from public/resources/copy-16.svg rename to assets/copy-16.svg diff --git a/public/cryptofill.js b/assets/cryptofill.js similarity index 100% rename from public/cryptofill.js rename to assets/cryptofill.js diff --git a/public/resources/favicon-32x32.png b/assets/favicon-32x32.png similarity index 100% rename from public/resources/favicon-32x32.png rename to assets/favicon-32x32.png diff --git a/public/resources/feedback.svg b/assets/feedback.svg similarity index 100% rename from public/resources/feedback.svg rename to assets/feedback.svg diff --git a/public/resources/firefox_logo-only.svg b/assets/firefox_logo-only.svg similarity index 100% rename from public/resources/firefox_logo-only.svg rename to assets/firefox_logo-only.svg diff --git a/public/resources/github-icon.svg b/assets/github-icon.svg similarity index 100% rename from public/resources/github-icon.svg rename to assets/github-icon.svg diff --git a/public/resources/illustration_download.svg b/assets/illustration_download.svg similarity index 100% rename from public/resources/illustration_download.svg rename to assets/illustration_download.svg diff --git a/public/resources/illustration_error.svg b/assets/illustration_error.svg similarity index 100% rename from public/resources/illustration_error.svg rename to assets/illustration_error.svg diff --git a/public/resources/illustration_expired.svg b/assets/illustration_expired.svg similarity index 100% rename from public/resources/illustration_expired.svg rename to assets/illustration_expired.svg diff --git a/frontend/src/main.css b/assets/main.css similarity index 96% rename from frontend/src/main.css rename to assets/main.css index ad670f0a..7641d932 100644 --- a/frontend/src/main.css +++ b/assets/main.css @@ -1,6 +1,6 @@ /*** index.html ***/ html { - background: url('../../public/resources/send_bg.svg'); + background: url('./send_bg.svg'); font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui', 'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif; font-weight: 200; @@ -89,7 +89,7 @@ body { .feedback { background-color: #0297f8; - background-image: url('../../public/resources/feedback.svg'); + background-image: url('./feedback.svg'); background-position: 2px 4px; background-repeat: no-repeat; background-size: 18px; @@ -154,6 +154,36 @@ a { /** page-one **/ +.fadeOut { + opacity: 0; + animation: fadeout 200ms linear; +} + +@keyframes fadeout { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +.fadeIn { + opacity: 1; + animation: fadein 200ms linear; +} + +@keyframes fadein { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + .title { font-size: 33px; line-height: 40px; @@ -431,12 +461,8 @@ tbody { } .percentage { - position: absolute; letter-spacing: -0.78px; font-family: 'Segoe UI', 'SF Pro Text', sans-serif; - top: 50px; - left: 50%; - transform: translateX(-45%); -moz-user-select: none; -ms-user-select: none; user-select: none; @@ -449,7 +475,8 @@ tbody { .percent-sign { font-size: 28.8px; - color: rgb(104, 104, 104); + stroke: none; + fill: #686868; } .upload { @@ -471,10 +498,18 @@ tbody { #cancel-upload { color: #d70022; + background: #fff; + font-size: 15px; + border: 0; cursor: pointer; text-decoration: underline; } +#cancel-upload:disabled { + text-decoration: none; + cursor: auto; +} + /** share-link **/ #share-window { margin: 0 auto; @@ -624,7 +659,7 @@ tbody { #update-firefox { margin-bottom: 181px; height: 80px; - background: #12bc00; + background: #98e02b; border-radius: 3px; cursor: pointer; border: 0; diff --git a/public/resources/mozilla-logo.svg b/assets/mozilla-logo.svg similarity index 100% rename from public/resources/mozilla-logo.svg rename to assets/mozilla-logo.svg diff --git a/public/resources/send-fb.jpg b/assets/send-fb.jpg similarity index 100% rename from public/resources/send-fb.jpg rename to assets/send-fb.jpg diff --git a/public/resources/send-twitter.jpg b/assets/send-twitter.jpg similarity index 100% rename from public/resources/send-twitter.jpg rename to assets/send-twitter.jpg diff --git a/public/resources/send_bg.svg b/assets/send_bg.svg similarity index 100% rename from public/resources/send_bg.svg rename to assets/send_bg.svg diff --git a/public/resources/send_logo.svg b/assets/send_logo.svg similarity index 100% rename from public/resources/send_logo.svg rename to assets/send_logo.svg diff --git a/public/resources/twitter-icon.svg b/assets/twitter-icon.svg similarity index 100% rename from public/resources/twitter-icon.svg rename to assets/twitter-icon.svg diff --git a/public/resources/upload.svg b/assets/upload.svg similarity index 100% rename from public/resources/upload.svg rename to assets/upload.svg diff --git a/build/fluent_loader.js b/build/fluent_loader.js new file mode 100644 index 00000000..8ba41928 --- /dev/null +++ b/build/fluent_loader.js @@ -0,0 +1,38 @@ +const { MessageContext } = require('fluent'); + +function toJSON(map) { + return JSON.stringify(Array.from(map)); +} + +module.exports = function(source) { + const localeExp = this.options.locale || /([^/]+)\/[^/]+\.ftl$/; + const result = localeExp.exec(this.resourcePath); + const locale = result && result[1]; + // pre-parse the ftl + const context = new MessageContext(locale); + context.addMessages(source); + if (!locale) { + throw new Error(`couldn't find locale in: ${this.resourcePath}`); + } + return ` +module.exports = \` +if (typeof window === 'undefined') { + var fluent = require('fluent'); +} +var ctx = new fluent.MessageContext('${locale}', {useIsolating: false}); +ctx._messages = new Map(${toJSON(context._messages)}); +function translate(id, data) { + var msg = ctx.getMessage(id); + if (typeof(msg) !== 'string' && !msg.val && msg.attrs) { + msg = msg.attrs.title || msg.attrs.alt + } + return ctx.format(msg, data); +} +if (typeof window === 'undefined') { + module.exports = translate; +} +else { + window.translate = translate; +} +\``; +}; diff --git a/build/generate_asset_map.js b/build/generate_asset_map.js new file mode 100644 index 00000000..d1efebb1 --- /dev/null +++ b/build/generate_asset_map.js @@ -0,0 +1,19 @@ +const fs = require('fs'); +const path = require('path'); + +function kv(f) { + return `"${f}": require('../assets/${f}')`; +} + +module.exports = function() { + const files = fs.readdirSync(path.join(__dirname, '..', 'assets')); + const code = `module.exports = { + "package.json": require('../package.json'), + ${files.map(kv).join(',\n')} + };`; + return { + code, + dependencies: files.map(f => require.resolve('../assets/' + f)), + cacheable: false + }; +}; diff --git a/build/generate_l10n_map.js b/build/generate_l10n_map.js new file mode 100644 index 00000000..57f73ab4 --- /dev/null +++ b/build/generate_l10n_map.js @@ -0,0 +1,22 @@ +const fs = require('fs'); +const path = require('path'); + +function kv(d) { + return `"${d}": require('../public/locales/${d}/send.ftl')`; +} + +module.exports = function() { + const dirs = fs.readdirSync(path.join(__dirname, '..', 'public', 'locales')); + const code = ` + module.exports = { + translate: function (id, data) { return window.translate(id, data) }, + ${dirs.map(kv).join(',\n')} + };`; + return { + code, + dependencies: dirs.map(d => + require.resolve(`../public/locales/${d}/send.ftl`) + ), + cacheable: false + }; +}; diff --git a/build/package_json_loader.js b/build/package_json_loader.js new file mode 100644 index 00000000..a03678f5 --- /dev/null +++ b/build/package_json_loader.js @@ -0,0 +1,11 @@ +const commit = require('git-rev-sync').short(); + +module.exports = function(source) { + const pkg = JSON.parse(source); + const version = { + commit, + source: pkg.homepage, + version: process.env.CIRCLE_TAG || `v${pkg.version}` + }; + return `module.exports = '${JSON.stringify(version)}'`; +}; diff --git a/common/assets.js b/common/assets.js new file mode 100644 index 00000000..b1db9acf --- /dev/null +++ b/common/assets.js @@ -0,0 +1,32 @@ +const genmap = require('../build/generate_asset_map'); +const isServer = typeof genmap === 'function'; +const prefix = isServer ? '/' : ''; +let manifest = {}; +try { + //eslint-disable-next-line node/no-missing-require + manifest = require('../dist/manifest.json'); +} catch (e) { + // use middleware +} + +const assets = isServer ? manifest : genmap; + +function getAsset(name) { + return prefix + assets[name]; +} + +const instance = { + get: getAsset, + setMiddleware: function(middleware) { + if (middleware) { + instance.get = function getAssetWithMiddleware(name) { + const f = middleware.fileSystem.readFileSync( + middleware.getFilenameFromUrl('/manifest.json') + ); + return prefix + JSON.parse(f)[name]; + }; + } + } +}; + +module.exports = instance; diff --git a/common/locales.js b/common/locales.js new file mode 100644 index 00000000..17eb9c2a --- /dev/null +++ b/common/locales.js @@ -0,0 +1,51 @@ +const gen = require('../build/generate_l10n_map'); + +const isServer = typeof gen === 'function'; +const prefix = isServer ? '/' : ''; +let manifest = {}; +try { + //eslint-disable-next-line node/no-missing-require + manifest = require('../dist/manifest.json'); +} catch (e) { + // use middleware +} + +const locales = isServer ? manifest : gen; + +function getLocale(name) { + return prefix + locales[`public/locales/${name}/send.ftl`]; +} + +function serverTranslator(name) { + return require(`../dist/${locales[`public/locales/${name}/send.ftl`]}`); +} + +function browserTranslator() { + return locales.translate; +} + +const translator = isServer ? serverTranslator : browserTranslator; + +const instance = { + get: getLocale, + getTranslator: translator, + setMiddleware: function(middleware) { + if (middleware) { + const _eval = require('require-from-string'); + instance.get = function getLocaleWithMiddleware(name) { + const f = middleware.fileSystem.readFileSync( + middleware.getFilenameFromUrl('/manifest.json') + ); + return prefix + JSON.parse(f)[`public/locales/${name}/send.ftl`]; + }; + instance.getTranslator = function(name) { + const f = middleware.fileSystem.readFileSync( + middleware.getFilenameFromUrl(instance.get(name)) + ); + return _eval(f.toString()); + }; + } + } +}; + +module.exports = instance; diff --git a/frontend/src/common.js b/frontend/src/common.js deleted file mode 100644 index ddbbd7ca..00000000 --- a/frontend/src/common.js +++ /dev/null @@ -1,20 +0,0 @@ -import Raven from 'raven-js'; -import { unsupported } from './metrics'; - -if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) { - Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install(); -} - -const ua = navigator.userAgent.toLowerCase(); -if ( - ua.indexOf('firefox') > -1 && - parseInt(ua.match(/firefox\/*([^\n\r]*)\./)[1], 10) <= 49 -) { - unsupported({ - err: new Error('Firefox is outdated.') - }).then(() => { - location.replace('/unsupported/outdated'); - }); -} - -export { Raven }; diff --git a/frontend/src/download.js b/frontend/src/download.js deleted file mode 100644 index 2d348cba..00000000 --- a/frontend/src/download.js +++ /dev/null @@ -1,119 +0,0 @@ -import { Raven } from './common'; -import FileReceiver from './fileReceiver'; -import { bytes, notify, gcmCompliant } from './utils'; -import Storage from './storage'; -import * as links from './links'; -import * as metrics from './metrics'; -import * as progress from './progress'; - -const storage = new Storage(); -function onUnload(size) { - metrics.cancelledDownload({ size }); -} - -async function download() { - const downloadBtn = document.getElementById('download-btn'); - const downloadPanel = document.getElementById('download-page-one'); - const progressPanel = document.getElementById('download-progress'); - const file = document.getElementById('dl-file'); - const size = Number(file.getAttribute('data-size')); - const ttl = Number(file.getAttribute('data-ttl')); - const unloadHandler = onUnload.bind(null, size); - const startTime = Date.now(); - const fileReceiver = new FileReceiver( - '/assets' + location.pathname.slice(0, -1), - location.hash.slice(1) - ); - - downloadBtn.disabled = true; - downloadPanel.hidden = true; - progressPanel.hidden = false; - metrics.startedDownload({ size, ttl }); - links.setOpenInNewTab(true); - window.addEventListener('unload', unloadHandler); - - fileReceiver.on('progress', data => { - progress.setProgress({ complete: data[0], total: data[1] }); - }); - - let downloadEnd; - fileReceiver.on('decrypting', () => { - downloadEnd = Date.now(); - window.removeEventListener('unload', unloadHandler); - fileReceiver.removeAllListeners('progress'); - document.l10n.formatValue('decryptingFile').then(progress.setText); - }); - - try { - const file = await fileReceiver.download(); - const endTime = Date.now(); - const time = endTime - startTime; - const downloadTime = endTime - downloadEnd; - const speed = size / (downloadTime / 1000); - - links.setOpenInNewTab(false); - storage.totalDownloads += 1; - metrics.completedDownload({ size, time, speed }); - progress.setText(' '); - document.l10n - .formatValues('downloadNotification', 'downloadFinish') - .then(translated => { - notify(translated[0]); - document.getElementById('dl-title').textContent = translated[1]; - document.querySelector('#download-progress .description').textContent = - ' '; - }); - const dataView = new DataView(file.plaintext); - const blob = new Blob([dataView], { type: file.type }); - const downloadUrl = URL.createObjectURL(blob); - - const a = document.createElement('a'); - a.href = downloadUrl; - if (window.navigator.msSaveBlob) { - window.navigator.msSaveBlob(blob, file.name); - return; - } - a.download = file.name; - document.body.appendChild(a); - a.click(); - URL.revokeObjectURL(downloadUrl); - } catch (err) { - metrics.stoppedDownload({ size, err }); - - if (err.message === 'notfound') { - location.reload(); - } else { - progressPanel.hidden = true; - downloadPanel.hidden = true; - document.getElementById('upload-error').hidden = false; - } - Raven.captureException(err); - } -} - -document.addEventListener('DOMContentLoaded', function() { - const file = document.getElementById('dl-file'); - const filename = file.getAttribute('data-filename'); - const b = Number(file.getAttribute('data-size')); - const size = bytes(b); - document.l10n.formatValue('downloadFileSize', { size }).then(str => { - document.getElementById('dl-filesize').textContent = str; - }); - document.l10n - .formatValue('downloadingPageProgress', { filename, size }) - .then(str => { - document.getElementById('dl-title').textContent = str; - }); - - gcmCompliant() - .then(() => { - document - .getElementById('download-btn') - .addEventListener('click', download); - }) - .catch(err => { - metrics.unsupported({ err }).then(() => { - location.replace('/unsupported/gcm'); - }); - }); -}); diff --git a/frontend/src/fileList.js b/frontend/src/fileList.js deleted file mode 100644 index 436e7a5a..00000000 --- a/frontend/src/fileList.js +++ /dev/null @@ -1,163 +0,0 @@ -import FileSender from './fileSender'; -import Storage from './storage'; -import * as metrics from './metrics'; -import { allowedCopy, copyToClipboard, ONE_DAY_IN_MS } from './utils'; -import bel from 'bel'; -import copyImg from '../../public/resources/copy-16.svg'; -import closeImg from '../../public/resources/close-16.svg'; - -const HOUR = 1000 * 60 * 60; -const storage = new Storage(); -let fileList = null; - -document.addEventListener('DOMContentLoaded', function() { - fileList = document.getElementById('file-list'); - toggleHeader(); - Promise.all( - storage.files.map(file => { - const id = file.fileId; - return checkExistence(id).then(exists => { - if (exists) { - addFile(storage.getFileById(id)); - } else { - storage.remove(id); - } - }); - }) - ) - .catch(err => console.error(err)) - .then(toggleHeader); -}); - -function toggleHeader() { - fileList.hidden = storage.files.length === 0; -} - -function timeLeft(milliseconds) { - const minutes = Math.floor(milliseconds / 1000 / 60); - const hours = Math.floor(minutes / 60); - const seconds = Math.floor(milliseconds / 1000 % 60); - if (hours >= 1) { - return `${hours}h ${minutes % 60}m`; - } else if (hours === 0) { - return `${minutes}m ${seconds}s`; - } - return 'Expired'; -} - -function addFile(file) { - if (!file) { - return; - } - file.creationDate = new Date(file.creationDate); - const url = `${file.url}#${file.secretKey}`; - const future = new Date(); - future.setTime(file.creationDate.getTime() + file.expiry); - const countdown = future.getTime() - Date.now(); - - const row = bel` - - ${file.name} - - - - - - ${timeLeft(countdown)} - - - - - - - `; - const popup = row.querySelector('.popuptext'); - const timeCol = row.querySelectorAll('td')[2]; - if (!allowedCopy()) { - row.querySelector('.icon-copy').disabled = true; - } - - fileList.querySelector('tbody').appendChild(row); - toggleHeader(); - poll(); - - function copyClick(e) { - metrics.copiedLink({ location: 'upload-list' }); - copyToClipboard(url); - const icon = e.target; - const text = e.target.nextSibling; - icon.hidden = true; - text.hidden = false; - setTimeout(() => { - icon.hidden = false; - text.hidden = true; - }, 500); - } - - function poll() { - const countdown = future.getTime() - Date.now(); - if (countdown <= 0) { - storage.remove(file.fileId); - row.parentNode.removeChild(row); - toggleHeader(); - } - timeCol.textContent = timeLeft(countdown); - setTimeout(poll, countdown >= HOUR ? 60000 : 1000); - } - - function deleteFile() { - FileSender.delete(file.fileId, file.deleteToken); - const ttl = ONE_DAY_IN_MS - (Date.now() - file.creationDate.getTime()); - metrics.deletedUpload({ - size: file.size, - time: file.totalTime, - speed: file.uploadSpeed, - type: file.typeOfUpload, - location: 'upload-list', - ttl - }); - row.parentNode.removeChild(row); - storage.remove(file.fileId); - toggleHeader(); - } - - function showPopup() { - popup.classList.add('show'); - popup.focus(); - } - - function cancel(e) { - e.stopPropagation(); - popup.classList.remove('show'); - } - - function stopProp(e) { - e.stopPropagation(); - } -} - -async function checkExistence(id) { - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) { - resolve(xhr.status === 200); - } - }; - xhr.onerror = reject; - xhr.ontimeout = reject; - xhr.open('get', '/exists/' + id); - xhr.timeout = 2000; - xhr.send(); - }); -} - -export { addFile }; diff --git a/frontend/src/links.js b/frontend/src/links.js deleted file mode 100644 index d27da908..00000000 --- a/frontend/src/links.js +++ /dev/null @@ -1,21 +0,0 @@ -let links = []; - -document.addEventListener('DOMContentLoaded', function() { - links = Array.from(document.querySelectorAll('a:not([target])')); -}); - -function setOpenInNewTab(bool) { - if (bool === false) { - links.forEach(l => { - l.removeAttribute('target'); - l.removeAttribute('rel'); - }); - } else { - links.forEach(l => { - l.setAttribute('target', '_blank'); - l.setAttribute('rel', 'noopener noreferrer'); - }); - } -} - -export { setOpenInNewTab }; diff --git a/frontend/src/progress.js b/frontend/src/progress.js deleted file mode 100644 index a7fdd1fe..00000000 --- a/frontend/src/progress.js +++ /dev/null @@ -1,47 +0,0 @@ -import { bytes, percent } from './utils'; - -let percentText = null; -let text = null; -let title = null; -let bar = null; -let updateTitle = false; - -const radius = 73; -const circumference = 2 * Math.PI * radius; - -document.addEventListener('DOMContentLoaded', function() { - percentText = document.querySelector('.percent-number'); - text = document.querySelector('.progress-text'); - bar = document.getElementById('bar'); - title = document.querySelector('title'); -}); - -document.addEventListener('blur', function() { - updateTitle = true; -}); - -document.addEventListener('focus', function() { - updateTitle = false; - return title && (title.textContent = 'Firefox Send'); -}); - -function setProgress(params) { - const ratio = params.complete / params.total; - bar.setAttribute('stroke-dashoffset', (1 - ratio) * circumference); - percentText.textContent = Math.floor(ratio * 100); - if (updateTitle) { - title.textContent = percent(ratio); - } - document.l10n - .formatValue('fileSizeProgress', { - partialSize: bytes(params.complete), - totalSize: bytes(params.total) - }) - .then(setText); -} - -function setText(str) { - text.textContent = str; -} - -export { setProgress, setText }; diff --git a/frontend/src/upload.js b/frontend/src/upload.js deleted file mode 100644 index 6133dd34..00000000 --- a/frontend/src/upload.js +++ /dev/null @@ -1,257 +0,0 @@ -/* global MAXFILESIZE EXPIRE_SECONDS */ -import { Raven } from './common'; -import FileSender from './fileSender'; -import { - allowedCopy, - bytes, - copyToClipboard, - notify, - gcmCompliant, - ONE_DAY_IN_MS -} from './utils'; -import Storage from './storage'; -import * as metrics from './metrics'; -import * as progress from './progress'; -import * as fileList from './fileList'; -import checkImg from '../../public/resources/check-16.svg'; - -const storage = new Storage(); - -async function upload(event) { - event.preventDefault(); - const pageOne = document.getElementById('page-one'); - const link = document.getElementById('link'); - const uploadWindow = document.querySelector('.upload-window'); - const uploadError = document.getElementById('upload-error'); - const uploadProgress = document.getElementById('upload-progress'); - const clickOrDrop = event.type === 'drop' ? 'drop' : 'click'; - - // don't allow upload if not on upload page - if (pageOne.hidden) { - return; - } - - storage.totalUploads += 1; - - let file = ''; - if (clickOrDrop === 'drop') { - if (!event.dataTransfer.files[0]) { - uploadWindow.classList.remove('ondrag'); - return; - } - if ( - event.dataTransfer.files.length > 1 || - event.dataTransfer.files[0].size === 0 - ) { - uploadWindow.classList.remove('ondrag'); - document.l10n.formatValue('uploadPageMultipleFilesAlert').then(str => { - alert(str); - }); - return; - } - file = event.dataTransfer.files[0]; - } else { - file = event.target.files[0]; - } - - if (file.size > MAXFILESIZE) { - return document.l10n - .formatValue('fileTooBig', { size: bytes(MAXFILESIZE) }) - .then(alert); - } - - pageOne.hidden = true; - uploadError.hidden = true; - uploadProgress.hidden = false; - document.l10n - .formatValue('uploadingPageProgress', { - size: bytes(file.size), - filename: file.name - }) - .then(str => { - document.getElementById('upload-filename').textContent = str; - }); - document.l10n.formatValue('importingFile').then(progress.setText); - //don't allow drag and drop when not on page-one - document.body.removeEventListener('drop', upload); - - const fileSender = new FileSender(file); - document.getElementById('cancel-upload').addEventListener('click', () => { - fileSender.cancel(); - metrics.cancelledUpload({ - size: file.size, - type: clickOrDrop - }); - location.reload(); - }); - - let uploadStart; - fileSender.on('progress', data => { - uploadStart = uploadStart || Date.now(); - progress.setProgress({ - complete: data[0], - total: data[1] - }); - }); - - fileSender.on('encrypting', () => { - document.l10n.formatValue('encryptingFile').then(progress.setText); - }); - - let t; - const startTime = Date.now(); - metrics.startedUpload({ - size: file.size, - type: clickOrDrop - }); - // For large files we need to give the ui a tick to breathe and update - // before we kick off the FileSender - setTimeout(() => { - fileSender - .upload() - .then(info => { - const endTime = Date.now(); - const time = endTime - startTime; - const uploadTime = endTime - uploadStart; - const speed = file.size / (uploadTime / 1000); - const expiration = EXPIRE_SECONDS * 1000; - - link.setAttribute('value', `${info.url}#${info.secretKey}`); - - const copyText = document.getElementById('copy-text'); - copyText.setAttribute( - 'data-l10n-args', - JSON.stringify({ filename: file.name }) - ); - copyText.setAttribute('data-l10n-id', 'copyUrlFormLabelWithName'); - - metrics.completedUpload({ - size: file.size, - time, - speed, - type: clickOrDrop - }); - - const fileData = { - name: file.name, - size: file.size, - fileId: info.fileId, - url: info.url, - secretKey: info.secretKey, - deleteToken: info.deleteToken, - creationDate: new Date(), - expiry: expiration, - totalTime: time, - typeOfUpload: clickOrDrop, - uploadSpeed: speed - }; - - document.getElementById('delete-file').addEventListener('click', () => { - FileSender.delete(fileData.fileId, fileData.deleteToken).then(() => { - const ttl = - ONE_DAY_IN_MS - (Date.now() - fileData.creationDate.getTime()); - metrics - .deletedUpload({ - size: fileData.size, - time: fileData.totalTime, - speed: fileData.uploadSpeed, - type: fileData.typeOfUpload, - location: 'success-screen', - ttl - }) - .then(() => { - storage.remove(fileData.fileId); - location.reload(); - }); - }); - }); - - storage.addFile(info.fileId, fileData); - - pageOne.hidden = true; - uploadProgress.hidden = true; - uploadError.hidden = true; - document.getElementById('share-link').hidden = false; - - fileList.addFile(fileData); - document.l10n.formatValue('notifyUploadDone').then(str => { - notify(str); - }); - }) - .catch(err => { - // err is 0 when coming from a cancel upload event - if (err === 0) { - return; - } - // only show error page when the error is anything other than user cancelling the upload - Raven.captureException(err); - pageOne.hidden = true; - uploadProgress.hidden = true; - uploadError.hidden = false; - window.clearTimeout(t); - - metrics.stoppedUpload({ - size: file.size, - type: clickOrDrop, - err - }); - }); - }, 10); -} - -document.addEventListener('DOMContentLoaded', function() { - gcmCompliant() - .then(function() { - const pageOne = document.getElementById('page-one'); - const copyBtn = document.getElementById('copy-btn'); - const link = document.getElementById('link'); - const uploadWindow = document.querySelector('.upload-window'); - - pageOne.hidden = false; - document.getElementById('file-upload').addEventListener('change', upload); - - document.body.addEventListener('dragover', allowDrop); - document.body.addEventListener('drop', upload); - - // reset copy button - copyBtn.disabled = !allowedCopy(); - copyBtn.setAttribute('data-l10n-id', 'copyUrlFormButton'); - - link.disabled = false; - - // copy link to clipboard - copyBtn.addEventListener('click', () => { - if (allowedCopy() && copyToClipboard(link.getAttribute('value'))) { - metrics.copiedLink({ location: 'success-screen' }); - - //disable button for 3s - copyBtn.disabled = true; - link.disabled = true; - copyBtn.innerHTML = ``; - setTimeout(() => { - copyBtn.disabled = !allowedCopy(); - copyBtn.setAttribute('data-l10n-id', 'copyUrlFormButton'); - link.disabled = false; - }, 3000); - } - }); - - uploadWindow.addEventListener('dragover', () => - uploadWindow.classList.add('ondrag') - ); - uploadWindow.addEventListener('dragleave', () => - uploadWindow.classList.remove('ondrag') - ); - - // on file upload by browse or drag & drop - - function allowDrop(ev) { - ev.preventDefault(); - } - }) - .catch(err => { - metrics.unsupported({ err }).then(() => { - location.replace('/unsupported/gcm'); - }); - }); -}); diff --git a/package-lock.json b/package-lock.json index 1923a1c6..573968a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,25 +4,56 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/node": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.39.tgz", - "integrity": "sha512-KQHAZeVsk4UIT9XaR6cn4WpHZzimK6UBD1UomQKfQQFmTlUHaNBzeuov+TM4+kigLO0IJt4I5OOsshcCyA9gSA==", + "@f/has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@f/has/-/has-1.0.1.tgz", + "integrity": "sha1-t08TK/OqpdwECe3+jucjN9bnP74=", "dev": true }, + "@f/is-svg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@f/is-svg/-/is-svg-1.0.0.tgz", + "integrity": "sha1-Q0fYy1VBkl+F9WMXSMwx3GRQ70Y=", + "dev": true, + "requires": { + "@f/has": "1.0.1", + "@f/svg-elements": "1.0.1" + } + }, + "@f/svg-elements": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@f/svg-elements/-/svg-elements-1.0.1.tgz", + "integrity": "sha1-qNMKizODbJiISNKOs8RgXZI1gd0=", + "dev": true + }, + "@f/svg-namespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@f/svg-namespace/-/svg-namespace-1.0.1.tgz", + "integrity": "sha1-9vGlzl05caSt6RoR0i1MRZrNN18=", + "dev": true + }, + "accept-language": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/accept-language/-/accept-language-3.0.17.tgz", + "integrity": "sha1-cTnStPmx6GDORg+qiz2w3x97aTE=", + "requires": { + "bcp47": "1.1.2", + "stable": "0.1.6" + } + }, "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", "requires": { "mime-types": "2.1.16", "negotiator": "0.6.1" } }, "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", "dev": true }, "acorn-dynamic-import": { @@ -32,6 +63,14 @@ "dev": true, "requires": { "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } } }, "acorn-jsx": { @@ -61,17 +100,6 @@ "fast-deep-equal": "1.0.0", "json-schema-traverse": "0.3.1", "json-stable-stringify": "1.0.1" - }, - "dependencies": { - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - } } }, "ajv-keywords": { @@ -84,6 +112,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, "requires": { "kind-of": "3.2.2", "longest": "1.0.1", @@ -96,17 +125,18 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, "ansi-escapes": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", "dev": true }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -125,6 +155,17 @@ "requires": { "micromatch": "2.3.11", "normalize-path": "2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + } } }, "app-root-path": { @@ -133,6 +174,22 @@ "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", "dev": true }, + "application-config": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/application-config/-/application-config-0.1.2.tgz", + "integrity": "sha1-MnJTO1+fg7MjqeXWQKNVi1Cls4U=", + "dev": true, + "requires": { + "application-config-path": "0.1.0", + "mkdirp": "0.5.1" + } + }, + "application-config-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz", + "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=", + "dev": true + }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", @@ -219,15 +276,10 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asmcrypto.js": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.0.11.tgz", - "integrity": "sha1-dLshuq/Z3OFoTcBvFShoOzUMHKA=", + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", "dev": true }, "asn1.js": { @@ -250,25 +302,23 @@ "util": "0.10.3" } }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "dev": true + }, "ast-types": { "version": "0.9.6", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", "dev": true }, - "astw": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", - "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", - "dev": true, - "requires": { - "acorn": "4.0.13" - } - }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true }, "async-each": { "version": "1.0.1", @@ -288,18 +338,18 @@ "integrity": "sha1-++rwfUj9h44Ggr98vurecorbKxg=", "dev": true, "requires": { - "browserslist": "2.3.0", - "caniuse-lite": "1.0.30000712", + "browserslist": "2.3.3", + "caniuse-lite": "1.0.30000717", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "6.0.8", + "postcss": "6.0.9", "postcss-value-parser": "3.3.0" } }, "aws-sdk": { - "version": "2.98.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.98.0.tgz", - "integrity": "sha1-kK0CPXM4ndFex736+TLsq2VEVxE=", + "version": "2.103.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.103.0.tgz", + "integrity": "sha1-gJtzG+tlg/OmwLZYeMMso6aloRE=", "requires": { "buffer": "4.9.1", "crypto-browserify": "1.0.9", @@ -313,10 +363,16 @@ "xmlbuilder": "4.2.1" } }, + "aws-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz", + "integrity": "sha1-PYHKabR0seFlGHKLUcJP8Lvtxuk=", + "dev": true + }, "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { "chalk": "1.1.3", @@ -325,62 +381,57 @@ } }, "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.22.0", - "babel-generator": "6.25.0", + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", "babel-helpers": "6.24.1", "babel-messages": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", "convert-source-map": "1.5.0", - "debug": "2.6.7", + "debug": "2.6.8", "json5": "0.5.1", "lodash": "4.17.4", "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.7", "slash": "1.0.0", - "source-map": "0.5.6" + "source-map": "0.5.7" }, "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } } } }, "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "dev": true, "requires": { "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", "lodash": "4.17.4", - "source-map": "0.5.6", + "source-map": "0.5.7", "trim-right": "1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } } }, "babel-helper-bindify-decorators": { @@ -389,9 +440,9 @@ "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -401,8 +452,8 @@ "dev": true, "requires": { "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-call-delegate": { @@ -412,20 +463,20 @@ "dev": true, "requires": { "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-define-map": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "lodash": "4.17.4" } }, @@ -435,9 +486,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-explode-class": { @@ -447,9 +498,9 @@ "dev": true, "requires": { "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -459,10 +510,10 @@ "dev": true, "requires": { "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -471,8 +522,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -481,8 +532,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-optimise-call-expression": { @@ -491,18 +542,18 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "lodash": "4.17.4" } }, @@ -513,10 +564,10 @@ "dev": true, "requires": { "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { @@ -527,10 +578,10 @@ "requires": { "babel-helper-optimise-call-expression": "6.24.1", "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -539,14 +590,14 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-loader": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.1.tgz", - "integrity": "sha1-uHE0yLEuPkwqlOBUYIW8aAorhIg=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", + "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", "dev": true, "requires": { "find-cache-dir": "1.0.0", @@ -560,7 +611,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-check-es2015-constants": { @@ -569,7 +620,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-syntax-async-functions": { @@ -628,7 +679,7 @@ "requires": { "babel-helper-remap-async-to-generator": "6.24.1", "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-async-to-generator": { @@ -639,7 +690,7 @@ "requires": { "babel-helper-remap-async-to-generator": "6.24.1", "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-class-properties": { @@ -650,8 +701,8 @@ "requires": { "babel-helper-function-name": "6.24.1", "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-decorators": { @@ -662,9 +713,9 @@ "requires": { "babel-helper-explode-class": "6.24.1", "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -673,7 +724,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -682,19 +733,19 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoping": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", "lodash": "4.17.4" } }, @@ -704,15 +755,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.24.1", + "babel-helper-define-map": "6.26.0", "babel-helper-function-name": "6.24.1", "babel-helper-optimise-call-expression": "6.24.1", "babel-helper-replace-supers": "6.24.1", "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -721,8 +772,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -731,7 +782,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -740,8 +791,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-for-of": { @@ -750,7 +801,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -760,8 +811,8 @@ "dev": true, "requires": { "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-literals": { @@ -770,7 +821,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -779,21 +830,21 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -803,8 +854,8 @@ "dev": true, "requires": { "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -814,8 +865,8 @@ "dev": true, "requires": { "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-object-super": { @@ -825,7 +876,7 @@ "dev": true, "requires": { "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -836,10 +887,10 @@ "requires": { "babel-helper-call-delegate": "6.24.1", "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -848,8 +899,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -858,7 +909,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -867,9 +918,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -878,7 +929,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -887,7 +938,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -896,8 +947,8 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", "regexpu-core": "2.0.0" } }, @@ -909,26 +960,26 @@ "requires": { "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-object-rest-spread": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", - "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.9.11" + "regenerator-transform": "0.10.1" } }, "babel-plugin-transform-strict-mode": { @@ -937,19 +988,81 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-yo-yoify": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/babel-plugin-yo-yoify/-/babel-plugin-yo-yoify-0.7.0.tgz", + "integrity": "sha512-Uidvqj9fHDEVcZ+U5ITRI/lh2C5/miBQSgD+B6NFBduTWKMvJbVARJ8GvYGPJaV5qYwQrbaO7GInQ/i63IDCVQ==", + "dev": true, + "requires": { + "@f/is-svg": "1.0.0", + "@f/svg-namespace": "1.0.1", + "camel-case": "3.0.0", + "hyperx": "2.3.0", + "is-boolean-attribute": "0.0.1", + "normalize-html-whitespace": "0.2.0", + "on-load": "3.2.0", + "yo-yoify": "3.7.3" } }, "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "6.25.0", + "babel-runtime": "6.26.0", "core-js": "2.5.0", "regenerator-runtime": "0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } + }, + "babel-preset-env": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz", + "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.3.3", + "invariant": "2.2.2", + "semver": "5.4.1" } }, "babel-preset-es2015": { @@ -961,7 +1074,7 @@ "babel-plugin-check-es2015-constants": "6.22.0", "babel-plugin-transform-es2015-arrow-functions": "6.22.0", "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.24.1", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", "babel-plugin-transform-es2015-classes": "6.24.1", "babel-plugin-transform-es2015-computed-properties": "6.24.1", "babel-plugin-transform-es2015-destructuring": "6.23.0", @@ -970,7 +1083,7 @@ "babel-plugin-transform-es2015-function-name": "6.24.1", "babel-plugin-transform-es2015-literals": "6.22.0", "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", "babel-plugin-transform-es2015-modules-umd": "6.24.1", "babel-plugin-transform-es2015-object-super": "6.24.1", @@ -981,7 +1094,7 @@ "babel-plugin-transform-es2015-template-literals": "6.22.0", "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.24.1" + "babel-plugin-transform-regenerator": "6.26.0" } }, "babel-preset-stage-2": { @@ -1006,97 +1119,119 @@ "babel-plugin-transform-async-generator-functions": "6.24.1", "babel-plugin-transform-async-to-generator": "6.24.1", "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.23.0" + "babel-plugin-transform-object-rest-spread": "6.26.0" } }, "babel-register": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.25.0", - "babel-runtime": "6.25.0", + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", "core-js": "2.5.0", "home-or-tmp": "2.0.0", "lodash": "4.17.4", "mkdirp": "0.5.1", - "source-map-support": "0.4.15" + "source-map-support": "0.4.16" } }, "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { "core-js": "2.5.0", - "regenerator-runtime": "0.10.5" + "regenerator-runtime": "0.11.0" } }, "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", "lodash": "4.17.4" } }, "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.22.0", + "babel-code-frame": "6.26.0", "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.7", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.8", "globals": "9.18.0", "invariant": "2.2.2", "lodash": "4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.25.0", + "babel-runtime": "6.26.0", "esutils": "2.0.2", "lodash": "4.17.4", "to-fast-properties": "1.0.3" } }, "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base64-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcp47": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bcp47/-/bcp47-1.1.2.tgz", + "integrity": "sha1-NUvjMH/9CEM6ePXh4glYRfifx/4=" + }, "bel": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/bel/-/bel-5.0.3.tgz", "integrity": "sha512-bMLvUOrKBM2zWp3Ab6UugjCjFmsZtIeKH3oMNWaUr9RA94sNeicajzptZHQWU3K8KNIL8o6JwAmKG1W3mUiwXw==", - "dev": true, "requires": { "hyperx": "2.3.0", "is-electron": "2.1.0", @@ -1110,15 +1245,44 @@ "dev": true }, "binary-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz", - "integrity": "sha1-ZlBsFs5vTWkopbPNajPKQelB43s=", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", "dev": true }, + "bl": { + "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" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "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", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + }, "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-1.0.3.tgz", + "integrity": "sha1-xLRBGEgC47ZKYe7tRXgnG0yL9qw=", "dev": true }, "bn.js": { @@ -1144,16 +1308,50 @@ "type-is": "1.6.15" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.1.1", + "multicast-dns-service-types": "1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + } + } + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "dev": true, + "requires": { + "hoek": "0.9.1" + }, + "dependencies": { + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "dev": true + } + } }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -1176,175 +1374,12 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "browser-pack": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", - "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", - "dev": true, - "requires": { - "combine-source-map": "0.7.2", - "defined": "1.0.0", - "JSONStream": "1.3.1", - "through2": "2.0.3", - "umd": "3.0.1" - } - }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, - "browserify": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.4.0.tgz", - "integrity": "sha1-CJo0Y69Y0OSNjNQHCz90ZU1avKk=", - "dev": true, - "requires": { - "assert": "1.4.1", - "browser-pack": "6.0.2", - "browser-resolve": "1.11.2", - "browserify-zlib": "0.1.4", - "buffer": "5.0.7", - "cached-path-relative": "1.0.1", - "concat-stream": "1.5.2", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.1", - "defined": "1.0.0", - "deps-sort": "2.0.0", - "domain-browser": "1.1.7", - "duplexer2": "0.1.4", - "events": "1.1.1", - "glob": "7.1.2", - "has": "1.0.1", - "htmlescape": "1.1.1", - "https-browserify": "1.0.0", - "inherits": "2.0.3", - "insert-module-globals": "7.0.1", - "JSONStream": "1.3.1", - "labeled-stream-splicer": "2.0.0", - "module-deps": "4.1.1", - "os-browserify": "0.1.2", - "parents": "1.0.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.3.2", - "querystring-es3": "0.2.1", - "read-only-stream": "2.0.0", - "readable-stream": "2.3.3", - "resolve": "1.4.0", - "shasum": "1.0.2", - "shell-quote": "1.6.1", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "1.0.3", - "subarg": "1.0.0", - "syntax-error": "1.3.0", - "through2": "2.0.3", - "timers-browserify": "1.4.2", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4", - "xtend": "4.0.1" - }, - "dependencies": { - "buffer": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.7.tgz", - "integrity": "sha512-NeeHXWh5pCbPQCt2/6rLvXqapZfVsqw/YgRgaHpT3H9Uzgs+S0lSg5SQzouIuDvcmlQRqBe8hOO2scKCu3cxrg==", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8" - } - }, - "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.13", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - } - } - }, "browserify-aes": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", @@ -1354,7 +1389,7 @@ "buffer-xor": "1.0.3", "cipher-base": "1.0.4", "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", + "evp_bytestokey": "1.0.2", "inherits": "2.0.3" } }, @@ -1366,7 +1401,7 @@ "requires": { "browserify-aes": "1.0.6", "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.0" + "evp_bytestokey": "1.0.2" } }, "browserify-des": { @@ -1412,16 +1447,24 @@ "dev": true, "requires": { "pako": "0.2.9" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + } } }, "browserslist": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.3.0.tgz", - "integrity": "sha512-jDr9Mea+n+FwI+kR0ce7rXCFBoM7hbL80G/th7oPxuNSK4V5J3LPMHB5vykjeI2h7fgSihBbSdoJPmzUC0606Q==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.3.3.tgz", + "integrity": "sha512-p9hz6FA2H1w1ZUAXKfK3MlIA4Z9fEd56hnZSOecBIITb5j0oZk/tZRwhdE0xG56RGx2x8cc1c5AWJKWVjMLOEQ==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000712", - "electron-to-chromium": "1.3.17" + "caniuse-lite": "1.0.30000717", + "electron-to-chromium": "1.3.18" } }, "buffer": { @@ -1434,6 +1477,12 @@ "isarray": "1.0.0" } }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1466,12 +1515,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" }, - "cached-path-relative": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", - "dev": true - }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -1498,9 +1541,10 @@ } }, "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, "camelcase-keys": { "version": "2.1.0", @@ -1532,7 +1576,7 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000712", + "caniuse-db": "1.0.30000717", "lodash.memoize": "4.1.2", "lodash.uniq": "4.5.0" }, @@ -1543,34 +1587,29 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000712", - "electron-to-chromium": "1.3.17" + "caniuse-db": "1.0.30000717", + "electron-to-chromium": "1.3.18" } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true } } }, "caniuse-db": { - "version": "1.0.30000712", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000712.tgz", - "integrity": "sha1-iXSDlvnXQZ1fon3ztIhy2tv4MYo=", + "version": "1.0.30000717", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000717.tgz", + "integrity": "sha1-J931/szdM4yZpiyXiMJpT5n2ftc=", "dev": true }, "caniuse-lite": { - "version": "1.0.30000712", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000712.tgz", - "integrity": "sha1-tHMt7yRZIk8/eMapuhA6v8xwVnA=", + "version": "1.0.30000717", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000717.tgz", + "integrity": "sha1-RTmxJq94fB1IUZRN4isr2HgNNhI=", "dev": true }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, "requires": { "align-text": "0.1.4", "lazy-cache": "1.0.4" @@ -1605,6 +1644,36 @@ "readdirp": "2.1.0" } }, + "choo": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/choo/-/choo-6.0.0.tgz", + "integrity": "sha512-bwBnTuZCZlHHTDJNqbBCdKmnLnApkJcaw6wYK6NRrS+wL1L4GXz1Athe6FiOGw15leisW+XhSGgF3WBT8E8Bmg==", + "requires": { + "bel": "5.0.3", + "document-ready": "2.0.1", + "nanobus": "4.2.0", + "nanohref": "3.0.0", + "nanolocation": "1.0.0", + "nanomorph": "5.1.2", + "nanoquery": "1.1.0", + "nanoraf": "3.0.1", + "nanorouter": "2.1.0", + "nanotiming": "6.1.3", + "scroll-to-anchor": "1.1.0", + "xtend": "4.0.1" + } + }, + "choo-log": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/choo-log/-/choo-log-7.2.1.tgz", + "integrity": "sha1-sTrCLcKTzUvu94GdxWhMAOwVqoM=", + "dev": true, + "requires": { + "nanologger": "1.3.0", + "on-idle": "3.1.2", + "on-performance": "1.0.1" + } + }, "ci-info": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", @@ -1642,15 +1711,7 @@ "integrity": "sha1-ua6k+FZ5iJzz6ui0A0nsTr390DI=", "dev": true, "requires": { - "source-map": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } + "source-map": "0.5.7" } }, "cli-cursor": { @@ -1663,9 +1724,9 @@ } }, "cli-spinners": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz", - "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", "dev": true }, "cli-truncate": { @@ -1701,25 +1762,41 @@ } }, "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" }, "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } } } }, @@ -1812,49 +1889,20 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "combine-source-map": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", - "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", - "dev": true, - "requires": { - "convert-source-map": "1.1.3", - "inline-source-map": "0.6.2", - "lodash.memoize": "3.0.4", - "source-map": "0.5.6" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } - } - }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "0.0.5" } }, "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "commondir": { "version": "1.0.1", @@ -1868,35 +1916,87 @@ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, + "compressible": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", + "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "dev": true, + "requires": { + "mime-db": "1.29.0" + } + }, + "compression": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", + "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "bytes": "2.5.0", + "compressible": "2.0.11", + "debug": "2.6.8", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.1" + }, + "dependencies": { + "bytes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", + "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=", + "dev": true + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", - "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { "inherits": "2.0.3", - "readable-stream": "2.0.6", + "readable-stream": "2.3.3", "typedarray": "0.0.6" }, "dependencies": { "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", "util-deprecate": "1.0.2" } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -1935,6 +2035,12 @@ "busboy": "0.2.14" } }, + "connect-history-api-fallback": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", + "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=", + "dev": true + }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -1975,9 +2081,9 @@ "dev": true }, "convict": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convict/-/convict-3.0.0.tgz", - "integrity": "sha1-JZ8wv7h+4JRIYEhiA1GdRntNUbU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/convict/-/convict-4.0.0.tgz", + "integrity": "sha1-c1B/0Lc3DRA70NCFBNu2ok8vwJ8=", "requires": { "depd": "1.1.0", "json5": "0.5.1", @@ -1992,66 +2098,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "moment": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.17.1.tgz", - "integrity": "sha1-/tlQYGPzaxDwZsi1mhRNf66+HYI=" - }, - "validator": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-7.0.0.tgz", - "integrity": "sha1-x03rgGNRL6w1VHk45vCxUEooL9I=" - }, - "varify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/varify/-/varify-0.2.0.tgz", - "integrity": "sha1-GR2p/p3EzWjQ0USY1OKpEP9OZRY=", - "optional": true, - "requires": { - "redeyed": "1.0.1", - "through": "2.3.8" - }, - "dependencies": { - "redeyed": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", - "optional": true, - "requires": { - "esprima": "3.0.0" - }, - "dependencies": { - "esprima": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", - "optional": true - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "optional": true - } - } } } }, @@ -2060,6 +2106,12 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, + "cookie-jar": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz", + "integrity": "sha1-vJon1OK5fhhs1XyeIGPLmfpozMw=", + "dev": true + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -2106,6 +2158,19 @@ "rimraf": "2.6.1" } }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2121,15 +2186,6 @@ "is-extglob": "2.1.1" } }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", @@ -2156,26 +2212,19 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-1.1.0.tgz", + "integrity": "sha1-DeoPmATv37kp+7GxiOJVU+oFPTc=", "dev": true, "requires": { - "is-directory": "0.3.1", + "graceful-fs": "4.1.11", "js-yaml": "3.7.0", "minimist": "1.2.0", "object-assign": "4.1.1", "os-homedir": "1.0.2", "parse-json": "2.2.0", + "pinkie-promise": "2.0.1", "require-from-string": "1.2.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } }, "create-ecdh": { @@ -2235,6 +2284,15 @@ "which": "1.3.0" } }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "dev": true, + "requires": { + "boom": "0.4.2" + } + }, "crypto-browserify": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz", @@ -2247,12 +2305,12 @@ "dev": true }, "css-loader": { - "version": "0.28.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", - "integrity": "sha1-bPNXkZLONV6LONX0Ldeh8uyJjQ8=", + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.5.tgz", + "integrity": "sha512-/FJmsDD8e6xZOBHMFShN/BCjnrEybq0spYaTZ1QoZ10/jhUa1LDDojQELu/JJ1ykZZjt0nSwkYrb2Mfx3bZx3Q==", "dev": true, "requires": { - "babel-code-frame": "6.22.0", + "babel-code-frame": "6.26.0", "css-selector-tokenizer": "0.7.0", "cssnano": "3.10.0", "icss-utils": "2.1.0", @@ -2265,7 +2323,7 @@ "postcss-modules-scope": "1.1.0", "postcss-modules-values": "1.3.0", "postcss-value-parser": "3.3.0", - "source-list-map": "0.1.8" + "source-list-map": "2.0.0" }, "dependencies": { "has-flag": { @@ -2282,22 +2340,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -2316,15 +2362,7 @@ "dev": true, "requires": { "minimist": "1.2.0", - "postcss": "6.0.8" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "postcss": "6.0.9" } }, "css-rule-stream": { @@ -2339,21 +2377,24 @@ "through2": "0.6.5" }, "dependencies": { - "duplexer2": { - "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" - } - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, + "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", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", @@ -2362,36 +2403,10 @@ "requires": { "readable-stream": "1.0.34", "xtend": "4.0.1" - }, - "dependencies": { - "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", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } } } } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", - "domutils": "1.5.1", - "nth-check": "1.0.1" - } - }, "css-selector-tokenizer": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", @@ -2426,12 +2441,6 @@ "readable-stream": "1.1.14" } }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, "cssesc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", @@ -2485,7 +2494,7 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000712", + "caniuse-db": "1.0.30000717", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "5.2.17", @@ -2498,8 +2507,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000712", - "electron-to-chromium": "1.3.17" + "caniuse-db": "1.0.30000717", + "electron-to-chromium": "1.3.18" } }, "has-flag": { @@ -2516,16 +2525,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -2544,17 +2547,15 @@ "dev": true, "requires": { "clap": "1.2.0", - "source-map": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } + "source-map": "0.5.7" } }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", + "dev": true + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -2570,7 +2571,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.27" + "es5-ext": "0.10.29" } }, "dasherize": { @@ -2611,7 +2612,14 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true }, "deep-is": { "version": "0.1.3", @@ -2623,6 +2631,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, "requires": { "foreach": "2.0.5", "object-keys": "1.0.11" @@ -2650,9 +2659,9 @@ } }, "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", "dev": true }, "depd": { @@ -2660,24 +2669,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" }, - "dependency-graph": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.5.0.tgz", - "integrity": "sha1-ce33lF27qGwbGayYK2r7ZHa1bdU=", - "dev": true - }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true, - "requires": { - "JSONStream": "1.3.1", - "shasum": "1.0.2", - "subarg": "1.0.0", - "through2": "2.0.3" - } - }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -2702,15 +2693,11 @@ "repeating": "2.0.1" } }, - "detective": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", - "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", - "dev": true, - "requires": { - "acorn": "4.0.13", - "defined": "1.0.0" - } + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true }, "dicer": { "version": "0.2.5", @@ -2738,11 +2725,36 @@ "randombytes": "2.0.5" } }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", + "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.1" + } + }, "dns-prefetch-control": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, "doctrine": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", @@ -2753,85 +2765,48 @@ "isarray": "1.0.0" } }, + "document-ready": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/document-ready/-/document-ready-2.0.1.tgz", + "integrity": "sha1-PjvzHTI1uU4jLnssX6GmNOhzuuQ=" + }, "doiuse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-3.0.0.tgz", "integrity": "sha1-4Nhm/9fFMP2luUSa+XCWxKrIlPY=", "dev": true, "requires": { - "browserslist": "2.3.0", - "caniuse-lite": "1.0.30000712", + "browserslist": "2.3.3", + "caniuse-lite": "1.0.30000717", "css-rule-stream": "1.1.0", "duplexer2": "0.0.2", "jsonfilter": "1.1.2", "ldjson-stream": "1.2.1", "lodash": "4.17.4", "multimatch": "2.1.0", - "postcss": "6.0.8", - "source-map": "0.5.6", + "postcss": "6.0.9", + "source-map": "0.5.7", "through2": "0.6.5", "yargs": "8.0.2" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "duplexer2": { - "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" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true + "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", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } }, "through2": { "version": "0.6.5", @@ -2841,79 +2816,15 @@ "requires": { "readable-stream": "1.0.34", "xtend": "4.0.1" - }, - "dependencies": { - "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", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.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" } } } }, - "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", - "dev": true, - "requires": { - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "dev": true }, "domain-browser": { "version": "1.1.7", @@ -2921,31 +2832,6 @@ "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", "dev": true }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } - }, "dont-sniff-mimetype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", @@ -2963,38 +2849,12 @@ "dev": true }, "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { - "readable-stream": "2.3.3" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } + "readable-stream": "1.1.14" } }, "ee-first": { @@ -3003,9 +2863,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.17", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.17.tgz", - "integrity": "sha1-QcE0V8xxZsXBXnZ65h2GqMrN7l0=", + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.18.tgz", + "integrity": "sha1-PcyZ2j5rZl9qu8ccKK1Ros1zGpw=", "dev": true }, "elegant-spinner": { @@ -3052,12 +2912,6 @@ "tapable": "0.2.8" } }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, "errno": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", @@ -3101,9 +2955,9 @@ } }, "es5-ext": { - "version": "0.10.27", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.27.tgz", - "integrity": "sha512-3KXJRYzKXTd7xfFy5uZsJCXue55fAYQ035PRjyYk2PicllxIwcW9l3AbM/eGaw3vgVAUW4tl4xg9AXDEI6yw0w==", + "version": "0.10.29", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.29.tgz", + "integrity": "sha512-KXla9NXo5sdaEkGSmbFPYgjH6m75kxsthL6GDRSug/Y2OiMoYm0I9giL39j4cgmaFmAbkIFJ6gG+SGKnLSmOvA==", "dev": true, "requires": { "es6-iterator": "2.0.1", @@ -3117,7 +2971,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.27", + "es5-ext": "0.10.29", "es6-symbol": "3.1.1" } }, @@ -3128,7 +2982,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.27", + "es5-ext": "0.10.29", "es6-iterator": "2.0.1", "es6-set": "0.1.5", "es6-symbol": "3.1.1", @@ -3148,7 +3002,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.27", + "es5-ext": "0.10.29", "es6-iterator": "2.0.1", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -3161,7 +3015,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.27" + "es5-ext": "0.10.29" } }, "es6-templates": { @@ -3181,7 +3035,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.27", + "es5-ext": "0.10.29", "es6-iterator": "2.0.1", "es6-symbol": "3.1.1" } @@ -3209,14 +3063,14 @@ } }, "eslint": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.4.1.tgz", - "integrity": "sha1-mc1+r8/8ov+Zpcj18qR01jZLS9M=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.5.0.tgz", + "integrity": "sha1-u3XTuL3pf7XhPvzVOXRGd/6wGcM=", "dev": true, "requires": { "ajv": "5.2.2", - "babel-code-frame": "6.22.0", - "chalk": "1.1.3", + "babel-code-frame": "6.26.0", + "chalk": "2.1.0", "concat-stream": "1.6.0", "cross-spawn": "5.1.0", "debug": "2.6.8", @@ -3232,7 +3086,7 @@ "globals": "9.18.0", "ignore": "3.3.3", "imurmurhash": "0.1.4", - "inquirer": "3.2.1", + "inquirer": "3.2.2", "is-resolvable": "1.0.0", "js-yaml": "3.9.1", "json-stable-stringify": "1.0.1", @@ -3247,20 +3101,36 @@ "progress": "2.0.0", "require-uncached": "1.0.3", "semver": "5.4.1", + "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", "table": "4.0.1", "text-table": "0.2.0" }, "dependencies": { - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.2.1" } }, "debug": { @@ -3278,20 +3148,6 @@ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, "js-yaml": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", @@ -3302,37 +3158,22 @@ "esprima": "4.0.0" } }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "ansi-regex": "3.0.0" } }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "supports-color": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", + "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" + "has-flag": "2.0.0" } } } @@ -3393,21 +3234,13 @@ "requires": { "acorn": "5.1.1", "acorn-jsx": "3.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", - "dev": true - } } }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", + "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", + "optional": true }, "esquery": { "version": "1.0.0", @@ -3452,7 +3285,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.27" + "es5-ext": "0.10.29" } }, "event-stream": { @@ -3470,24 +3303,40 @@ "through": "2.3.8" } }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, - "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "dev": true, "requires": { - "create-hash": "1.1.3" + "original": "1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.2.tgz", + "integrity": "sha512-ni0r0lrm7AOzsh2qC5mi9sj8S0gmj5fLNjfFpxN05FB4tAVZEKotbkjOtLPqTCX/CXT7NsUr6juZb4IFJeNNdA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" } }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "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", @@ -3537,12 +3386,18 @@ "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.0.tgz", "integrity": "sha1-UnNWeN4YUwiQ2Ne5XwrGNkCVgJQ=" }, + "expose-loader": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.3.tgz", + "integrity": "sha1-NfvTZZeJ5PqoH1nei36fw55GbVE=", + "dev": true + }, "express": { "version": "4.15.4", "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", "requires": { - "accepts": "1.3.3", + "accepts": "1.3.4", "array-flatten": "1.1.1", "content-disposition": "0.5.2", "content-type": "1.0.2", @@ -3587,16 +3442,13 @@ } } }, - "express-handlebars": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-3.0.0.tgz", - "integrity": "sha1-gKBwu4GbCeSvLKbQeA91zgXnXC8=", + "express-request-language": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/express-request-language/-/express-request-language-1.1.12.tgz", + "integrity": "sha1-u/gj7wsR6M68B9Ql8N+dXgkAH0Q=", "requires": { - "glob": "6.0.4", - "graceful-fs": "4.1.11", - "handlebars": "4.0.10", - "object.assign": "4.0.4", - "promise": "7.3.1" + "accept-language": "3.0.17", + "bcp47": "1.1.2" } }, "extend": { @@ -3634,14 +3486,34 @@ } }, "extract-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-1.0.0.tgz", - "integrity": "sha512-NEWbK3OHP2csbg35pXPbnRP8rmSxSSisROK+SN2m+UloWL5COgtj+/YuX4o6KSK3PLYFNdF6j3BxyboCbSvSMg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-1.0.1.tgz", + "integrity": "sha512-As/KL9XEi3O4gpJsP3qvYFXy8yN9hqsDNY8/VCN0iEAPV7OieMx44jib1M8Ba0Y/t6MOEvJMyvWJQqFxcMZ14w==", "dev": true, "requires": { "loader-utils": "1.1.0" } }, + "falafel": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", + "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", + "dev": true, + "requires": { + "acorn": "5.1.1", + "foreach": "2.0.5", + "isarray": "0.0.1", + "object-keys": "1.0.11" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -3660,6 +3532,15 @@ "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", "dev": true }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.6.5" + } + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -3702,6 +3583,14 @@ "requires": { "is-object": "1.0.1", "merge-descriptors": "1.0.1" + }, + "dependencies": { + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + } } }, "fill-range": { @@ -3780,25 +3669,14 @@ "dev": true }, "fluent": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/fluent/-/fluent-0.3.1.tgz", - "integrity": "sha1-f6TOw/9X1wjI4me3sMSjTXog7nI=", - "dev": true - }, - "fluent-intl-polyfill": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fluent-intl-polyfill/-/fluent-intl-polyfill-0.1.0.tgz", - "integrity": "sha1-ETOUSrJHeINHOZVZaIPg05z4hc8=", - "dev": true, - "requires": { - "intl-pluralrules": "github:projectfluent/IntlPluralRules#94cb0fa1c23ad943bc5aafef43cea132fa51d68b" - } + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fluent/-/fluent-0.4.1.tgz", + "integrity": "sha512-vatFe36jVjXclCYPRopLVB6oR5ceuKWnn6oVLIuLCnkdCb49RGuTznPdd51xATo+S83N9zLD1xsYf1Ma4s2VoQ==" }, "fluent-langneg": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/fluent-langneg/-/fluent-langneg-0.0.3.tgz", - "integrity": "sha512-atYae9PGcLqa3ckStk3IPDjpdkkqzSzsR86viQB0y1kMhajR2tCAf6nmHTOvfKsV8WB9ZotWPrDpcLVLwD9/gA==", - "dev": true + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fluent-langneg/-/fluent-langneg-0.1.0.tgz", + "integrity": "sha512-SzRtXNaIcCyRabIpcv+AQd0gn+tXv1wfDDvej3wtBo1/XV0iDnCw5XzbARRRmZMW+IEg+Q26jup6vYgnDam4dg==" }, "for-in": { "version": "1.0.2", @@ -3818,17 +3696,32 @@ "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", + "dev": true }, "form-data": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.2.0.tgz", - "integrity": "sha1-ml47kpX5gLJiPPZPojixTOvKcHs=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.8.tgz", + "integrity": "sha1-CJDNEAXFzOzAudJKiAUskkQtDbU=", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.16" + "async": "0.2.10", + "combined-stream": "0.0.7", + "mime": "1.2.11" + }, + "dependencies": { + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "dev": true + } } }, "formatio": { @@ -3868,14 +3761,16 @@ "dev": true }, "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true, "requires": { "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", - "universalify": "0.1.1" + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.1" } }, "fs.realpath": { @@ -4786,7 +4681,8 @@ "function-bind": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true }, "functional-red-black-tree": { "version": "1.0.1", @@ -4812,6 +4708,20 @@ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, + "ghauth": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ghauth/-/ghauth-3.0.0.tgz", + "integrity": "sha1-gpKiTvR4mfGAo5x4DEgJVhKUvbw=", + "dev": true, + "requires": { + "application-config": "0.1.2", + "bl": "0.9.5", + "hyperquest": "1.2.0", + "mkdirp": "0.5.1", + "read": "1.0.7", + "xtend": "4.0.1" + } + }, "git-rev-sync": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.9.1.tgz", @@ -4823,11 +4733,62 @@ "shelljs": "0.7.7" } }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "github": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/github/-/github-0.1.16.tgz", + "integrity": "sha1-iV0qhbD+t5gNiawM5PRNyqA/F7U=", + "dev": true + }, + "github-changes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/github-changes/-/github-changes-1.1.0.tgz", + "integrity": "sha1-1Oi5i8N7Mv4nKuABcUFtbN9r/+4=", + "dev": true, "requires": { + "bluebird": "1.0.3", + "ghauth": "3.0.0", + "github": "0.1.16", + "github-commit-stream": "0.1.0", + "lodash": "2.4.1", + "moment-timezone": "0.5.5", + "nomnom": "1.6.2", + "parse-link-header": "0.1.0", + "semver": "2.2.1" + }, + "dependencies": { + "lodash": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=", + "dev": true + }, + "semver": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz", + "integrity": "sha1-eUEYKz/8xYC/8cF5QqzfeVHA0hM=", + "dev": true + } + } + }, + "github-commit-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/github-commit-stream/-/github-commit-stream-0.1.0.tgz", + "integrity": "sha1-2823smeWcYa3DMc2ORgw2mNo16E=", + "dev": true, + "requires": { + "async": "0.2.10", + "parse-link-header": "0.1.0", + "request": "2.22.0", + "through": "2.3.8" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", "inflight": "1.0.6", "inherits": "2.0.3", "minimatch": "3.0.4", @@ -4854,6 +4815,16 @@ "is-glob": "2.0.1" } }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "2.19.0", + "process": "0.5.2" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -4872,22 +4843,6 @@ "object-assign": "4.1.1", "pify": "2.3.0", "pinkie-promise": "2.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } } }, "globjoin": { @@ -4899,7 +4854,8 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "graceful-readlink": { "version": "1.0.1", @@ -4913,16 +4869,11 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, - "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - } + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true }, "has": { "version": "1.0.1", @@ -4966,6 +4917,18 @@ "minimalistic-assert": "1.0.0" } }, + "hawk": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.13.1.tgz", + "integrity": "sha1-NheViCH1gxHk1/beKR/KZitBLvQ=", + "dev": true, + "requires": { + "boom": "0.4.2", + "cryptiles": "0.2.2", + "hoek": "0.8.5", + "sntp": "0.2.4" + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -5020,6 +4983,12 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "hoek": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.8.5.tgz", + "integrity": "sha1-Hp/XcO9+vgJ0rfy1sIBqAlpeTp8=", + "dev": true + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -5036,6 +5005,44 @@ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "wbuf": "1.7.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, "hpkp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", @@ -5052,6 +5059,12 @@ "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", "dev": true }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, "html-loader": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.1.tgz", @@ -5078,31 +5091,7 @@ "ncname": "1.0.0", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.0.27" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "uglify-js": { - "version": "3.0.27", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz", - "integrity": "sha512-HD8CmxPXUI62v5tweiulMcP/apAtx1DXGcNZkhKQZyC+MTrTsoCBb8yPAwVrbvpgw3EpRU76bRe6axjIiCYcQg==", - "dev": true, - "requires": { - "commander": "2.11.0", - "source-map": "0.5.6" - } - } + "uglify-js": "3.0.28" } }, "html-tags": { @@ -5111,61 +5100,100 @@ "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", "dev": true }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + } + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", "dev": true, "requires": { - "bluebird": "3.5.0", - "html-minifier": "3.5.3", - "loader-utils": "0.2.17", + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", "lodash": "4.17.4", - "pretty-error": "2.1.1", - "toposort": "1.0.3" + "micromatch": "2.3.11" }, "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "is-extglob": "2.1.1" } } } }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "husky": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", + "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "dev": true, + "requires": { + "is-ci": "1.0.10", + "normalize-path": "1.0.0", + "strip-indent": "2.0.0" + } + }, + "hyperquest": { + "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" }, "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -5183,62 +5211,28 @@ "isarray": "0.0.1", "string_decoder": "0.10.31" } - } - } - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "husky": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", - "dev": true, - "requires": { - "is-ci": "1.0.10", - "normalize-path": "1.0.0", - "strip-indent": "2.0.0" - }, - "dependencies": { - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "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" + } } } }, "hyperscript-attribute-to-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hyperscript-attribute-to-property/-/hyperscript-attribute-to-property-1.0.0.tgz", - "integrity": "sha1-glMI1Ju44pV5I/cxmBvMgRytev8=", - "dev": true + "integrity": "sha1-glMI1Ju44pV5I/cxmBvMgRytev8=" }, "hyperx": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/hyperx/-/hyperx-2.3.0.tgz", "integrity": "sha1-cPRz1m1K1VDd0cg+S+JlEna78eI=", - "dev": true, "requires": { "hyperscript-attribute-to-property": "1.0.0" } @@ -5260,7 +5254,7 @@ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "dev": true, "requires": { - "postcss": "6.0.8" + "postcss": "6.0.9" } }, "ieee754": { @@ -5316,6 +5310,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -5326,33 +5321,16 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } - } - }, "inquirer": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.1.tgz", - "integrity": "sha512-QgW3eiPN8gpj/K5vVpHADJJgrrF0ho/dZGylikGX7iqAdRgC9FVKYKWFLx6hZDBFcOLEoSqINYrVPeFAeG/PdA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.2.tgz", + "integrity": "sha512-bTKLzEHJVATimZO/YFdLrom0lRx1BHfRYskFHfIMVkGdp8+dIZaxuU+4yrsS1lcu6YWywVQVVsfvdwESzbeqHw==", "dev": true, "requires": { "ansi-escapes": "2.0.0", "chalk": "2.1.0", "cli-cursor": "2.1.0", - "cli-width": "2.1.0", + "cli-width": "2.2.0", "external-editor": "2.0.4", "figures": "2.0.0", "lodash": "4.17.4", @@ -5411,22 +5389,6 @@ } } }, - "insert-module-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", - "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", - "dev": true, - "requires": { - "combine-source-map": "0.7.2", - "concat-stream": "1.5.2", - "is-buffer": "1.1.5", - "JSONStream": "1.3.1", - "lexical-scope": "1.2.0", - "process": "0.11.10", - "through2": "2.0.3", - "xtend": "4.0.1" - } - }, "intel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/intel/-/intel-1.2.0.tgz", @@ -5440,16 +5402,21 @@ "utcstring": "0.1.0" } }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.0" + } + }, "interpret": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", "dev": true }, - "intl-pluralrules": { - "version": "github:projectfluent/IntlPluralRules#94cb0fa1c23ad943bc5aafef43cea132fa51d68b", - "dev": true - }, "invariant": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", @@ -5465,11 +5432,23 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, "ipaddr.js": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" }, + "is": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", + "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", + "dev": true + }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -5488,13 +5467,20 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.9.0" + "binary-extensions": "1.10.0" } }, + "is-boolean-attribute": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-attribute/-/is-boolean-attribute-0.0.1.tgz", + "integrity": "sha1-JKtZt9y52jYSx3PmDGVlZeWgmAw=", + "dev": true + }, "is-buffer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true }, "is-builtin-module": { "version": "1.0.0", @@ -5541,8 +5527,7 @@ "is-electron": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.1.0.tgz", - "integrity": "sha512-dkg5xT383+M6zIbbXW/z7n2nz4SFUi2OSyhntnFYkRdtV+HVEfdjEK+5AWisfYgkpe3WYjTIuh7toaKmSfFVWw==", - "dev": true + "integrity": "sha512-dkg5xT383+M6zIbbXW/z7n2nz4SFUi2OSyhntnFYkRdtV+HVEfdjEK+5AWisfYgkpe3WYjTIuh7toaKmSfFVWw==" }, "is-equal-shallow": { "version": "0.1.3", @@ -5599,9 +5584,9 @@ } }, "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", + "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", "dev": true }, "is-path-cwd": { @@ -5760,6 +5745,14 @@ "requires": { "argparse": "1.0.9", "esprima": "2.7.3" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } } }, "jschardet": { @@ -5787,9 +5780,9 @@ "dev": true }, "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { "jsonify": "0.0.0" @@ -5809,13 +5802,12 @@ "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { "graceful-fs": "4.1.11" @@ -5839,28 +5831,6 @@ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", - "dev": true, - "requires": { - "jsonparse": "0.0.5", - "through": "2.3.8" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", @@ -5902,25 +5872,25 @@ "dev": true }, "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", "dev": true }, "JSONStream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", "dev": true, "requires": { - "jsonparse": "1.3.1", + "jsonparse": "0.0.5", "through": "2.3.8" } }, "jszip": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.3.tgz", - "integrity": "sha1-ipIEA7KxZRwPwSa+kBktkICVfDc=", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.4.tgz", + "integrity": "sha512-z6w8iYIxZ/fcgul0j/OerkYnkomH8BZigvzbxVmr2h5HkZUrPtk2kjYtLkqR9wwQxEP6ecKNoKLsbhd18jfnGA==", "dev": true, "requires": { "core-js": "2.3.0", @@ -5936,12 +5906,6 @@ "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", "dev": true }, - "pako": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.5.tgz", - "integrity": "sha1-0iBd/ludqK95fnwWPbTR+E5GALw=", - "dev": true - }, "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", @@ -5958,10 +5922,17 @@ } } }, + "just-extend": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz", + "integrity": "sha1-MzCvdWyralQnAMZLLk5KoGLVL/8=", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "1.1.5" } @@ -5981,40 +5952,11 @@ "integrity": "sha512-UTCzU28rRI9wkb8qSGoZa9pgWvxr4LjP2MEhi9XHb/1XMOJy0uTnIxaxzj8My/PORG+kQG6VzAcGvRw66eIOfA==", "dev": true }, - "l20n": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/l20n/-/l20n-5.0.0.tgz", - "integrity": "sha1-XfkVSyCgrPAdTIsMRa8wuXpzGjM=", - "dev": true, - "requires": { - "fluent": "0.3.1", - "fluent-intl-polyfill": "0.1.0", - "fluent-langneg": "0.0.3" - } - }, - "labeled-stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", - "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "isarray": "0.0.1", - "stream-splicer": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true }, "lcid": { "version": "1.0.0", @@ -6075,15 +6017,6 @@ "type-check": "0.3.2" } }, - "lexical-scope": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", - "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", - "dev": true, - "requires": { - "astw": "2.2.0" - } - }, "lie": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", @@ -6094,9 +6027,9 @@ } }, "lint-staged": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-4.0.3.tgz", - "integrity": "sha1-HOVVkbwsg6eBqQtpoKDIqg/GNws=", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-4.0.4.tgz", + "integrity": "sha1-nKaWizDfv+gTZbenY81PSZKJZVM=", "dev": true, "requires": { "app-root-path": "2.0.1", @@ -6108,45 +6041,6 @@ "npm-which": "3.0.1", "p-map": "1.1.1", "staged-git-files": "0.0.4" - }, - "dependencies": { - "cosmiconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-1.1.0.tgz", - "integrity": "sha1-DeoPmATv37kp+7GxiOJVU+oFPTc=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "require-from-string": "1.2.1" - } - }, - "execa": { - "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", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } }, "listr": { @@ -6173,21 +6067,6 @@ "strip-ansi": "3.0.1" }, "dependencies": { - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true - }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", @@ -6197,34 +6076,6 @@ "escape-string-regexp": "1.0.5", "object-assign": "4.1.1" } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "ora": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", - "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" - } - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } } } }, @@ -6407,6 +6258,11 @@ "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "lodash.create": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", @@ -6442,9 +6298,9 @@ } }, "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, "lodash.reduce": { @@ -6510,16 +6366,23 @@ } } }, + "loglevel": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.4.1.tgz", + "integrity": "sha1-lbOD+Ro8J1b9SrCTZn5DCRYfK80=", + "dev": true + }, "lolex": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.2.tgz", + "integrity": "sha1-JpS5U8nqTQE+W4v7qJHJkQJbJik=", "dev": true }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true }, "loose-envify": { "version": "1.3.1", @@ -6600,6 +6463,28 @@ "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=", "dev": true }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -6691,12 +6576,6 @@ "strip-bom": "2.0.0" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -6783,6 +6662,17 @@ "object.omit": "2.0.1", "parse-glob": "3.0.4", "regex-cache": "0.4.3" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + } } }, "miller-rabin": { @@ -6819,6 +6709,15 @@ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", "dev": true }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "0.1.1" + } + }, "minimalistic-assert": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", @@ -6835,14 +6734,15 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "1.1.8" } }, "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "mkdirp": { "version": "0.5.1", @@ -6880,6 +6780,15 @@ "supports-color": "3.1.2" }, "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", @@ -6920,61 +6829,26 @@ } } }, - "module-deps": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", - "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", - "dev": true, - "requires": { - "browser-resolve": "1.11.2", - "cached-path-relative": "1.0.1", - "concat-stream": "1.5.2", - "defined": "1.0.0", - "detective": "4.5.0", - "duplexer2": "0.1.4", - "inherits": "2.0.3", - "JSONStream": "1.3.1", - "parents": "1.0.1", - "readable-stream": "2.3.3", - "resolve": "1.4.0", - "stream-combiner2": "1.1.1", - "subarg": "1.0.0", - "through2": "2.0.3", - "xtend": "4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, "module-not-found-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", "dev": true }, + "moment": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.17.1.tgz", + "integrity": "sha1-/tlQYGPzaxDwZsi1mhRNf66+HYI=" + }, + "moment-timezone": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.5.tgz", + "integrity": "sha1-odVBCnLBil8pPyouYocKgK1DLa4=", + "dev": true, + "requires": { + "moment": "2.17.1" + } + }, "mozlog": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/mozlog/-/mozlog-2.1.1.tgz", @@ -6989,6 +6863,22 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multicast-dns": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", + "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "dev": true, + "requires": { + "dns-packet": "1.2.2", + "thunky": "0.1.0" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, "multimatch": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", @@ -7014,6 +6904,65 @@ "dev": true, "optional": true }, + "nanobus": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.2.0.tgz", + "integrity": "sha1-T/6wNlsDPXp8xPDI7lyMGqmzK6w=", + "requires": { + "nanotiming": "6.1.3", + "remove-array-items": "1.0.0" + } + }, + "nanohref": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/nanohref/-/nanohref-3.0.0.tgz", + "integrity": "sha1-wysD4KJY+1/pELtqT+yoESC5RHI=" + }, + "nanolocation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nanolocation/-/nanolocation-1.0.0.tgz", + "integrity": "sha1-FbXHrwWJXRqfIfDRNkldmURQaGs=" + }, + "nanologger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/nanologger/-/nanologger-1.3.0.tgz", + "integrity": "sha1-BRKOJDLv9dh369hVYQNp+22NljI=", + "dev": true, + "requires": { + "xtend": "4.0.1" + } + }, + "nanomorph": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/nanomorph/-/nanomorph-5.1.2.tgz", + "integrity": "sha1-ZtElCYco5UsOyqDISYA205XT8l0=" + }, + "nanoquery": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nanoquery/-/nanoquery-1.1.0.tgz", + "integrity": "sha1-g6giCTNAygU9aW7IYKEKWsTDtEI=" + }, + "nanoraf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nanoraf/-/nanoraf-3.0.1.tgz", + "integrity": "sha1-q5+5wle5rcxx2CmCy1jY+jUDdko=" + }, + "nanorouter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nanorouter/-/nanorouter-2.1.0.tgz", + "integrity": "sha1-T8r5YgOgCJjaiRiLG/9aj8Bu9P8=", + "requires": { + "wayfarer": "6.6.2" + } + }, + "nanotiming": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/nanotiming/-/nanotiming-6.1.3.tgz", + "integrity": "sha512-1PaTW4nyeYVKhPdydxl5u0tQn33C5Raf48lOKFKrKTUWmVlWdJkJKsqyYzGQ4jU43Da6NpyvAUzdZlfVs7RhPA==", + "requires": { + "on-idle": "3.1.2" + } + }, "native-promise-only": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", @@ -7040,6 +6989,41 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "nise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.0.1.tgz", + "integrity": "sha1-DakrEKhU6XwPSW9sKEWjASgLPu8=", + "dev": true, + "requires": { + "formatio": "1.2.0", + "just-extend": "1.1.22", + "lolex": "1.6.0", + "path-to-regexp": "1.7.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, "no-case": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", @@ -7063,6 +7047,12 @@ "minimatch": "3.0.4" } }, + "node-forge": { + "version": "0.6.33", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", + "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", + "dev": true + }, "node-libs-browser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", @@ -7112,16 +7102,10 @@ "randombytes": "2.0.5" } }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, "readable-stream": { @@ -7150,15 +7134,6 @@ } } }, - "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -7171,6 +7146,30 @@ } } }, + "nomnom": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", + "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", + "dev": true, + "requires": { + "colors": "0.5.1", + "underscore": "1.4.4" + }, + "dependencies": { + "colors": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", + "dev": true + } + } + }, + "normalize-html-whitespace": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", + "integrity": "sha1-EBci9kI1Ucdc24+dEE/4UNrx4Q4=", + "dev": true + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -7184,13 +7183,10 @@ } }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.0.2" - } + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true }, "normalize-range": { "version": "0.1.2", @@ -7255,20 +7251,11 @@ "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", "dev": true, "requires": { - "commander": "2.9.0", + "commander": "2.11.0", "npm-path": "2.0.3", "which": "1.3.0" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "1.0.0" - } - }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -7281,6 +7268,12 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7290,17 +7283,8 @@ "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" - }, - "object.assign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", - "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.0", - "object-keys": "1.0.11" - } + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true }, "object.omit": { "version": "2.0.1", @@ -7312,6 +7296,12 @@ "is-extendable": "0.1.1" } }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -7320,10 +7310,40 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "on-idle": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/on-idle/-/on-idle-3.1.2.tgz", + "integrity": "sha512-NRB0PAuE8LvWBtaN5b65U/vEWVLQPqUfSDOK6gf5BgfXa2WelSopZj4NkSR0MoqYsk28ugYpcdDpaYANV2WKEA==" + }, + "on-load": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/on-load/-/on-load-3.2.0.tgz", + "integrity": "sha1-3TFF06XC+qVmaSDR32dLafDC9m8=", + "dev": true, + "requires": { + "global": "4.3.2" + } + }, + "on-performance": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-performance/-/on-performance-1.0.1.tgz", + "integrity": "sha1-4RckEg5lpXVigimj94m4rj3T4Wc=", + "dev": true, + "requires": { + "on-idle": "3.1.2" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1.0.2" } @@ -7337,13 +7357,14 @@ "mimic-fn": "1.1.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" } }, "optionator": { @@ -7358,32 +7379,72 @@ "prelude-ls": "1.1.2", "type-check": "0.3.2", "wordwrap": "1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } } }, "ora": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz", - "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "dev": true, "requires": { "chalk": "1.1.3", - "cli-cursor": "2.1.0", - "cli-spinners": "1.0.0", - "log-symbols": "1.0.2" + "cli-cursor": "1.0.2", + "cli-spinners": "0.1.2", + "object-assign": "4.1.1" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + } + } + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "1.0.0" + } + } } }, "os-browserify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", - "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", "dev": true }, "os-homedir": { @@ -7401,6 +7462,23 @@ "execa": "0.7.0", "lcid": "1.0.0", "mem": "1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + } } }, "os-tmpdir": { @@ -7437,9 +7515,9 @@ "dev": true }, "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.5.tgz", + "integrity": "sha1-0iBd/ludqK95fnwWPbTR+E5GALw=", "dev": true }, "param-case": { @@ -7451,15 +7529,6 @@ "no-case": "2.3.1" } }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "0.11.15" - } - }, "parse-asn1": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", @@ -7469,7 +7538,7 @@ "asn1.js": "4.9.1", "browserify-aes": "1.0.6", "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", + "evp_bytestokey": "1.0.2", "pbkdf2": "3.0.13" } }, @@ -7494,6 +7563,38 @@ "error-ex": "1.3.1" } }, + "parse-link-header": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-0.1.0.tgz", + "integrity": "sha1-VQP6f7LzVLsjQlXBxCHaPrBbkYU=", + "dev": true, + "requires": { + "xtend": "2.0.6" + }, + "dependencies": { + "object-keys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", + "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "indexof": "0.0.1", + "is": "0.2.7" + } + }, + "xtend": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", + "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", + "dev": true, + "requires": { + "is-object": "0.1.2", + "object-keys": "0.2.0" + } + } + } + }, "parseurl": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", @@ -7514,7 +7615,8 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", @@ -7534,12 +7636,6 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -7579,8 +7675,7 @@ "pelo": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/pelo/-/pelo-0.0.3.tgz", - "integrity": "sha1-+2smsGEgNtsCuRj+qrPowMTLWXw=", - "dev": true + "integrity": "sha1-+2smsGEgNtsCuRj+qrPowMTLWXw=" }, "pify": { "version": "2.3.0", @@ -7623,14 +7718,33 @@ "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", "dev": true }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.7", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, "postcss": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", - "integrity": "sha512-G6WnRmdTt2jvJvY+aY+M0AO4YlbxE+slKPZb+jG2P2U9Tyxi3h1fYZ/DgiFU6DC6bv3XIEJoZt+f/kNh8BrWFw==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.9.tgz", + "integrity": "sha512-bBE2AHNEBhF23TfET6AA/lFP8ah+qHOZoFJEflFG+HgvVLdTmMOrocx/4LVVDIn3w6jUssw1q2Exk1cc9UOI8w==", "dev": true, "requires": { "chalk": "2.1.0", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "4.2.1" }, "dependencies": { @@ -7654,12 +7768,6 @@ "supports-color": "4.2.1" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", @@ -7696,16 +7804,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -7717,115 +7819,6 @@ } } }, - "postcss-cli": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-4.1.0.tgz", - "integrity": "sha1-j2gDZ4rNek8hSD8aQDkTb24cIU8=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "chokidar": "1.7.0", - "dependency-graph": "0.5.0", - "fs-extra": "3.0.1", - "get-stdin": "5.0.1", - "globby": "6.1.0", - "ora": "1.3.0", - "postcss": "6.0.8", - "postcss-load-config": "1.2.0", - "postcss-reporter": "4.0.0", - "read-cache": "1.0.0", - "yargs": "8.0.2" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "globby": { - "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", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.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" - } - } - } - }, "postcss-colormin": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", @@ -7851,16 +7844,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -7896,16 +7883,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -7940,16 +7921,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -7984,16 +7959,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8028,16 +7997,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8072,16 +8035,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8117,16 +8074,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8162,16 +8113,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8206,16 +8151,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8237,6 +8176,23 @@ "object-assign": "4.1.1", "postcss-load-options": "1.2.0", "postcss-load-plugins": "2.3.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + } + } } }, "postcss-load-options": { @@ -8247,6 +8203,23 @@ "requires": { "cosmiconfig": "2.2.2", "object-assign": "4.1.1" + }, + "dependencies": { + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + } + } } }, "postcss-load-plugins": { @@ -8257,6 +8230,23 @@ "requires": { "cosmiconfig": "2.2.2", "object-assign": "4.1.1" + }, + "dependencies": { + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + } + } } }, "postcss-loader": { @@ -8266,7 +8256,7 @@ "dev": true, "requires": { "loader-utils": "1.1.0", - "postcss": "6.0.8", + "postcss": "6.0.9", "postcss-load-config": "1.2.0", "schema-utils": "0.3.0" } @@ -8302,16 +8292,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8346,16 +8330,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8386,8 +8364,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000712", - "electron-to-chromium": "1.3.17" + "caniuse-db": "1.0.30000717", + "electron-to-chromium": "1.3.18" } }, "has-flag": { @@ -8404,16 +8382,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8456,16 +8428,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8501,16 +8467,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8548,16 +8508,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8595,16 +8549,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8622,7 +8570,7 @@ "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "dev": true, "requires": { - "postcss": "6.0.8" + "postcss": "6.0.9" } }, "postcss-modules-local-by-default": { @@ -8632,7 +8580,7 @@ "dev": true, "requires": { "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.8" + "postcss": "6.0.9" } }, "postcss-modules-scope": { @@ -8642,7 +8590,7 @@ "dev": true, "requires": { "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.8" + "postcss": "6.0.9" } }, "postcss-modules-values": { @@ -8652,7 +8600,7 @@ "dev": true, "requires": { "icss-replace-symbols": "1.1.0", - "postcss": "6.0.8" + "postcss": "6.0.9" } }, "postcss-normalize-charset": { @@ -8678,16 +8626,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8725,16 +8667,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8770,16 +8706,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8815,16 +8745,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8859,16 +8783,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8905,16 +8823,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -8949,7 +8861,7 @@ "integrity": "sha1-/0XPM1S4ee6JpOtoaA9GrJuxT5Q=", "dev": true, "requires": { - "postcss": "6.0.8" + "postcss": "6.0.9" } }, "postcss-selector-parser": { @@ -8989,16 +8901,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -9035,16 +8941,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -9087,16 +8987,10 @@ "requires": { "chalk": "1.1.3", "js-base64": "2.1.9", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "3.2.3" } }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -9132,16 +9026,6 @@ "integrity": "sha1-WdrcaDNF7GuI+IuU7Urn4do5S/4=", "dev": true }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" - } - }, "private": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", @@ -9149,9 +9033,9 @@ "dev": true }, "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", "dev": true }, "process-nextick-args": { @@ -9166,14 +9050,6 @@ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "2.0.6" - } - }, "proxy-addr": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", @@ -9273,6 +9149,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, "ramda": { "version": "0.24.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", @@ -9335,9 +9217,9 @@ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raven": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/raven/-/raven-2.1.1.tgz", - "integrity": "sha1-s6l0xsKTFcZ3wHnhaENerRllJc0=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/raven/-/raven-2.1.2.tgz", + "integrity": "sha512-pBopqPVAuzEP5jyyqEPxJvXg788dAJ9p8NXoHVLF598Ih7MApu2AWT/QHNk2Fa4Rx/xV9yTYDEtAujLXX1FvRg==", "requires": { "cookie": "0.3.1", "json-stringify-safe": "5.0.1", @@ -9375,48 +9257,13 @@ "unpipe": "1.0.0" } }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "dev": true, "requires": { - "pify": "2.3.0" - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "2.3.3" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } + "mute-stream": "0.0.7" } }, "read-pkg": { @@ -9505,7 +9352,7 @@ "ast-types": "0.9.6", "esprima": "3.1.3", "private": "0.1.7", - "source-map": "0.5.6" + "source-map": "0.5.7" }, "dependencies": { "esprima": { @@ -9513,12 +9360,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true } } }, @@ -9539,6 +9380,32 @@ "requires": { "indent-string": "2.1.0", "strip-indent": "1.0.1" + }, + "dependencies": { + "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 + }, + "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" + } + } + } + }, + "redeyed": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", + "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", + "optional": true, + "requires": { + "esprima": "3.0.0" } }, "redis": { @@ -9609,19 +9476,19 @@ "dev": true }, "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", "dev": true }, "regenerator-transform": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "private": "0.1.7" } }, @@ -9675,32 +9542,16 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true + "remove-array-items": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remove-array-items/-/remove-array-items-1.0.0.tgz", + "integrity": "sha1-B79CyzMvTPboXq2DteToltIyayE=" }, - "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", - "dev": true, - "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "repeat-element": { "version": "1.1.2", @@ -9711,7 +9562,8 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "2.0.1", @@ -9722,6 +9574,52 @@ "is-finite": "1.0.2" } }, + "request": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.22.0.tgz", + "integrity": "sha1-uIOnacxKkJVx61AEs0TEPPflFZI=", + "dev": true, + "requires": { + "aws-sign": "0.3.0", + "cookie-jar": "0.3.0", + "forever-agent": "0.5.2", + "form-data": "0.0.8", + "hawk": "0.13.1", + "http-signature": "0.10.1", + "json-stringify-safe": "4.0.0", + "mime": "1.2.11", + "node-uuid": "1.4.8", + "oauth-sign": "0.3.0", + "qs": "0.6.6", + "tunnel-agent": "0.3.0" + }, + "dependencies": { + "json-stringify-safe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-4.0.0.tgz", + "integrity": "sha1-d8JxqupUMC5o7+rMtWq78GqbGlQ=", + "dev": true + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "dev": true + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true + }, + "qs": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "integrity": "sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc=", + "dev": true + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9750,6 +9648,12 @@ "resolve-from": "1.0.1" } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", @@ -9776,15 +9680,16 @@ } }, "ret": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.14.tgz", - "integrity": "sha1-WMY2g3sS4WH4o4DPCBxqIw/RZk4=", + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, "requires": { "align-text": "0.1.4" } @@ -9796,22 +9701,6 @@ "dev": true, "requires": { "glob": "7.1.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } } }, "ripemd160": { @@ -9869,7 +9758,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.14" + "ret": "0.1.15" } }, "samsam": { @@ -9892,13 +9781,24 @@ "ajv": "5.2.2" } }, + "scroll-to-anchor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/scroll-to-anchor/-/scroll-to-anchor-1.1.0.tgz", + "integrity": "sha1-yZuNLl2VBWdSeHyngJWrdbUgs/0=" + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, "selenium-webdriver": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.5.0.tgz", "integrity": "sha512-1bCZYRfDy7vsu1dkLrclTLvWPxSo6rOIkxZXvB2wnzeWkEoiTKpw612EUGA3jRZxPzAzI9OlxuULJV8ge1vVXQ==", "dev": true, "requires": { - "jszip": "3.1.3", + "jszip": "3.1.4", "rimraf": "2.6.1", "tmp": "0.0.30", "xml2js": "0.4.17" @@ -9915,6 +9815,15 @@ } } }, + "selfsigned": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", + "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "dev": true, + "requires": { + "node-forge": "0.6.33" + } + }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", @@ -9951,6 +9860,32 @@ } } }, + "serve-index": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", + "integrity": "sha1-0rKA/FYNYW7oG0i/D6gqvtJIXOc=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "batch": "0.6.1", + "debug": "2.6.8", + "escape-html": "1.0.3", + "http-errors": "1.6.2", + "mime-types": "2.1.16", + "parseurl": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "serve-static": { "version": "1.12.4", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", @@ -9994,16 +9929,6 @@ "inherits": "2.0.3" } }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "0.0.1", - "sha.js": "2.4.8" - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -10040,22 +9965,6 @@ "glob": "7.1.2", "interpret": "1.0.3", "rechoir": "0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } } }, "signal-exit": { @@ -10065,15 +9974,16 @@ "dev": true }, "sinon": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", - "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.2.1.tgz", + "integrity": "sha512-KY3OLOWpek/I4NGAMHetuutVgS2aRgMR5g5/1LSYvPJ3qo2BopIvk3esFztPxF40RWf/NNNJzdFPriSkXUVK3A==", "dev": true, "requires": { "diff": "3.2.0", "formatio": "1.2.0", - "lolex": "1.6.0", + "lolex": "2.1.2", "native-promise-only": "0.8.1", + "nise": "1.0.1", "path-to-regexp": "1.7.0", "samsam": "1.2.1", "text-encoding": "0.6.4", @@ -10109,6 +10019,66 @@ "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "dev": true, + "requires": { + "hoek": "0.9.1" + }, + "dependencies": { + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "2.0.3" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.7", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.1.9" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.6.5" + } + } + } + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -10125,28 +10095,18 @@ "dev": true }, "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": "1.0.1" - } + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.16.tgz", + "integrity": "sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg==", "dev": true, "requires": { - "source-map": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } + "source-map": "0.5.7" } }, "spdx-correct": { @@ -10170,6 +10130,81 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.8", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.0.20" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "requires": { + "debug": "2.6.8", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "wbuf": "1.7.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, "specificity": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.1.tgz", @@ -10230,6 +10265,11 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "stable": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", + "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=" + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -10291,42 +10331,6 @@ "duplexer": "0.1.1" } }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "0.1.4", - "readable-stream": "2.3.3" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", @@ -10366,42 +10370,6 @@ } } }, - "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, "stream-to-observable": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", @@ -10488,21 +10456,10 @@ "dev": true }, "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" - }, - "dependencies": { - "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 - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true }, "strip-json-comments": { "version": "2.0.1", @@ -10543,7 +10500,7 @@ "micromatch": "2.3.11", "normalize-selector": "0.2.0", "pify": "3.0.0", - "postcss": "6.0.8", + "postcss": "6.0.9", "postcss-less": "1.1.0", "postcss-media-query-parser": "0.2.3", "postcss-reporter": "4.0.0", @@ -10580,6 +10537,21 @@ "supports-color": "4.2.1" } }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + } + }, "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", @@ -10589,20 +10561,6 @@ "ms": "2.0.0" } }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -10670,54 +10628,69 @@ "requires": { "doiuse": "3.0.0", "lodash": "4.17.4", - "postcss": "6.0.8", + "postcss": "6.0.9", "stylelint": "8.0.0" } }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "sugarss": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.0.tgz", "integrity": "sha1-ZeUbOVhDL7cNVFGmi7M+MtDPHvc=", "dev": true, "requires": { - "postcss": "6.0.8" + "postcss": "6.0.9" } }, "superagent": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.5.2.tgz", - "integrity": "sha1-M2GjlxVnUEw1EGOr6q4PqiPb8/g=", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.6.0.tgz", + "integrity": "sha512-oWsu4mboo8sVxagp4bNwZIR1rUmypeAJDmNIwT9mF4k06hSu6P92aOjEWLaIj7vsX3fOUp+cRH/04tao+q5Q7A==", "dev": true, "requires": { "component-emitter": "1.2.1", "cookiejar": "2.1.1", "debug": "2.6.7", "extend": "3.0.1", - "form-data": "2.2.0", + "form-data": "2.3.1", "formidable": "1.1.1", "methods": "1.1.2", - "mime": "1.3.4", + "mime": "1.3.6", "qs": "6.4.0", "readable-stream": "2.3.3" }, "dependencies": { + "combined-stream": { + "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" + } + }, + "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 + }, + "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", + "mime-types": "2.1.16" + } + }, + "mime": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", + "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", + "dev": true + }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", @@ -10751,7 +10724,7 @@ "dev": true, "requires": { "methods": "1.1.2", - "superagent": "3.5.2" + "superagent": "3.6.0" } }, "supports-color": { @@ -10791,15 +10764,6 @@ "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=", "dev": true }, - "syntax-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", - "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", - "dev": true, - "requires": { - "acorn": "4.0.13" - } - }, "table": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", @@ -10823,15 +10787,6 @@ "co": "4.6.0", "json-stable-stringify": "1.0.1" } - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } } } }, @@ -10862,8 +10817,7 @@ "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": "2.0.3", @@ -10901,6 +10855,12 @@ } } }, + "thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "dev": true + }, "time-stamp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", @@ -10913,12 +10873,12 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", "dev": true, "requires": { - "process": "0.11.10" + "setimmediate": "1.0.5" } }, "tmp": { @@ -10942,12 +10902,6 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, - "toposort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz", - "integrity": "sha1-8CzYp0vYvi/A6YYRw7rLlaFxhpw=", - "dev": true - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -10966,18 +10920,18 @@ "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, - "tslib": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", - "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=", - "dev": true - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel-agent": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", + "integrity": "sha1-rWgbaPUyGtKCfEz7G31d8s/pQu4=", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -11008,33 +10962,21 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typescript": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.4.tgz", - "integrity": "sha1-PTgyGCgjHkNPKHUUlZw3qCtin0I=", - "dev": true - }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.28.tgz", + "integrity": "sha512-0h/qGay016GG2lVav3Kz174F3T2Vjlz2v6HCt+WDQpoXfco0hWwF5gHK9yh88mUYvIC+N7Z8NT8WpjSp1yoqGA==", + "dev": true, "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - } + "commander": "2.11.0", + "source-map": "0.5.7" } }, "uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, "optional": true }, "uglifyjs-webpack-plugin": { @@ -11043,23 +10985,63 @@ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "0.5.6", + "source-map": "0.5.7", "uglify-js": "2.8.29", "webpack-sources": "1.0.1" }, "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } } } }, - "umd": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", - "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=", + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", "dev": true }, "uniq": { @@ -11083,12 +11065,6 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -11109,6 +11085,24 @@ "querystring": "0.2.0" } }, + "url-parse": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", + "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, "utcstring": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/utcstring/-/utcstring-0.1.0.tgz", @@ -11137,12 +11131,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, "utils-merge": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", @@ -11153,6 +11141,15 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" }, + "val-loader": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/val-loader/-/val-loader-1.0.2.tgz", + "integrity": "sha1-eQkZgJOzfLoKlr9PbSnelw0JnT0=", + "dev": true, + "requires": { + "loader-utils": "1.1.0" + } + }, "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", @@ -11163,6 +11160,21 @@ "spdx-expression-parse": "1.0.4" } }, + "validator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-7.0.0.tgz", + "integrity": "sha1-x03rgGNRL6w1VHk45vCxUEooL9I=" + }, + "varify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/varify/-/varify-0.2.0.tgz", + "integrity": "sha1-GR2p/p3EzWjQ0USY1OKpEP9OZRY=", + "optional": true, + "requires": { + "redeyed": "1.0.1", + "through": "2.3.8" + } + }, "vary": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", @@ -11205,41 +11217,27 @@ } } }, - "webcrypto-core": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-0.1.16.tgz", - "integrity": "sha1-3kkUtZFI23Moe8T45hz0+y9W8CA=", - "dev": true, + "wayfarer": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/wayfarer/-/wayfarer-6.6.2.tgz", + "integrity": "sha512-jwIufUN6EYfMeCJYBA8r0YytqHaSGACLtOddMeBtdq5gTo2F2XgK+t7eEXSPUBF9vm+hdI/iPOtSz1EJOd01dQ==", "requires": { - "@types/node": "6.0.85", - "tslib": "1.7.1" - }, - "dependencies": { - "@types/node": { - "version": "6.0.85", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.85.tgz", - "integrity": "sha512-6qLZpfQFO/g5Ns2e7RsW6brk0Q6Xzwiw7kVVU/XiQNOiJXSojhX76GP457PBYIsNMH2WfcGgcnZB4awFDHrwpA==", - "dev": true - } + "xtend": "4.0.1" } }, - "webcrypto-liner": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/webcrypto-liner/-/webcrypto-liner-0.1.26.tgz", - "integrity": "sha512-bXnI0TwuAJEqhtKUNsSaiw7cCcE7LxlazFZv9R3BWjKPgRdd8Wbv5CUE1UFOlc7KvRlFMyw85DHq8mZ3KBx1gg==", + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", "dev": true, "requires": { - "@types/node": "7.0.39", - "asmcrypto.js": "0.0.11", - "elliptic": "6.4.0", - "typescript": "2.3.4", - "webcrypto-core": "0.1.16" + "minimalistic-assert": "1.0.0" } }, "webpack": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.5.4.tgz", - "integrity": "sha1-VYPrJj7Se3i1vRe/37DrGxzRv4E=", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.5.5.tgz", + "integrity": "sha512-qeUx4nIbeLL53qqNTs3kObPBMkUVDrOjEfp/hTvMlx21qL2MsGNr8/tXCoX/lS12dLl9qtZaXv2qfBEctPScDg==", "dev": true, "requires": { "acorn": "5.1.1", @@ -11257,7 +11255,7 @@ "memory-fs": "0.4.1", "mkdirp": "0.5.1", "node-libs-browser": "2.0.0", - "source-map": "0.5.6", + "source-map": "0.5.7", "supports-color": "4.2.1", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", @@ -11266,12 +11264,6 @@ "yargs": "8.0.2" }, "dependencies": { - "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", - "dev": true - }, "ajv-keywords": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", @@ -11287,51 +11279,6 @@ "lodash": "4.17.4" } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, "supports-color": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", @@ -11340,27 +11287,6 @@ "requires": { "has-flag": "2.0.0" } - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.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" - } } } }, @@ -11377,6 +11303,265 @@ "time-stamp": "2.0.0" } }, + "webpack-dev-server": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.7.1.tgz", + "integrity": "sha1-IVgPWgjNBlxxFEz29hw0W8pZqLg=", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.0", + "connect-history-api-fallback": "1.3.0", + "del": "3.0.0", + "express": "4.15.4", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "loglevel": "1.4.1", + "opn": "4.0.2", + "portfinder": "1.0.13", + "selfsigned": "1.10.1", + "serve-index": "1.9.0", + "sockjs": "0.3.18", + "sockjs-client": "1.1.4", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "3.2.3", + "webpack-dev-middleware": "1.12.0", + "yargs": "6.6.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.1.1", + "pify": "3.0.0", + "rimraf": "2.6.1" + } + }, + "find-up": { + "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" + } + }, + "globby": { + "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", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "path-exists": { + "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" + } + }, + "path-type": { + "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", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "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", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "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" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "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" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "webpack-manifest-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.1.tgz", + "integrity": "sha512-OW7in/4VksQVnQcDJClv7YnOs/ruOqzPriT46z+qe6i1qINfZkmCNoxNG3r5J19VBSmO0KF1vn3Ute0yTKaeHQ==", + "dev": true, + "requires": { + "fs-extra": "0.30.0", + "lodash": "4.17.4" + } + }, "webpack-sources": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", @@ -11384,17 +11569,24 @@ "dev": true, "requires": { "source-list-map": "2.0.0", - "source-map": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } + "source-map": "0.5.7" } }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": "0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", + "dev": true + }, "whet.extend": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", @@ -11419,12 +11611,14 @@ "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wrap-ansi": { "version": "2.1.0", @@ -11461,7 +11655,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write": { "version": "0.2.1", @@ -11503,8 +11698,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=" }, "y18n": { "version": "3.2.1", @@ -11519,14 +11713,24 @@ "dev": true }, "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", + "camelcase": "4.1.0", + "cliui": "3.2.0", "decamelize": "1.2.0", - "window-size": "0.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": { @@ -11536,14 +11740,19 @@ "dev": true, "requires": { "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } + } + }, + "yo-yoify": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/yo-yoify/-/yo-yoify-3.7.3.tgz", + "integrity": "sha1-yNGoBL4J+lFbJRksH33lAIpmMBE=", + "dev": true, + "requires": { + "acorn": "5.1.1", + "falafel": "2.1.0", + "hyperx": "2.3.0", + "on-load": "3.2.0", + "through2": "2.0.3" } } } diff --git a/package.json b/package.json index 6ca4fc0a..c358edd2 100644 --- a/package.json +++ b/package.json @@ -3,73 +3,109 @@ "description": "File Sharing Experiment", "version": "1.1.2", "author": "Mozilla (https://mozilla.org)", - "dependencies": { - "aws-sdk": "^2.98.0", - "body-parser": "^1.17.2", - "connect-busboy": "0.0.2", - "convict": "^3.0.0", - "express": "^4.15.3", - "express-handlebars": "^3.0.0", - "helmet": "^3.8.0", - "mozlog": "^2.1.1", - "raven": "^2.1.0", - "redis": "^2.8.0" + "repository": "mozilla/send", + "homepage": "https://github.com/mozilla/send/", + "license": "MPL-2.0", + "private": true, + "scripts": { + "precommit": "lint-staged", + "clean": "rimraf dist", + "build": "npm run clean && webpack -p", + "lint": "npm-run-all lint:*", + "lint:css": "stylelint 'assets/*.css'", + "lint:js": "eslint .", + "lint-locales": "node scripts/lint-locales", + "lint-locales:dev": "npm run lint-locales", + "lint-locales:prod": "npm run lint-locales -- --production", + "format": "prettier '!(dist|node_modules|assets)/**/*.js' 'assets/*.css' --single-quote --write", + "get-prod-locales": "node scripts/get-prod-locales", + "get-prod-locales:write": "npm run get-prod-locales -- --write", + "changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges", + "contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS", + "release": "npm-run-all contributors changelog", + "test": "mocha test/unit", + "start": "cross-env NODE_ENV=development webpack-dev-server", + "prod": "node server/prod.js" }, - "devDependencies": { - "asmcrypto.js": "0.0.11", - "autoprefixer": "^7.1.2", - "babel-core": "^6.25.0", - "babel-loader": "^7.1.1", - "babel-polyfill": "^6.23.0", - "babel-preset-es2015": "^6.24.1", - "babel-preset-stage-2": "^6.24.1", - "bel": "^5.0.3", - "browserify": "^14.4.0", - "copy-webpack-plugin": "^4.0.1", - "cross-env": "^5.0.5", - "css-loader": "^0.28.4", - "css-mqpacker": "^6.0.1", - "cssnano": "^3.10.0", - "eslint": "^4.3.0", - "eslint-plugin-mocha": "^4.11.0", - "eslint-plugin-node": "^5.1.1", - "eslint-plugin-security": "^1.4.0", - "extract-loader": "^1.0.0", - "file-loader": "^0.11.2", - "git-rev-sync": "^1.9.1", - "github-changes": "^1.1.0", - "html-loader": "^0.5.1", - "html-webpack-plugin": "^2.30.1", - "husky": "^0.14.3", - "l20n": "^5.0.0", - "lint-staged": "^4.0.3", - "mkdirp": "^0.5.1", - "mocha": "^3.4.2", - "npm-run-all": "^4.0.2", - "postcss-cli": "^4.1.0", - "postcss-loader": "^2.0.6", - "prettier": "^1.5.3", - "proxyquire": "^1.8.0", - "raven-js": "^3.17.0", - "rimraf": "^2.6.1", - "selenium-webdriver": "^3.5.0", - "sinon": "^2.3.8", - "stylelint": "^8.0.0", - "stylelint-config-standard": "^17.0.0", - "stylelint-no-unsupported-browser-features": "^1.0.0", - "supertest": "^3.0.0", - "testpilot-ga": "^0.3.0", - "webcrypto-liner": "^0.1.25", - "webpack": "^3.5.4", - "webpack-dev-middleware": "^1.12.0" + "lint-staged": { + "*.js": [ + "prettier --single-quote --write", + "eslint", + "git add" + ], + "*.css": [ + "prettier --single-quote --write", + "stylelint", + "git add" + ] }, "engines": { "node": ">=8.2.0" }, - "homepage": "https://github.com/mozilla/send/", - "license": "MPL-2.0", - "repository": "mozilla/send", + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.26.0", + "babel-loader": "^7.1.2", + "babel-plugin-yo-yoify": "^0.7.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.6.0", + "babel-preset-es2015": "^6.24.1", + "babel-preset-stage-2": "^6.24.1", + "choo-log": "^7.2.1", + "copy-webpack-plugin": "^4.0.1", + "cross-env": "^5.0.5", + "css-loader": "^0.28.5", + "css-mqpacker": "^6.0.1", + "cssnano": "^3.10.0", + "eslint": "^4.5.0", + "eslint-plugin-mocha": "^4.11.0", + "eslint-plugin-node": "^5.1.1", + "eslint-plugin-security": "^1.4.0", + "expose-loader": "^0.7.3", + "extract-loader": "^1.0.1", + "file-loader": "^0.11.2", + "git-rev-sync": "^1.9.1", + "github-changes": "^1.1.0", + "html-loader": "^0.5.1", + "husky": "^0.14.3", + "lint-staged": "^4.0.4", + "mocha": "^3.5.0", + "nanobus": "^4.2.0", + "npm-run-all": "^4.0.2", + "postcss-loader": "^2.0.6", + "prettier": "^1.5.3", + "proxyquire": "^1.8.0", + "raven-js": "^3.17.0", + "require-from-string": "^1.2.1", + "rimraf": "^2.6.1", + "selenium-webdriver": "^3.5.0", + "sinon": "^3.2.1", + "stylelint-config-standard": "^17.0.0", + "stylelint-no-unsupported-browser-features": "^1.0.0", + "supertest": "^3.0.0", + "testpilot-ga": "^0.3.0", + "val-loader": "^1.0.2", + "webpack": "^3.5.5", + "webpack-dev-server": "^2.7.1", + "webpack-manifest-plugin": "^1.3.1" + }, + "dependencies": { + "aws-sdk": "^2.103.0", + "body-parser": "^1.17.2", + "choo": "^6.0.0", + "connect-busboy": "0.0.2", + "convict": "^4.0.0", + "express": "^4.15.4", + "express-request-language": "^1.1.12", + "fluent": "^0.4.1", + "fluent-langneg": "^0.1.0", + "helmet": "^3.8.1", + "mozlog": "^2.1.1", + "raven": "^2.1.2", + "redis": "^2.8.0" + }, "availableLanguages": [ + "en-US", "ast", "az", "ca", @@ -78,7 +114,6 @@ "de", "dsb", "el", - "en-US", "es-AR", "es-CL", "es-ES", @@ -108,42 +143,5 @@ "vi", "zh-CN", "zh-TW" - ], - "scripts": { - "precommit": "lint-staged", - "clean": "rimraf dist", - "build": "npm-run-all build:*", - "build:js": "webpack -p", - "build:version": "node scripts/version", - "changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges", - "contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS", - "dev": "npm run clean && npm run build && npm start", - "format": "prettier '{,frontend/src/,scripts/,server/,test/**/!(bundle)}*.{js,css}' --single-quote --write", - "get-prod-locales": "node scripts/get-prod-locales", - "get-prod-locales:write": "npm run get-prod-locales -- --write", - "lint": "npm-run-all lint:*", - "lint:css": "stylelint 'frontend/src/*.css'", - "lint:js": "eslint .", - "lint-locales": "node scripts/lint-locales", - "lint-locales:dev": "npm run lint-locales", - "lint-locales:prod": "npm run lint-locales -- --production", - "release": "npm-run-all contributors changelog", - "start": "node server/server", - "test": "cross-env NODE_ENV=test npm-run-all test:*", - "test:unit": "mocha test/unit", - "test:server": "mocha test/server", - "test--browser": "browserify test/frontend/frontend.bundle.js -o test/frontend/bundle.js -d && node test/frontend/driver.js" - }, - "lint-staged": { - "*.js": [ - "prettier --single-quote --write", - "eslint", - "git add" - ], - "*.css": [ - "prettier --single-quote --write", - "stylelint", - "git add" - ] - } + ] } diff --git a/postcss.config.js b/postcss.config.js index c96732f3..86125684 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -2,13 +2,13 @@ const autoprefixer = require('autoprefixer'); const cssnano = require('cssnano'); const mqpacker = require('css-mqpacker'); -const conf = require('./server/config'); +const config = require('./server/config'); const options = { plugins: [autoprefixer, mqpacker, cssnano] }; -if (conf.env === 'development') { +if (config.env === 'development') { options.map = { inline: true }; } diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 6afb7ed793e10fedafc7b716ed71a3b2cca77f9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3410 zcmcgv+fS576#x3(_OUNbOdtCf^r=A#3 z#NV#>74iFl^6@*0@}8n7ABwh1w2wq1pY+q)it_urOHDGw58jaGUcW}o?c1oVsKC_J z)EioJPkmxy0taGZVes^X$L>9d2n)mDz@U4|JCqt59YsuJBs@OZjR2zw7PDD??+dl# z&lfLtXmxY7nVA{HL`6$Kf&TvZvGgWdTUroo4w5{(EfjryeVZHE!E8f)J@n#i1N{R~ zURI9z`FUxjy}cbF7OV6f9=0E|v$JknXUr~SX5w_(DR5t|sOA2B7=3(ERauGBk`mZM zY`C0tQHuUrT@8bWrw_qwl)L@S>$>dw~h1`7Z=g-=n)*n#RxE&p!d)r z$sUK>!;cu}AQp24)NK8mTZ*T89pRLYTflHm#@!aEqg8Y2YK52Y>9N!lf zq2xvhrl+SRk7IwMQJl9P@kfuL=V=c@tszoBC@>K9b@ft?KZoMtB%ga485z;|larG$ zi&$}w>^nO;w7LHNeuN2(a?an+4^F2O`FY=oZ=+bJ9>?Po@T98?wq>8h_1&f>O`jj! zlTPe~Hoi>$LYu27|5@_5Pufta@A-4sZ8kYatlsPZVq|b zxl%4VG73(CYgcsL;gELd`&sWZDRLk-R`O0HCTS|8e~m(o70-uQ%Dyao3Ow!A8^pSk z!CK`m&4~DT>GaZ1d0Cl^A?tdM zk$hEWt3G0XxU`v@lOr)hpKLrwm8z>mK8X04eEm?6moM4%b#=H|QYveN)nY-ASkv(E zu&T0UAGz!|=V~^HDb;UNW22_aT5$N_A?QTiH3>XXmekzb3~SI*U5XI3f#={34Gau` z_@S?=U#g@E&ywRy7ngEhwZoWvPTxY_B;p!>4{W#67&P zwa0j<_eE;TS8JzTj(Kl$t<>929bIe8QT&6p{>FxewbQG{b+xscY*At1s=4hBc;E8P z!aeB4JA!p`?K^}ypO=%X)uS-G9ox+VSL^B*`K{J8`u7%j!dzoL_$>BQE%!Ocnld=} z@4aP*hK9g app.use(pages.notfound)); +}; diff --git a/server/languages.js b/server/languages.js new file mode 100644 index 00000000..3447c580 --- /dev/null +++ b/server/languages.js @@ -0,0 +1,16 @@ +const { availableLanguages } = require('../package.json'); +const config = require('./config'); +const fs = require('fs'); +const path = require('path'); + +function allLangs() { + const langs = fs.readdirSync(path.join(__dirname, '..', 'public', 'locales')); + langs.unshift('en-US'); // default first, TODO change for fluent-langneg + return langs; +} + +if (config.l10n_dev) { + module.exports = allLangs(); +} else { + module.exports = availableLanguages; +} diff --git a/server/layout.js b/server/layout.js new file mode 100644 index 00000000..8ba5329c --- /dev/null +++ b/server/layout.js @@ -0,0 +1,98 @@ +const html = require('choo/html'); +const assets = require('../common/assets'); +const locales = require('../common/locales'); + +module.exports = function(state, body = '') { + const firaTag = state.fira + ? html`` + : ''; + return html` + + + + + + + + + + + + + + + + + + ${state.title} + + + + ${firaTag} + + + + + + + +
+ + +
+
+ + ${body} +
+ + + + `; +}; diff --git a/server/log.js b/server/log.js index 2164412b..ea6318ab 100644 --- a/server/log.js +++ b/server/log.js @@ -1,4 +1,4 @@ -const conf = require('./config.js'); +const conf = require('./config'); const isProduction = conf.env === 'production'; diff --git a/server/prod.js b/server/prod.js new file mode 100644 index 00000000..020d3e4b --- /dev/null +++ b/server/prod.js @@ -0,0 +1,26 @@ +const express = require('express'); +const path = require('path'); +const Raven = require('raven'); +const config = require('./config'); +const routes = require('./routes'); +const pages = require('./routes/pages'); + +if (config.sentry_dsn) { + Raven.config(config.sentry_dsn).install(); +} + +const app = express(); + +app.use( + express.static(path.resolve(__dirname, '../dist/'), { + setHeaders: function(res) { + res.set('Cache-Control', 'public, max-age=31536000, immutable'); + } + }) +); + +routes(app); + +app.use(pages.notfound); + +app.listen(1443); diff --git a/server/routes/delete.js b/server/routes/delete.js new file mode 100644 index 00000000..00fac3e2 --- /dev/null +++ b/server/routes/delete.js @@ -0,0 +1,30 @@ +const storage = require('../storage'); + +function validateID(route_id) { + return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; +} + +module.exports = async function(req, res) { + const id = req.params.id; + + if (!validateID(id)) { + res.sendStatus(404); + return; + } + + const delete_token = req.body.delete_token; + + if (!delete_token) { + res.sendStatus(404); + return; + } + + try { + const err = await storage.delete(id, delete_token); + if (!err) { + res.sendStatus(200); + } + } catch (e) { + res.sendStatus(404); + } +}; diff --git a/server/routes/download.js b/server/routes/download.js new file mode 100644 index 00000000..f574b850 --- /dev/null +++ b/server/routes/download.js @@ -0,0 +1,38 @@ +const storage = require('../storage'); +const mozlog = require('../log'); +const log = mozlog('send.download'); + +function validateID(route_id) { + return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; +} + +module.exports = async function(req, res) { + const id = req.params.id; + if (!validateID(id)) { + return res.sendStatus(404); + } + + try { + const meta = await storage.metadata(id); + const contentLength = await storage.length(id); + res.writeHead(200, { + 'Content-Disposition': `attachment; filename=${meta.filename}`, + 'Content-Type': 'application/octet-stream', + 'Content-Length': contentLength, + 'X-File-Metadata': JSON.stringify(meta) + }); + const file_stream = storage.get(id); + + file_stream.on('end', async () => { + try { + await storage.forceDelete(id); + } catch (e) { + log.info('DeleteError:', id); + } + }); + + file_stream.pipe(res); + } catch (e) { + res.sendStatus(404); + } +}; diff --git a/server/routes/exists.js b/server/routes/exists.js new file mode 100644 index 00000000..e22bf21f --- /dev/null +++ b/server/routes/exists.js @@ -0,0 +1,19 @@ +const storage = require('../storage'); + +function validateID(route_id) { + return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; +} + +module.exports = async (req, res) => { + const id = req.params.id; + if (!validateID(id)) { + return res.sendStatus(404); + } + + try { + await storage.exists(id); + res.sendStatus(200); + } catch (e) { + res.sendStatus(404); + } +}; diff --git a/server/routes/index.js b/server/routes/index.js new file mode 100644 index 00000000..baafffe9 --- /dev/null +++ b/server/routes/index.js @@ -0,0 +1,80 @@ +const busboy = require('connect-busboy'); +const helmet = require('helmet'); +const bodyParser = require('body-parser'); +const requestLanguage = require('express-request-language'); +const languages = require('../languages'); +const storage = require('../storage'); +const config = require('../config'); +const pages = require('./pages'); +// const lang = require('fluent-langneg') + +module.exports = function(app) { + app.use( + requestLanguage({ + languages + }) + ); + app.use(helmet()); + app.use( + helmet.hsts({ + maxAge: 31536000, + force: config.env === 'production' + }) + ); + app.use( + helmet.contentSecurityPolicy({ + directives: { + defaultSrc: ["'self'"], + connectSrc: [ + "'self'", + 'https://sentry.prod.mozaws.net', + 'https://www.google-analytics.com' + ], + imgSrc: ["'self'", 'https://www.google-analytics.com'], + scriptSrc: ["'self'"], + styleSrc: ["'self'", 'https://code.cdn.mozilla.net'], + fontSrc: ["'self'", 'https://code.cdn.mozilla.net'], + formAction: ["'none'"], + frameAncestors: ["'none'"], + objectSrc: ["'none'"], + reportUri: '/__cspreport__' + } + }) + ); + app.use( + busboy({ + limits: { + fileSize: config.max_file_size + } + }) + ); + app.use(bodyParser.json()); + app.get('/', pages.index); + app.get('/legal', pages.legal); + app.get('/jsconfig.js', require('./jsconfig')); + app.get('/share/:id', pages.blank); + app.get('/download/:id', pages.download); + app.get('/completed', pages.blank); + app.get('/unsupported/:reason', pages.unsupported); + app.post('/api/upload', require('./upload')); + app.get('/api/download/:id', require('./download')); + app.get('/api/exists/:id', require('./exists')); + app.post('/api/delete/:id', require('./delete')); + + app.get('/__version__', function(req, res) { + res.sendFile(require.resolve('../../dist/version.json')); + }); + + app.get('/__lbheartbeat__', function(req, res) { + res.sendStatus(200); + }); + + app.get('__heartbeat__', async (req, res) => { + try { + await storage.ping(); + res.sendStatus(200); + } catch (e) { + res.sendStatus(500); + } + }); +}; diff --git a/server/routes/jsconfig.js b/server/routes/jsconfig.js new file mode 100644 index 00000000..15d4b3e0 --- /dev/null +++ b/server/routes/jsconfig.js @@ -0,0 +1,46 @@ +const config = require('../config'); + +let sentry = ''; +if (config.sentry_id) { + //eslint-disable-next-line node/no-missing-require + const version = require('../../dist/version.json'); + sentry = ` +var RAVEN_CONFIG = { + release: '${version.version}', + tags: { + commit: '${version.commit}' + }, + dataCallback: function (data) { + var hash = window.location.hash; + if (hash) { + return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), '')); + } + return data; + } +} +var SENTRY_ID = '${config.sentry_id}'; +`; +} + +let ga = ''; +if (config.analytics_id) { + ga = `var GOOGLE_ANALYTICS_ID = ${config.analytics_id};`; +} + +/* eslint-disable no-useless-escape */ +const jsconfig = ` +var isIE = /trident\\\/7\.|msie/i.test(navigator.userAgent); +var isUnsupportedPage = /\\\/unsupported/.test(location.pathname); +if (isIE && !isUnsupportedPage) { + window.location.replace('/unsupported/ie'); +} +var MAXFILESIZE = ${config.max_file_size}; +var EXPIRE_SECONDS = ${config.expire_seconds}; +${ga} +${sentry} +`; + +module.exports = function(req, res) { + res.set('Content-Type', 'application/javascript'); + res.send(jsconfig); +}; diff --git a/server/routes/pages.js b/server/routes/pages.js new file mode 100644 index 00000000..5266d19a --- /dev/null +++ b/server/routes/pages.js @@ -0,0 +1,68 @@ +const routes = require('../../app/routes'); +const storage = require('../storage'); +const state = require('../state'); + +function validateID(route_id) { + return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; +} + +function stripEvents(str) { + // For CSP we need to remove all the event handler placeholders. + // It's ok, app.js will add them when it attaches to the DOM. + return str.replace(/\son\w+=""/g, ''); +} + +module.exports = { + index: function(req, res) { + res.send(stripEvents(routes.toString('/', state(req)))); + }, + + blank: function(req, res) { + res.send(stripEvents(routes.toString('/blank', state(req)))); + }, + + download: async function(req, res, next) { + const id = req.params.id; + if (!validateID(id)) { + return next(); + } + + try { + const efilename = await storage.filename(id); + const name = decodeURIComponent(efilename); + const size = await storage.length(id); + const ttl = await storage.ttl(id); + res.send( + stripEvents( + routes.toString( + `/download/${req.params.id}`, + Object.assign(state(req), { + fileInfo: { name, size, ttl } + }) + ) + ) + ); + } catch (e) { + next(); + } + }, + + unsupported: function(req, res) { + res.send( + stripEvents( + routes.toString( + `/unsupported/${req.params.reason}`, + Object.assign(state(req), { fira: true }) + ) + ) + ); + }, + + legal: function(req, res) { + res.send(stripEvents(routes.toString('/legal', state(req)))); + }, + + notfound: function(req, res) { + res.status(404).send(stripEvents(routes.toString('/404', state(req)))); + } +}; diff --git a/server/routes/upload.js b/server/routes/upload.js new file mode 100644 index 00000000..28d6112e --- /dev/null +++ b/server/routes/upload.js @@ -0,0 +1,65 @@ +const crypto = require('crypto'); +const storage = require('../storage'); +const config = require('../config'); +const mozlog = require('../log'); + +const log = mozlog('send.upload'); + +const validateIV = route_id => { + return route_id.match(/^[0-9a-fA-F]{24}$/) !== null; +}; + +module.exports = function(req, res) { + const newId = crypto.randomBytes(5).toString('hex'); + let meta; + + try { + meta = JSON.parse(req.header('X-File-Metadata')); + } catch (e) { + res.sendStatus(400); + return; + } + + if ( + !meta.hasOwnProperty('id') || + !meta.hasOwnProperty('filename') || + !validateIV(meta.id) + ) { + res.sendStatus(404); + return; + } + + meta.delete = crypto.randomBytes(10).toString('hex'); + req.pipe(req.busboy); + + req.busboy.on( + 'file', + async (fieldname, file, filename, encoding, mimeType) => { + try { + meta.mimeType = mimeType || 'application/octet-stream'; + await storage.set(newId, file, filename, meta); + const protocol = config.env === 'production' ? 'https' : req.protocol; + const url = `${protocol}://${req.get('host')}/download/${newId}/`; + res.json({ + url, + delete: meta.delete, + id: newId + }); + } catch (e) { + log.error('upload', e); + if (e.message === 'limit') { + return res.sendStatus(413); + } + res.sendStatus(500); + } + } + ); + + req.on('close', async err => { + try { + await storage.forceDelete(newId); + } catch (e) { + log.info('DeleteError:', newId); + } + }); +}; diff --git a/server/server.js b/server/server.js deleted file mode 100644 index c3c97a47..00000000 --- a/server/server.js +++ /dev/null @@ -1,328 +0,0 @@ -const express = require('express'); -const exphbs = require('express-handlebars'); -const busboy = require('connect-busboy'); -const path = require('path'); -const bodyParser = require('body-parser'); -const helmet = require('helmet'); -const conf = require('./config.js'); -const storage = require('./storage.js'); -const Raven = require('raven'); -const crypto = require('crypto'); -const fs = require('fs'); -const version = require('../dist/public/version.json'); - -if (conf.sentry_dsn) { - Raven.config(conf.sentry_dsn).install(); -} - -const mozlog = require('./log.js'); - -const log = mozlog('send.server'); - -const STATIC_PATH = path.join(__dirname, '../dist/public'); - -const app = express(); - -function allLangs() { - return fs - .readdirSync(path.join(STATIC_PATH, 'locales')) - .map(function(f) { - return f.split('.')[0]; - }) - .join(','); -} - -function prodLangs() { - return require('../package.json').availableLanguages.join(','); -} - -const availableLanguages = conf.l10n_dev ? allLangs() : prodLangs(); - -// dev middleware is broken at the moment because of how webpack builds the -// handlebars templates. Leaving the commented code here as a mark of shame. - -// if (conf.env === 'development') { -// const webpack = require('webpack'); -// const webpackDevMiddleware = require('webpack-dev-middleware'); -// const config = require('../webpack.config.js'); -// config.devtool = 'inline-source-map'; -// const compiler = webpack(config); -// const wdm = webpackDevMiddleware(compiler, { -// publicPath: config.output.publicPath -// }); -// app.use(wdm); -// } -app.set('views', 'dist/views/'); -app.engine( - 'handlebars', - exphbs({ - defaultLayout: 'main', - layoutsDir: 'dist/views/layouts', - helpers: { - availableLanguages, - baseUrl: conf.base_url, - title: 'Firefox Send', - description: - 'Encrypt and send files with a link that automatically expires to ensure your important documents don’t stay online forever.' - } - }) -); -app.set('view engine', 'handlebars'); - -app.use(helmet()); -app.use( - helmet.hsts({ - maxAge: 31536000, - force: conf.env === 'production' - }) -); -app.use( - helmet.contentSecurityPolicy({ - directives: { - defaultSrc: ["'self'"], - connectSrc: [ - "'self'", - 'https://sentry.prod.mozaws.net', - 'https://www.google-analytics.com' - ], - imgSrc: ["'self'", 'https://www.google-analytics.com'], - scriptSrc: ["'self'"], - styleSrc: ["'self'", 'https://code.cdn.mozilla.net'], - fontSrc: ["'self'", 'https://code.cdn.mozilla.net'], - formAction: ["'none'"], - frameAncestors: ["'none'"], - objectSrc: ["'none'"], - reportUri: '/__cspreport__' - } - }) -); -app.use( - busboy({ - limits: { - fileSize: conf.max_file_size - } - }) -); -app.use(bodyParser.json()); -app.use( - '/resources', - express.static(path.join(STATIC_PATH, 'resources'), { - setHeaders: function(res) { - res.set('Cache-Control', 'public, max-age=31536000, immutable'); - } - }) -); -app.use(express.static(STATIC_PATH)); - -app.get('/', (req, res) => { - res.render('index'); -}); - -app.get('/unsupported/:reason', (req, res) => { - const outdated = req.params.reason === 'outdated'; - res.render('unsupported', { - outdated, - fira: true - }); -}); - -app.get('/legal', (req, res) => { - res.render('legal'); -}); - -app.get('/jsconfig.js', (req, res) => { - res.set('Content-Type', 'application/javascript'); - res.render('jsconfig', { - googleAnalyticsId: conf.analytics_id, - sentryId: conf.sentry_id, - version: version.version, - commit: version.commit, - maxFileSize: conf.max_file_size, - expireSeconds: conf.expire_seconds, - layout: false - }); -}); - -app.get('/exists/:id', async (req, res) => { - const id = req.params.id; - if (!validateID(id)) { - res.sendStatus(404); - return; - } - - try { - await storage.exists(id); - res.sendStatus(200); - } catch (e) { - res.sendStatus(404); - } -}); - -app.get('/download/:id', async (req, res) => { - const id = req.params.id; - if (!validateID(id)) { - res.status(404).render('notfound'); - return; - } - - try { - const efilename = await storage.filename(id); - const filename = decodeURIComponent(efilename); - const filenameJson = JSON.stringify({ filename }); - const sizeInBytes = await storage.length(id); - const ttl = await storage.ttl(id); - res.render('download', { - filename, - filenameJson, - sizeInBytes, - ttl - }); - } catch (e) { - res.status(404).render('notfound'); - } -}); - -app.get('/assets/download/:id', async (req, res) => { - const id = req.params.id; - if (!validateID(id)) { - res.sendStatus(404); - return; - } - - try { - const meta = await storage.metadata(id); - const contentLength = await storage.length(id); - res.writeHead(200, { - 'Content-Disposition': `attachment; filename=${meta.filename}`, - 'Content-Type': 'application/octet-stream', - 'Content-Length': contentLength, - 'X-File-Metadata': JSON.stringify(meta) - }); - const file_stream = storage.get(id); - - file_stream.on('end', async () => { - try { - await storage.forceDelete(id); - } catch (e) { - log.info('DeleteError:', id); - } - }); - - file_stream.pipe(res); - } catch (e) { - res.sendStatus(404); - } -}); - -app.post('/delete/:id', async (req, res) => { - const id = req.params.id; - - if (!validateID(id)) { - res.sendStatus(404); - return; - } - - const delete_token = req.body.delete_token; - - if (!delete_token) { - res.sendStatus(404); - return; - } - - try { - const err = await storage.delete(id, delete_token); - if (!err) { - res.sendStatus(200); - } - } catch (e) { - res.sendStatus(404); - } -}); - -app.post('/upload', (req, res, next) => { - const newId = crypto.randomBytes(5).toString('hex'); - let meta; - - try { - meta = JSON.parse(req.header('X-File-Metadata')); - } catch (e) { - res.sendStatus(400); - return; - } - - if ( - !meta.hasOwnProperty('id') || - !meta.hasOwnProperty('filename') || - !validateIV(meta.id) - ) { - res.sendStatus(404); - return; - } - - meta.delete = crypto.randomBytes(10).toString('hex'); - req.pipe(req.busboy); - - req.busboy.on( - 'file', - async (fieldname, file, filename, encoding, mimeType) => { - try { - meta.mimeType = mimeType || 'application/octet-stream'; - await storage.set(newId, file, filename, meta); - const protocol = conf.env === 'production' ? 'https' : req.protocol; - const url = `${protocol}://${req.get('host')}/download/${newId}/`; - res.json({ - url, - delete: meta.delete, - id: newId - }); - } catch (e) { - if (e.message === 'limit') { - return res.sendStatus(413); - } - res.sendStatus(500); - } - } - ); - - req.on('close', async err => { - try { - await storage.forceDelete(newId); - } catch (e) { - log.info('DeleteError:', newId); - } - }); -}); - -app.get('/__lbheartbeat__', (req, res) => { - res.sendStatus(200); -}); - -app.get('/__heartbeat__', async (req, res) => { - try { - await storage.ping(); - res.sendStatus(200); - } catch (e) { - res.sendStatus(500); - } -}); - -app.get('/__version__', (req, res) => { - res.sendFile(path.join(STATIC_PATH, 'version.json')); -}); - -const server = app.listen(conf.listen_port, () => { - log.info('startServer:', `Send app listening on port ${conf.listen_port}!`); -}); - -const validateID = route_id => { - return route_id.match(/^[0-9a-fA-F]{10}$/) !== null; -}; - -const validateIV = route_id => { - return route_id.match(/^[0-9a-fA-F]{24}$/) !== null; -}; - -module.exports = { - server: server, - storage: storage -}; diff --git a/server/state.js b/server/state.js new file mode 100644 index 00000000..6dc889ed --- /dev/null +++ b/server/state.js @@ -0,0 +1,20 @@ +const config = require('./config'); +const layout = require('./layout'); +const locales = require('../common/locales'); + +module.exports = function(req) { + const locale = req.language || 'en-US'; + return { + locale, + translate: locales.getTranslator(locale), + title: 'Firefox Send', + description: + 'Encrypt and send files with a link that automatically expires to ensure your important documents don’t stay online forever.', + baseUrl: config.base_url, + ui: {}, + storage: { + files: [] + }, + layout + }; +}; diff --git a/server/storage.js b/server/storage.js index 8bac8e30..36b040af 100644 --- a/server/storage.js +++ b/server/storage.js @@ -1,17 +1,18 @@ const AWS = require('aws-sdk'); const s3 = new AWS.S3(); -const conf = require('./config.js'); +const config = require('./config'); +const { tmpdir } = require('os'); const fs = require('fs'); const path = require('path'); -const mozlog = require('./log.js'); +const mozlog = require('./log'); const log = mozlog('send.storage'); const redis = require('redis'); const redis_client = redis.createClient({ - host: conf.redis_host, + host: config.redis_host, connect_timeout: 10000 }); @@ -19,7 +20,9 @@ redis_client.on('error', err => { log.error('Redis:', err); }); -if (conf.s3_bucket) { +let tempDir = null; + +if (config.s3_bucket) { module.exports = { filename: filename, exists: exists, @@ -36,6 +39,8 @@ if (conf.s3_bucket) { metadata }; } else { + tempDir = fs.mkdtempSync(`${tmpdir()}${path.sep}send-`); + log.info('tempDir', tempDir); module.exports = { filename: filename, exists: exists, @@ -113,7 +118,7 @@ function setField(id, key, value) { function localLength(id) { return new Promise((resolve, reject) => { try { - resolve(fs.statSync(path.join(__dirname, '../static', id)).size); + resolve(fs.statSync(path.join(tempDir, id)).size); } catch (err) { reject(); } @@ -121,12 +126,12 @@ function localLength(id) { } function localGet(id) { - return fs.createReadStream(path.join(__dirname, '../static', id)); + return fs.createReadStream(path.join(tempDir, id)); } function localSet(newId, file, filename, meta) { return new Promise((resolve, reject) => { - const filepath = path.join(__dirname, '../static', newId); + const filepath = path.join(tempDir, newId); const fstream = fs.createWriteStream(filepath); file.pipe(fstream); file.on('limit', () => { @@ -135,7 +140,7 @@ function localSet(newId, file, filename, meta) { }); fstream.on('finish', () => { redis_client.hmset(newId, meta); - redis_client.expire(newId, conf.expire_seconds); + redis_client.expire(newId, config.expire_seconds); log.info('localSet:', 'Upload Finished of ' + newId); resolve(meta.delete); }); @@ -156,7 +161,7 @@ function localDelete(id, delete_token) { } else { redis_client.del(id); log.info('Deleted:', id); - resolve(fs.unlinkSync(path.join(__dirname, '../static', id))); + resolve(fs.unlinkSync(path.join(tempDir, id))); } }); }); @@ -165,7 +170,7 @@ function localDelete(id, delete_token) { function localForceDelete(id) { return new Promise((resolve, reject) => { redis_client.del(id); - resolve(fs.unlinkSync(path.join(__dirname, '../static', id))); + resolve(fs.unlinkSync(path.join(tempDir, id))); }); } @@ -179,7 +184,7 @@ function localPing() { function awsLength(id) { const params = { - Bucket: conf.s3_bucket, + Bucket: config.s3_bucket, Key: id }; return new Promise((resolve, reject) => { @@ -195,7 +200,7 @@ function awsLength(id) { function awsGet(id) { const params = { - Bucket: conf.s3_bucket, + Bucket: config.s3_bucket, Key: id }; @@ -208,7 +213,7 @@ function awsGet(id) { function awsSet(newId, file, filename, meta) { const params = { - Bucket: conf.s3_bucket, + Bucket: config.s3_bucket, Key: newId, Body: file }; @@ -221,7 +226,7 @@ function awsSet(newId, file, filename, meta) { return upload.promise().then( () => { redis_client.hmset(newId, meta); - redis_client.expire(newId, conf.expire_seconds); + redis_client.expire(newId, config.expire_seconds); }, err => { if (hitLimit) { @@ -240,7 +245,7 @@ function awsDelete(id, delete_token) { reject(); } else { const params = { - Bucket: conf.s3_bucket, + Bucket: config.s3_bucket, Key: id }; @@ -256,7 +261,7 @@ function awsDelete(id, delete_token) { function awsForceDelete(id) { return new Promise((resolve, reject) => { const params = { - Bucket: conf.s3_bucket, + Bucket: config.s3_bucket, Key: id }; @@ -269,6 +274,6 @@ function awsForceDelete(id) { function awsPing() { return localPing().then(() => - s3.headBucket({ Bucket: conf.s3_bucket }).promise() + s3.headBucket({ Bucket: config.s3_bucket }).promise() ); } diff --git a/static/info.txt b/static/info.txt deleted file mode 100644 index b3119bbf..00000000 --- a/static/info.txt +++ /dev/null @@ -1 +0,0 @@ -This is where downloaded files are stored. diff --git a/test/frontend/frontend.bundle.js b/test/frontend/frontend.bundle.js index af584d1b..eea32c79 100644 --- a/test/frontend/frontend.bundle.js +++ b/test/frontend/frontend.bundle.js @@ -12,11 +12,11 @@ window.Raven = { }; window.FakeFile = FakeFile; -window.FileSender = require('../../frontend/src/fileSender'); -window.FileReceiver = require('../../frontend/src/fileReceiver'); +window.FileSender = require('../../app/fileSender'); +window.FileReceiver = require('../../app/fileReceiver'); window.sinon = require('sinon'); window.server = window.sinon.fakeServer.create(); window.assert = require('assert'); -const utils = require('../../frontend/src/utils'); +const utils = require('../../app/utils'); window.hexToArray = utils.hexToArray; window.arrayToHex = utils.arrayToHex; diff --git a/test/unit/aws.storage.test.js b/test/unit/aws.storage.test.js index d9c142e2..8c4d8b19 100644 --- a/test/unit/aws.storage.test.js +++ b/test/unit/aws.storage.test.js @@ -46,11 +46,11 @@ const awsStub = { const storage = proxyquire('../../server/storage', { redis: redisStub, fs: fsStub, - './log.js': function() { + './log': function() { return logStub; }, 'aws-sdk': awsStub, - './config.js': { + './config': { s3_bucket: 'test' } }); diff --git a/test/unit/local.storage.test.js b/test/unit/local.storage.test.js index 48836433..ae94ba95 100644 --- a/test/unit/local.storage.test.js +++ b/test/unit/local.storage.test.js @@ -2,8 +2,6 @@ const assert = require('assert'); const sinon = require('sinon'); const proxyquire = require('proxyquire'); -// const conf = require('../server/config.js'); - const redisStub = {}; const exists = sinon.stub(); const hget = sinon.stub(); @@ -35,7 +33,7 @@ logStub.error = sinon.stub(); const storage = proxyquire('../../server/storage', { redis: redisStub, fs: fsStub, - './log.js': function() { + './log': function() { return logStub; } }); diff --git a/views/jsconfig.handlebars b/views/jsconfig.handlebars deleted file mode 100644 index 7a24eb2b..00000000 --- a/views/jsconfig.handlebars +++ /dev/null @@ -1,28 +0,0 @@ -{{!-- This file should be es5 only --}} -var isIE = /trident\/7\.|msie/i.test(navigator.userAgent); -var isUnsupportedPage = /\/unsupported/.test(location.pathname); -if (isIE && !isUnsupportedPage) { - window.location.replace('/unsupported/ie'); -} - -{{#if sentryId}} -var RAVEN_CONFIG = { - release: '{{{version}}}', - tags: { - commit: '{{{commit}}}' - }, - dataCallback: function (data) { - var hash = window.location.hash; - if (hash) { - return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), '')); - } - return data; - } -} -var SENTRY_ID = '{{{sentryId}}}'; -{{/if}} -{{#if googleAnalyticsId}} -var GOOGLE_ANALYTICS_ID = '{{{googleAnalyticsId}}}'; -{{/if}} -var MAXFILESIZE = {{{maxFileSize}}}; -var EXPIRE_SECONDS = {{{expireSeconds}}}; diff --git a/webpack.config.js b/webpack.config.js index de5ab1a1..4c40bdd1 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,17 +1,16 @@ const path = require('path'); const webpack = require('webpack'); -const HtmlPlugin = require('html-webpack-plugin'); const CopyPlugin = require('copy-webpack-plugin'); +const ManifestPlugin = require('webpack-manifest-plugin'); module.exports = { entry: { - vendor: ['babel-polyfill', 'raven-js'], - upload: ['./frontend/src/upload.js'], - download: ['./frontend/src/download.js'] + vendor: ['babel-polyfill', 'raven-js', 'fluent', 'choo'], + app: ['./app/main.js'] }, output: { - filename: 'resources/[name].[chunkhash].js', - path: path.resolve(__dirname, 'dist/public'), + filename: '[name].[chunkhash:8].js', + path: path.resolve(__dirname, 'dist'), publicPath: '/' }, module: { @@ -20,19 +19,48 @@ module.exports = { test: /\.js$/, loader: 'babel-loader', include: [ - path.resolve(__dirname, 'frontend'), + path.resolve(__dirname, 'app'), + path.resolve(__dirname, 'common'), path.resolve(__dirname, 'node_modules/testpilot-ga/src') ], options: { babelrc: false, - presets: [['es2015', { modules: false }], 'stage-2'] + presets: [['env', { modules: false }], 'stage-2'], + plugins: ['yo-yoify'] } }, + { + test: /\.js$/, + include: [path.dirname(require.resolve('fluent'))], + use: [ + { + loader: 'expose-loader', + options: 'fluent' + }, + { + loader: 'babel-loader', + options: { + presets: [['env', { modules: false }]] + } + } + ] + }, + { + test: require.resolve('./assets/cryptofill'), + use: [ + { + loader: 'file-loader', + options: { + name: '[name].[hash:8].[ext]' + } + } + ] + }, { test: /\.(svg|png|jpg)$/, loader: 'file-loader', options: { - name: 'resources/[name].[hash].[ext]' + name: '[name].[hash:8].[ext]' } }, { @@ -41,7 +69,7 @@ module.exports = { { loader: 'file-loader', options: { - name: 'resources/[name].[hash].[ext]' + name: '[name].[hash:8].[ext]' } }, 'extract-loader', @@ -50,75 +78,64 @@ module.exports = { ] }, { - test: /\.hbs$/, + test: require.resolve('./package.json'), use: [ { - loader: 'html-loader', + loader: 'file-loader', options: { - interpolate: 'require', - minimize: false + name: 'version.json' } - } + }, + 'extract-loader', + './build/package_json_loader' ] + }, + { + test: /\.ftl$/, + use: [ + { + loader: 'file-loader', + options: { + name: '[path][name].[hash:8].js' + } + }, + 'extract-loader', + './build/fluent_loader' + ] + }, + { + test: require.resolve('./build/generate_asset_map.js'), + use: ['babel-loader', 'val-loader'] + }, + { + test: require.resolve('./build/generate_l10n_map.js'), + use: ['babel-loader', 'val-loader'] } ] }, plugins: [ new CopyPlugin([ - { - context: 'public', - from: 'locales/**/*.ftl' - }, { context: 'public', from: '*.*' - }, - { - from: 'views/**', - to: '../' - }, - { - context: 'node_modules/l20n/dist/web', - from: 'l20n.min.js' } ]), - new HtmlPlugin({ - filename: '../views/index.handlebars', - template: 'webpack/upload.hbs', - chunks: ['upload'] - }), - new HtmlPlugin({ - filename: '../views/download.handlebars', - template: 'webpack/download.hbs', - chunks: ['download'] - }), - new HtmlPlugin({ - filename: '../views/legal.handlebars', - template: 'webpack/legal.hbs', - inject: false - }), - new HtmlPlugin({ - filename: '../views/notfound.handlebars', - template: 'webpack/notfound.hbs', - inject: false - }), - new HtmlPlugin({ - filename: '../views/layouts/main.handlebars', - template: 'webpack/layout.hbs', - inject: 'head', - excludeChunks: ['upload', 'download'] - }), - new HtmlPlugin({ - filename: '../views/unsupported.handlebars', - template: 'webpack/unsupported.hbs', - inject: false - }), + new webpack.IgnorePlugin(/dist/), + new webpack.IgnorePlugin(/require-from-string/), new webpack.HashedModuleIdsPlugin(), new webpack.optimize.CommonsChunkPlugin({ name: 'vendor' }), new webpack.optimize.CommonsChunkPlugin({ name: 'runtime' - }) - ] + }), + new ManifestPlugin() + ], + devServer: { + compress: true, + setup: + process.env.NODE_ENV === 'development' + ? require('./server/dev') + : undefined + } }; diff --git a/webpack/download.hbs b/webpack/download.hbs deleted file mode 100644 index b94f501c..00000000 --- a/webpack/download.hbs +++ /dev/null @@ -1,43 +0,0 @@ -
-
-
- - -
-
- -
- -
-
- - - - - - -
diff --git a/webpack/layout.hbs b/webpack/layout.hbs deleted file mode 100644 index 9b9f8e50..00000000 --- a/webpack/layout.hbs +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - {{title}} - - - {{#if fira}} - - {{/if}} - - - - - - - - -
- - -
-
- - {{{body}}} -
- - - diff --git a/webpack/legal.hbs b/webpack/legal.hbs deleted file mode 100644 index 023ebf8e..00000000 --- a/webpack/legal.hbs +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/webpack/notfound.hbs b/webpack/notfound.hbs deleted file mode 100644 index 04bc54ed..00000000 --- a/webpack/notfound.hbs +++ /dev/null @@ -1,8 +0,0 @@ -
-
- -
- -
diff --git a/webpack/unsupported.hbs b/webpack/unsupported.hbs deleted file mode 100644 index 08d8b75a..00000000 --- a/webpack/unsupported.hbs +++ /dev/null @@ -1,20 +0,0 @@ -
-
Your browser is not supported.
- {{#if outdated}} -
Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser.
- - -
Update Firefox
-
- {{else}} -
Unfortunately this browser does not support the web technology that powers Firefox Send. You’ll need to try another browser. We recommend Firefox!
- - - -
Firefox
- Free Download -
-
- {{/if}} -
Send files through a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever.
-
diff --git a/webpack/upload.hbs b/webpack/upload.hbs deleted file mode 100644 index 331add23..00000000 --- a/webpack/upload.hbs +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - -