diff --git a/app/api/ada/lib/cardanoCrypto/cryptoWallet.js b/app/api/ada/lib/cardanoCrypto/cryptoWallet.js index 1f442acef1..c8f9a6a0cd 100644 --- a/app/api/ada/lib/cardanoCrypto/cryptoWallet.js +++ b/app/api/ada/lib/cardanoCrypto/cryptoWallet.js @@ -2,7 +2,7 @@ // Utility functions for handling the private master key -import bip39 from 'bip39'; +import { validateMnemonic, generateMnemonic } from 'bip39'; import { Logger, stringifyError } from '../../../../utils/logging'; @@ -17,17 +17,30 @@ import { RustModule } from './rustLoader'; declare var CONFIG : ConfigType; /** Generate a random mnemonic based on 160-bits of entropy (15 words) */ -export const generateAdaMnemonic = () => bip39.generateMnemonic(160).split(' '); +export const generateAdaMnemonic = () => generateMnemonic(160).split(' '); /** Check validty of mnemonic (including checksum) */ export const isValidEnglishAdaMnemonic = ( phrase: string, numberOfWords: ?number = 15 -) => ( +) => { // Note: splitting on spaces will not work for Japanese-encoded mnemonics who use \u3000 instead // We only use English mnemonics in Yoroi so this is okay. - phrase.split(' ').length === numberOfWords && bip39.validateMnemonic(phrase) -); + const split = phrase.split(' '); + if (split.length !== numberOfWords) { + return false; + } + /** + * Redemption mnemonics use 0-word menmonics. + * However, 9-word mnemonics were disallowed in a later version of BIP39 + * Since our bip39 library now considers all 9-word mnemonics invalid + * we just return true for backwards compatibility + */ + if (split.length === 9) { + return true; + } + return validateMnemonic(phrase); +}; /** Check validty of paper mnemonic (including checksum) */ export const isValidEnglishAdaPaperMnemonic = ( diff --git a/app/api/ada/lib/decrypt.js b/app/api/ada/lib/decrypt.js index 0e82caab39..1ec1a0d5ee 100644 --- a/app/api/ada/lib/decrypt.js +++ b/app/api/ada/lib/decrypt.js @@ -1,8 +1,9 @@ import aesjs from 'aes-js'; -import bip39 from 'bip39'; +import { validateMnemonic } from 'bip39'; import blakejs from 'blakejs'; import crypto from 'crypto'; -import validWords from 'bip39/wordlists/english.json'; +import validWords from 'bip39/src/wordlists/english.json'; +import { RustModule } from './cardanoCrypto/rustLoader'; const isBase64 = (string) => { const criteria = '(?:^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$)'; @@ -17,30 +18,15 @@ function decryptWithAES(aesKey, bytes) { return new aesjs.ModeOfOperation.ctr(aesKey, new aesjs.Counter(iv)).decrypt(bytes); // eslint-disable-line } -const hexChar = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; - -const hexToBytes = (s) => { - const arr = []; - if (s.length & 1 === 1) { // eslint-disable-line - throw new Error(`Wrong hex: ${s}`); - } - for (let i = 0; i < s.length / 2; ++i) { - const c1 = s[2 * i]; - const c2 = s[(2 * i) + 1]; - const i1 = hexChar.indexOf(c1); - const i2 = hexChar.indexOf(c2); - if (i1 === -1 || i2 === -1) throw new Error(`Wrong hex: ${s}`); - arr[i] = (i1 << 4) + i2; - } - return new Uint8Array(arr); -}; - const blake2b = (data) => blakejs.blake2b(data, null, 32); -const fromMnemonic = (words) => hexToBytes(bip39.mnemonicToEntropy(words, validWords)); +const fromMnemonic = (words) => { + const entropy = RustModule.Wallet.Entropy.from_english_mnemonics(words); + return new Uint8Array(entropy.to_array()); +}; export const isValidMnemonic = (phrase, numberOfWords = 9) => ( - (phrase.split(' ').length === numberOfWords && bip39.validateMnemonic(phrase, validWords)) + (phrase.split(' ').length === numberOfWords && validateMnemonic(phrase, validWords)) ); const hashData = (data) => { diff --git a/app/containers/transfer/DaedalusTransferPage.js b/app/containers/transfer/DaedalusTransferPage.js index 1cd6957c86..458e9fb3d6 100644 --- a/app/containers/transfer/DaedalusTransferPage.js +++ b/app/containers/transfer/DaedalusTransferPage.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import { observer } from 'mobx-react'; import { intlShape, defineMessages } from 'react-intl'; -import validWords from 'bip39/wordlists/english.json'; +import validWords from 'bip39/src/wordlists/english.json'; import type { InjectedProps } from '../../types/injectedPropsType'; import StaticTopbarTitle from '../../components/topbar/StaticTopbarTitle'; import TopBar from '../../components/topbar/TopBar'; diff --git a/app/containers/wallet/AdaRedemptionPage.js b/app/containers/wallet/AdaRedemptionPage.js index fbfc3b704d..a88afad216 100644 --- a/app/containers/wallet/AdaRedemptionPage.js +++ b/app/containers/wallet/AdaRedemptionPage.js @@ -7,7 +7,7 @@ import AdaRedemptionNoWallets from '../../components/wallet/ada-redemption/AdaRe import LoadingSpinner from '../../components/widgets/LoadingSpinner'; import { ADA_REDEMPTION_TYPES } from '../../types/redemptionTypes'; import { AdaRedemptionCertificateParseError } from '../../i18n/errors'; -import validWords from 'bip39/wordlists/english.json'; +import validWords from 'bip39/src/wordlists/english.json'; import { ROUTES } from '../../routes-config'; import environment from '../../environment'; diff --git a/app/containers/wallet/dialogs/WalletRestoreDialogContainer.js b/app/containers/wallet/dialogs/WalletRestoreDialogContainer.js index 3773a5937a..d00a8eb8fa 100644 --- a/app/containers/wallet/dialogs/WalletRestoreDialogContainer.js +++ b/app/containers/wallet/dialogs/WalletRestoreDialogContainer.js @@ -1,7 +1,7 @@ // @flow import React, { Component } from 'react'; import { observer } from 'mobx-react'; -import validWords from 'bip39/wordlists/english.json'; +import validWords from 'bip39/src/wordlists/english.json'; import WalletRestoreDialog from '../../../components/wallet/WalletRestoreDialog'; import type { InjectedDialogContainerProps } from '../../../types/injectedPropsType'; import environment from '../../../environment'; diff --git a/app/i18n/errors.js b/app/i18n/errors.js index 19c5d378a5..99a17ead16 100644 --- a/app/i18n/errors.js +++ b/app/i18n/errors.js @@ -3,7 +3,7 @@ import LocalizableError from './LocalizableError'; export class InvalidMnemonicError extends LocalizableError { constructor() { super({ - id: 'global.errors.invalidMnemonic', + id: 'api.errors.invalidMnemonicError', defaultMessage: '!!!Invalid phrase entered, please check.', }); } @@ -30,7 +30,7 @@ export class FieldRequiredError extends LocalizableError { export class AdaRedemptionCertificateParseError extends LocalizableError { constructor() { super({ - id: 'global.errors.AdaRedemptionCertificateParseError', + id: 'api.errors.AdaRedemptionCertificateParseError', defaultMessage: '!!!The ADA redemption code could not be parsed from the given document.', }); } diff --git a/app/i18n/locales/en-US.json b/app/i18n/locales/en-US.json index 5886a09f7d..69ad6d77de 100644 --- a/app/i18n/locales/en-US.json +++ b/app/i18n/locales/en-US.json @@ -65,6 +65,7 @@ "environment.apiVersion.cardano": "1.0.4", "environment.currency.ada": "ADA", "global.errors.fieldIsRequired": "This field is required.", + "global.errors.invalidEmail": "Invalid email entered, please check.", "global.errors.invalidMasterKey": "Invalid master key entered, please check.", "global.errors.invalidRepeatPassword": "Doesn't match.", "global.errors.invalidWalletName": "Wallet name requires at least 1 and at most 40 letters.", diff --git a/chrome/views/background.html b/chrome/views/background.html new file mode 100644 index 0000000000..2f7ec6d3b5 --- /dev/null +++ b/chrome/views/background.html @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/chrome/views/background.pug b/chrome/views/background.pug deleted file mode 100644 index 03f282a008..0000000000 --- a/chrome/views/background.pug +++ /dev/null @@ -1,6 +0,0 @@ -doctype html - -html - head - script(src='./js/vendor.js' charset="UTF-8") - script(src=env != 'development' ? '/js/background.bundle.js' : 'http://localhost:3000/js/background.bundle.js' charset="UTF-8") \ No newline at end of file diff --git a/chrome/views/main_window.html b/chrome/views/main_window.html new file mode 100644 index 0000000000..73065cd026 --- /dev/null +++ b/chrome/views/main_window.html @@ -0,0 +1,16 @@ + + + + Yoroi + + + +
+ +
+ + + diff --git a/chrome/views/main_window.pug b/chrome/views/main_window.pug deleted file mode 100644 index 5701a53c76..0000000000 --- a/chrome/views/main_window.pug +++ /dev/null @@ -1,15 +0,0 @@ -doctype html - -html - head - if env == 'development' - script(src="http://localhost:8097") - meta(charset='UTF-8') - title Yoroi - style. - body { width: 500px; } - - body - #root - script(src='./js/vendor.js' charset="UTF-8") - script(src=env != 'development' ? '/js/yoroi.bundle.js' : 'http://localhost:3000/js/yoroi.bundle.js' charset="UTF-8") \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f89d9a1d32..5d36eb2b51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1115,20 +1115,10 @@ } } }, - "@types/babel-types": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.6.tgz", - "integrity": "sha512-8zYZyy2kgwBXdz2j8Ix7LOghGiZbOiHf6vqmmBX1r76FdAzVNv7cODyJTEglUWiOdRnXh0s/o58neUwv5vaitQ==", - "dev": true - }, - "@types/babylon": { - "version": "6.16.5", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", - "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", - "dev": true, - "requires": { - "@types/babel-types": "7.0.6" - } + "@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" }, "@webassemblyjs/ast": { "version": "1.8.2", @@ -1405,17 +1395,6 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" }, - "align-text": { - "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", - "repeat-string": "1.6.1" - } - }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -1446,7 +1425,8 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -1843,6 +1823,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, "requires": { "arr-flatten": "1.1.0" } @@ -1850,7 +1831,8 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "arr-union": { "version": "3.1.0", @@ -1904,12 +1886,14 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asap": { "version": "2.0.6", @@ -2104,6 +2088,7 @@ "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", "esutils": "2.0.2", @@ -2113,12 +2098,14 @@ "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -2130,7 +2117,8 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, @@ -2158,6 +2146,7 @@ "version": "6.26.1", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, "requires": { "babel-messages": "6.23.0", "babel-runtime": "6.26.0", @@ -2172,7 +2161,8 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -2196,6 +2186,7 @@ "version": "23.6.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "dev": true, "requires": { "babel-plugin-istanbul": "4.1.6", "babel-preset-jest": "23.2.0" @@ -2217,6 +2208,7 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, "requires": { "babel-runtime": "6.26.0" } @@ -2231,6 +2223,7 @@ "version": "4.1.6", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, "requires": { "babel-plugin-syntax-object-rest-spread": "6.13.0", "find-up": "2.1.0", @@ -2241,7 +2234,8 @@ "babel-plugin-jest-hoist": { "version": "23.2.0", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", - "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=" + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true }, "babel-plugin-react-intl": { "version": "3.0.1", @@ -2257,7 +2251,8 @@ "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true }, "babel-plugin-transform-react-constant-elements": { "version": "6.23.0", @@ -2306,6 +2301,7 @@ "version": "23.2.0", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, "requires": { "babel-plugin-jest-hoist": "23.2.0", "babel-plugin-syntax-object-rest-spread": "6.13.0" @@ -2433,6 +2429,7 @@ "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.26.0", "babel-traverse": "6.26.0", @@ -2445,6 +2442,7 @@ "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.26.0", "babel-messages": "6.23.0", @@ -2461,6 +2459,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -2468,7 +2467,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -2476,6 +2476,7 @@ "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.26.0", "esutils": "2.0.2", @@ -2486,7 +2487,8 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true }, "balanced-match": { "version": "1.0.0", @@ -2638,14 +2640,14 @@ "dev": true }, "bip39": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.3.0.tgz", - "integrity": "sha1-5O5sbRvZDKAP/VetRGvfjAF/9IQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.0.tgz", + "integrity": "sha512-p1gHoZCAMfHRQLr57d/3AfillgPwV2nsBAnHpHUmr3BCRmThN9k18r5mUK/9R/zdFhZAlltYDzYe2GjnzXvMQA==", "requires": { + "@types/node": "11.11.6", "create-hash": "1.2.0", "pbkdf2": "3.0.17", - "randombytes": "2.1.0", - "unorm": "1.4.1" + "randombytes": "2.1.0" } }, "bl": { @@ -2746,6 +2748,12 @@ } } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", @@ -2783,6 +2791,7 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", @@ -3162,16 +3171,6 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "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" - } - }, "chai": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-3.2.0.tgz", @@ -3212,15 +3211,6 @@ "supports-color": "5.5.0" } }, - "character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "dev": true, - "requires": { - "is-regex": "1.0.4" - } - }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3770,18 +3760,6 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, - "constantinople": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", - "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", - "dev": true, - "requires": { - "@types/babel-types": "7.0.6", - "@types/babylon": "6.16.5", - "babel-types": "6.26.0", - "babylon": "6.18.0" - } - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -4091,6 +4069,18 @@ "source-list-map": "2.0.1" } }, + "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.3", + "domutils": "1.5.1", + "nth-check": "1.0.2" + } + }, "css-selector-tokenizer": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", @@ -4136,6 +4126,12 @@ } } }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, "cssesc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", @@ -4473,6 +4469,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, "requires": { "repeating": "2.0.1" } @@ -4509,11 +4506,24 @@ "esutils": "2.0.2" } }, - "doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", - "dev": true + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "0.4.0" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "1.3.1", + "entities": "1.1.2" + } }, "dom-walk": { "version": "0.1.1", @@ -4526,6 +4536,12 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -4535,6 +4551,25 @@ "webidl-conversions": "4.0.2" } }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1.3.1" + } + }, + "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.1", + "domelementtype": "1.3.1" + } + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -4681,6 +4716,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -4808,7 +4844,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.11.1", @@ -5249,7 +5286,8 @@ "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "etag": { "version": "1.8.1", @@ -5311,6 +5349,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -5319,6 +5358,7 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, "requires": { "fill-range": "2.2.4" } @@ -5456,6 +5496,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -5611,7 +5652,8 @@ "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true }, "fileset": { "version": "2.0.3", @@ -5627,6 +5669,7 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -5693,6 +5736,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { "locate-path": "2.0.0" } @@ -5804,12 +5848,14 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, "requires": { "for-in": "1.0.2" } @@ -6608,6 +6654,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -6617,6 +6664,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, "requires": { "is-glob": "2.0.1" } @@ -6648,7 +6696,8 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true }, "globby": { "version": "6.1.0", @@ -6707,7 +6756,8 @@ "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true }, "growly": { "version": "1.3.0", @@ -6761,6 +6811,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -6936,7 +6987,8 @@ "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true }, "html-encoding-sniffer": { "version": "1.0.2", @@ -6989,6 +7041,56 @@ } } }, + "html-webpack-harddisk-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/html-webpack-harddisk-plugin/-/html-webpack-harddisk-plugin-1.0.1.tgz", + "integrity": "sha512-GWfutTqfxOe53qEKocqAFrrLVP/EJbmJZDAS5jBBmALkfyc2aakoQkSgo3fitYJORWcN0Fi8ekuySxfffhhRYw==", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "html-webpack-plugin": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", + "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", + "dev": true, + "requires": { + "html-minifier": "3.5.21", + "loader-utils": "1.2.3", + "lodash": "4.17.11", + "pretty-error": "2.1.1", + "tapable": "1.1.1", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "1.3.1", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.2", + "inherits": "2.0.3", + "readable-stream": "3.3.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + } + } + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -7296,7 +7398,8 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-binary-path": { "version": "1.0.1", @@ -7370,48 +7473,35 @@ "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", - "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", "dev": true, "requires": { - "acorn": "4.0.13", - "object-assign": "4.1.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } + "is-primitive": "2.0.0" } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, "requires": { "number-is-nan": "1.0.1" } @@ -7438,6 +7528,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -7462,6 +7553,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, "requires": { "kind-of": "3.2.2" } @@ -7528,12 +7620,14 @@ "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true }, "is-promise": { "version": "2.1.0", @@ -7591,7 +7685,8 @@ "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, "is-windows": { "version": "1.0.2", @@ -7608,7 +7703,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", @@ -7620,6 +7716,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" } @@ -7688,7 +7785,8 @@ "istanbul-lib-coverage": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", - "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==" + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true }, "istanbul-lib-hook": { "version": "1.2.2", @@ -7703,6 +7801,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, "requires": { "babel-generator": "6.26.1", "babel-template": "6.26.0", @@ -8533,12 +8632,6 @@ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, - "js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", - "dev": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -8604,7 +8697,8 @@ "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true }, "json-parse-better-errors": { "version": "1.0.2", @@ -8830,16 +8924,6 @@ "verror": "1.10.0" } }, - "jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", - "dev": true, - "requires": { - "is-promise": "2.1.0", - "promise": "7.3.1" - } - }, "jsx-ast-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", @@ -8871,6 +8955,7 @@ "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.6" } @@ -8899,12 +8984,6 @@ "package-json": "4.0.1" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", @@ -8964,6 +9043,7 @@ "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.15", "parse-json": "2.2.0", @@ -8992,6 +9072,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -9071,12 +9152,6 @@ "version": "git://github.com/dcodeIO/long.js.git#8181a6b50a2a230f0b2a1e4c4093f9b9d19c8b69", "dev": true }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -9228,7 +9303,8 @@ "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true }, "md5": { "version": "2.2.1", @@ -9359,6 +9435,7 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -10003,6 +10080,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "requires": { "hosted-git-info": "2.7.1", "resolve": "1.10.0", @@ -10014,6 +10092,7 @@ "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" } @@ -10045,6 +10124,15 @@ "set-blocking": "2.0.0" } }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -10054,7 +10142,8 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true }, "nwsapi": { "version": "2.1.3", @@ -10156,6 +10245,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" @@ -10324,6 +10414,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, "requires": { "p-try": "1.0.0" } @@ -10332,6 +10423,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { "p-limit": "1.3.0" } @@ -10354,7 +10446,8 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true }, "package-json": { "version": "4.0.1", @@ -10454,6 +10547,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -10465,6 +10559,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, "requires": { "error-ex": "1.3.2" } @@ -10501,7 +10596,8 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -10524,7 +10620,8 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "path-to-regexp": { "version": "1.7.0", @@ -10545,6 +10642,7 @@ "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.15", "pify": "2.3.0", @@ -10587,17 +10685,20 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, "requires": { "pinkie": "2.0.4" } @@ -10778,7 +10879,18 @@ "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "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.3", + "utila": "0.4.0" + } }, "pretty-format": { "version": "23.6.0", @@ -10897,231 +11009,6 @@ "safe-buffer": "5.1.2" } }, - "pug": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz", - "integrity": "sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=", - "dev": true, - "requires": { - "pug-code-gen": "2.0.1", - "pug-filters": "3.1.0", - "pug-lexer": "4.0.0", - "pug-linker": "3.0.5", - "pug-load": "2.0.11", - "pug-parser": "5.0.0", - "pug-runtime": "2.0.4", - "pug-strip-comments": "1.0.3" - } - }, - "pug-attrs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.3.tgz", - "integrity": "sha1-owlflw5kFR972tlX7vVftdeQXRU=", - "dev": true, - "requires": { - "constantinople": "3.1.2", - "js-stringify": "1.0.2", - "pug-runtime": "2.0.4" - } - }, - "pug-cli": { - "version": "1.0.0-alpha6", - "resolved": "https://registry.npmjs.org/pug-cli/-/pug-cli-1.0.0-alpha6.tgz", - "integrity": "sha1-HKU56krA67ac5KroSu7V1k/+ZQE=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.20.0", - "mkdirp": "0.5.1", - "pug": "2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "pug-code-gen": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.1.tgz", - "integrity": "sha1-CVHsgyJddNjPxHan+Zolm199BQw=", - "dev": true, - "requires": { - "constantinople": "3.1.2", - "doctypes": "1.1.0", - "js-stringify": "1.0.2", - "pug-attrs": "2.0.3", - "pug-error": "1.3.2", - "pug-runtime": "2.0.4", - "void-elements": "2.0.1", - "with": "5.1.1" - } - }, - "pug-error": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz", - "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=", - "dev": true - }, - "pug-filters": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.0.tgz", - "integrity": "sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=", - "dev": true, - "requires": { - "clean-css": "4.2.1", - "constantinople": "3.1.2", - "jstransformer": "1.0.0", - "pug-error": "1.3.2", - "pug-walk": "1.1.7", - "resolve": "1.10.0", - "uglify-js": "2.8.29" - }, - "dependencies": { - "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" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "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" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "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" - } - } - } - }, - "pug-lexer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.0.0.tgz", - "integrity": "sha1-IQwYRX7y4XYCQnQMXmR715TOwng=", - "dev": true, - "requires": { - "character-parser": "2.2.0", - "is-expression": "3.0.0", - "pug-error": "1.3.2" - } - }, - "pug-linker": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.5.tgz", - "integrity": "sha1-npp65ABWgtAn3uuWsAD4juuDoC8=", - "dev": true, - "requires": { - "pug-error": "1.3.2", - "pug-walk": "1.1.7" - } - }, - "pug-load": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.11.tgz", - "integrity": "sha1-5kjlftET/iwfRdV4WOorrWvAFSc=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "pug-walk": "1.1.7" - } - }, - "pug-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.0.tgz", - "integrity": "sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=", - "dev": true, - "requires": { - "pug-error": "1.3.2", - "token-stream": "0.0.1" - } - }, - "pug-runtime": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.4.tgz", - "integrity": "sha1-4XjhvaaKsujArPybztLFT9iM61g=", - "dev": true - }, - "pug-strip-comments": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz", - "integrity": "sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=", - "dev": true, - "requires": { - "pug-error": "1.3.2" - } - }, - "pug-walk": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz", - "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM=", - "dev": true - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -11196,6 +11083,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, "requires": { "is-number": "4.0.0", "kind-of": "6.0.2", @@ -11205,12 +11093,14 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -11478,6 +11368,7 @@ "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.5.0", @@ -11488,6 +11379,7 @@ "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" @@ -11497,6 +11389,7 @@ "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" @@ -11506,6 +11399,7 @@ "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" } @@ -11927,6 +11821,7 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, "requires": { "is-equal-shallow": "0.1.3" } @@ -12012,22 +11907,39 @@ "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=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-converter": "0.2.0", + "htmlparser2": "3.10.1", + "strip-ansi": "3.0.1", + "utila": "0.4.0" + } }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true }, "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", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, "requires": { "is-finite": "1.0.2" } @@ -12095,7 +12007,8 @@ "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true }, "require-uncached": { "version": "1.0.3", @@ -12111,6 +12024,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, "requires": { "path-parse": "1.0.6" } @@ -12165,15 +12079,6 @@ "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" - } - }, "rimraf": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", @@ -13158,6 +13063,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.3" @@ -13166,12 +13072,14 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, "requires": { "spdx-exceptions": "2.2.0", "spdx-license-ids": "3.0.3" @@ -13180,7 +13088,8 @@ "spdx-license-ids": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==" + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true }, "split-string": { "version": "3.1.0", @@ -13447,6 +13356,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -13455,6 +13365,7 @@ "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" } @@ -13795,6 +13706,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, "requires": { "arrify": "1.0.1", "micromatch": "2.3.11", @@ -13914,7 +13826,8 @@ "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true }, "to-object-path": { "version": "0.3.0", @@ -13963,12 +13876,6 @@ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" }, - "token-stream": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", - "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=", - "dev": true - }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -14036,7 +13943,8 @@ "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true }, "true-case-path": { "version": "1.0.3", @@ -14128,13 +14036,6 @@ } } }, - "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 - }, "underscore": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", @@ -14521,6 +14422,12 @@ "object.getownpropertydescriptors": "2.0.3" } }, + "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.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -14543,6 +14450,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "requires": { "spdx-correct": "3.1.0", "spdx-expression-parse": "3.0.0" @@ -14584,12 +14492,6 @@ "indexof": "0.0.1" } }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, "w3c-hr-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", @@ -15335,41 +15237,6 @@ "execa": "1.0.0" } }, - "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", - "dev": true, - "requires": { - "acorn": "3.3.0", - "acorn-globals": "3.1.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "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 - } - } - } - } - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 862833449c..f1b70c462b 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "author": "IOHK & EMURGO", "license": "MIT", "devDependencies": { - "autoprefixer": "7.2.5", "@babel/core": "7.1.6", "@babel/plugin-proposal-class-properties": "7.1.0", "@babel/plugin-proposal-decorators": "7.1.6", @@ -66,8 +65,10 @@ "@babel/register": "7.0.0", "@babel/runtime": "7.1.5", "@babel/runtime-corejs2": "7.1.5", + "autoprefixer": "7.2.5", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.0.1", + "babel-jest": "23.6.0", "babel-loader": "8.0.4", "babel-plugin-add-module-exports": "0.2.1", "babel-plugin-react-intl": "3.0.1", @@ -93,6 +94,8 @@ "flow-typed": "2.5.1", "geckodriver": "1.14.1", "html-loader": "0.5.5", + "html-webpack-harddisk-plugin": "^1.0.1", + "html-webpack-plugin": "^4.0.0-beta.5", "jest": "23.6.0", "json-server": "0.13.0", "markdown-loader": "4.0.0", @@ -100,7 +103,6 @@ "mobx-react-devtools": "^6.0.3", "node-sass": "4.10.0", "postcss-loader": "3.0.0", - "pug-cli": "1.0.0-alpha6", "raw-loader": "0.5.1", "react-intl-translations-manager": "5.0.3", "rimraf": "2.4.3", @@ -110,7 +112,6 @@ "shelljs": "0.7.0", "style-loader": "0.23.1", "svg-inline-loader": "^0.8.0", - "terser-webpack-plugin": "^1.2.3", "url-loader": "1.1.2", "webpack": "4.29.4", "webpack-cli": "3.1.2", @@ -122,9 +123,8 @@ "@cardano-foundation/ledgerjs-hw-app-cardano": "1.0.6", "aes-js": "3.1.0", "axios": "0.18.0", - "babel-jest": "23.6.0", "bignumber.js": "4.0.0", - "bip39": "2.3.0", + "bip39": "3.0.0", "blakejs": "1.1.0", "bluebird": "3.3.4", "bs58": "4.0.1", diff --git a/scripts/tasks.js b/scripts/tasks.js index 71fdf72eaa..79dfb69cd4 100644 --- a/scripts/tasks.js +++ b/scripts/tasks.js @@ -21,5 +21,4 @@ exports.copyAssets = (type, env) => { cp('-R', 'dll/*', `${type}/js/`); cp('chrome/3rd-party/trezor/*.js', `${type}/js/`); cp('chrome/3rd-party/trezor/trezor-usb-permissions.html', `${type}/`); - exec(`./node_modules/.bin/pug -O "{ env: '${env}' }" -o ${type} chrome/views/`); }; diff --git a/webpack/development.config.js b/webpack/development.config.js index d74fbe8abe..961a752b04 100644 --- a/webpack/development.config.js +++ b/webpack/development.config.js @@ -3,6 +3,8 @@ const webpack = require('webpack'); const autoprefixer = require('autoprefixer'); const ConfigWebpackPlugin = require('config-webpack'); const shell = require('shelljs'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin'); const host = 'localhost'; const port = 3000; @@ -15,6 +17,13 @@ const baseDevConfig = () => ({ optimization: { // https://github.com/webpack/webpack/issues/7470 nodeEnv: false, + splitChunks: { + // the default delimiter ~ doesn't work with Terser + automaticNameDelimiter: '_', + chunks: 'all', + // Firefox require all files to be <4MBs + maxSize: 4000000, + } }, devtool: 'eval-source-map', entry: { @@ -43,9 +52,12 @@ const baseDevConfig = () => ({ output: { path: path.join(__dirname, '../dev/js'), filename: '[name].bundle.js', - webassemblyModuleFilename: '[modulehash].wasm', + // Need to so `HtmlWebpackPlugin` knows where to find the js bundles + publicPath: 'http://localhost:3000/js/' }, plugins: [ + /** We remove non-English languages from BIP39 to avoid triggering bad word filtering */ + new webpack.IgnorePlugin(/^\.\/(?!english)/, /bip39\/src\/wordlists$/), /** * We need CardanoWallet for flow to get the WASM binding types. * However, the flow definitions aren't available to webpack at runtime @@ -55,6 +67,27 @@ const baseDevConfig = () => ({ /CardanoWallet/, 'lodash/noop.js' ), + /** + * We use the HtmlWebpackPlugin to group back together the chunks inside the HTML + */ + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../dev/main_window.html'), + template: path.join(__dirname, '../chrome/views/main_window.html'), + chunks: ['yoroi'], + alwaysWriteToDisk: true + }), + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../dev/background.html'), + template: path.join(__dirname, '../chrome/views/background.html'), + chunks: ['background'], + alwaysWriteToDisk: true + }), + /** + * This plugin adds `alwaysWriteToDisk` to `HtmlWebpackPlugin`. + * We need this otherwise the HTML files are managed by in-memory only by our hot reloader + * But we need this written to disk so the extension can be loaded by Chrome + */ + new HtmlWebpackHarddiskPlugin(), new ConfigWebpackPlugin(), new webpack.DllReferencePlugin({ context: path.join(__dirname, '..', 'dll'), @@ -82,7 +115,7 @@ const baseDevConfig = () => ({ rules: [ { test: /\.js$/, - loader: 'babel-loader', + loader: 'babel-loader?cacheDirectory', exclude: /node_modules/ }, // Pdfjs Worker webpack config, reference to issue: https://github.com/mozilla/pdf.js/issues/7612#issuecomment-315179422 @@ -93,7 +126,7 @@ const baseDevConfig = () => ({ { test: /\.(js|jsx)$/, exclude: [/node_modules/, /pdf\.worker(\.min)?\.js$/], - use: 'babel-loader', + use: 'babel-loader?cacheDirectory', }, { test: /\.css$/, @@ -136,7 +169,7 @@ const baseDevConfig = () => ({ }, { test: /\.(eot|otf|ttf|woff|woff2|gif)$/, - loader: 'file-loader' + loader: 'file-loader', }, { test: /\.md$/, diff --git a/webpack/dll.config.js b/webpack/dll.config.js index d965424b9a..02f2637c58 100644 --- a/webpack/dll.config.js +++ b/webpack/dll.config.js @@ -13,20 +13,17 @@ module.exports = { optimization: { // https://github.com/webpack/webpack/issues/7470 nodeEnv: false, - splitChunks: { - chunks: 'all', - }, }, context: process.cwd(), resolve: { extensions: ['.js', '.jsx', '.json', '.less', '.css'], modules: [__dirname, 'node_modules'] }, - entry: { vendor: dependencies }, node: { + // need to remove "fs" library as we are not a nodejs application fs: 'empty' }, output: { @@ -36,6 +33,10 @@ module.exports = { }, plugins: [ + /** We remove non-English languages from BIP39 to avoid triggering bad word filtering */ + new webpack.IgnorePlugin(/^\.\/(?!english)/, /bip39\/src\/wordlists$/), + // creates a config file that will tell your main webpack config + // where to find the precompiled library code bundle new webpack.DllPlugin({ context: __dirname, name: '[name]', diff --git a/webpack/mainnet.config.js b/webpack/mainnet.config.js index 2dc0291ccc..df3a798757 100644 --- a/webpack/mainnet.config.js +++ b/webpack/mainnet.config.js @@ -3,6 +3,7 @@ const webpack = require('webpack'); const autoprefixer = require('autoprefixer'); const ConfigWebpackPlugin = require('config-webpack'); const shell = require('shelljs'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); const customPath = path.join(__dirname, './customPublicPath'); @@ -11,6 +12,13 @@ module.exports = { optimization: { // https://github.com/webpack/webpack/issues/7470 nodeEnv: false, + splitChunks: { + // the default delimiter ~ doesn't work with Terser + automaticNameDelimiter: '_', + chunks: 'all', + // Firefox require all files to be <4MBs + maxSize: 4000000, + } }, entry: { yoroi: [ @@ -24,9 +32,12 @@ module.exports = { }, output: { path: path.join(__dirname, '../build/js'), - filename: '[name].bundle.js' + filename: '[name].bundle.js', + publicPath: '/js/', }, plugins: [ + /** We remove non-English languages from BIP39 to avoid triggering bad word filtering */ + new webpack.IgnorePlugin(/^\.\/(?!english)/, /bip39\/src\/wordlists$/), /** * We need CardanoWallet for flow to get the WASM binding types. * However, the flow definitions aren't available to webpack at runtime @@ -36,10 +47,23 @@ module.exports = { /CardanoWallet/, 'lodash/noop.js' ), + /** + * We use the HtmlWebpackPlugin to group back together the chunks inside the HTML + */ + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../build/main_window.html'), + template: path.join(__dirname, '../chrome/views/main_window.html'), + chunks: ['yoroi'] + }), + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../build/background.html'), + template: path.join(__dirname, '../chrome/views/background.html'), + chunks: ['background'] + }), new ConfigWebpackPlugin(), new webpack.DllReferencePlugin({ context: path.join(__dirname, '..', 'dll'), - manifest: require('../dll/vendor-manifest.json') // eslint-disable-line + manifest: require('../dll/vendor-manifest.json') }), new webpack.optimize.OccurrenceOrderPlugin(), new webpack.IgnorePlugin(/[^/]+\/[\S]+.dev$/), @@ -114,7 +138,11 @@ module.exports = { }, { test: /\.(eot|otf|ttf|woff|woff2|gif)$/, - loader: 'file-loader' + loader: 'file-loader', + options: { + // Need to specify public path so assets can be loaded from static resources like CSS + publicPath: '/js/' + }, }, { test: /\.md$/, diff --git a/webpack/staging.config.js b/webpack/staging.config.js index 4f6eb3fbe3..bc0c3a8de5 100644 --- a/webpack/staging.config.js +++ b/webpack/staging.config.js @@ -3,6 +3,7 @@ const webpack = require('webpack'); const autoprefixer = require('autoprefixer'); const ConfigWebpackPlugin = require('config-webpack'); const shell = require('shelljs'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); const customPath = path.join(__dirname, './customPublicPath'); @@ -11,6 +12,13 @@ module.exports = { optimization: { // https://github.com/webpack/webpack/issues/7470 nodeEnv: false, + splitChunks: { + // the default delimiter ~ doesn't work with Terser + automaticNameDelimiter: '_', + chunks: 'all', + // Firefox require all files to be <4MBs + maxSize: 4000000, + } }, entry: { yoroi: [ @@ -24,9 +32,12 @@ module.exports = { }, output: { path: path.join(__dirname, '../build/js'), - filename: '[name].bundle.js' + filename: '[name].bundle.js', + publicPath: '/js/', }, plugins: [ + /** We remove non-English languages from BIP39 to avoid triggering bad word filtering */ + new webpack.IgnorePlugin(/^\.\/(?!english)/, /bip39\/src\/wordlists$/), /** * We need CardanoWallet for flow to get the WASM binding types. * However, the flow definitions aren't available to webpack at runtime @@ -36,10 +47,23 @@ module.exports = { /CardanoWallet/, 'lodash/noop.js' ), + /** + * We use the HtmlWebpackPlugin to group back together the chunks inside the HTML + */ + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../build/main_window.html'), + template: path.join(__dirname, '../chrome/views/main_window.html'), + chunks: ['yoroi'] + }), + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../build/background.html'), + template: path.join(__dirname, '../chrome/views/background.html'), + chunks: ['background'] + }), new ConfigWebpackPlugin(), new webpack.DllReferencePlugin({ context: path.join(__dirname, '..', 'dll'), - manifest: require('../dll/vendor-manifest.json') // eslint-disable-line + manifest: require('../dll/vendor-manifest.json') }), new webpack.optimize.OccurrenceOrderPlugin(), new webpack.IgnorePlugin(/[^/]+\/[\S]+.dev$/), @@ -114,7 +138,11 @@ module.exports = { }, { test: /\.(eot|otf|ttf|woff|woff2|gif)$/, - loader: 'file-loader' + loader: 'file-loader', + options: { + // Need to specify public path so assets can be loaded from static resources like CSS + publicPath: '/js/' + }, }, { test: /\.md$/, diff --git a/webpack/test.config.js b/webpack/test.config.js index d1930b6f6d..41111b6640 100644 --- a/webpack/test.config.js +++ b/webpack/test.config.js @@ -3,6 +3,7 @@ const webpack = require('webpack'); const autoprefixer = require('autoprefixer'); const ConfigWebpackPlugin = require('config-webpack'); const shell = require('shelljs'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); const customPath = path.join(__dirname, './customPublicPath'); @@ -11,6 +12,13 @@ module.exports = { optimization: { // https://github.com/webpack/webpack/issues/7470 nodeEnv: false, + splitChunks: { + // the default delimiter ~ doesn't work with Terser + automaticNameDelimiter: '_', + chunks: 'all', + // Firefox require all files to be <4MBs + maxSize: 4000000, + } }, entry: { yoroi: [ @@ -24,9 +32,12 @@ module.exports = { }, output: { path: path.join(__dirname, '../build/js'), - filename: '[name].bundle.js' + filename: '[name].bundle.js', + publicPath: '/js/', }, plugins: [ + /** We remove non-English languages from BIP39 to avoid triggering bad word filtering */ + new webpack.IgnorePlugin(/^\.\/(?!english)/, /bip39\/src\/wordlists$/), /** * We need CardanoWallet for flow to get the WASM binding types. * However, the flow definitions aren't available to webpack at runtime @@ -36,6 +47,19 @@ module.exports = { /CardanoWallet/, 'lodash/noop.js' ), + /** + * We use the HtmlWebpackPlugin to group back together the chunks inside the HTML + */ + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../build/main_window.html'), + template: path.join(__dirname, '../chrome/views/main_window.html'), + chunks: ['yoroi'] + }), + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../build/background.html'), + template: path.join(__dirname, '../chrome/views/background.html'), + chunks: ['background'] + }), new ConfigWebpackPlugin(), new webpack.DllReferencePlugin({ context: path.join(__dirname, '..', 'dll'), @@ -63,6 +87,7 @@ module.exports = { presets: [] } }, + // Pdfjs Worker webpack config, reference to issue: https://github.com/mozilla/pdf.js/issues/7612#issuecomment-315179422 { test: /pdf\.worker(\.min)?\.js$/, use: 'raw-loader', @@ -113,7 +138,11 @@ module.exports = { }, { test: /\.(eot|otf|ttf|woff|woff2|gif)$/, - loader: 'file-loader' + loader: 'file-loader', + options: { + // Need to specify public path so assets can be loaded from static resources like CSS + publicPath: '/js/' + }, }, { test: /\.md$/, diff --git a/webpack/testnet.config.js b/webpack/testnet.config.js index 63b2e5a336..0871cd0170 100644 --- a/webpack/testnet.config.js +++ b/webpack/testnet.config.js @@ -3,6 +3,7 @@ const webpack = require('webpack'); const autoprefixer = require('autoprefixer'); const ConfigWebpackPlugin = require('config-webpack'); const shell = require('shelljs'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); const customPath = path.join(__dirname, './customPublicPath'); @@ -11,6 +12,13 @@ module.exports = { optimization: { // https://github.com/webpack/webpack/issues/7470 nodeEnv: false, + splitChunks: { + // the default delimiter ~ doesn't work with Terser + automaticNameDelimiter: '_', + chunks: 'all', + // Firefox require all files to be <4MBs + maxSize: 4000000, + } }, entry: { yoroi: [ @@ -24,9 +32,12 @@ module.exports = { }, output: { path: path.join(__dirname, '../build/js'), - filename: '[name].bundle.js' + filename: '[name].bundle.js', + publicPath: '/js/', }, plugins: [ + /** We remove non-English languages from BIP39 to avoid triggering bad word filtering */ + new webpack.IgnorePlugin(/^\.\/(?!english)/, /bip39\/src\/wordlists$/), /** * We need CardanoWallet for flow to get the WASM binding types. * However, the flow definitions aren't available to webpack at runtime @@ -36,6 +47,19 @@ module.exports = { /CardanoWallet/, 'lodash/noop.js' ), + /** + * We use the HtmlWebpackPlugin to group back together the chunks inside the HTML + */ + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../build/main_window.html'), + template: path.join(__dirname, '../chrome/views/main_window.html'), + chunks: ['yoroi'] + }), + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '../build/background.html'), + template: path.join(__dirname, '../chrome/views/background.html'), + chunks: ['background'] + }), new ConfigWebpackPlugin(), new webpack.DllReferencePlugin({ context: path.join(__dirname, '..', 'dll'), @@ -114,7 +138,11 @@ module.exports = { }, { test: /\.(eot|otf|ttf|woff|woff2|gif)$/, - loader: 'file-loader' + loader: 'file-loader', + options: { + // Need to specify public path so assets can be loaded from static resources like CSS + publicPath: '/js/' + }, }, { test: /\.md$/,