diff --git a/app/fileManager.js b/app/fileManager.js
index 588fd93a..8e9b3f40 100644
--- a/app/fileManager.js
+++ b/app/fileManager.js
@@ -97,6 +97,13 @@ export default function(state, emitter) {
lastRender = Date.now();
});
+ emitter.on('changeLimit', async ({ file, value }) => {
+ await FileSender.changeLimit(file.id, file.ownerToken, value);
+ file.dlimit = value;
+ state.storage.writeFiles();
+ metrics.changedDownloadLimit(file);
+ });
+
emitter.on('delete', async ({ file, location }) => {
try {
metrics.deletedUpload({
@@ -108,7 +115,7 @@ export default function(state, emitter) {
location
});
state.storage.remove(file.id);
- await FileSender.delete(file.id, file.deleteToken);
+ await FileSender.delete(file.id, file.ownerToken);
} catch (e) {
state.raven.captureException(e);
}
diff --git a/app/fileReceiver.js b/app/fileReceiver.js
index ee0cf5ca..71a2cebb 100644
--- a/app/fileReceiver.js
+++ b/app/fileReceiver.js
@@ -116,7 +116,8 @@ export default class FileReceiver extends Nanobus {
// TODO
}
- fetchMetadata(sig) {
+ async fetchMetadata(nonce) {
+ const authHeader = await this.getAuthHeader(nonce);
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
@@ -132,7 +133,7 @@ export default class FileReceiver extends Nanobus {
xhr.onerror = () => reject(new Error(0));
xhr.ontimeout = () => reject(new Error(0));
xhr.open('get', `/api/metadata/${this.file.id}`);
- xhr.setRequestHeader('Authorization', `send-v1 ${arrayToB64(sig)}`);
+ xhr.setRequestHeader('Authorization', authHeader);
xhr.responseType = 'json';
xhr.timeout = 2000;
xhr.send();
@@ -140,16 +141,16 @@ export default class FileReceiver extends Nanobus {
}
async getMetadata(nonce) {
+ let data = null;
try {
- const authKey = await this.authKeyPromise;
- const sig = await window.crypto.subtle.sign(
- {
- name: 'HMAC'
- },
- authKey,
- b64ToArray(nonce)
- );
- const data = await this.fetchMetadata(new Uint8Array(sig));
+ try {
+ data = await this.fetchMetadata(nonce);
+ } catch (e) {
+ if (e.message === '401') {
+ // allow one retry for changed nonce
+ data = await this.fetchMetadata(e.nonce);
+ }
+ }
const metaKey = await this.metaKeyPromise;
const json = await window.crypto.subtle.decrypt(
{
@@ -174,7 +175,8 @@ export default class FileReceiver extends Nanobus {
}
}
- downloadFile(sig) {
+ async downloadFile(nonce) {
+ const authHeader = await this.getAuthHeader(nonce);
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
@@ -190,9 +192,10 @@ export default class FileReceiver extends Nanobus {
reject(new Error('notfound'));
return;
}
-
if (xhr.status !== 200) {
- return reject(new Error(xhr.status));
+ const err = new Error(xhr.status);
+ err.nonce = xhr.getResponseHeader('WWW-Authenticate').split(' ')[1];
+ return reject(err);
}
const blob = new Blob([xhr.response]);
@@ -205,26 +208,37 @@ export default class FileReceiver extends Nanobus {
};
xhr.open('get', this.url);
- xhr.setRequestHeader('Authorization', `send-v1 ${arrayToB64(sig)}`);
+ xhr.setRequestHeader('Authorization', authHeader);
xhr.responseType = 'blob';
xhr.send();
});
}
+ async getAuthHeader(nonce) {
+ const authKey = await this.authKeyPromise;
+ const sig = await window.crypto.subtle.sign(
+ {
+ name: 'HMAC'
+ },
+ authKey,
+ b64ToArray(nonce)
+ );
+ return `send-v1 ${arrayToB64(new Uint8Array(sig))}`;
+ }
+
async download(nonce) {
this.state = 'downloading';
this.emit('progress', this.progress);
try {
const encryptKey = await this.encryptKeyPromise;
- const authKey = await this.authKeyPromise;
- const sig = await window.crypto.subtle.sign(
- {
- name: 'HMAC'
- },
- authKey,
- b64ToArray(nonce)
- );
- const ciphertext = await this.downloadFile(new Uint8Array(sig));
+ let ciphertext = null;
+ try {
+ ciphertext = await this.downloadFile(nonce);
+ } catch (e) {
+ if (e.message === '401') {
+ ciphertext = await this.downloadFile(e.nonce);
+ }
+ }
this.msg = 'decryptingFile';
this.emit('decrypting');
const plaintext = await window.crypto.subtle.decrypt(
diff --git a/app/fileSender.js b/app/fileSender.js
index d5a00eec..1212429e 100644
--- a/app/fileSender.js
+++ b/app/fileSender.js
@@ -35,7 +35,26 @@ export default class FileSender extends Nanobus {
}
};
- xhr.send(JSON.stringify({ delete_token: token }));
+ xhr.send(JSON.stringify({ owner_token: token }));
+ });
+ }
+
+ static changeLimit(id, owner_token, dlimit) {
+ return new Promise((resolve, reject) => {
+ if (!id || !owner_token) {
+ return reject();
+ }
+ const xhr = new XMLHttpRequest();
+ xhr.open('POST', `/api/params/${id}`);
+ xhr.setRequestHeader('Content-Type', 'application/json');
+
+ xhr.onreadystatechange = () => {
+ if (xhr.readyState === XMLHttpRequest.DONE) {
+ resolve();
+ }
+ };
+
+ xhr.send(JSON.stringify({ owner_token, dlimit }));
});
}
@@ -100,7 +119,7 @@ export default class FileSender extends Nanobus {
url: responseObj.url,
id: responseObj.id,
secretKey: arrayToB64(this.rawSecret),
- deleteToken: responseObj.delete,
+ ownerToken: responseObj.owner,
nonce
});
}
@@ -205,6 +224,17 @@ export default class FileSender extends Nanobus {
return this.uploadFile(encrypted, metadata, new Uint8Array(rawAuth));
}
+ async getAuthHeader(authKey, nonce) {
+ const sig = await window.crypto.subtle.sign(
+ {
+ name: 'HMAC'
+ },
+ authKey,
+ b64ToArray(nonce)
+ );
+ return `send-v1 ${arrayToB64(new Uint8Array(sig))}`;
+ }
+
static async setPassword(password, file) {
const encoder = new TextEncoder();
const secretKey = await window.crypto.subtle.importKey(
@@ -229,13 +259,7 @@ export default class FileSender extends Nanobus {
true,
['sign']
);
- const sig = await window.crypto.subtle.sign(
- {
- name: 'HMAC'
- },
- authKey,
- b64ToArray(file.nonce)
- );
+ const authHeader = await this.getAuthHeader(authKey, file.nonce);
const pwdKey = await window.crypto.subtle.importKey(
'raw',
encoder.encode(password),
@@ -278,10 +302,7 @@ export default class FileSender extends Nanobus {
xhr.onerror = () => reject(new Error(0));
xhr.ontimeout = () => reject(new Error(0));
xhr.open('post', `/api/password/${file.id}`);
- xhr.setRequestHeader(
- 'Authorization',
- `send-v1 ${arrayToB64(new Uint8Array(sig))}`
- );
+ xhr.setRequestHeader('Authorization', authHeader);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.responseType = 'json';
xhr.timeout = 2000;
diff --git a/app/main.js b/app/main.js
index 2c55e0ed..7f7e0402 100644
--- a/app/main.js
+++ b/app/main.js
@@ -1,3 +1,4 @@
+import 'fluent-intl-polyfill';
import app from './routes';
import locale from '../common/locales';
import fileManager from './fileManager';
diff --git a/app/metrics.js b/app/metrics.js
index 3f3adf4e..e469d12a 100644
--- a/app/metrics.js
+++ b/app/metrics.js
@@ -205,6 +205,16 @@ function stoppedUpload(params) {
});
}
+function changedDownloadLimit(params) {
+ return sendEvent('sender', 'download-limit-changed', {
+ cm1: params.size,
+ cm5: storage.totalUploads,
+ cm6: storage.files.length,
+ cm7: storage.totalDownloads,
+ cm8: params.dlimit
+ });
+}
+
function completedDownload(params) {
return sendEvent('recipient', 'download-stopped', {
cm1: params.size,
@@ -272,6 +282,7 @@ export {
cancelledUpload,
stoppedUpload,
completedUpload,
+ changedDownloadLimit,
deletedUpload,
startedDownload,
cancelledDownload,
diff --git a/app/templates/file.js b/app/templates/file.js
index 7fc665e9..881ef098 100644
--- a/app/templates/file.js
+++ b/app/templates/file.js
@@ -18,7 +18,9 @@ module.exports = function(file, state, emit) {
const remaining = timeLeft(ttl) || state.translate('linkExpiredAlt');
const row = html`
- ${file.name} |
+ ${file.name} |
+
+ ${translate(selected)}
+
+
+
+ ${options.map(
+ i =>
+ html`- ${
+ i
+ }
`
+ )}
+
+ `;
+};
diff --git a/app/templates/share.js b/app/templates/share.js
index 3efeb6bd..4869cb50 100644
--- a/app/templates/share.js
+++ b/app/templates/share.js
@@ -2,6 +2,7 @@ const html = require('choo/html');
const assets = require('../../common/assets');
const notFound = require('./notFound');
const uploadPassword = require('./uploadPassword');
+const selectbox = require('./selectbox');
const { allowedCopy, delay, fadeOut } = require('../utils');
function passwordComplete(state, password) {
@@ -14,6 +15,24 @@ function passwordComplete(state, password) {
return el;
}
+function expireInfo(file, translate, emit) {
+ const el = html([
+ `${translate('expireInfo', {
+ downloadCount: '',
+ timespan: translate('timespanHours', { number: 24 })
+ })} `
+ ]);
+ const select = el.querySelector('select');
+ const options = [1, 2, 3, 4, 5, 20];
+ const t = number => translate('downloadCount', { number });
+ const changed = value => emit('changeLimit', { file, value });
+ select.parentNode.replaceChild(
+ selectbox(file.dlimit || 1, options, t, changed),
+ select
+ );
+ return el;
+}
+
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
if (!file) {
@@ -27,7 +46,7 @@ module.exports = function(state, emit) {
: uploadPassword(state, emit);
const div = html`
- ${state.translate('uploadSuccessTimingHeader')}
+ ${expireInfo(file, state.translate, emit)}
${state.translate('copyUrlFormLabelWithName', {
diff --git a/assets/main.css b/assets/main.css
index fb2f6925..20a1a350 100644
--- a/assets/main.css
+++ b/assets/main.css
@@ -938,12 +938,11 @@ tbody {
#addPasswordWrapper label {
line-height: 20px;
cursor: pointer;
- position: relative;
- opacity: 0.6;
+ color: #737373;
}
#addPassword:checked + label {
- opacity: 1;
+ color: #000;
}
#addPasswordWrapper label::before {
@@ -985,6 +984,47 @@ tbody {
margin-left: 10px;
}
+.selectbox {
+ display: inline-block;
+ position: relative;
+ cursor: pointer;
+}
+
+.selectSelected {
+ cursor: pointer;
+}
+
+.selectOptions {
+ display: none;
+}
+
+.selectOptions.active {
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: 0;
+ margin: 40px 0;
+ background-color: white;
+ border: 1px solid rgba(12, 12, 13, 0.3);
+ border-radius: 4px;
+ box-shadow: 1px 2px 4px rgba(12, 12, 13, 0.3);
+}
+
+.selectOption {
+ color: #737373;
+ font-size: 12pt;
+ list-style: none;
+ user-select: none;
+ white-space: nowrap;
+ padding: 0 60px;
+ border-bottom: 1px solid rgba(12, 12, 13, 0.3);
+}
+
+.selectOption:hover {
+ background-color: #f4f4f4;
+}
+
@media (max-device-width: 992px), (max-width: 992px) {
.popup .popuptext {
left: auto;
diff --git a/docs/metrics.md b/docs/metrics.md
index 9006b347..abff9189 100644
--- a/docs/metrics.md
+++ b/docs/metrics.md
@@ -27,6 +27,7 @@ Data will be collected with Google Analytics and follow [Test Pilot standards](h
- `cm5` - the number of files the user has ever uploaded.
- `cm6` - the number of unexpired files the user has uploaded.
- `cm7` - the number of files the user has ever downloaded.
+- `cm8` - the number of downloads permitted by the uploader.
### Custom Dimensions
- `cd1` - the method by which the user initiated an upload. One of `drag`, `click`.
@@ -67,6 +68,17 @@ Triggered whenever a user stops uploading a file. Includes:
- `cd2`
- `cd6`
+#### `download-limit-changed`
+Triggered whenever the sender changes the download limit. Includes:
+
+- `ec` - `sender`
+- `ea` - `download-limit-changed`
+- `cm1`
+- `cm5`
+- `cm6`
+- `cm7`
+- `cm8`
+
#### `password-added`
Triggered whenever a password is added to a file. Includes:
diff --git a/package-lock.json b/package-lock.json
index 59ca7ad6..d6b5a7c8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -92,9 +92,9 @@
}
},
"ajv": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz",
- "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.0.tgz",
+ "integrity": "sha1-6yhAdG6dxIvV4GOjbj/UAMXqtak=",
"dev": true,
"requires": {
"co": "4.6.0",
@@ -245,9 +245,15 @@
"dev": true,
"requires": {
"define-properties": "1.1.2",
- "es-abstract": "1.9.0"
+ "es-abstract": "1.10.0"
}
},
+ "array-iterate": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.1.tgz",
+ "integrity": "sha1-hlv3+K851rCYLGCQKRSsdrwBCPY=",
+ "dev": true
+ },
"array-map": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
@@ -344,23 +350,31 @@
"dev": true
},
"autoprefixer": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz",
- "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==",
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.1.tgz",
+ "integrity": "sha512-lTbsa2X03maxG45xCNh30sJaRKDn8JPnanOeQOW3wvD9yPGmIsf041LHqlrZ1lXPF/1M3yTZKXqqYfmxU69xuQ==",
"dev": true,
"requires": {
- "browserslist": "2.8.0",
- "caniuse-lite": "1.0.30000760",
+ "browserslist": "2.9.1",
+ "caniuse-lite": "1.0.30000777",
"normalize-range": "0.1.2",
"num2fraction": "1.2.2",
"postcss": "6.0.14",
"postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "caniuse-lite": {
+ "version": "1.0.30000777",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000777.tgz",
+ "integrity": "sha1-McGKSozUl4LrswXI6Kk+azs+TxM=",
+ "dev": true
+ }
}
},
"aws-sdk": {
- "version": "2.149.0",
- "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.149.0.tgz",
- "integrity": "sha1-dvU3Iqd4C9sxkeg/J8EBCMb+mBM=",
+ "version": "2.162.0",
+ "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.162.0.tgz",
+ "integrity": "sha1-GxYhX8m1mbp80s/nzgUMf5NDgaY=",
"requires": {
"buffer": "4.9.1",
"crypto-browserify": "1.0.9",
@@ -407,7 +421,7 @@
"babel-traverse": "6.26.0",
"babel-types": "6.26.0",
"babylon": "6.18.0",
- "convert-source-map": "1.5.0",
+ "convert-source-map": "1.5.1",
"debug": "2.6.9",
"json5": "0.5.1",
"lodash": "4.17.4",
@@ -1009,9 +1023,9 @@
}
},
"babel-plugin-yo-yoify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-yo-yoify/-/babel-plugin-yo-yoify-1.0.1.tgz",
- "integrity": "sha512-apPjOzas8nhKR1GT1h8fuJhClS/BJck6+bVZph7rjrHYgLkrkEBQVpOQ7y1HydKgVEj2dL6BRNpp+nAJAj/Q7A==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-yo-yoify/-/babel-plugin-yo-yoify-1.0.2.tgz",
+ "integrity": "sha512-M2aJCgNknRGpwju5sEXeauAsb4Ior4zgwq8EbUigqEU1B4UETa1ySs64nZff9F2BNddzZ2c7h4ypGrck0ppmSA==",
"dev": true,
"requires": {
"@f/is-svg": "1.0.0",
@@ -1020,7 +1034,7 @@
"hyperx": "2.3.2",
"is-boolean-attribute": "0.0.1",
"normalize-html-whitespace": "0.2.0",
- "yo-yoify": "4.0.0"
+ "yo-yoify": "4.2.0"
}
},
"babel-polyfill": {
@@ -1075,7 +1089,7 @@
"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.8.0",
+ "browserslist": "2.9.1",
"invariant": "2.2.2",
"semver": "5.4.1"
}
@@ -1210,6 +1224,12 @@
"integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
"dev": true
},
+ "bail": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.2.tgz",
+ "integrity": "sha1-99bBcxYwqfnw1NNe0fli4gdKF2Q=",
+ "dev": true
+ },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -1244,9 +1264,9 @@
"dev": true
},
"binary-extensions": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz",
- "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=",
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
"dev": true
},
"bl": {
@@ -1317,7 +1337,7 @@
"deep-equal": "1.0.1",
"dns-equal": "1.0.0",
"dns-txt": "2.0.2",
- "multicast-dns": "6.1.1",
+ "multicast-dns": "6.2.1",
"multicast-dns-service-types": "1.1.0"
},
"dependencies": {
@@ -1441,29 +1461,21 @@
}
},
"browserify-zlib": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
- "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
"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
- }
+ "pako": "1.0.6"
}
},
"browserslist": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.8.0.tgz",
- "integrity": "sha512-iiWHM1Et6Q4TQpB7Ar6pxuM3TNMXasVJY4Y/oh3q38EwR3Z+IdZ9MyVf7PI4MJFB4xpwMcZgs9bEUnPG2E3TCA==",
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.9.1.tgz",
+ "integrity": "sha512-3n3nPdbUqn3nWmsy4PeSQthz2ja1ndpoXta+dwFFNhveGjMg6FXpWYe12vsTpNoXJbzx3j7GZXdtoVIdvh3JbA==",
"dev": true,
"requires": {
- "caniuse-lite": "1.0.30000760",
+ "caniuse-lite": "1.0.30000775",
"electron-to-chromium": "1.3.27"
}
},
@@ -1587,7 +1599,7 @@
"dev": true,
"requires": {
"browserslist": "1.7.7",
- "caniuse-db": "1.0.30000760",
+ "caniuse-db": "1.0.30000775",
"lodash.memoize": "4.1.2",
"lodash.uniq": "4.5.0"
},
@@ -1598,22 +1610,28 @@
"integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
"dev": true,
"requires": {
- "caniuse-db": "1.0.30000760",
+ "caniuse-db": "1.0.30000775",
"electron-to-chromium": "1.3.27"
}
}
}
},
"caniuse-db": {
- "version": "1.0.30000760",
- "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000760.tgz",
- "integrity": "sha1-PqKUc+t4psywny63Osnh3r/sUo0=",
+ "version": "1.0.30000775",
+ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000775.tgz",
+ "integrity": "sha1-BLzN0CFO3yW5f2GglmCfetaQQzM=",
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30000760",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000760.tgz",
- "integrity": "sha1-7HIDlXQvHH7IlH/W3SYE53qPmP8=",
+ "version": "1.0.30000775",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000775.tgz",
+ "integrity": "sha1-dNJ/7dxH88hM+8sTDDCSo168LeI=",
+ "dev": true
+ },
+ "ccount": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.2.tgz",
+ "integrity": "sha1-U7ai+BW7d7nChx97mnLDol8djok=",
"dev": true
},
"center-align": {
@@ -1638,6 +1656,36 @@
"supports-color": "2.0.0"
}
},
+ "character-entities": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.1.tgz",
+ "integrity": "sha1-92hxvl72bdt/j440eOzDdMJ9bco=",
+ "dev": true
+ },
+ "character-entities-html4": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.1.tgz",
+ "integrity": "sha1-NZoqSg9+KdPcKsmb2+Ie45Q46lA=",
+ "dev": true
+ },
+ "character-entities-legacy": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz",
+ "integrity": "sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8=",
+ "dev": true
+ },
+ "character-reference-invalid": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz",
+ "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=",
+ "dev": true
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
"chokidar": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
@@ -1646,7 +1694,7 @@
"requires": {
"anymatch": "1.3.2",
"async-each": "1.0.1",
- "fsevents": "1.1.2",
+ "fsevents": "1.1.3",
"glob-parent": "2.0.0",
"inherits": "2.0.3",
"is-binary-path": "1.0.1",
@@ -1673,17 +1721,17 @@
}
},
"choo": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/choo/-/choo-6.5.1.tgz",
- "integrity": "sha512-5nfyEn0b/AZqH4MOwCtwXbZKdMrd+5zyWwygXnOQvkiSn8wRtDFoyKUQW3qC4iuUlb77HnapL9s0NaJ6RWK+6A==",
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/choo/-/choo-6.6.0.tgz",
+ "integrity": "sha512-4WtzJhVVQFQm5SFc0Wfkbe0jOJK/hrUSG6Rxt68JE5Ctdg+fBucCM/PcM9Pg+1d8frOAn2qLX6z7SL6BeAiHJg==",
"requires": {
"bel": "5.1.5",
"document-ready": "2.0.1",
- "nanobus": "4.3.0",
+ "nanobus": "4.3.1",
"nanohref": "3.0.1",
"nanolocation": "1.0.0",
"nanomorph": "5.1.3",
- "nanoquery": "1.1.0",
+ "nanoquery": "1.2.0",
"nanoraf": "3.0.1",
"nanorouter": "2.1.0",
"nanotiming": "6.1.5",
@@ -1692,9 +1740,9 @@
}
},
"ci-info": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz",
- "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz",
+ "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==",
"dev": true
},
"cipher-base": {
@@ -1873,6 +1921,12 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
+ "collapse-white-space": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.3.tgz",
+ "integrity": "sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw=",
+ "dev": true
+ },
"color": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
@@ -1935,9 +1989,9 @@
}
},
"commander": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
- "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
+ "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
"dev": true
},
"commondir": {
@@ -2067,20 +2121,20 @@
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"convert-source-map": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz",
- "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
"dev": true
},
"convict": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/convict/-/convict-4.0.1.tgz",
- "integrity": "sha1-3yhunfaNik43icCfkvSdK6e51Z4=",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/convict/-/convict-4.0.2.tgz",
+ "integrity": "sha1-oVFl1DwhHRJfV8ZNKLxWHcKdNb4=",
"requires": {
"depd": "1.1.1",
"json5": "0.5.1",
"lodash.clonedeep": "4.5.0",
- "moment": "2.18.1",
+ "moment": "2.19.3",
"validator": "7.2.0",
"varify": "0.2.0",
"yargs-parser": "7.0.0"
@@ -2109,19 +2163,17 @@
"dev": true
},
"copy-webpack-plugin": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.2.0.tgz",
- "integrity": "sha512-eZERim02YjJcepLjrToQMapOoRLfiXewJi9zJON6xXNNJSUhkGzL1L/yFjOufS0KxsnWUzc2szg9t8ZaZKJXAg==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.2.3.tgz",
+ "integrity": "sha512-cL/Wl3Y1QmmKThl/mWeGB+HH3YH+25tn8nhqEGsZda4Yn7GqGnDZ+TbeKJ7A6zvrxyNhhuviYAxn/tCyyAqh8Q==",
"dev": true,
"requires": {
"bluebird": "3.5.1",
- "fs-extra": "4.0.2",
"glob": "7.1.2",
"is-glob": "4.0.0",
"loader-utils": "0.2.17",
"lodash": "4.17.4",
- "minimatch": "3.0.4",
- "node-dir": "0.1.17"
+ "minimatch": "3.0.4"
},
"dependencies": {
"loader-utils": {
@@ -2291,7 +2343,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -2460,7 +2512,7 @@
"dev": true,
"requires": {
"browserslist": "1.7.7",
- "caniuse-db": "1.0.30000760",
+ "caniuse-db": "1.0.30000775",
"normalize-range": "0.1.2",
"num2fraction": "1.2.2",
"postcss": "5.2.18",
@@ -2473,7 +2525,7 @@
"integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
"dev": true,
"requires": {
- "caniuse-db": "1.0.30000760",
+ "caniuse-db": "1.0.30000775",
"electron-to-chromium": "1.3.27"
}
},
@@ -2490,7 +2542,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -2551,7 +2603,7 @@
"integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
"dev": true,
"requires": {
- "es5-ext": "0.10.35"
+ "es5-ext": "0.10.37"
}
},
"dasherize": {
@@ -2713,6 +2765,16 @@
"randombytes": "2.0.5"
}
},
+ "dir-glob": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+ "dev": true,
+ "requires": {
+ "arrify": "1.0.1",
+ "path-type": "3.0.0"
+ }
+ },
"dns-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
@@ -2744,13 +2806,12 @@
}
},
"doctrine": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz",
- "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz",
+ "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==",
"dev": true,
"requires": {
- "esutils": "2.0.2",
- "isarray": "1.0.0"
+ "esutils": "2.0.2"
}
},
"document-ready": {
@@ -2764,8 +2825,8 @@
"integrity": "sha512-j2KwY4eJdysCnRY/CVYG3/cE0t5SEOCtGMvdfVLkcmyay9W43rmZbb4bOmkCN25aJ9EkkRhxCJe44uMt92WqgQ==",
"dev": true,
"requires": {
- "browserslist": "2.8.0",
- "caniuse-lite": "1.0.30000760",
+ "browserslist": "2.9.1",
+ "caniuse-lite": "1.0.30000775",
"css-rule-stream": "1.1.0",
"duplexer2": "0.0.2",
"jsonfilter": "1.1.2",
@@ -2814,6 +2875,24 @@
}
}
},
+ "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",
@@ -2826,11 +2905,45 @@
"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.4.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
+ "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0"
+ }
+ },
+ "domutils": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz",
+ "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=",
+ "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",
"integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g="
},
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
"double-ended-queue": {
"version": "2.1.0-0",
"resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz",
@@ -2906,6 +3019,12 @@
"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",
@@ -2925,9 +3044,9 @@
}
},
"es-abstract": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz",
- "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz",
+ "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==",
"dev": true,
"requires": {
"es-to-primitive": "1.1.1",
@@ -2949,9 +3068,9 @@
}
},
"es5-ext": {
- "version": "0.10.35",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz",
- "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=",
+ "version": "0.10.37",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz",
+ "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=",
"dev": true,
"requires": {
"es6-iterator": "2.0.3",
@@ -2965,7 +3084,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.35",
+ "es5-ext": "0.10.37",
"es6-symbol": "3.1.1"
}
},
@@ -2976,7 +3095,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.35",
+ "es5-ext": "0.10.37",
"es6-iterator": "2.0.3",
"es6-set": "0.1.5",
"es6-symbol": "3.1.1",
@@ -2996,7 +3115,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.35",
+ "es5-ext": "0.10.37",
"es6-iterator": "2.0.3",
"es6-symbol": "3.1.1",
"event-emitter": "0.3.5"
@@ -3009,7 +3128,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.35"
+ "es5-ext": "0.10.37"
}
},
"es6-templates": {
@@ -3029,7 +3148,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.35",
+ "es5-ext": "0.10.37",
"es6-iterator": "2.0.3",
"es6-symbol": "3.1.1"
}
@@ -3085,33 +3204,33 @@
}
},
"eslint": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz",
- "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==",
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.12.1.tgz",
+ "integrity": "sha512-28hOYej+NZ/R5H1yMvyKa1+bPlu+fnsIAQffK6hxXgvmXnImos2bA5XfCn5dYv2k2mrKj+/U/Z4L5ICWxC7TQw==",
"dev": true,
"requires": {
- "ajv": "5.3.0",
+ "ajv": "5.5.0",
"babel-code-frame": "6.26.0",
"chalk": "2.3.0",
"concat-stream": "1.6.0",
"cross-spawn": "5.1.0",
"debug": "3.1.0",
- "doctrine": "2.0.0",
+ "doctrine": "2.0.2",
"eslint-scope": "3.7.1",
- "espree": "3.5.1",
+ "espree": "3.5.2",
"esquery": "1.0.0",
"estraverse": "4.2.0",
"esutils": "2.0.2",
"file-entry-cache": "2.0.0",
"functional-red-black-tree": "1.0.1",
"glob": "7.1.2",
- "globals": "9.18.0",
+ "globals": "11.0.1",
"ignore": "3.3.7",
"imurmurhash": "0.1.4",
"inquirer": "3.3.0",
"is-resolvable": "1.0.0",
"js-yaml": "3.10.0",
- "json-stable-stringify": "1.0.1",
+ "json-stable-stringify-without-jsonify": "1.0.1",
"levn": "0.3.0",
"lodash": "4.17.4",
"minimatch": "3.0.4",
@@ -3170,6 +3289,12 @@
"integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
"dev": true
},
+ "globals": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.0.1.tgz",
+ "integrity": "sha1-Eqh7sBDlFUOWrMU14eQ/x1Ow5eg=",
+ "dev": true
+ },
"js-yaml": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
@@ -3249,9 +3374,9 @@
}
},
"espree": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz",
- "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=",
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz",
+ "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==",
"dev": true,
"requires": {
"acorn": "5.2.1",
@@ -3316,7 +3441,7 @@
"dev": true,
"requires": {
"d": "1.0.0",
- "es5-ext": "0.10.35"
+ "es5-ext": "0.10.37"
}
},
"event-stream": {
@@ -3418,9 +3543,9 @@
"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=",
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.4.tgz",
+ "integrity": "sha512-lweINkewAXcQtNjd7j1gO3cd8O/8lNYijsEwH4YZ+Dv3gT2Kh9/YvJov5Mdp2A75QIhgOvsSyRa/ZG3wYjNZpA==",
"dev": true
},
"express": {
@@ -3479,13 +3604,13 @@
"dev": true
},
"external-editor": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz",
- "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
+ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
"dev": true,
"requires": {
+ "chardet": "0.4.2",
"iconv-lite": "0.4.19",
- "jschardet": "1.6.0",
"tmp": "0.0.33"
}
},
@@ -3694,9 +3819,18 @@
"dev": true
},
"fluent": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/fluent/-/fluent-0.4.1.tgz",
- "integrity": "sha512-vatFe36jVjXclCYPRopLVB6oR5ceuKWnn6oVLIuLCnkdCb49RGuTznPdd51xATo+S83N9zLD1xsYf1Ma4s2VoQ=="
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/fluent/-/fluent-0.4.2.tgz",
+ "integrity": "sha512-P2w5DeSRYkq80J2VsuFC4SRZaG/jglAgVbHkUgLAaRoQtdDw6vdJjr36/ZH2zKk7bBwubGdIBuavNAhOVeuQxw=="
+ },
+ "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"
+ }
},
"fluent-langneg": {
"version": "0.1.0",
@@ -3786,14 +3920,16 @@
"dev": true
},
"fs-extra": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
- "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
+ "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": "4.0.0",
- "universalify": "0.1.1"
+ "jsonfile": "2.4.0",
+ "klaw": "1.3.1",
+ "path-is-absolute": "1.0.1",
+ "rimraf": "2.6.2"
}
},
"fs.realpath": {
@@ -3803,14 +3939,14 @@
"dev": true
},
"fsevents": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz",
- "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
+ "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
"dev": true,
"optional": true,
"requires": {
- "nan": "2.7.0",
- "node-pre-gyp": "0.6.36"
+ "nan": "2.8.0",
+ "node-pre-gyp": "0.6.39"
},
"dependencies": {
"abbrev": {
@@ -3968,7 +4104,6 @@
"version": "2.0.5",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"boom": "2.10.1"
}
@@ -4016,6 +4151,12 @@
"dev": true,
"optional": true
},
+ "detect-libc": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
"ecc-jsbn": {
"version": "0.1.1",
"bundled": true,
@@ -4157,7 +4298,6 @@
"version": "3.1.3",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"boom": "2.10.1",
"cryptiles": "2.0.5",
@@ -4329,11 +4469,13 @@
"optional": true
},
"node-pre-gyp": {
- "version": "0.6.36",
+ "version": "0.6.39",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
+ "detect-libc": "1.0.2",
+ "hawk": "3.1.3",
"mkdirp": "0.5.1",
"nopt": "4.0.1",
"npmlog": "4.1.0",
@@ -4541,7 +4683,6 @@
"version": "1.0.9",
"bundled": true,
"dev": true,
- "optional": true,
"requires": {
"hoek": "2.16.3"
}
@@ -5149,25 +5290,25 @@
"requires": {
"es6-templates": "0.2.3",
"fastparse": "1.1.1",
- "html-minifier": "3.5.6",
+ "html-minifier": "3.5.7",
"loader-utils": "1.1.0",
"object-assign": "4.1.1"
}
},
"html-minifier": {
- "version": "3.5.6",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.6.tgz",
- "integrity": "sha512-88FjtKrlak2XjczhxrBomgzV4jmGzM3UnHRBScRkJcmcRum0kb+IwhVAETJ8AVp7j0p3xugjSaw9L+RmI5/QOA==",
+ "version": "3.5.7",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz",
+ "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==",
"dev": true,
"requires": {
"camel-case": "3.0.0",
"clean-css": "4.1.9",
- "commander": "2.11.0",
+ "commander": "2.12.2",
"he": "1.1.1",
"ncname": "1.0.0",
"param-case": "2.1.1",
"relateurl": "0.2.7",
- "uglify-js": "3.1.8"
+ "uglify-js": "3.2.0"
}
},
"html-tags": {
@@ -5176,6 +5317,46 @@
"integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
"dev": true
},
+ "htmlparser2": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
+ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0",
+ "domhandler": "2.4.1",
+ "domutils": "1.6.2",
+ "entities": "1.1.1",
+ "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"
+ }
+ }
+ }
+ },
"http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
@@ -5244,9 +5425,9 @@
}
},
"https-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz",
- "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=",
+ "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": {
@@ -5407,7 +5588,7 @@
"chalk": "2.3.0",
"cli-cursor": "2.1.0",
"cli-width": "2.2.0",
- "external-editor": "2.0.5",
+ "external-editor": "2.1.0",
"figures": "2.0.0",
"lodash": "4.17.4",
"mute-stream": "0.0.7",
@@ -5488,9 +5669,13 @@
}
},
"interpret": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz",
- "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "intl-pluralrules": {
+ "version": "github:projectfluent/IntlPluralRules#94cb0fa1c23ad943bc5aafef43cea132fa51d68b",
"dev": true
},
"invariant": {
@@ -5531,6 +5716,28 @@
"integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
"dev": true
},
+ "is-alphabetical": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.1.tgz",
+ "integrity": "sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg=",
+ "dev": true
+ },
+ "is-alphanumeric": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
+ "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
+ "dev": true
+ },
+ "is-alphanumerical": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz",
+ "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=",
+ "dev": true,
+ "requires": {
+ "is-alphabetical": "1.0.1",
+ "is-decimal": "1.0.1"
+ }
+ },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -5543,7 +5750,7 @@
"integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
"dev": true,
"requires": {
- "binary-extensions": "1.10.0"
+ "binary-extensions": "1.11.0"
}
},
"is-boolean-attribute": {
@@ -5579,7 +5786,7 @@
"integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=",
"dev": true,
"requires": {
- "ci-info": "1.1.1"
+ "ci-info": "1.1.2"
}
},
"is-date-object": {
@@ -5588,6 +5795,12 @@
"integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
"dev": true
},
+ "is-decimal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz",
+ "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=",
+ "dev": true
+ },
"is-directory": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
@@ -5650,6 +5863,12 @@
"is-extglob": "2.1.1"
}
},
+ "is-hexadecimal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz",
+ "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=",
+ "dev": true
+ },
"is-number": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
@@ -5683,13 +5902,13 @@
"integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
"dev": true,
"requires": {
- "is-path-inside": "1.0.0"
+ "is-path-inside": "1.0.1"
}
},
"is-path-inside": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz",
- "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
"dev": true,
"requires": {
"path-is-inside": "1.0.2"
@@ -5776,12 +5995,24 @@
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
},
+ "is-whitespace-character": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz",
+ "integrity": "sha1-muAXbzKCtlRXoZks2whPil+DPjs=",
+ "dev": true
+ },
"is-windows": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz",
"integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=",
"dev": true
},
+ "is-word-character": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.1.tgz",
+ "integrity": "sha1-WgP6HqkazopusMfNdw64bWXIvvs=",
+ "dev": true
+ },
"is-wsl": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
@@ -5863,9 +6094,9 @@
"integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc="
},
"js-base64": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz",
- "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz",
+ "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==",
"dev": true
},
"js-tokens": {
@@ -5892,12 +6123,6 @@
}
}
},
- "jschardet": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz",
- "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ==",
- "dev": true
- },
"jsesc": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
@@ -5922,14 +6147,11 @@
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
"dev": true
},
- "json-stable-stringify": {
+ "json-stable-stringify-without-jsonify": {
"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"
- }
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
},
"json-stringify-safe": {
"version": "4.0.0",
@@ -5949,9 +6171,9 @@
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
},
"jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "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"
@@ -6180,7 +6402,7 @@
"requires": {
"app-root-path": "2.0.1",
"chalk": "2.3.0",
- "commander": "2.11.0",
+ "commander": "2.12.2",
"cosmiconfig": "1.1.0",
"execa": "0.8.0",
"is-glob": "4.0.0",
@@ -6611,15 +6833,15 @@
}
},
"loglevel": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.5.1.tgz",
- "integrity": "sha1-GJB4yUq5BT7iFaCs2/JCROoPZQI=",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.0.tgz",
+ "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=",
"dev": true
},
"lolex": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.0.tgz",
- "integrity": "sha512-rPO6R1t8PjYL6xbsFUg7aByKkWAql907na6powPBORVs4DCm8aMBUkL4+6CXO0gEIV8vtu3mWV0FB8ZaCYPBmA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.1.tgz",
+ "integrity": "sha512-mQuW55GhduF3ppo+ZRUTz1PRjEh1hS5BbqU7d8D0ez2OKxHDod7StPPeAVKisZR5aLkHZjdGWSL42LSONUJsZw==",
"dev": true
},
"longest": {
@@ -6628,6 +6850,12 @@
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
"dev": true
},
+ "longest-streak": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz",
+ "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==",
+ "dev": true
+ },
"loose-envify": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
@@ -6695,6 +6923,18 @@
"integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
"dev": true
},
+ "markdown-escapes": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.1.tgz",
+ "integrity": "sha1-GZTfLTr0gR3lmmcUk0wrIpJzRRg=",
+ "dev": true
+ },
+ "markdown-table": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.1.tgz",
+ "integrity": "sha1-Sz3ToTPRUYuO8NvHCb8qG0gkvIw=",
+ "dev": true
+ },
"math-expression-evaluator": {
"version": "1.2.17",
"resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
@@ -6729,6 +6969,16 @@
}
}
},
+ "mdast-util-compact": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz",
+ "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=",
+ "dev": true,
+ "requires": {
+ "unist-util-modify-children": "1.1.1",
+ "unist-util-visit": "1.2.0"
+ }
+ },
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -7105,9 +7355,9 @@
"dev": true
},
"moment": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
- "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8="
+ "version": "2.19.3",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.3.tgz",
+ "integrity": "sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8="
},
"moment-timezone": {
"version": "0.5.5",
@@ -7115,13 +7365,13 @@
"integrity": "sha1-odVBCnLBil8pPyouYocKgK1DLa4=",
"dev": true,
"requires": {
- "moment": "2.18.1"
+ "moment": "2.19.3"
}
},
"mozlog": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/mozlog/-/mozlog-2.1.1.tgz",
- "integrity": "sha1-JxCOChxQvOMuo3Q4kRiDrjdO77s=",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/mozlog/-/mozlog-2.2.0.tgz",
+ "integrity": "sha1-Rwk8XHEuKBDecnCYMFFk0SyK6SM=",
"requires": {
"intel": "1.2.0",
"merge": "1.2.0"
@@ -7133,9 +7383,9 @@
"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=",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.1.tgz",
+ "integrity": "sha512-uV3/ckdsffHx9IrGQrx613mturMdMqQ06WTq+C09NsStJ9iNG6RcUWgPKs1Rfjy+idZT6tfQoXEusGNnEZhT3w==",
"dev": true,
"requires": {
"dns-packet": "1.2.2",
@@ -7167,9 +7417,9 @@
"dev": true
},
"nan": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz",
- "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=",
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
+ "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
"dev": true,
"optional": true
},
@@ -7179,9 +7429,9 @@
"integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40="
},
"nanobus": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.3.0.tgz",
- "integrity": "sha512-M8ZN8fg9gidyGPJY0rWxHQbBlXs9Vy8afd/AuFqqVw65fYl3E/MVAQmTYg9VpLoCE/PGmHdGEEDHJ/7hkH3Ktg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.3.1.tgz",
+ "integrity": "sha512-fCWDlth+flNm4qfodfsQxLedeYzKWqURFd00sm6HcAkJtP12s6y9SrNWuu2+vXRUxiTIbBU+9TQjla8cKLyJqA==",
"requires": {
"nanotiming": "6.1.5",
"remove-array-items": "1.0.0"
@@ -7206,9 +7456,12 @@
}
},
"nanoquery": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/nanoquery/-/nanoquery-1.1.0.tgz",
- "integrity": "sha1-g6giCTNAygU9aW7IYKEKWsTDtEI="
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/nanoquery/-/nanoquery-1.2.0.tgz",
+ "integrity": "sha512-o4JC1cLsNSu8gLMLeALBFPzILMPyc3HltXT0727vncM29N1qB802oQyza3lQRjI9iylRRK0X5jjTjiPZyCw0gg==",
+ "requires": {
+ "nanoassert": "1.1.0"
+ }
},
"nanoraf": {
"version": "3.0.1",
@@ -7298,15 +7551,6 @@
"resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
"integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA="
},
- "node-dir": {
- "version": "0.1.17",
- "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
- "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=",
- "dev": true,
- "requires": {
- "minimatch": "3.0.4"
- }
- },
"node-forge": {
"version": "0.6.33",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz",
@@ -7314,21 +7558,21 @@
"dev": true
},
"node-libs-browser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz",
- "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
+ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
"dev": true,
"requires": {
"assert": "1.4.1",
- "browserify-zlib": "0.1.4",
+ "browserify-zlib": "0.2.0",
"buffer": "4.9.1",
"console-browserify": "1.1.0",
"constants-browserify": "1.0.0",
"crypto-browserify": "3.12.0",
"domain-browser": "1.1.7",
"events": "1.1.1",
- "https-browserify": "0.0.1",
- "os-browserify": "0.2.1",
+ "https-browserify": "1.0.0",
+ "os-browserify": "0.3.0",
"path-browserify": "0.0.0",
"process": "0.11.10",
"punycode": "1.3.2",
@@ -7336,7 +7580,7 @@
"readable-stream": "2.3.3",
"stream-browserify": "2.0.1",
"stream-http": "2.7.2",
- "string_decoder": "0.10.31",
+ "string_decoder": "1.0.3",
"timers-browserify": "2.0.4",
"tty-browserify": "0.0.0",
"url": "0.11.0",
@@ -7382,17 +7626,15 @@
"safe-buffer": "5.1.1",
"string_decoder": "1.0.3",
"util-deprecate": "1.0.2"
- },
- "dependencies": {
- "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"
- }
- }
+ }
+ },
+ "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": {
@@ -7545,7 +7787,7 @@
"integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=",
"dev": true,
"requires": {
- "commander": "2.11.0",
+ "commander": "2.12.2",
"npm-path": "2.0.3",
"which": "1.3.0"
}
@@ -7611,9 +7853,9 @@
"dev": true
},
"on-load": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/on-load/-/on-load-3.3.1.tgz",
- "integrity": "sha1-izj1t46ITuRXwFFpmdMB2BSw/qA=",
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/on-load/-/on-load-3.3.4.tgz",
+ "integrity": "sha512-WhwvSW0hZndA7HjN1O3AypgaAahFPTOmJ43bQUTQHsiHhtp9/kk+WlMnd/skqBkWuiNcQqNwKo2ZiwwRWStJIA==",
"dev": true,
"requires": {
"global": "4.3.2",
@@ -7722,9 +7964,9 @@
}
},
"os-browserify": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz",
- "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=",
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
"os-homedir": {
@@ -7822,6 +8064,20 @@
"pbkdf2": "3.0.14"
}
},
+ "parse-entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.1.tgz",
+ "integrity": "sha1-gRLYhHExnyerrk1klksSL+ThuJA=",
+ "dev": true,
+ "requires": {
+ "character-entities": "1.2.1",
+ "character-entities-legacy": "1.1.1",
+ "character-reference-invalid": "1.1.1",
+ "is-alphanumerical": "1.0.1",
+ "is-decimal": "1.0.1",
+ "is-hexadecimal": "1.0.1"
+ }
+ },
"parse-glob": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
@@ -8100,7 +8356,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8146,7 +8402,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8191,7 +8447,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8235,7 +8491,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8279,7 +8535,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8323,7 +8579,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8367,7 +8623,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8412,7 +8668,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8457,7 +8713,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8479,10 +8735,21 @@
}
}
},
+ "postcss-html": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.11.0.tgz",
+ "integrity": "sha512-ruCTbRZWY+qOV4FNYNm6E0ucIbCkkuYHIqQ4W3iSVIc1aUVBTKMG0iUo2nPUAG2lhFaTmfBaZ17017osZ18ddA==",
+ "dev": true,
+ "requires": {
+ "htmlparser2": "3.9.2",
+ "remark": "8.0.0",
+ "unist-util-find-all-after": "1.0.1"
+ }
+ },
"postcss-less": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.2.tgz",
- "integrity": "sha512-zRMQLHjD5BsnKOPAr+jCw3M5NoHoEANJ1xg8ftu0lpfRailrchh3spt9n6jFdBF/WGpI8Q+Ch21QnLlLaKGxnA==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.3.tgz",
+ "integrity": "sha512-WS0wsQxRm+kmN8wEYAGZ3t4lnoNfoyx9EJZrhiPR1K0lMHR0UNWnz52Ya5QRXChHtY75Ef+kDc05FpnBujebgw==",
"dev": true,
"requires": {
"postcss": "5.2.18"
@@ -8501,7 +8768,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8643,9 +8910,9 @@
}
},
"postcss-loader": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz",
- "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==",
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.9.tgz",
+ "integrity": "sha512-sgoXPtmgVT3aBAhU47Kig8oPF+mbXl8Unjvtz1Qj1q2D2EvSVJW2mKJNzxv5y/LvA9xWwuvdysvhc7Zn80UWWw==",
"dev": true,
"requires": {
"loader-utils": "1.1.0",
@@ -8684,7 +8951,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8728,7 +8995,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8769,7 +9036,7 @@
"integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
"dev": true,
"requires": {
- "caniuse-db": "1.0.30000760",
+ "caniuse-db": "1.0.30000775",
"electron-to-chromium": "1.3.27"
}
},
@@ -8786,7 +9053,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8838,7 +9105,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8883,7 +9150,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8930,7 +9197,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -8977,7 +9244,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9060,7 +9327,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9107,7 +9374,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9152,7 +9419,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9197,7 +9464,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9241,7 +9508,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9287,7 +9554,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9412,7 +9679,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9458,7 +9725,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9510,7 +9777,7 @@
"dev": true,
"requires": {
"chalk": "1.1.3",
- "js-base64": "2.3.2",
+ "js-base64": "2.4.0",
"source-map": "0.5.7",
"supports-color": "3.2.3"
}
@@ -9808,9 +10075,9 @@
}
},
"raven-js": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.19.1.tgz",
- "integrity": "sha512-E01uqSgP4JJIZNCaug2rV8g3JcIabLP09POLJ6wpM0oWftfnjqIWHYipUuscltCjQAxsPV3FFnMkW22/93qgig==",
+ "version": "3.20.1",
+ "resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.20.1.tgz",
+ "integrity": "sha512-Wr973Ipmd+dWUPQ6mSru/gyteavriEyP6G3iDZ2jpI3sBAWejtVtoXO5BHujEWB1z+/dqCLn+Zezgdc30xZcVA==",
"dev": true
},
"raw-body": {
@@ -10160,6 +10427,62 @@
"integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
"dev": true
},
+ "remark": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz",
+ "integrity": "sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw==",
+ "dev": true,
+ "requires": {
+ "remark-parse": "4.0.0",
+ "remark-stringify": "4.0.0",
+ "unified": "6.1.6"
+ }
+ },
+ "remark-parse": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz",
+ "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==",
+ "dev": true,
+ "requires": {
+ "collapse-white-space": "1.0.3",
+ "is-alphabetical": "1.0.1",
+ "is-decimal": "1.0.1",
+ "is-whitespace-character": "1.0.1",
+ "is-word-character": "1.0.1",
+ "markdown-escapes": "1.0.1",
+ "parse-entities": "1.1.1",
+ "repeat-string": "1.6.1",
+ "state-toggle": "1.0.0",
+ "trim": "0.0.1",
+ "trim-trailing-lines": "1.1.0",
+ "unherit": "1.1.0",
+ "unist-util-remove-position": "1.1.1",
+ "vfile-location": "2.0.2",
+ "xtend": "4.0.1"
+ }
+ },
+ "remark-stringify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-4.0.0.tgz",
+ "integrity": "sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w==",
+ "dev": true,
+ "requires": {
+ "ccount": "1.0.2",
+ "is-alphanumeric": "1.0.0",
+ "is-decimal": "1.0.1",
+ "is-whitespace-character": "1.0.1",
+ "longest-streak": "2.0.2",
+ "markdown-escapes": "1.0.1",
+ "markdown-table": "1.1.1",
+ "mdast-util-compact": "1.0.1",
+ "parse-entities": "1.1.1",
+ "repeat-string": "1.6.1",
+ "state-toggle": "1.0.0",
+ "stringify-entities": "1.3.1",
+ "unherit": "1.1.0",
+ "xtend": "4.0.1"
+ }
+ },
"remove-array-items": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/remove-array-items/-/remove-array-items-1.0.0.tgz",
@@ -10192,6 +10515,12 @@
"is-finite": "1.0.2"
}
},
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
"request": {
"version": "2.22.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.22.0.tgz",
@@ -10355,7 +10684,7 @@
"integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==",
"dev": true,
"requires": {
- "symbol-observable": "1.0.4"
+ "symbol-observable": "1.1.0"
}
},
"safe-buffer": {
@@ -10389,7 +10718,7 @@
"integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
"dev": true,
"requires": {
- "ajv": "5.3.0"
+ "ajv": "5.5.0"
}
},
"scroll-to-anchor": {
@@ -10561,7 +10890,7 @@
"dev": true,
"requires": {
"glob": "7.1.2",
- "interpret": "1.0.4",
+ "interpret": "1.1.0",
"rechoir": "0.6.2"
}
},
@@ -10580,7 +10909,7 @@
"diff": "3.2.0",
"formatio": "1.2.0",
"lodash.get": "4.4.2",
- "lolex": "2.3.0",
+ "lolex": "2.3.1",
"nise": "1.2.0",
"supports-color": "4.5.0",
"type-detect": "4.0.5"
@@ -10857,6 +11186,12 @@
"integrity": "sha1-15fhtVHKemOd7AI33G60u5vhfTU=",
"dev": true
},
+ "state-toggle": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.0.tgz",
+ "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=",
+ "dev": true
+ },
"statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
@@ -11008,7 +11343,7 @@
"dev": true,
"requires": {
"define-properties": "1.1.2",
- "es-abstract": "1.9.0",
+ "es-abstract": "1.10.0",
"function-bind": "1.1.1"
}
},
@@ -11017,6 +11352,18 @@
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
},
+ "stringify-entities": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.1.tgz",
+ "integrity": "sha1-sVDsLXKsTBtfMktR+2soyc3/BYw=",
+ "dev": true,
+ "requires": {
+ "character-entities-html4": "1.1.1",
+ "character-entities-legacy": "1.1.1",
+ "is-alphanumerical": "1.0.1",
+ "is-hexadecimal": "1.0.1"
+ }
+ },
"stringify-object": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.1.tgz",
@@ -11067,12 +11414,12 @@
"dev": true
},
"stylelint": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-8.2.0.tgz",
- "integrity": "sha512-57JWIz/1Uh9ehZMZyAqlFC0EDfQrMXCH8yqt8ZuJQQvV3LBKgAM/JYd+CWi1hC4eJtRODSPbIIBYKdGjkPZdMg==",
+ "version": "8.3.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-8.3.1.tgz",
+ "integrity": "sha512-v5K6tv+Ky3SoJfNqGOvgzRDLqZV133CZ7Wtu3y5aAGjQHVi+6dixFLgI82VrJZJdC4HwZplafJcRP+4r7EUt5g==",
"dev": true,
"requires": {
- "autoprefixer": "7.1.6",
+ "autoprefixer": "7.2.1",
"balanced-match": "1.0.0",
"chalk": "2.3.0",
"cosmiconfig": "3.1.0",
@@ -11080,7 +11427,7 @@
"execall": "1.0.0",
"file-entry-cache": "2.0.0",
"get-stdin": "5.0.1",
- "globby": "6.1.0",
+ "globby": "7.1.1",
"globjoin": "0.1.4",
"html-tags": "2.0.0",
"ignore": "3.3.7",
@@ -11094,13 +11441,14 @@
"normalize-selector": "0.2.0",
"pify": "3.0.0",
"postcss": "6.0.14",
- "postcss-less": "1.1.2",
+ "postcss-html": "0.11.0",
+ "postcss-less": "1.1.3",
"postcss-media-query-parser": "0.2.3",
"postcss-reporter": "5.0.0",
"postcss-resolve-nested-selector": "0.1.1",
"postcss-safe-parser": "3.0.1",
"postcss-scss": "1.0.2",
- "postcss-selector-parser": "2.2.3",
+ "postcss-selector-parser": "3.1.1",
"postcss-value-parser": "3.3.0",
"resolve-from": "4.0.0",
"specificity": "0.3.2",
@@ -11159,24 +11507,17 @@
"dev": true
},
"globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+ "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
"dev": true,
"requires": {
"array-union": "1.0.2",
+ "dir-glob": "2.0.0",
"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
- }
+ "ignore": "3.3.7",
+ "pify": "3.0.0",
+ "slash": "1.0.0"
}
},
"js-yaml": {
@@ -11198,6 +11539,17 @@
"error-ex": "1.3.1"
}
},
+ "postcss-selector-parser": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
+ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
+ "dev": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "indexes-of": "1.0.1",
+ "uniq": "1.0.1"
+ }
+ },
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -11239,7 +11591,7 @@
"doiuse": "4.0.0",
"lodash": "4.17.4",
"postcss": "6.0.14",
- "stylelint": "8.2.0"
+ "stylelint": "8.3.1"
}
},
"sugarss": {
@@ -11372,9 +11724,9 @@
"integrity": "sha1-tvmpANSWpX8CQI8iGYwQndoGMEE="
},
"symbol-observable": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz",
- "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.1.0.tgz",
+ "integrity": "sha512-dQoid9tqQ+uotGhuTKEY11X4xhyYePVnqGSoSm3OGKh2E8LZ6RPULp1uXTctk33IeERlrRJYoVSBglsL05F5Uw==",
"dev": true
},
"table": {
@@ -11383,7 +11735,7 @@
"integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
"dev": true,
"requires": {
- "ajv": "5.3.0",
+ "ajv": "5.5.0",
"ajv-keywords": "2.1.1",
"chalk": "2.3.0",
"lodash": "4.17.4",
@@ -11534,6 +11886,12 @@
"integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
"dev": true
},
+ "trim": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
+ "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
+ "dev": true
+ },
"trim-newlines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
@@ -11546,6 +11904,18 @@
"integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
"dev": true
},
+ "trim-trailing-lines": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz",
+ "integrity": "sha1-eu+7eAjfnWafbaLkOMrIxGradoQ=",
+ "dev": true
+ },
+ "trough": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.1.tgz",
+ "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=",
+ "dev": true
+ },
"tryit": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz",
@@ -11595,12 +11965,12 @@
"dev": true
},
"uglify-js": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.8.tgz",
- "integrity": "sha512-1lnTkrJWw6LJ7n43ZyYVXx0eN2PQh0c3Inb0nY/vj5fNfwykXQFif2kvNgm/Bf0ClLA8R6SKaMHFzo9io4Q+vg==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.0.tgz",
+ "integrity": "sha512-L98DlTshoPGnZGF8pr3MoE+CCo6n9joktHNHMPkckeBV8xTVc4CWtC0kGGhQsIvnX2Ug4nXFTAeE7SpTrPX2tg==",
"dev": true,
"requires": {
- "commander": "2.11.0",
+ "commander": "2.12.2",
"source-map": "0.6.1"
}
},
@@ -11619,7 +11989,7 @@
"requires": {
"source-map": "0.5.7",
"uglify-js": "2.8.29",
- "webpack-sources": "1.0.2"
+ "webpack-sources": "1.1.0"
},
"dependencies": {
"camelcase": {
@@ -11705,6 +12075,31 @@
"integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=",
"dev": true
},
+ "unherit": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz",
+ "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "unified": {
+ "version": "6.1.6",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz",
+ "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==",
+ "dev": true,
+ "requires": {
+ "bail": "1.0.2",
+ "extend": "3.0.1",
+ "is-plain-obj": "1.1.0",
+ "trough": "1.0.1",
+ "vfile": "2.3.0",
+ "x-is-function": "1.0.4",
+ "x-is-string": "0.1.0"
+ }
+ },
"uniq": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
@@ -11726,12 +12121,54 @@
"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=",
+ "unist-util-find-all-after": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.1.tgz",
+ "integrity": "sha1-TlUSq/734GFnga7Pex7XUcAK+Qg=",
+ "dev": true,
+ "requires": {
+ "unist-util-is": "2.1.1"
+ }
+ },
+ "unist-util-is": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.1.tgz",
+ "integrity": "sha1-DDEmKeP5YMZukx6BLT2A53AQlHs=",
"dev": true
},
+ "unist-util-modify-children": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz",
+ "integrity": "sha1-ZtfmpEnm9nIguXarPLi166w55R0=",
+ "dev": true,
+ "requires": {
+ "array-iterate": "1.1.1"
+ }
+ },
+ "unist-util-remove-position": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz",
+ "integrity": "sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs=",
+ "dev": true,
+ "requires": {
+ "unist-util-visit": "1.2.0"
+ }
+ },
+ "unist-util-stringify-position": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz",
+ "integrity": "sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw=",
+ "dev": true
+ },
+ "unist-util-visit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.2.0.tgz",
+ "integrity": "sha512-lI+jyPlDztHZ2CJhUchcRMQ7MNc0yASgYFxwRTxs0EZ+9HbYFBLVGDJ2FchTBy+pra0O1LVEn0Wkgf19mDVDzw==",
+ "dev": true,
+ "requires": {
+ "unist-util-is": "2.1.1"
+ }
+ },
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -11809,9 +12246,9 @@
"integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g=="
},
"val-loader": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/val-loader/-/val-loader-1.0.2.tgz",
- "integrity": "sha1-eQkZgJOzfLoKlr9PbSnelw0JnT0=",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/val-loader/-/val-loader-1.1.0.tgz",
+ "integrity": "sha512-8m62XF42FcfrBBl02rtDY9hQhDcDczrEcr60/aSMxlzJiXAcbAimRPvsDoDa5QcGAusOgOmVTpFtK5EbfZdDwA==",
"dev": true,
"requires": {
"loader-utils": "1.1.0"
@@ -11853,6 +12290,33 @@
"integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=",
"dev": true
},
+ "vfile": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
+ "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6",
+ "replace-ext": "1.0.0",
+ "unist-util-stringify-position": "1.1.1",
+ "vfile-message": "1.0.0"
+ }
+ },
+ "vfile-location": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.2.tgz",
+ "integrity": "sha1-02dcWch3SY5JK0dW/2Xkrxp1IlU=",
+ "dev": true
+ },
+ "vfile-message": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.0.tgz",
+ "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==",
+ "dev": true,
+ "requires": {
+ "unist-util-stringify-position": "1.1.1"
+ }
+ },
"vm-browserify": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
@@ -11902,32 +12366,32 @@
}
},
"webpack": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz",
- "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==",
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.9.1.tgz",
+ "integrity": "sha512-jONJ0l8nqgiQVkqs15O9TFWLozbFkCgVodVrBXBK/PIBFeGkaOGo30Ov57iQqYRwAWNDM5vyLPZYmAIpPa5QSw==",
"dev": true,
"requires": {
"acorn": "5.2.1",
"acorn-dynamic-import": "2.0.2",
- "ajv": "5.3.0",
+ "ajv": "5.5.0",
"ajv-keywords": "2.1.1",
"async": "2.6.0",
"enhanced-resolve": "3.4.1",
"escope": "3.6.0",
- "interpret": "1.0.4",
+ "interpret": "1.1.0",
"json-loader": "0.5.7",
"json5": "0.5.1",
"loader-runner": "2.3.0",
"loader-utils": "1.1.0",
"memory-fs": "0.4.1",
"mkdirp": "0.5.1",
- "node-libs-browser": "2.0.0",
+ "node-libs-browser": "2.1.0",
"source-map": "0.5.7",
"supports-color": "4.5.0",
"tapable": "0.2.8",
"uglifyjs-webpack-plugin": "0.4.6",
"watchpack": "1.4.0",
- "webpack-sources": "1.0.2",
+ "webpack-sources": "1.1.0",
"yargs": "8.0.2"
},
"dependencies": {
@@ -11958,16 +12422,24 @@
}
},
"webpack-dev-middleware": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz",
- "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=",
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
+ "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
"dev": true,
"requires": {
"memory-fs": "0.4.1",
- "mime": "1.4.1",
+ "mime": "1.6.0",
"path-is-absolute": "1.0.1",
"range-parser": "1.2.0",
"time-stamp": "2.0.0"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true
+ }
}
},
"webpack-dev-server": {
@@ -11988,7 +12460,7 @@
"http-proxy-middleware": "0.17.4",
"internal-ip": "1.2.0",
"ip": "1.1.5",
- "loglevel": "1.5.1",
+ "loglevel": "1.6.0",
"opn": "5.1.0",
"portfinder": "1.0.13",
"selfsigned": "1.10.1",
@@ -11998,7 +12470,7 @@
"spdy": "3.4.7",
"strip-ansi": "3.0.1",
"supports-color": "4.5.0",
- "webpack-dev-middleware": "1.12.0",
+ "webpack-dev-middleware": "1.12.2",
"yargs": "6.6.0"
},
"dependencies": {
@@ -12216,36 +12688,12 @@
"requires": {
"fs-extra": "0.30.0",
"lodash": "4.17.4"
- },
- "dependencies": {
- "fs-extra": {
- "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": "2.4.0",
- "klaw": "1.3.1",
- "path-is-absolute": "1.0.1",
- "rimraf": "2.6.2"
- }
- },
- "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"
- }
- }
}
},
"webpack-sources": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.2.tgz",
- "integrity": "sha512-Y7UddMCv6dGjy81nBv6nuQeFFIt5aalHm7uyDsAsW86nZwfOVPGRr3XMjEQLaT+WKo8rlzhC9qtbJvYKLtAwaw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
+ "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==",
"dev": true,
"requires": {
"source-list-map": "2.0.0",
@@ -12279,13 +12727,13 @@
"dev": true,
"requires": {
"http-parser-js": "0.4.9",
- "websocket-extensions": "0.1.2"
+ "websocket-extensions": "0.1.3"
}
},
"websocket-extensions": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz",
- "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=",
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
"dev": true
},
"whet.extend": {
@@ -12368,6 +12816,18 @@
"mkdirp": "0.5.1"
}
},
+ "x-is-function": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/x-is-function/-/x-is-function-1.0.4.tgz",
+ "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=",
+ "dev": true
+ },
+ "x-is-string": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
+ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
+ "dev": true
+ },
"x-xss-protection": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz",
@@ -12443,15 +12903,15 @@
}
},
"yo-yoify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yo-yoify/-/yo-yoify-4.0.0.tgz",
- "integrity": "sha512-Z02JF10NsAfmUnNRi2uTNWWSq2UNnsB94Fok6Nd/0hDwv0rZU2xdAWo6V0EvvEj/JYmeB4hy6TFVq+ECELmMvg==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/yo-yoify/-/yo-yoify-4.2.0.tgz",
+ "integrity": "sha512-ZgmFaE1nKw0ZIXu9Ag82A0mjFJtSDCp/qpxI2PSZTlePr+eAa0N5/5qWFwZFCw1t0MMv/RrGm/V751K2gq/MNQ==",
"dev": true,
"requires": {
"acorn": "5.2.1",
"falafel": "2.1.0",
"hyperx": "2.3.2",
- "on-load": "3.3.1",
+ "on-load": "3.3.4",
"through2": "2.0.3"
}
}
diff --git a/package.json b/package.json
index e6a76049..23c72ecf 100644
--- a/package.json
+++ b/package.json
@@ -43,39 +43,40 @@
"node": ">=8.2.0"
},
"devDependencies": {
- "autoprefixer": "^7.1.6",
+ "autoprefixer": "^7.2.1",
"babel-core": "^6.26.0",
"babel-loader": "^7.1.2",
- "babel-plugin-yo-yoify": "^1.0.1",
+ "babel-plugin-yo-yoify": "^1.0.2",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.6.1",
"babel-preset-es2015": "^6.24.1",
"babel-preset-stage-2": "^6.24.1",
"base64-js": "^1.2.1",
- "copy-webpack-plugin": "^4.2.0",
+ "copy-webpack-plugin": "^4.2.3",
"cross-env": "^5.1.1",
"css-loader": "^0.28.7",
"css-mqpacker": "^6.0.1",
"cssnano": "^3.10.0",
- "eslint": "^4.10.0",
+ "eslint": "^4.12.0",
"eslint-plugin-mocha": "^4.11.0",
"eslint-plugin-node": "^5.2.1",
"eslint-plugin-security": "^1.4.0",
- "expose-loader": "^0.7.3",
+ "expose-loader": "^0.7.4",
"extract-loader": "^1.0.1",
"file-loader": "^1.1.5",
+ "fluent-intl-polyfill": "^0.1.0",
"git-rev-sync": "^1.9.1",
"github-changes": "^1.1.1",
"html-loader": "^0.5.1",
"husky": "^0.14.3",
"lint-staged": "^4.3.0",
"mocha": "^3.5.3",
- "nanobus": "^4.3.0",
+ "nanobus": "^4.3.1",
"npm-run-all": "^4.1.2",
- "postcss-loader": "^2.0.8",
+ "postcss-loader": "^2.0.9",
"prettier": "^1.8.2",
"proxyquire": "^1.8.0",
- "raven-js": "^3.19.1",
+ "raven-js": "^3.20.1",
"redis-mock": "^0.20.0",
"require-from-string": "^2.0.1",
"rimraf": "^2.6.2",
@@ -86,16 +87,16 @@
"stylelint-no-unsupported-browser-features": "^1.0.1",
"supertest": "^3.0.0",
"testpilot-ga": "^0.3.0",
- "val-loader": "^1.0.2",
+ "val-loader": "^1.1.0",
"webpack": "^3.8.1",
"webpack-dev-server": "2.9.1",
"webpack-manifest-plugin": "^1.3.2",
"webpack-unassert-loader": "^1.2.0"
},
"dependencies": {
- "aws-sdk": "^2.149.0",
+ "aws-sdk": "^2.162.0",
"body-parser": "^1.18.2",
- "choo": "^6.5.1",
+ "choo": "^6.6.0",
"cldr-core": "^32.0.0",
"connect-busboy": "0.0.2",
"convict": "^4.0.1",
@@ -104,7 +105,7 @@
"fluent-langneg": "^0.1.0",
"helmet": "^3.9.0",
"mkdirp": "^0.5.1",
- "mozlog": "^2.1.1",
+ "mozlog": "^2.2.0",
"raven": "^2.2.1",
"redis": "^2.8.0"
},
diff --git a/public/locales/en-US/send.ftl b/public/locales/en-US/send.ftl
index 094908e5..2ae8093f 100644
--- a/public/locales/en-US/send.ftl
+++ b/public/locales/en-US/send.ftl
@@ -25,6 +25,15 @@ uploadingFileNotification = Notify me when the upload is complete.
uploadSuccessConfirmHeader = Ready to Send
uploadSvgAlt = Upload
uploadSuccessTimingHeader = The link to your file will expire after 1 download or in 24 hours.
+expireInfo = The link to your file will expire after { $downloadCount } or { $timespan }.
+downloadCount = { $number ->
+ [one] 1 download
+ *[other] { $number } downloads
+ }
+timespanHours = { $number ->
+ [one] 1 hour
+ *[other] { $number } hours
+ }
copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename }
copyUrlFormButton = Copy to clipboard
copiedUrl = Copied!
diff --git a/server/routes/delete.js b/server/routes/delete.js
index 00fac3e2..7e100db2 100644
--- a/server/routes/delete.js
+++ b/server/routes/delete.js
@@ -12,15 +12,15 @@ module.exports = async function(req, res) {
return;
}
- const delete_token = req.body.delete_token;
+ const ownerToken = req.body.owner_token || req.body.delete_token;
- if (!delete_token) {
+ if (!ownerToken) {
res.sendStatus(404);
return;
}
try {
- const err = await storage.delete(id, delete_token);
+ const err = await storage.delete(id, ownerToken);
if (!err) {
res.sendStatus(200);
}
diff --git a/server/routes/download.js b/server/routes/download.js
index 4a77febf..70e3792a 100644
--- a/server/routes/download.js
+++ b/server/routes/download.js
@@ -19,12 +19,12 @@ module.exports = async function(req, res) {
const hmac = crypto.createHmac('sha256', Buffer.from(meta.auth, 'base64'));
hmac.update(Buffer.from(meta.nonce, 'base64'));
const verifyHash = hmac.digest();
- const nonce = crypto.randomBytes(16).toString('base64');
- storage.setField(id, 'nonce', nonce);
if (!verifyHash.equals(Buffer.from(auth, 'base64'))) {
- res.set('WWW-Authenticate', `send-v1 ${nonce}`);
+ res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`);
return res.sendStatus(401);
}
+ const nonce = crypto.randomBytes(16).toString('base64');
+ storage.setField(id, 'nonce', nonce);
const contentLength = await storage.length(id);
res.writeHead(200, {
'Content-Disposition': 'attachment',
@@ -36,10 +36,16 @@ module.exports = async function(req, res) {
const file_stream = storage.get(id);
file_stream.on('end', async () => {
+ const dl = (+meta.dl || 0) + 1;
+ const dlimit = +meta.dlimit || 1;
try {
- await storage.forceDelete(id);
+ if (dl >= dlimit) {
+ await storage.forceDelete(id);
+ } else {
+ await storage.setField(id, 'dl', dl);
+ }
} catch (e) {
- log.info('DeleteError:', id);
+ log.info('StorageError:', id);
}
});
diff --git a/server/routes/index.js b/server/routes/index.js
index 7230d455..5ac3a49d 100644
--- a/server/routes/index.js
+++ b/server/routes/index.js
@@ -42,26 +42,32 @@ module.exports = function(app) {
force: !IS_DEV
})
);
- 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'", "'unsafe-inline'", 'https://code.cdn.mozilla.net'],
- fontSrc: ["'self'", 'https://code.cdn.mozilla.net'],
- formAction: ["'none'"],
- frameAncestors: ["'none'"],
- objectSrc: ["'none'"],
- reportUri: '/__cspreport__'
- }
- })
- );
+ if (!IS_DEV) {
+ 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'",
+ "'unsafe-inline'",
+ 'https://code.cdn.mozilla.net'
+ ],
+ fontSrc: ["'self'", 'https://code.cdn.mozilla.net'],
+ formAction: ["'none'"],
+ frameAncestors: ["'none'"],
+ objectSrc: ["'none'"],
+ reportUri: '/__cspreport__'
+ }
+ })
+ );
+ }
app.use(
busboy({
limits: {
@@ -88,6 +94,7 @@ module.exports = function(app) {
app.post('/api/upload', require('./upload'));
app.post('/api/delete/:id', require('./delete'));
app.post('/api/password/:id', require('./password'));
+ app.post('/api/params/:id', require('./params'));
app.get('/__version__', function(req, res) {
res.sendFile(require.resolve('../../dist/version.json'));
diff --git a/server/routes/metadata.js b/server/routes/metadata.js
index 0c774821..558e6a7b 100644
--- a/server/routes/metadata.js
+++ b/server/routes/metadata.js
@@ -17,12 +17,14 @@ module.exports = async function(req, res) {
const hmac = crypto.createHmac('sha256', Buffer.from(meta.auth, 'base64'));
hmac.update(Buffer.from(meta.nonce, 'base64'));
const verifyHash = hmac.digest();
+ if (!verifyHash.equals(Buffer.from(auth, 'base64'))) {
+ res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`);
+ return res.sendStatus(401);
+ }
const nonce = crypto.randomBytes(16).toString('base64');
storage.setField(id, 'nonce', nonce);
res.set('WWW-Authenticate', `send-v1 ${nonce}`);
- if (!verifyHash.equals(Buffer.from(auth, 'base64'))) {
- return res.sendStatus(401);
- }
+
const size = await storage.length(id);
const ttl = await storage.ttl(id);
res.send({
diff --git a/server/routes/params.js b/server/routes/params.js
new file mode 100644
index 00000000..2233f398
--- /dev/null
+++ b/server/routes/params.js
@@ -0,0 +1,32 @@
+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)) {
+ return res.sendStatus(404);
+ }
+ const ownerToken = req.body.owner_token;
+ if (!ownerToken) {
+ return res.sendStatus(400);
+ }
+
+ const dlimit = req.body.dlimit;
+ if (!dlimit || dlimit > 20) {
+ return res.sendStatus(400);
+ }
+
+ try {
+ const meta = await storage.metadata(id);
+ if (meta.owner !== ownerToken) {
+ return res.sendStatus(400);
+ }
+ storage.setField(id, 'dlimit', dlimit);
+ res.sendStatus(200);
+ } catch (e) {
+ res.sendStatus(404);
+ }
+};
diff --git a/server/routes/password.js b/server/routes/password.js
index 02be3d25..68d1125d 100644
--- a/server/routes/password.js
+++ b/server/routes/password.js
@@ -20,12 +20,13 @@ module.exports = async function(req, res) {
const hmac = crypto.createHmac('sha256', Buffer.from(meta.auth, 'base64'));
hmac.update(Buffer.from(meta.nonce, 'base64'));
const verifyHash = hmac.digest();
- const nonce = crypto.randomBytes(16).toString('base64');
- storage.setField(id, 'nonce', nonce);
if (!verifyHash.equals(Buffer.from(auth, 'base64'))) {
- res.set('WWW-Authenticate', `send-v1 ${nonce}`);
+ res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`);
return res.sendStatus(401);
}
+ const nonce = crypto.randomBytes(16).toString('base64');
+ storage.setField(id, 'nonce', nonce);
+ res.set('WWW-Authenticate', `send-v1 ${nonce}`);
} catch (e) {
res.sendStatus(404);
}
diff --git a/server/routes/upload.js b/server/routes/upload.js
index d23e8086..6dac96ae 100644
--- a/server/routes/upload.js
+++ b/server/routes/upload.js
@@ -12,9 +12,12 @@ module.exports = function(req, res) {
if (!metadata || !auth) {
return res.sendStatus(400);
}
-
+ const owner = crypto.randomBytes(10).toString('hex');
const meta = {
- delete: crypto.randomBytes(10).toString('hex'),
+ dlimit: 1,
+ dl: 0,
+ owner,
+ delete: owner, // delete is deprecated
metadata,
pwd: 0,
auth: auth.split(' ')[1],
@@ -30,7 +33,7 @@ module.exports = function(req, res) {
res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`);
res.json({
url,
- delete: meta.delete,
+ owner: meta.owner,
id: newId
});
} catch (e) {
diff --git a/server/storage.js b/server/storage.js
index 13bfeb47..87047a60 100644
--- a/server/storage.js
+++ b/server/storage.js
@@ -134,7 +134,7 @@ function localSet(newId, file, meta) {
redis_client.hmset(newId, meta);
redis_client.expire(newId, config.expire_seconds);
log.info('localSet:', 'Upload Finished of ' + newId);
- resolve(meta.delete);
+ resolve(meta.owner);
});
fstream.on('error', err => {
@@ -145,10 +145,10 @@ function localSet(newId, file, meta) {
});
}
-function localDelete(id, delete_token) {
+function localDelete(id, ownerToken) {
return new Promise((resolve, reject) => {
redis_client.hget(id, 'delete', (err, reply) => {
- if (!reply || delete_token !== reply) {
+ if (!reply || ownerToken !== reply) {
reject();
} else {
redis_client.del(id);
@@ -230,10 +230,10 @@ function awsSet(newId, file, meta) {
);
}
-function awsDelete(id, delete_token) {
+function awsDelete(id, ownerToken) {
return new Promise((resolve, reject) => {
redis_client.hget(id, 'delete', (err, reply) => {
- if (!reply || delete_token !== reply) {
+ if (!reply || ownerToken !== reply) {
reject();
} else {
const params = {
diff --git a/webpack.config.js b/webpack.config.js
index a89509d9..dbcf5f6e 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -51,7 +51,9 @@ module.exports = {
include: [
path.resolve(__dirname, 'app'),
path.resolve(__dirname, 'common'),
- path.resolve(__dirname, 'node_modules/testpilot-ga/src')
+ path.resolve(__dirname, 'node_modules/testpilot-ga/src'),
+ path.resolve(__dirname, 'node_modules/fluent-intl-polyfill'),
+ path.resolve(__dirname, 'node_modules/intl-pluralrules')
],
options: {
babelrc: false,
|