diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-08-14 04:16:12 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-08-14 04:16:12 +0200 |
commit | d5bba630a35fff72b11273fb5e62c2208f9e1f5b (patch) | |
tree | 3397a580d663161be1ba7c46df368ac10d566cdc | |
parent | 419a05e801da688a1d0917a6bf16d468e6362a3d (diff) |
implement returning coins to user's account
-rw-r--r-- | src/checkable.ts | 5 | ||||
-rw-r--r-- | src/crypto/cryptoApi.ts | 6 | ||||
-rw-r--r-- | src/crypto/cryptoWorker.ts | 22 | ||||
-rw-r--r-- | src/i18n/de.po | 97 | ||||
-rw-r--r-- | src/i18n/en-US.po | 97 | ||||
-rw-r--r-- | src/i18n/fr.po | 97 | ||||
-rw-r--r-- | src/i18n/it.po | 97 | ||||
-rw-r--r-- | src/i18n/strings.ts | 36 | ||||
-rw-r--r-- | src/i18n/taler-wallet-webex.pot | 97 | ||||
-rw-r--r-- | src/query.ts | 40 | ||||
-rw-r--r-- | src/types.ts | 192 | ||||
-rw-r--r-- | src/wallet.ts | 369 | ||||
-rw-r--r-- | src/webex/messages.ts | 8 | ||||
-rw-r--r-- | src/webex/pages/confirm-create-reserve.html | 30 | ||||
-rw-r--r-- | src/webex/pages/popup.tsx | 44 | ||||
-rw-r--r-- | src/webex/pages/return-coins.html | 19 | ||||
-rw-r--r-- | src/webex/pages/return-coins.tsx | 271 | ||||
-rw-r--r-- | src/webex/style/wallet.css | 16 | ||||
-rw-r--r-- | src/webex/wxApi.ts | 27 | ||||
-rw-r--r-- | src/webex/wxBackend.ts | 17 | ||||
-rw-r--r-- | src/wire.ts | 53 | ||||
-rw-r--r-- | tsconfig.json | 1 | ||||
-rw-r--r-- | webpack.config.js | 5 | ||||
-rw-r--r-- | yarn.lock | 1012 |
24 files changed, 1832 insertions, 826 deletions
diff --git a/src/checkable.ts b/src/checkable.ts index 802d8f32d..e6ef99336 100644 --- a/src/checkable.ts +++ b/src/checkable.ts @@ -217,12 +217,11 @@ export namespace Checkable { type: target, }, ["(root)"]); if (opts.validate) { - const instance = new target(); - if (typeof instance.validate !== "function") { + if (target.validate !== "function") { throw Error("invalid Checkable annotion: validate method required"); } // May throw exception - instance.validate.call(cv); + target.validate(cv); } return cv; }; diff --git a/src/crypto/cryptoApi.ts b/src/crypto/cryptoApi.ts index 139f8ae88..227c3d346 100644 --- a/src/crypto/cryptoApi.ts +++ b/src/crypto/cryptoApi.ts @@ -26,8 +26,8 @@ import { AmountJson, CoinRecord, + ContractTerms, DenominationRecord, - ProposalRecord, PayCoinInfo, PaybackRequest, PreCoinRecord, @@ -277,9 +277,9 @@ export class CryptoApi { return this.doRpc<PayCoinInfo>("isValidPaymentSignature", 1, sig, contractHash, merchantPub); } - signDeposit(proposal: ProposalRecord, + signDeposit(contractTerms: ContractTerms, cds: CoinWithDenom[]): Promise<PayCoinInfo> { - return this.doRpc<PayCoinInfo>("signDeposit", 3, proposal, cds); + return this.doRpc<PayCoinInfo>("signDeposit", 3, contractTerms, cds); } createEddsaKeypair(): Promise<{priv: string, pub: string}> { diff --git a/src/crypto/cryptoWorker.ts b/src/crypto/cryptoWorker.ts index 507a080ac..b05d7d184 100644 --- a/src/crypto/cryptoWorker.ts +++ b/src/crypto/cryptoWorker.ts @@ -28,8 +28,8 @@ import { CoinPaySig, CoinRecord, CoinStatus, + ContractTerms, DenominationRecord, - ProposalRecord, PayCoinInfo, PaybackRequest, PreCoinRecord, @@ -39,6 +39,9 @@ import { WireFee, } from "../types"; import { + canonicalJson, +} from "../helpers"; +import { CoinWithDenom, } from "../wallet"; @@ -227,16 +230,17 @@ namespace RpcFunctions { * Generate updated coins (to store in the database) * and deposit permissions for each given coin. */ - export function signDeposit(proposal: ProposalRecord, + export function signDeposit(contractTerms: ContractTerms, cds: CoinWithDenom[]): PayCoinInfo { const ret: PayCoinInfo = []; + const contractTermsHash = hashString(canonicalJson(contractTerms)); const feeList: AmountJson[] = cds.map((x) => x.denom.feeDeposit); let fees = Amounts.add(Amounts.getZero(feeList[0].currency), ...feeList).amount; // okay if saturates - fees = Amounts.sub(fees, proposal.contractTerms.max_fee).amount; - const total = Amounts.add(fees, proposal.contractTerms.amount).amount; + fees = Amounts.sub(fees, contractTerms.max_fee).amount; + const total = Amounts.add(fees, contractTerms.amount).amount; const amountSpent = native.Amount.getZero(cds[0].coin.currentAmount.currency); const amountRemaining = new native.Amount(total); @@ -273,11 +277,11 @@ namespace RpcFunctions { amount_with_fee: coinSpend.toNbo(), coin_pub: native.EddsaPublicKey.fromCrock(cd.coin.coinPub), deposit_fee: new native.Amount(cd.denom.feeDeposit).toNbo(), - h_contract: native.HashCode.fromCrock(proposal.contractTermsHash), - h_wire: native.HashCode.fromCrock(proposal.contractTerms.H_wire), - merchant: native.EddsaPublicKey.fromCrock(proposal.contractTerms.merchant_pub), - refund_deadline: native.AbsoluteTimeNbo.fromTalerString(proposal.contractTerms.refund_deadline), - timestamp: native.AbsoluteTimeNbo.fromTalerString(proposal.contractTerms.timestamp), + h_contract: native.HashCode.fromCrock(contractTermsHash), + h_wire: native.HashCode.fromCrock(contractTerms.H_wire), + merchant: native.EddsaPublicKey.fromCrock(contractTerms.merchant_pub), + refund_deadline: native.AbsoluteTimeNbo.fromTalerString(contractTerms.refund_deadline), + timestamp: native.AbsoluteTimeNbo.fromTalerString(contractTerms.timestamp), }); const coinSig = native.eddsaSign(d.toPurpose(), diff --git a/src/i18n/de.po b/src/i18n/de.po index 5bf73c8ab..887dc2c47 100644 --- a/src/i18n/de.po +++ b/src/i18n/de.po @@ -56,67 +56,67 @@ msgid "" "wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:212 +#: src/webex/pages/confirm-create-reserve.tsx:213 #, fuzzy, c-format msgid "Withdrawal fees:" msgstr "Abheben bei %1$s" -#: src/webex/pages/confirm-create-reserve.tsx:213 +#: src/webex/pages/confirm-create-reserve.tsx:214 #, c-format msgid "Rounding loss:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:214 +#: src/webex/pages/confirm-create-reserve.tsx:215 #, c-format msgid "Earliest expiration (for deposit): %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:219 +#: src/webex/pages/confirm-create-reserve.tsx:220 #, c-format msgid "# Coins" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:220 +#: src/webex/pages/confirm-create-reserve.tsx:221 #, c-format msgid "Value" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:221 +#: src/webex/pages/confirm-create-reserve.tsx:222 #, fuzzy, c-format msgid "Withdraw Fee" msgstr "Abheben bei %1$s" -#: src/webex/pages/confirm-create-reserve.tsx:222 +#: src/webex/pages/confirm-create-reserve.tsx:223 #, c-format msgid "Refresh Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:223 +#: src/webex/pages/confirm-create-reserve.tsx:224 #, c-format msgid "Deposit Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:276 +#: src/webex/pages/confirm-create-reserve.tsx:278 #, c-format msgid "Select" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:292 +#: src/webex/pages/confirm-create-reserve.tsx:294 #, c-format msgid "Error: URL may not be relative" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:360 +#: src/webex/pages/confirm-create-reserve.tsx:362 #, c-format msgid "The exchange is trusted by the wallet.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:366 +#: src/webex/pages/confirm-create-reserve.tsx:368 #, c-format msgid "The exchange is audited by a trusted auditor.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:372 +#: src/webex/pages/confirm-create-reserve.tsx:374 #, c-format msgid "" "Warning: The exchange is neither directly trusted nor audited by a trusted " @@ -124,7 +124,7 @@ msgid "" "If you withdraw from this exchange, it will be trusted in the future.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:381 +#: src/webex/pages/confirm-create-reserve.tsx:383 #, c-format msgid "" "Using exchange provider%1$s.\n" @@ -132,151 +132,166 @@ msgid "" " %2$s in fees.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:395 +#: src/webex/pages/confirm-create-reserve.tsx:397 #, c-format msgid "" "Waiting for a response from\n" " %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:406 +#: src/webex/pages/confirm-create-reserve.tsx:408 #, c-format msgid "A problem occured, see below. %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:412 +#: src/webex/pages/confirm-create-reserve.tsx:414 #, c-format msgid "" "Information about fees will be available when an exchange provider is " "selected." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:455 +#: src/webex/pages/confirm-create-reserve.tsx:457 #, c-format msgid "Accept fees and withdraw" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:460 +#: src/webex/pages/confirm-create-reserve.tsx:462 #, c-format msgid "Change Exchange Provider" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:517 +#: src/webex/pages/confirm-create-reserve.tsx:519 #, c-format msgid "You are about to withdraw %1$s from your bank account into your wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:600 +#: src/webex/pages/confirm-create-reserve.tsx:607 #, c-format msgid "" "Oops, something went wrong. The wallet responded with error status (%1$s)." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:611 +#: src/webex/pages/confirm-create-reserve.tsx:616 #, c-format msgid "Checking URL, please wait ..." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:625 +#: src/webex/pages/confirm-create-reserve.tsx:630 #, c-format msgid "Can't parse amount: %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:632 +#: src/webex/pages/confirm-create-reserve.tsx:637 #, c-format msgid "Can't parse wire_types: %1$s" msgstr "" #. TODO:generic error reporting function or component. -#: src/webex/pages/confirm-create-reserve.tsx:652 +#: src/webex/pages/confirm-create-reserve.tsx:663 #, c-format msgid "Fatal error: \"%1$s\"." msgstr "" -#: src/webex/pages/popup.tsx:160 +#: src/webex/pages/popup.tsx:161 #, c-format msgid "Balance" msgstr "Saldo" -#: src/webex/pages/popup.tsx:163 +#: src/webex/pages/popup.tsx:164 #, c-format msgid "History" msgstr "Verlauf" -#: src/webex/pages/popup.tsx:166 +#: src/webex/pages/popup.tsx:167 #, c-format msgid "Debug" msgstr "Debug" -#: src/webex/pages/popup.tsx:242 +#: src/webex/pages/popup.tsx:247 #, c-format msgid "help" msgstr "" -#: src/webex/pages/popup.tsx:247 +#: src/webex/pages/popup.tsx:252 #, fuzzy, c-format msgid "" "You have no balance to show. Need some\n" " %1$s getting started?\n" msgstr "Sie haben kein Digitalgeld. Wollen Sie %1$s? abheben?" -#: src/webex/pages/popup.tsx:264 +#: src/webex/pages/popup.tsx:269 #, c-format msgid "%1$s incoming\n" msgstr "" -#: src/webex/pages/popup.tsx:277 +#: src/webex/pages/popup.tsx:282 #, c-format msgid "%1$s being spent\n" msgstr "" -#: src/webex/pages/popup.tsx:303 +#: src/webex/pages/popup.tsx:308 #, c-format msgid "Error: could not retrieve balance information." msgstr "" -#: src/webex/pages/popup.tsx:342 +#: src/webex/pages/popup.tsx:335 +#, c-format +msgid "Payback" +msgstr "" + +#: src/webex/pages/popup.tsx:336 +#, c-format +msgid "Return Electronic Cash to Bank Account" +msgstr "" + +#: src/webex/pages/popup.tsx:337 +#, c-format +msgid "Manage Trusted Auditors and Exchanges" +msgstr "" + +#: src/webex/pages/popup.tsx:349 #, fuzzy, c-format msgid "" "Bank requested reserve (%1$s) for\n" " %2$s.\n" msgstr "Bank bestätig anlegen der Reserve (%1$s) bei %2$s" -#: src/webex/pages/popup.tsx:353 +#: src/webex/pages/popup.tsx:360 #, fuzzy, c-format msgid "" "Started to withdraw\n" " %1$s from%2$s(%3$s).\n" msgstr "Reserve (%1$s) mit %2$s bei %3$s erzeugt" -#: src/webex/pages/popup.tsx:363 +#: src/webex/pages/popup.tsx:370 #, c-format msgid "Merchant%1$soffered contract%2$s;\n" msgstr "" -#: src/webex/pages/popup.tsx:373 +#: src/webex/pages/popup.tsx:380 #, fuzzy, c-format msgid "Withdrew%1$sfrom%2$s(%3$s).\n" msgstr "Reserve (%1$s) mit %2$s bei %3$s erzeugt" -#: src/webex/pages/popup.tsx:383 +#: src/webex/pages/popup.tsx:390 #, fuzzy, c-format msgid "" "Paid%1$sto merchant%2$s.\n" " (%3$s)\n" msgstr "Reserve (%1$s) mit %2$s bei %3$s erzeugt" -#: src/webex/pages/popup.tsx:392 +#: src/webex/pages/popup.tsx:399 #, c-format msgid "Unknown event (%1$s)" msgstr "" -#: src/webex/pages/popup.tsx:435 +#: src/webex/pages/popup.tsx:442 #, c-format msgid "Error: could not retrieve event history" msgstr "" -#: src/webex/pages/popup.tsx:469 +#: src/webex/pages/popup.tsx:476 #, c-format msgid "Your wallet has no events recorded." msgstr "Ihre Geldbörse verzeichnet keine Vorkommnisse." diff --git a/src/i18n/en-US.po b/src/i18n/en-US.po index e548014e6..ec879f580 100644 --- a/src/i18n/en-US.po +++ b/src/i18n/en-US.po @@ -56,67 +56,67 @@ msgid "" "wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:212 +#: src/webex/pages/confirm-create-reserve.tsx:213 #, c-format msgid "Withdrawal fees:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:213 +#: src/webex/pages/confirm-create-reserve.tsx:214 #, c-format msgid "Rounding loss:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:214 +#: src/webex/pages/confirm-create-reserve.tsx:215 #, c-format msgid "Earliest expiration (for deposit): %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:219 +#: src/webex/pages/confirm-create-reserve.tsx:220 #, c-format msgid "# Coins" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:220 +#: src/webex/pages/confirm-create-reserve.tsx:221 #, c-format msgid "Value" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:221 +#: src/webex/pages/confirm-create-reserve.tsx:222 #, c-format msgid "Withdraw Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:222 +#: src/webex/pages/confirm-create-reserve.tsx:223 #, c-format msgid "Refresh Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:223 +#: src/webex/pages/confirm-create-reserve.tsx:224 #, c-format msgid "Deposit Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:276 +#: src/webex/pages/confirm-create-reserve.tsx:278 #, c-format msgid "Select" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:292 +#: src/webex/pages/confirm-create-reserve.tsx:294 #, c-format msgid "Error: URL may not be relative" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:360 +#: src/webex/pages/confirm-create-reserve.tsx:362 #, c-format msgid "The exchange is trusted by the wallet.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:366 +#: src/webex/pages/confirm-create-reserve.tsx:368 #, c-format msgid "The exchange is audited by a trusted auditor.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:372 +#: src/webex/pages/confirm-create-reserve.tsx:374 #, c-format msgid "" "Warning: The exchange is neither directly trusted nor audited by a trusted " @@ -124,7 +124,7 @@ msgid "" "If you withdraw from this exchange, it will be trusted in the future.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:381 +#: src/webex/pages/confirm-create-reserve.tsx:383 #, c-format msgid "" "Using exchange provider%1$s.\n" @@ -132,151 +132,166 @@ msgid "" " %2$s in fees.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:395 +#: src/webex/pages/confirm-create-reserve.tsx:397 #, c-format msgid "" "Waiting for a response from\n" " %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:406 +#: src/webex/pages/confirm-create-reserve.tsx:408 #, c-format msgid "A problem occured, see below. %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:412 +#: src/webex/pages/confirm-create-reserve.tsx:414 #, c-format msgid "" "Information about fees will be available when an exchange provider is " "selected." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:455 +#: src/webex/pages/confirm-create-reserve.tsx:457 #, c-format msgid "Accept fees and withdraw" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:460 +#: src/webex/pages/confirm-create-reserve.tsx:462 #, c-format msgid "Change Exchange Provider" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:517 +#: src/webex/pages/confirm-create-reserve.tsx:519 #, c-format msgid "You are about to withdraw %1$s from your bank account into your wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:600 +#: src/webex/pages/confirm-create-reserve.tsx:607 #, c-format msgid "" "Oops, something went wrong. The wallet responded with error status (%1$s)." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:611 +#: src/webex/pages/confirm-create-reserve.tsx:616 #, c-format msgid "Checking URL, please wait ..." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:625 +#: src/webex/pages/confirm-create-reserve.tsx:630 #, c-format msgid "Can't parse amount: %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:632 +#: src/webex/pages/confirm-create-reserve.tsx:637 #, c-format msgid "Can't parse wire_types: %1$s" msgstr "" #. TODO:generic error reporting function or component. -#: src/webex/pages/confirm-create-reserve.tsx:652 +#: src/webex/pages/confirm-create-reserve.tsx:663 #, c-format msgid "Fatal error: \"%1$s\"." msgstr "" -#: src/webex/pages/popup.tsx:160 +#: src/webex/pages/popup.tsx:161 #, c-format msgid "Balance" msgstr "" -#: src/webex/pages/popup.tsx:163 +#: src/webex/pages/popup.tsx:164 #, c-format msgid "History" msgstr "" -#: src/webex/pages/popup.tsx:166 +#: src/webex/pages/popup.tsx:167 #, c-format msgid "Debug" msgstr "" -#: src/webex/pages/popup.tsx:242 +#: src/webex/pages/popup.tsx:247 #, c-format msgid "help" msgstr "" -#: src/webex/pages/popup.tsx:247 +#: src/webex/pages/popup.tsx:252 #, c-format msgid "" "You have no balance to show. Need some\n" " %1$s getting started?\n" msgstr "" -#: src/webex/pages/popup.tsx:264 +#: src/webex/pages/popup.tsx:269 #, c-format msgid "%1$s incoming\n" msgstr "" -#: src/webex/pages/popup.tsx:277 +#: src/webex/pages/popup.tsx:282 #, c-format msgid "%1$s being spent\n" msgstr "" -#: src/webex/pages/popup.tsx:303 +#: src/webex/pages/popup.tsx:308 #, c-format msgid "Error: could not retrieve balance information." msgstr "" -#: src/webex/pages/popup.tsx:342 +#: src/webex/pages/popup.tsx:335 +#, c-format +msgid "Payback" +msgstr "" + +#: src/webex/pages/popup.tsx:336 +#, c-format +msgid "Return Electronic Cash to Bank Account" +msgstr "" + +#: src/webex/pages/popup.tsx:337 +#, c-format +msgid "Manage Trusted Auditors and Exchanges" +msgstr "" + +#: src/webex/pages/popup.tsx:349 #, c-format msgid "" "Bank requested reserve (%1$s) for\n" " %2$s.\n" msgstr "" -#: src/webex/pages/popup.tsx:353 +#: src/webex/pages/popup.tsx:360 #, c-format msgid "" "Started to withdraw\n" " %1$s from%2$s(%3$s).\n" msgstr "" -#: src/webex/pages/popup.tsx:363 +#: src/webex/pages/popup.tsx:370 #, c-format msgid "Merchant%1$soffered contract%2$s;\n" msgstr "" -#: src/webex/pages/popup.tsx:373 +#: src/webex/pages/popup.tsx:380 #, c-format msgid "Withdrew%1$sfrom%2$s(%3$s).\n" msgstr "" -#: src/webex/pages/popup.tsx:383 +#: src/webex/pages/popup.tsx:390 #, c-format msgid "" "Paid%1$sto merchant%2$s.\n" " (%3$s)\n" msgstr "" -#: src/webex/pages/popup.tsx:392 +#: src/webex/pages/popup.tsx:399 #, c-format msgid "Unknown event (%1$s)" msgstr "" -#: src/webex/pages/popup.tsx:435 +#: src/webex/pages/popup.tsx:442 #, c-format msgid "Error: could not retrieve event history" msgstr "" -#: src/webex/pages/popup.tsx:469 +#: src/webex/pages/popup.tsx:476 #, c-format msgid "Your wallet has no events recorded." msgstr "" diff --git a/src/i18n/fr.po b/src/i18n/fr.po index da860ad8f..705b1cba6 100644 --- a/src/i18n/fr.po +++ b/src/i18n/fr.po @@ -56,67 +56,67 @@ msgid "" "wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:212 +#: src/webex/pages/confirm-create-reserve.tsx:213 #, c-format msgid "Withdrawal fees:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:213 +#: src/webex/pages/confirm-create-reserve.tsx:214 #, c-format msgid "Rounding loss:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:214 +#: src/webex/pages/confirm-create-reserve.tsx:215 #, c-format msgid "Earliest expiration (for deposit): %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:219 +#: src/webex/pages/confirm-create-reserve.tsx:220 #, c-format msgid "# Coins" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:220 +#: src/webex/pages/confirm-create-reserve.tsx:221 #, c-format msgid "Value" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:221 +#: src/webex/pages/confirm-create-reserve.tsx:222 #, c-format msgid "Withdraw Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:222 +#: src/webex/pages/confirm-create-reserve.tsx:223 #, c-format msgid "Refresh Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:223 +#: src/webex/pages/confirm-create-reserve.tsx:224 #, c-format msgid "Deposit Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:276 +#: src/webex/pages/confirm-create-reserve.tsx:278 #, c-format msgid "Select" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:292 +#: src/webex/pages/confirm-create-reserve.tsx:294 #, c-format msgid "Error: URL may not be relative" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:360 +#: src/webex/pages/confirm-create-reserve.tsx:362 #, c-format msgid "The exchange is trusted by the wallet.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:366 +#: src/webex/pages/confirm-create-reserve.tsx:368 #, c-format msgid "The exchange is audited by a trusted auditor.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:372 +#: src/webex/pages/confirm-create-reserve.tsx:374 #, c-format msgid "" "Warning: The exchange is neither directly trusted nor audited by a trusted " @@ -124,7 +124,7 @@ msgid "" "If you withdraw from this exchange, it will be trusted in the future.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:381 +#: src/webex/pages/confirm-create-reserve.tsx:383 #, c-format msgid "" "Using exchange provider%1$s.\n" @@ -132,151 +132,166 @@ msgid "" " %2$s in fees.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:395 +#: src/webex/pages/confirm-create-reserve.tsx:397 #, c-format msgid "" "Waiting for a response from\n" " %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:406 +#: src/webex/pages/confirm-create-reserve.tsx:408 #, c-format msgid "A problem occured, see below. %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:412 +#: src/webex/pages/confirm-create-reserve.tsx:414 #, c-format msgid "" "Information about fees will be available when an exchange provider is " "selected." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:455 +#: src/webex/pages/confirm-create-reserve.tsx:457 #, c-format msgid "Accept fees and withdraw" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:460 +#: src/webex/pages/confirm-create-reserve.tsx:462 #, c-format msgid "Change Exchange Provider" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:517 +#: src/webex/pages/confirm-create-reserve.tsx:519 #, c-format msgid "You are about to withdraw %1$s from your bank account into your wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:600 +#: src/webex/pages/confirm-create-reserve.tsx:607 #, c-format msgid "" "Oops, something went wrong. The wallet responded with error status (%1$s)." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:611 +#: src/webex/pages/confirm-create-reserve.tsx:616 #, c-format msgid "Checking URL, please wait ..." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:625 +#: src/webex/pages/confirm-create-reserve.tsx:630 #, c-format msgid "Can't parse amount: %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:632 +#: src/webex/pages/confirm-create-reserve.tsx:637 #, c-format msgid "Can't parse wire_types: %1$s" msgstr "" #. TODO:generic error reporting function or component. -#: src/webex/pages/confirm-create-reserve.tsx:652 +#: src/webex/pages/confirm-create-reserve.tsx:663 #, c-format msgid "Fatal error: \"%1$s\"." msgstr "" -#: src/webex/pages/popup.tsx:160 +#: src/webex/pages/popup.tsx:161 #, c-format msgid "Balance" msgstr "" -#: src/webex/pages/popup.tsx:163 +#: src/webex/pages/popup.tsx:164 #, c-format msgid "History" msgstr "" -#: src/webex/pages/popup.tsx:166 +#: src/webex/pages/popup.tsx:167 #, c-format msgid "Debug" msgstr "" -#: src/webex/pages/popup.tsx:242 +#: src/webex/pages/popup.tsx:247 #, c-format msgid "help" msgstr "" -#: src/webex/pages/popup.tsx:247 +#: src/webex/pages/popup.tsx:252 #, c-format msgid "" "You have no balance to show. Need some\n" " %1$s getting started?\n" msgstr "" -#: src/webex/pages/popup.tsx:264 +#: src/webex/pages/popup.tsx:269 #, c-format msgid "%1$s incoming\n" msgstr "" -#: src/webex/pages/popup.tsx:277 +#: src/webex/pages/popup.tsx:282 #, c-format msgid "%1$s being spent\n" msgstr "" -#: src/webex/pages/popup.tsx:303 +#: src/webex/pages/popup.tsx:308 #, c-format msgid "Error: could not retrieve balance information." msgstr "" -#: src/webex/pages/popup.tsx:342 +#: src/webex/pages/popup.tsx:335 +#, c-format +msgid "Payback" +msgstr "" + +#: src/webex/pages/popup.tsx:336 +#, c-format +msgid "Return Electronic Cash to Bank Account" +msgstr "" + +#: src/webex/pages/popup.tsx:337 +#, c-format +msgid "Manage Trusted Auditors and Exchanges" +msgstr "" + +#: src/webex/pages/popup.tsx:349 #, c-format msgid "" "Bank requested reserve (%1$s) for\n" " %2$s.\n" msgstr "" -#: src/webex/pages/popup.tsx:353 +#: src/webex/pages/popup.tsx:360 #, c-format msgid "" "Started to withdraw\n" " %1$s from%2$s(%3$s).\n" msgstr "" -#: src/webex/pages/popup.tsx:363 +#: src/webex/pages/popup.tsx:370 #, c-format msgid "Merchant%1$soffered contract%2$s;\n" msgstr "" -#: src/webex/pages/popup.tsx:373 +#: src/webex/pages/popup.tsx:380 #, c-format msgid "Withdrew%1$sfrom%2$s(%3$s).\n" msgstr "" -#: src/webex/pages/popup.tsx:383 +#: src/webex/pages/popup.tsx:390 #, c-format msgid "" "Paid%1$sto merchant%2$s.\n" " (%3$s)\n" msgstr "" -#: src/webex/pages/popup.tsx:392 +#: src/webex/pages/popup.tsx:399 #, c-format msgid "Unknown event (%1$s)" msgstr "" -#: src/webex/pages/popup.tsx:435 +#: src/webex/pages/popup.tsx:442 #, c-format msgid "Error: could not retrieve event history" msgstr "" -#: src/webex/pages/popup.tsx:469 +#: src/webex/pages/popup.tsx:476 #, c-format msgid "Your wallet has no events recorded." msgstr "" diff --git a/src/i18n/it.po b/src/i18n/it.po index da860ad8f..705b1cba6 100644 --- a/src/i18n/it.po +++ b/src/i18n/it.po @@ -56,67 +56,67 @@ msgid "" "wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:212 +#: src/webex/pages/confirm-create-reserve.tsx:213 #, c-format msgid "Withdrawal fees:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:213 +#: src/webex/pages/confirm-create-reserve.tsx:214 #, c-format msgid "Rounding loss:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:214 +#: src/webex/pages/confirm-create-reserve.tsx:215 #, c-format msgid "Earliest expiration (for deposit): %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:219 +#: src/webex/pages/confirm-create-reserve.tsx:220 #, c-format msgid "# Coins" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:220 +#: src/webex/pages/confirm-create-reserve.tsx:221 #, c-format msgid "Value" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:221 +#: src/webex/pages/confirm-create-reserve.tsx:222 #, c-format msgid "Withdraw Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:222 +#: src/webex/pages/confirm-create-reserve.tsx:223 #, c-format msgid "Refresh Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:223 +#: src/webex/pages/confirm-create-reserve.tsx:224 #, c-format msgid "Deposit Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:276 +#: src/webex/pages/confirm-create-reserve.tsx:278 #, c-format msgid "Select" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:292 +#: src/webex/pages/confirm-create-reserve.tsx:294 #, c-format msgid "Error: URL may not be relative" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:360 +#: src/webex/pages/confirm-create-reserve.tsx:362 #, c-format msgid "The exchange is trusted by the wallet.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:366 +#: src/webex/pages/confirm-create-reserve.tsx:368 #, c-format msgid "The exchange is audited by a trusted auditor.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:372 +#: src/webex/pages/confirm-create-reserve.tsx:374 #, c-format msgid "" "Warning: The exchange is neither directly trusted nor audited by a trusted " @@ -124,7 +124,7 @@ msgid "" "If you withdraw from this exchange, it will be trusted in the future.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:381 +#: src/webex/pages/confirm-create-reserve.tsx:383 #, c-format msgid "" "Using exchange provider%1$s.\n" @@ -132,151 +132,166 @@ msgid "" " %2$s in fees.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:395 +#: src/webex/pages/confirm-create-reserve.tsx:397 #, c-format msgid "" "Waiting for a response from\n" " %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:406 +#: src/webex/pages/confirm-create-reserve.tsx:408 #, c-format msgid "A problem occured, see below. %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:412 +#: src/webex/pages/confirm-create-reserve.tsx:414 #, c-format msgid "" "Information about fees will be available when an exchange provider is " "selected." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:455 +#: src/webex/pages/confirm-create-reserve.tsx:457 #, c-format msgid "Accept fees and withdraw" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:460 +#: src/webex/pages/confirm-create-reserve.tsx:462 #, c-format msgid "Change Exchange Provider" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:517 +#: src/webex/pages/confirm-create-reserve.tsx:519 #, c-format msgid "You are about to withdraw %1$s from your bank account into your wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:600 +#: src/webex/pages/confirm-create-reserve.tsx:607 #, c-format msgid "" "Oops, something went wrong. The wallet responded with error status (%1$s)." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:611 +#: src/webex/pages/confirm-create-reserve.tsx:616 #, c-format msgid "Checking URL, please wait ..." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:625 +#: src/webex/pages/confirm-create-reserve.tsx:630 #, c-format msgid "Can't parse amount: %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:632 +#: src/webex/pages/confirm-create-reserve.tsx:637 #, c-format msgid "Can't parse wire_types: %1$s" msgstr "" #. TODO:generic error reporting function or component. -#: src/webex/pages/confirm-create-reserve.tsx:652 +#: src/webex/pages/confirm-create-reserve.tsx:663 #, c-format msgid "Fatal error: \"%1$s\"." msgstr "" -#: src/webex/pages/popup.tsx:160 +#: src/webex/pages/popup.tsx:161 #, c-format msgid "Balance" msgstr "" -#: src/webex/pages/popup.tsx:163 +#: src/webex/pages/popup.tsx:164 #, c-format msgid "History" msgstr "" -#: src/webex/pages/popup.tsx:166 +#: src/webex/pages/popup.tsx:167 #, c-format msgid "Debug" msgstr "" -#: src/webex/pages/popup.tsx:242 +#: src/webex/pages/popup.tsx:247 #, c-format msgid "help" msgstr "" -#: src/webex/pages/popup.tsx:247 +#: src/webex/pages/popup.tsx:252 #, c-format msgid "" "You have no balance to show. Need some\n" " %1$s getting started?\n" msgstr "" -#: src/webex/pages/popup.tsx:264 +#: src/webex/pages/popup.tsx:269 #, c-format msgid "%1$s incoming\n" msgstr "" -#: src/webex/pages/popup.tsx:277 +#: src/webex/pages/popup.tsx:282 #, c-format msgid "%1$s being spent\n" msgstr "" -#: src/webex/pages/popup.tsx:303 +#: src/webex/pages/popup.tsx:308 #, c-format msgid "Error: could not retrieve balance information." msgstr "" -#: src/webex/pages/popup.tsx:342 +#: src/webex/pages/popup.tsx:335 +#, c-format +msgid "Payback" +msgstr "" + +#: src/webex/pages/popup.tsx:336 +#, c-format +msgid "Return Electronic Cash to Bank Account" +msgstr "" + +#: src/webex/pages/popup.tsx:337 +#, c-format +msgid "Manage Trusted Auditors and Exchanges" +msgstr "" + +#: src/webex/pages/popup.tsx:349 #, c-format msgid "" "Bank requested reserve (%1$s) for\n" " %2$s.\n" msgstr "" -#: src/webex/pages/popup.tsx:353 +#: src/webex/pages/popup.tsx:360 #, c-format msgid "" "Started to withdraw\n" " %1$s from%2$s(%3$s).\n" msgstr "" -#: src/webex/pages/popup.tsx:363 +#: src/webex/pages/popup.tsx:370 #, c-format msgid "Merchant%1$soffered contract%2$s;\n" msgstr "" -#: src/webex/pages/popup.tsx:373 +#: src/webex/pages/popup.tsx:380 #, c-format msgid "Withdrew%1$sfrom%2$s(%3$s).\n" msgstr "" -#: src/webex/pages/popup.tsx:383 +#: src/webex/pages/popup.tsx:390 #, c-format msgid "" "Paid%1$sto merchant%2$s.\n" " (%3$s)\n" msgstr "" -#: src/webex/pages/popup.tsx:392 +#: src/webex/pages/popup.tsx:399 #, c-format msgid "Unknown event (%1$s)" msgstr "" -#: src/webex/pages/popup.tsx:435 +#: src/webex/pages/popup.tsx:442 #, c-format msgid "Error: could not retrieve event history" msgstr "" -#: src/webex/pages/popup.tsx:469 +#: src/webex/pages/popup.tsx:476 #, c-format msgid "Your wallet has no events recorded." msgstr "" diff --git a/src/i18n/strings.ts b/src/i18n/strings.ts index 242fecf5f..aa883403e 100644 --- a/src/i18n/strings.ts +++ b/src/i18n/strings.ts @@ -138,6 +138,15 @@ strings['de'] = { "Error: could not retrieve balance information.": [ "" ], + "Payback": [ + "" + ], + "Return Electronic Cash to Bank Account": [ + "" + ], + "Manage Trusted Auditors and Exchanges": [ + "" + ], "Bank requested reserve (%1$s) for\n %2$s.\n": [ "Bank bestätig anlegen der Reserve (%1$s) bei %2$s" ], @@ -294,6 +303,15 @@ strings['en-US'] = { "Error: could not retrieve balance information.": [ "" ], + "Payback": [ + "" + ], + "Return Electronic Cash to Bank Account": [ + "" + ], + "Manage Trusted Auditors and Exchanges": [ + "" + ], "Bank requested reserve (%1$s) for\n %2$s.\n": [ "" ], @@ -450,6 +468,15 @@ strings['fr'] = { "Error: could not retrieve balance information.": [ "" ], + "Payback": [ + "" + ], + "Return Electronic Cash to Bank Account": [ + "" + ], + "Manage Trusted Auditors and Exchanges": [ + "" + ], "Bank requested reserve (%1$s) for\n %2$s.\n": [ "" ], @@ -606,6 +633,15 @@ strings['it'] = { "Error: could not retrieve balance information.": [ "" ], + "Payback": [ + "" + ], + "Return Electronic Cash to Bank Account": [ + "" + ], + "Manage Trusted Auditors and Exchanges": [ + "" + ], "Bank requested reserve (%1$s) for\n %2$s.\n": [ "" ], diff --git a/src/i18n/taler-wallet-webex.pot b/src/i18n/taler-wallet-webex.pot index da860ad8f..705b1cba6 100644 --- a/src/i18n/taler-wallet-webex.pot +++ b/src/i18n/taler-wallet-webex.pot @@ -56,67 +56,67 @@ msgid "" "wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:212 +#: src/webex/pages/confirm-create-reserve.tsx:213 #, c-format msgid "Withdrawal fees:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:213 +#: src/webex/pages/confirm-create-reserve.tsx:214 #, c-format msgid "Rounding loss:" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:214 +#: src/webex/pages/confirm-create-reserve.tsx:215 #, c-format msgid "Earliest expiration (for deposit): %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:219 +#: src/webex/pages/confirm-create-reserve.tsx:220 #, c-format msgid "# Coins" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:220 +#: src/webex/pages/confirm-create-reserve.tsx:221 #, c-format msgid "Value" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:221 +#: src/webex/pages/confirm-create-reserve.tsx:222 #, c-format msgid "Withdraw Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:222 +#: src/webex/pages/confirm-create-reserve.tsx:223 #, c-format msgid "Refresh Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:223 +#: src/webex/pages/confirm-create-reserve.tsx:224 #, c-format msgid "Deposit Fee" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:276 +#: src/webex/pages/confirm-create-reserve.tsx:278 #, c-format msgid "Select" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:292 +#: src/webex/pages/confirm-create-reserve.tsx:294 #, c-format msgid "Error: URL may not be relative" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:360 +#: src/webex/pages/confirm-create-reserve.tsx:362 #, c-format msgid "The exchange is trusted by the wallet.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:366 +#: src/webex/pages/confirm-create-reserve.tsx:368 #, c-format msgid "The exchange is audited by a trusted auditor.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:372 +#: src/webex/pages/confirm-create-reserve.tsx:374 #, c-format msgid "" "Warning: The exchange is neither directly trusted nor audited by a trusted " @@ -124,7 +124,7 @@ msgid "" "If you withdraw from this exchange, it will be trusted in the future.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:381 +#: src/webex/pages/confirm-create-reserve.tsx:383 #, c-format msgid "" "Using exchange provider%1$s.\n" @@ -132,151 +132,166 @@ msgid "" " %2$s in fees.\n" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:395 +#: src/webex/pages/confirm-create-reserve.tsx:397 #, c-format msgid "" "Waiting for a response from\n" " %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:406 +#: src/webex/pages/confirm-create-reserve.tsx:408 #, c-format msgid "A problem occured, see below. %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:412 +#: src/webex/pages/confirm-create-reserve.tsx:414 #, c-format msgid "" "Information about fees will be available when an exchange provider is " "selected." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:455 +#: src/webex/pages/confirm-create-reserve.tsx:457 #, c-format msgid "Accept fees and withdraw" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:460 +#: src/webex/pages/confirm-create-reserve.tsx:462 #, c-format msgid "Change Exchange Provider" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:517 +#: src/webex/pages/confirm-create-reserve.tsx:519 #, c-format msgid "You are about to withdraw %1$s from your bank account into your wallet." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:600 +#: src/webex/pages/confirm-create-reserve.tsx:607 #, c-format msgid "" "Oops, something went wrong. The wallet responded with error status (%1$s)." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:611 +#: src/webex/pages/confirm-create-reserve.tsx:616 #, c-format msgid "Checking URL, please wait ..." msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:625 +#: src/webex/pages/confirm-create-reserve.tsx:630 #, c-format msgid "Can't parse amount: %1$s" msgstr "" -#: src/webex/pages/confirm-create-reserve.tsx:632 +#: src/webex/pages/confirm-create-reserve.tsx:637 #, c-format msgid "Can't parse wire_types: %1$s" msgstr "" #. TODO:generic error reporting function or component. -#: src/webex/pages/confirm-create-reserve.tsx:652 +#: src/webex/pages/confirm-create-reserve.tsx:663 #, c-format msgid "Fatal error: \"%1$s\"." msgstr "" -#: src/webex/pages/popup.tsx:160 +#: src/webex/pages/popup.tsx:161 #, c-format msgid "Balance" msgstr "" -#: src/webex/pages/popup.tsx:163 +#: src/webex/pages/popup.tsx:164 #, c-format msgid "History" msgstr "" -#: src/webex/pages/popup.tsx:166 +#: src/webex/pages/popup.tsx:167 #, c-format msgid "Debug" msgstr "" -#: src/webex/pages/popup.tsx:242 +#: src/webex/pages/popup.tsx:247 #, c-format msgid "help" msgstr "" -#: src/webex/pages/popup.tsx:247 +#: src/webex/pages/popup.tsx:252 #, c-format msgid "" "You have no balance to show. Need some\n" " %1$s getting started?\n" msgstr "" -#: src/webex/pages/popup.tsx:264 +#: src/webex/pages/popup.tsx:269 #, c-format msgid "%1$s incoming\n" msgstr "" -#: src/webex/pages/popup.tsx:277 +#: src/webex/pages/popup.tsx:282 #, c-format msgid "%1$s being spent\n" msgstr "" -#: src/webex/pages/popup.tsx:303 +#: src/webex/pages/popup.tsx:308 #, c-format msgid "Error: could not retrieve balance information." msgstr "" -#: src/webex/pages/popup.tsx:342 +#: src/webex/pages/popup.tsx:335 +#, c-format +msgid "Payback" +msgstr "" + +#: src/webex/pages/popup.tsx:336 +#, c-format +msgid "Return Electronic Cash to Bank Account" +msgstr "" + +#: src/webex/pages/popup.tsx:337 +#, c-format +msgid "Manage Trusted Auditors and Exchanges" +msgstr "" + +#: src/webex/pages/popup.tsx:349 #, c-format msgid "" "Bank requested reserve (%1$s) for\n" " %2$s.\n" msgstr "" -#: src/webex/pages/popup.tsx:353 +#: src/webex/pages/popup.tsx:360 #, c-format msgid "" "Started to withdraw\n" " %1$s from%2$s(%3$s).\n" msgstr "" -#: src/webex/pages/popup.tsx:363 +#: src/webex/pages/popup.tsx:370 #, c-format msgid "Merchant%1$soffered contract%2$s;\n" msgstr "" -#: src/webex/pages/popup.tsx:373 +#: src/webex/pages/popup.tsx:380 #, c-format msgid "Withdrew%1$sfrom%2$s(%3$s).\n" msgstr "" -#: src/webex/pages/popup.tsx:383 +#: src/webex/pages/popup.tsx:390 #, c-format msgid "" "Paid%1$sto merchant%2$s.\n" " (%3$s)\n" msgstr "" -#: src/webex/pages/popup.tsx:392 +#: src/webex/pages/popup.tsx:399 #, c-format msgid "Unknown event (%1$s)" msgstr "" -#: src/webex/pages/popup.tsx:435 +#: src/webex/pages/popup.tsx:442 #, c-format msgid "Error: could not retrieve event history" msgstr "" -#: src/webex/pages/popup.tsx:469 +#: src/webex/pages/popup.tsx:476 #, c-format msgid "Your wallet has no events recorded." msgstr "" diff --git a/src/query.ts b/src/query.ts index 24db4de56..9a6162807 100644 --- a/src/query.ts +++ b/src/query.ts @@ -130,7 +130,11 @@ export interface QueryStream<T> { */ first(): QueryValue<T>; - then(onfulfill: any, onreject: any): any; + /** + * Run the query without returning a result. + * Useful for queries with side effects. + */ + run(): Promise<void>; } @@ -225,7 +229,7 @@ export const AbortTransaction = Symbol("abort_transaction"); * function. */ export function openPromise<T>(): any { - let resolve: ((value?: T | PromiseLike<T>) => void) | null = null; + let resolve: ((x?: any) => void) | null = null; let reject: ((reason?: any) => void) | null = null; const promise = new Promise<T>((res, rej) => { resolve = res; @@ -239,7 +243,7 @@ export function openPromise<T>(): any { } -abstract class QueryStreamBase<T> implements QueryStream<T>, PromiseLike<void> { +abstract class QueryStreamBase<T> implements QueryStream<T> { abstract subscribe(f: (isDone: boolean, value: any, tx: IDBTransaction) => void): void; @@ -250,11 +254,6 @@ abstract class QueryStreamBase<T> implements QueryStream<T>, PromiseLike<void> { return new FirstQueryValue(this); } - then<R>(onfulfilled: (value: void) => R | PromiseLike<R>, - onrejected: (reason: any) => R | PromiseLike<R>): PromiseLike<R> { - return this.root.then(onfulfilled, onrejected); - } - flatMap<S>(f: (x: T) => S[]): QueryStream<S> { return new QueryStreamFlatMap<T, S>(this, f); } @@ -279,8 +278,7 @@ abstract class QueryStreamBase<T> implements QueryStream<T>, PromiseLike<void> { keyFn: (obj: T) => I): QueryStream<JoinResult<T, S>> { this.root.addStoreAccess(store.name, false); return new QueryStreamKeyJoin<T, S>(this, store.name, keyFn); - } - + } filter(f: (x: any) => boolean): QueryStream<T> { return new QueryStreamFilter(this, f); } @@ -318,6 +316,21 @@ abstract class QueryStreamBase<T> implements QueryStream<T>, PromiseLike<void> { .then(() => this.root.finish()) .then(() => promise); } + + run(): Promise<void> { + const {resolve, promise} = openPromise(); + + this.subscribe((isDone, value) => { + if (isDone) { + resolve(); + return; + } + }); + + return Promise.resolve() + .then(() => this.root.finish()) + .then(() => promise); + } } type FilterFn = (e: any) => boolean; @@ -519,7 +532,7 @@ class IterQueryStream<T> extends QueryStreamBase<T> { /** * Root wrapper around an IndexedDB for queries with a fluent interface. */ -export class QueryRoot implements PromiseLike<void> { +export class QueryRoot { private work: Array<((t: IDBTransaction) => void)> = []; private stores = new Set(); private kickoffPromise: Promise<void>; @@ -537,11 +550,6 @@ export class QueryRoot implements PromiseLike<void> { constructor(public db: IDBDatabase) { } - then<R>(onfulfilled: (value: void) => R | PromiseLike<R>, - onrejected: (reason: any) => R | PromiseLike<R>): PromiseLike<R> { - return this.finish().then(onfulfilled, onrejected); - } - private checkFinished() { if (this.finished) { throw Error("Can't add work to query after it was started"); diff --git a/src/types.ts b/src/types.ts index 68fde2690..9031b19b7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -126,6 +126,12 @@ export interface ReserveRecord { * withdraw money from it. */ hasPayback: boolean; + + /** + * Wire information for the bank account that + * transfered funds for this reserve. + */ + senderWire?: object; } @@ -814,6 +820,61 @@ export enum CoinStatus { } + +/** + * State of returning a list of coins + * to the customer's bank account. + */ +export interface CoinsReturnRecord { + /** + * Coins that we're returning. + */ + coins: CoinPaySig[]; + + /** + * Responses to the deposit requests. + */ + responses: any; + + /** + * Ephemeral dummy merchant key for + * the coins returns operation. + */ + dummyMerchantPub: string; + + /** + * Ephemeral dummy merchant key for + * the coins returns operation. + */ + dummyMerchantPriv: string; + + /** + * Contract terms. + */ + contractTerms: string; + + /** + * Hash of contract terms. + */ + contractTermsHash: string; + + /** + * Wire info to send the money for the coins to. + */ + wire: object; + + /** + * Hash of the wire object. + */ + wireHash: string; + + /** + * All coins were deposited. + */ + finished: boolean; +} + + /** * CoinRecord as stored in the "coins" data store * of the wallet database. @@ -903,14 +964,19 @@ export class ExchangeHandle { /** - * Mapping from currency names to detailed balance - * information for that particular currency. + * Mapping from currency/exchange to detailed balance + * information. */ export interface WalletBalance { /** - * Mapping from currency name to defailed balance info. + * Mapping from currency name to detailed balance info. */ - [currency: string]: WalletBalanceEntry; + byExchange: { [exchangeBaseUrl: string]: WalletBalanceEntry }; + + /** + * Mapping from currency name to detailed balance info. + */ + byCurrency: { [currency: string]: WalletBalanceEntry }; } @@ -942,8 +1008,8 @@ export interface WalletBalanceEntry { */ @Checkable.Class({validate: true}) export class ContractTerms { - validate() { - if (this.exchanges.length === 0) { + static validate(x: ContractTerms) { + if (x.exchanges.length === 0) { throw Error("no exchanges in contract terms"); } } @@ -1361,6 +1427,18 @@ export namespace Amounts { value: Number.parseInt(res[2]), }; } + + export function toFloat(a: AmountJson): number { + return a.value + (a.fraction / fractionalBase); + } + + export function fromFloat(floatVal: number, currency: string) { + return { + currency, + fraction: (floatVal - Math.floor(floatVal)) * fractionalBase, + value: Math.floor(floatVal), + }; + } } @@ -1457,7 +1535,7 @@ export interface PayReq { order_id: string; /** - * Exchange that the coins are from. + * Exchange that the coins are from (base URL). */ exchange: string; } @@ -1484,3 +1562,103 @@ export interface QueryPaymentFound { contractTerms: ContractTerms; payReq: PayReq; } + +/** + * Information about all sender wire details known to the wallet, + * as well as exchanges that accept these wire types. + */ +export interface SenderWireInfos { + /** + * Mapping from exchange base url to list of accepted + * wire types. + */ + exchangeWireTypes: { [exchangeBaseUrl: string]: string[] }; + + /** + * Sender wire types stored in the wallet. + */ + senderWires: object[]; +} + + +/** + * Request to mark a reserve as confirmed. + */ +@Checkable.Class() +export class CreateReserveRequest { + /** + * The initial amount for the reserve. + */ + @Checkable.Value(AmountJson) + amount: AmountJson; + + /** + * Exchange URL where the bank should create the reserve. + */ + @Checkable.String + exchange: string; + + /** + * Wire details for the bank account that sent the funds to the exchange. + */ + @Checkable.Optional(Checkable.Any) + senderWire?: object; + + /** + * Verify that a value matches the schema of this class and convert it into a + * member. + */ + static checked: (obj: any) => CreateReserveRequest; +} + + +/** + * Request to mark a reserve as confirmed. + */ +@Checkable.Class() +export class ConfirmReserveRequest { + /** + * Public key of then reserve that should be marked + * as confirmed. + */ + @Checkable.String + reservePub: string; + + /** + * Verify that a value matches the schema of this class and convert it into a + * member. + */ + static checked: (obj: any) => ConfirmReserveRequest; +} + + +/** + * Wire coins to the user's own bank account. + */ +@Checkable.Class() +export class ReturnCoinsRequest { + /** + * The amount to wire. + */ + @Checkable.Value(AmountJson) + amount: AmountJson; + + /** + * The exchange to take the coins from. + */ + @Checkable.String + exchange: string; + + /** + * Wire details for the bank account of the customer that will + * receive the funds. + */ + @Checkable.Any + senderWire?: object; + + /** + * Verify that a value matches the schema of this class and convert it into a + * member. + */ + static checked: (obj: any) => ReturnCoinsRequest; +} diff --git a/src/wallet.ts b/src/wallet.ts index 5de3906dc..68d70b0bb 100644 --- a/src/wallet.ts +++ b/src/wallet.ts @@ -49,10 +49,13 @@ import { Amounts, Auditor, CheckPayResult, + CoinPaySig, CoinRecord, CoinStatus, ConfirmPayResult, + ConfirmReserveRequest, ContractTerms, + CreateReserveRequest, CreateReserveResponse, CurrencyRecord, Denomination, @@ -73,6 +76,8 @@ import { RefreshSessionRecord, ReserveCreationInfo, ReserveRecord, + ReturnCoinsRequest, + SenderWireInfos, WalletBalance, WalletBalanceEntry, WireFee, @@ -236,51 +241,6 @@ class WireDetailJson { } -/** - * Request to mark a reserve as confirmed. - */ -@Checkable.Class() -export class CreateReserveRequest { - /** - * The initial amount for the reserve. - */ - @Checkable.Value(AmountJson) - amount: AmountJson; - - /** - * Exchange URL where the bank should create the reserve. - */ - @Checkable.String - exchange: string; - - /** - * Verify that a value matches the schema of this class and convert it into a - * member. - */ - static checked: (obj: any) => CreateReserveRequest; -} - - -/** - * Request to mark a reserve as confirmed. - */ -@Checkable.Class() -export class ConfirmReserveRequest { - /** - * Public key of then reserve that should be marked - * as confirmed. - */ - @Checkable.String - reservePub: string; - - /** - * Verify that a value matches the schema of this class and convert it into a - * member. - */ - static checked: (obj: any) => ConfirmReserveRequest; -} - - interface TransactionRecord { contractTermsHash: string; contractTerms: ContractTerms; @@ -330,6 +290,48 @@ export interface ConfigRecord { /** + * Coin that we're depositing ourselves. + */ +export interface DepositCoin { + coinPaySig: CoinPaySig; + + /** + * Undefined if coin not deposited, otherwise signature + * from the exchange confirming the deposit. + */ + depositedSig?: string; +} + +export interface CoinsReturnRecord { + /** + * Hash of the contract for sending coins to our own bank account. + */ + contractTermsHash: string; + + contractTerms: ContractTerms; + + /** + * Private key where corresponding + * public key is used in the contract terms + * as merchant pub. + */ + merchantPriv: string; + + coins: DepositCoin[]; + + /** + * Exchange base URL to deposit coins at. + */ + exchange: string; + + /** + * Our own wire information for the deposit. + */ + wire: any; +} + + +/** * Wallet protocol version spoken with the exchange * and merchant. * @@ -343,7 +345,7 @@ export const WALLET_PROTOCOL_VERSION = "0:0:0"; * In the future we might consider adding migration functions for * each version increment. */ -export const WALLET_DB_VERSION = 18; +export const WALLET_DB_VERSION = 19; const builtinCurrencies: CurrencyRecord[] = [ { @@ -421,6 +423,7 @@ export function selectPayCoins(cds: CoinWithDenom[], paymentAmount: AmountJson, Amounts.add(paymentAmount, denom.feeDeposit).amount) >= 0; isBelowFee = Amounts.cmp(accFee, depositFeeLimit) <= 0; + if ((coversAmount && isBelowFee) || coversAmountWithFee) { return cdsResult; } @@ -553,6 +556,7 @@ export namespace Stores { } export const coins = new CoinsStore(); + export const coinsReturns = new Store<CoinsReturnRecord>("coinsReturns", {keyPath: "contractTermsHash"}); export const config = new ConfigStore(); export const currencies = new CurrenciesStore(); export const denominations = new DenominationsStore(); @@ -700,6 +704,12 @@ export class Wallet { this.continueRefreshSession(r); }); + this.q() + .iter(Stores.coinsReturns) + .reduce((r: CoinsReturnRecord) => { + this.depositReturnedCoins(r); + }); + // FIXME: optimize via index this.q() .iter(Stores.coins) @@ -712,6 +722,58 @@ export class Wallet { } + private async getCoinsForReturn(exchangeBaseUrl: string, amount: AmountJson): Promise<CoinWithDenom[] | undefined> { + const exchange = await this.q().get(Stores.exchanges, exchangeBaseUrl); + if (!exchange) { + throw Error(`Exchange ${exchangeBaseUrl} not known to the wallet`); + } + + const coins: CoinRecord[] = await ( + this.q() + .iterIndex(Stores.coins.exchangeBaseUrlIndex, exchange.baseUrl) + .toArray() + ); + + if (!coins || !coins.length) { + return []; + } + + // Denomination of the first coin, we assume that all other + // coins have the same currency + const firstDenom = await this.q().get(Stores.denominations, + [ + exchange.baseUrl, + coins[0].denomPub, + ]); + if (!firstDenom) { + throw Error("db inconsistent"); + } + const currency = firstDenom.value.currency; + + const cds: CoinWithDenom[] = []; + for (const coin of coins) { + const denom = await this.q().get(Stores.denominations, + [exchange.baseUrl, coin.denomPub]); + if (!denom) { + throw Error("db inconsistent"); + } + if (denom.value.currency !== currency) { + console.warn(`same pubkey for different currencies at exchange ${exchange.baseUrl}`); + continue; + } + if (coin.suspended) { + continue; + } + if (coin.status !== CoinStatus.Fresh) { + continue; + } + cds.push({coin, denom}); + } + + return selectPayCoins(cds, amount, amount); + } + + /** * Get exchanges and associated coins that are still spendable, * but only if the sum the coins' remaining value exceeds the payment amount. @@ -769,6 +831,7 @@ export class Wallet { if (!coins || coins.length === 0) { continue; } + // Denomination of the first coin, we assume that all other // coins have the same currency const firstDenom = await this.q().get(Stores.denominations, @@ -903,7 +966,7 @@ export class Wallet { */ async confirmPay(proposalId: number): Promise<ConfirmPayResult> { console.log("executing confirmPay"); - const proposal = await this.q().get(Stores.proposals, proposalId); + const proposal: ProposalRecord|undefined = await this.q().get(Stores.proposals, proposalId); if (!proposal) { throw Error(`proposal with id ${proposalId} not found`); @@ -936,7 +999,7 @@ export class Wallet { } const {exchangeUrl, cds} = res; - const ds = await this.cryptoApi.signDeposit(proposal, cds); + const ds = await this.cryptoApi.signDeposit(proposal.contractTerms, cds); await this.recordConfirmPay(proposal, ds, exchangeUrl); return "paid"; } @@ -1138,6 +1201,7 @@ export class Wallet { requested_amount: req.amount, reserve_priv: keypair.priv, reserve_pub: keypair.pub, + senderWire: req.senderWire, }; const historyEntry = { @@ -1755,22 +1819,26 @@ export class Wallet { /** - * Retrieve a mapping from currency name to the amount - * that is currenctly available for spending in the wallet. + * Get detailed balance information, sliced by exchange and by currency. */ async getBalances(): Promise<WalletBalance> { - function ensureEntry(balance: WalletBalance, currency: string) { - let entry: WalletBalanceEntry|undefined = balance[currency]; - const z = Amounts.getZero(currency); - if (!entry) { - balance[currency] = entry = { - available: z, - paybackAmount: z, - pendingIncoming: z, - pendingPayment: z, - }; + /** + * Add amount to a balance field, both for + * the slicing by exchange and currency. + */ + function addTo(balance: WalletBalance, field: keyof WalletBalanceEntry, amount: AmountJson, exchange: string): void { + const z = Amounts.getZero(amount.currency); + const balanceIdentity = {available: z, paybackAmount: z, pendingIncoming: z, pendingPayment: z}; + let entryCurr = balance.byCurrency[amount.currency]; + if (!entryCurr) { + balance.byCurrency[amount.currency] = entryCurr = { ...balanceIdentity }; + } + let entryEx = balance.byExchange[exchange]; + if (!entryEx) { + balance.byExchange[exchange] = entryEx = { ...balanceIdentity }; } - return entry; + entryCurr[field] = Amounts.add(entryCurr[field], amount).amount; + entryEx[field] = Amounts.add(entryEx[field], amount).amount; } function collectBalances(c: CoinRecord, balance: WalletBalance) { @@ -1780,9 +1848,8 @@ export class Wallet { if (!(c.status === CoinStatus.Dirty || c.status === CoinStatus.Fresh)) { return balance; } - const currency = c.currentAmount.currency; - const entry = ensureEntry(balance, currency); - entry.available = Amounts.add(entry.available, c.currentAmount).amount; + console.log("collecting balance"); + addTo(balance, "available", c.currentAmount, c.exchangeBaseUrl); return balance; } @@ -1790,15 +1857,13 @@ export class Wallet { if (!r.confirmed) { return balance; } - const entry = ensureEntry(balance, r.requested_amount.currency); let amount = r.current_amount; if (!amount) { amount = r.requested_amount; } amount = Amounts.add(amount, r.precoin_amount).amount; if (Amounts.cmp(smallestWithdraw[r.exchange_base_url], amount) < 0) { - entry.pendingIncoming = Amounts.add(entry.pendingIncoming, - amount).amount; + addTo(balance, "pendingIncoming", amount, r.exchange_base_url); } return balance; } @@ -1807,9 +1872,8 @@ export class Wallet { if (!r.hasPayback) { return balance; } - const entry = ensureEntry(balance, r.requested_amount.currency); if (Amounts.cmp(smallestWithdraw[r.exchange_base_url], r.current_amount!) < 0) { - entry.paybackAmount = Amounts.add(entry.paybackAmount, r.current_amount!).amount; + addTo(balance, "paybackAmount", r.current_amount!, r.exchange_base_url); } return balance; } @@ -1821,9 +1885,7 @@ export class Wallet { if (r.finished) { return balance; } - const entry = ensureEntry(balance, r.valueWithFee.currency); - entry.pendingIncoming = Amounts.add(entry.pendingIncoming, - r.valueOutput).amount; + addTo(balance, "pendingIncoming", r.valueOutput, r.exchangeBaseUrl); return balance; } @@ -1832,10 +1894,7 @@ export class Wallet { if (t.finished) { return balance; } - const entry = ensureEntry(balance, t.contractTerms.amount.currency); - entry.pendingPayment = Amounts.add(entry.pendingPayment, - t.contractTerms.amount).amount; - + addTo(balance, "pendingIncoming", t.contractTerms.amount, t.payReq.exchange); return balance; } @@ -1852,7 +1911,10 @@ export class Wallet { return sw; } - const balance = {}; + const balance = { + byExchange: {}, + byCurrency: {}, + }; // Mapping from exchange pub to smallest // possible amount we can withdraw let smallestWithdraw: {[baseUrl: string]: AmountJson} = {}; @@ -1876,7 +1938,6 @@ export class Wallet { .reduce(collectPayments, balance); await tx.finish(); return balance; - } @@ -2347,4 +2408,156 @@ export class Wallet { stop() { this.timerGroup.stopCurrentAndFutureTimers(); } + + async getSenderWireInfos(): Promise<SenderWireInfos> { + const m: { [url: string]: Set<string> } = {}; + await this.q().iter(Stores.exchangeWireFees).map((x) => { + const s = m[x.exchangeBaseUrl] = m[x.exchangeBaseUrl] || new Set(); + Object.keys(x.feesForType).map((k) => s.add(k)); + }).run(); + console.log(m); + const exchangeWireTypes: { [url: string]: string[] } = {}; + Object.keys(m).map((e) => { exchangeWireTypes[e] = Array.from(m[e]); }); + + const senderWiresSet = new Set(); + await this.q().iter(Stores.reserves).map((x) => { + if (x.senderWire) { + senderWiresSet.add(JSON.stringify(x.senderWire)); + } + }).run(); + const senderWires = Array.from(senderWiresSet).map((x) => JSON.parse(x)); + + return { + exchangeWireTypes, + senderWires, + }; + } + + /** + * Trigger paying coins back into the user's account. + */ + async returnCoins(req: ReturnCoinsRequest): Promise<void> { + console.log("got returnCoins request", req); + const wireType = (req.senderWire as any).type; + console.log("wireType", wireType); + if (!wireType || typeof wireType !== "string") { + console.error(`wire type must be a non-empty string, not ${wireType}`); + return; + } + const stampSecNow = Math.floor((new Date()).getTime() / 1000); + const exchange = await this.q().get(Stores.exchanges, req.exchange); + if (!exchange) { + console.error(`Exchange ${req.exchange} not known to the wallet`); + return; + } + const cds = await this.getCoinsForReturn(req.exchange, req.amount); + console.log(cds); + + if (!cds) { + throw Error("coin return impossible, can't select coins"); + } + + const { priv, pub } = await this.cryptoApi.createEddsaKeypair(); + + const wireHash = await this.cryptoApi.hashString(canonicalJson(req.senderWire)); + + const contractTerms: ContractTerms = { + H_wire: wireHash, + amount: req.amount, + auditors: [], + wire_method: wireType, + pay_deadline: `/Date(${stampSecNow + 60 * 5})/`, + locations: [], + max_fee: req.amount, + merchant: {}, + merchant_pub: pub, + exchanges: [ { master_pub: exchange.masterPublicKey, url: exchange.baseUrl } ], + products: [], + refund_deadline: `/Date(${stampSecNow + 60 * 5})/`, + timestamp: `/Date(${stampSecNow})/`, + order_id: "none", + pay_url: "", + fulfillment_url: "", + extra: {}, + }; + + const contractTermsHash = await this.cryptoApi.hashString(canonicalJson(contractTerms)); + + const payCoinInfo = await this.cryptoApi.signDeposit(contractTerms, cds); + + console.log("pci", payCoinInfo); + + const coins = payCoinInfo.map((pci) => ({ coinPaySig: pci.sig })); + + const coinsReturnRecord: CoinsReturnRecord = { + coins, + exchange: exchange.baseUrl, + contractTerms, + contractTermsHash, + merchantPriv: priv, + wire: req.senderWire, + } + + await this.q() + .put(Stores.coinsReturns, coinsReturnRecord) + .putAll(Stores.coins, payCoinInfo.map((pci) => pci.updatedCoin)) + .finish(); + + this.depositReturnedCoins(coinsReturnRecord); + } + + async depositReturnedCoins(coinsReturnRecord: CoinsReturnRecord): Promise<void> { + for (const c of coinsReturnRecord.coins) { + if (c.depositedSig) { + continue; + } + const req = { + f: c.coinPaySig.f, + wire: coinsReturnRecord.wire, + H_wire: coinsReturnRecord.contractTerms.H_wire, + h_contract_terms: coinsReturnRecord.contractTermsHash, + coin_pub: c.coinPaySig.coin_pub, + denom_pub: c.coinPaySig.denom_pub, + ub_sig: c.coinPaySig.ub_sig, + timestamp: coinsReturnRecord.contractTerms.timestamp, + wire_transfer_deadline: coinsReturnRecord.contractTerms.pay_deadline, + pay_deadline: coinsReturnRecord.contractTerms.pay_deadline, + refund_deadline: coinsReturnRecord.contractTerms.refund_deadline, + merchant_pub: coinsReturnRecord.contractTerms.merchant_pub, + coin_sig: c.coinPaySig.coin_sig, + }; + console.log("req", req); + const reqUrl = (new URI("deposit")).absoluteTo(coinsReturnRecord.exchange); + const resp = await this.http.postJson(reqUrl.href(), req); + if (resp.status !== 200) { + console.error("deposit failed due to status code", resp); + continue; + } + const respJson = JSON.parse(resp.responseText); + if (respJson.status !== "DEPOSIT_OK") { + console.error("deposit failed", resp); + continue; + } + + if (!respJson.sig) { + console.error("invalid 'sig' field", resp); + continue; + } + + // FIXME: verify signature + + // For every successful deposit, we replace the old record with an updated one + const currentCrr = await this.q().get(Stores.coinsReturns, coinsReturnRecord.contractTermsHash); + if (!currentCrr) { + console.error("database inconsistent"); + continue; + } + for (const nc of currentCrr.coins) { + if (nc.coinPaySig.coin_pub === c.coinPaySig.coin_pub) { + nc.depositedSig = respJson.sig; + } + } + await this.q().put(Stores.coinsReturns, currentCrr); + } + } } diff --git a/src/webex/messages.ts b/src/webex/messages.ts index bf9ca00b0..d7ecd06a1 100644 --- a/src/webex/messages.ts +++ b/src/webex/messages.ts @@ -168,6 +168,14 @@ export interface MessageMap { request: { }; response: void; }; + "get-sender-wire-infos": { + request: { }; + response: void; + }; + "return-coins": { + request: { }; + response: void; + }; } /** diff --git a/src/webex/pages/confirm-create-reserve.html b/src/webex/pages/confirm-create-reserve.html index 493a6fb5f..17daf4dde 100644 --- a/src/webex/pages/confirm-create-reserve.html +++ b/src/webex/pages/confirm-create-reserve.html @@ -6,40 +6,12 @@ <title>Taler Wallet: Select Taler Provider</title> <link rel="icon" href="/img/icon.png"> - <link rel="stylesheet" type="text/css" href="../style/wallet.css"> <link rel="stylesheet" type="text/css" href="../style/pure.css"> + <link rel="stylesheet" type="text/css" href="../style/wallet.css"> <script src="/dist/page-common-bundle.js"></script> <script src="/dist/confirm-create-reserve-bundle.js"></script> - <style> - body { - font-size: 100%; - overflow-y: scroll; - } - .button-success { - background: rgb(28, 184, 65); /* this is a green */ - color: white; - border-radius: 4px; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - } - .button-secondary { - background: rgb(66, 184, 221); /* this is a light blue */ - color: white; - border-radius: 4px; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - } - a.opener { - color: black; - } - .opener-open::before { - content: "\25bc" - } - .opener-collapsed::before { - content: "\25b6 " - } - </style> - </head> <body> diff --git a/src/webex/pages/popup.tsx b/src/webex/pages/popup.tsx index f1f0353ad..7d12d365e 100644 --- a/src/webex/pages/popup.tsx +++ b/src/webex/pages/popup.tsx @@ -219,22 +219,26 @@ class WalletBalanceView extends React.Component<any, any> { this.unmount = true; } - updateBalance() { - chrome.runtime.sendMessage({type: "balances"}, (resp) => { + async updateBalance() { + let balance: WalletBalance; + try { + balance = await wxApi.getBalance(); + } catch (e) { if (this.unmount) { return; } - if (resp.error) { - this.gotError = true; - console.error("could not retrieve balances", resp); - this.setState({}); - return; - } - this.gotError = false; - console.log("got wallet", resp); - this.balance = resp; + this.gotError = true; + console.error("could not retrieve balances", e); this.setState({}); - }); + return; + } + if (this.unmount) { + return; + } + this.gotError = false; + console.log("got balance", balance); + this.balance = balance; + this.setState({}); } renderEmpty(): JSX.Element { @@ -308,8 +312,8 @@ class WalletBalanceView extends React.Component<any, any> { } console.log(wallet); let paybackAvailable = false; - const listing = Object.keys(wallet).map((key) => { - const entry: WalletBalanceEntry = wallet[key]; + const listing = Object.keys(wallet.byCurrency).map((key) => { + const entry: WalletBalanceEntry = wallet.byCurrency[key]; if (entry.paybackAmount.value !== 0 || entry.paybackAmount.fraction !== 0) { paybackAvailable = true; } @@ -321,14 +325,16 @@ class WalletBalanceView extends React.Component<any, any> { </p> ); }); - const link = chrome.extension.getURL("/src/webex/pages/auditors.html"); - const linkElem = <a className="actionLink" href={link} target="_blank">Trusted Auditors and Exchanges</a>; - const paybackLinkElem = <a className="actionLink" href={link} target="_blank">Trusted Auditors and Exchanges</a>; + const makeLink = (page: string, name: string) => { + const url = chrome.extension.getURL(`/src/webex/pages/${page}`); + return <div><a className="actionLink" href={url} target="_blank">{name}</a></div>; + }; return ( <div> {listing.length > 0 ? listing : this.renderEmpty()} - {paybackAvailable && paybackLinkElem} - {linkElem} + {paybackAvailable && makeLink("payback", i18n.str`Payback`)} + {makeLink("return-coins.html#dissolve", i18n.str`Return Electronic Cash to Bank Account`)} + {makeLink("auditors.html", i18n.str`Manage Trusted Auditors and Exchanges`)} </div> ); } diff --git a/src/webex/pages/return-coins.html b/src/webex/pages/return-coins.html new file mode 100644 index 000000000..c0ab218d2 --- /dev/null +++ b/src/webex/pages/return-coins.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="UTF-8"> + <title>Taler Wallet: Return Coins to Bank Account</title> + + <link rel="stylesheet" type="text/css" href="../style/pure.css"> + <link rel="stylesheet" type="text/css" href="../style/wallet.css"> + + <link rel="icon" href="/img/icon.png"> + + <script src="/dist/page-common-bundle.js"></script> + <script src="/dist/return-coins-bundle.js"></script> + + <body> + <div id="container"></div> + </body> +</html> diff --git a/src/webex/pages/return-coins.tsx b/src/webex/pages/return-coins.tsx new file mode 100644 index 000000000..1fdadd2e9 --- /dev/null +++ b/src/webex/pages/return-coins.tsx @@ -0,0 +1,271 @@ +/* + This file is part of TALER + (C) 2017 Inria + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** + * View and edit auditors. + * + * @author Florian Dold + */ + + +/** + * Imports. + */ + +import { + AmountJson, + Amounts, + SenderWireInfos, + WalletBalance, +} from "../../types"; + +import * as i18n from "../../i18n"; + +import * as wire from "../../wire"; + +import { + getBalance, + getSenderWireInfos, + returnCoins, +} from "../wxApi"; + +import { renderAmount } from "../renderHtml"; + +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +interface ReturnSelectionItemProps extends ReturnSelectionListProps { + exchangeUrl: string; + senderWireInfos: SenderWireInfos; +} + +interface ReturnSelectionItemState { + selectedValue: string; + supportedWires: object[]; + selectedWire: string; + currency: string; +} + +class ReturnSelectionItem extends React.Component<ReturnSelectionItemProps, ReturnSelectionItemState> { + constructor(props: ReturnSelectionItemProps) { + super(props); + const exchange = this.props.exchangeUrl; + const wireTypes = this.props.senderWireInfos.exchangeWireTypes; + const supportedWires = this.props.senderWireInfos.senderWires.filter((x) => { + return wireTypes[exchange] && wireTypes[exchange].indexOf((x as any).type) >= 0; + }); + this.state = { + currency: props.balance.byExchange[props.exchangeUrl].available.currency, + selectedValue: Amounts.toFloat(props.balance.byExchange[props.exchangeUrl].available).toString(), + selectedWire: "", + supportedWires, + }; + } + render(): JSX.Element { + const exchange = this.props.exchangeUrl; + const byExchange = this.props.balance.byExchange; + const wireTypes = this.props.senderWireInfos.exchangeWireTypes; + return ( + <div key={exchange}> + <h2>Exchange {exchange}</h2> + <p>Available amount: {renderAmount(byExchange[exchange].available)}</p> + <p>Supported wire methods: {wireTypes[exchange].length ? wireTypes[exchange].join(", ") : "none"}</p> + <p>Wire {""} + <input + type="text" + size={this.state.selectedValue.length || 1} + value={this.state.selectedValue} + onChange={(evt) => this.setState({selectedValue: evt.target.value})} + style={{textAlign: "center"}} + /> {this.props.balance.byExchange[exchange].available.currency} {""} + to account {""} + <select value={this.state.selectedWire} onChange={(evt) => this.setState({selectedWire: evt.target.value})}> + <option style={{display: "none"}}>Select account</option> + {this.state.supportedWires.map((w, n) => + <option value={n.toString()} key={JSON.stringify(w)}>{n+1}: {wire.summarizeWire(w)}</option> + )} + </select>. + </p> + {this.state.selectedWire + ? <button className="pure-button button-success" onClick={() => this.select()}> + {i18n.str`Wire to bank account`} + </button> + : null} + </div> + ); + } + + select() { + let val: number; + let selectedWire: number; + try { + val = Number.parseFloat(this.state.selectedValue); + selectedWire = Number.parseInt(this.state.selectedWire); + } catch (e) { + console.error(e); + return; + } + this.props.selectDetail({ + amount: Amounts.fromFloat(val, this.state.currency), + exchange: this.props.exchangeUrl, + senderWire: this.state.supportedWires[selectedWire], + }); + } +} + +interface ReturnSelectionListProps { + balance: WalletBalance; + senderWireInfos: SenderWireInfos; + selectDetail(d: SelectedDetail): void; +} + +class ReturnSelectionList extends React.Component<ReturnSelectionListProps, {}> { + render(): JSX.Element { + const byExchange = this.props.balance.byExchange; + const exchanges = Object.keys(byExchange); + if (!exchanges.length) { + return <p className="errorbox">Currently no funds available to transfer.</p>; + } + return ( + <div> + {exchanges.map((e) => <ReturnSelectionItem key={e} exchangeUrl={e} {...this.props} />)} + </div> + ); + } +} + +interface SelectedDetail { + amount: AmountJson; + senderWire: any; + exchange: string; +} + + +interface ReturnConfirmationProps { + detail: SelectedDetail; + cancel(): void; + confirm(): void; +} + +class ReturnConfirmation extends React.Component<ReturnConfirmationProps, {}> { + render() { + return ( + <div> + <p>Please confirm if you want to transmit <strong>{renderAmount(this.props.detail.amount)}</strong> at {""} + {this.props.detail.exchange} to account {""} + <strong style={{whiteSpace: "nowrap"}}>{wire.summarizeWire(this.props.detail.senderWire)}</strong>. + </p> + <button className="pure-button button-success" onClick={() => this.props.confirm()}> + {i18n.str`Confirm`} + </button> + <button className="pure-button" onClick={() => this.props.cancel()}> + {i18n.str`Cancel`} + </button> + </div> + ); + } +} + +interface ReturnCoinsState { + balance: WalletBalance | undefined; + senderWireInfos: SenderWireInfos | undefined; + selectedReturn: SelectedDetail | undefined; + /** + * Last confirmed detail, so we can show a nice box. + */ + lastConfirmedDetail: SelectedDetail | undefined; +} + +class ReturnCoins extends React.Component<any, ReturnCoinsState> { + constructor() { + super(); + const port = chrome.runtime.connect(); + port.onMessage.addListener((msg: any) => { + if (msg.notify) { + console.log("got notified"); + this.update(); + } + }); + this.update(); + this.state = {} as any; + } + + async update() { + const balance = await getBalance(); + const senderWireInfos = await getSenderWireInfos(); + console.log("got swi", senderWireInfos); + console.log("got bal", balance); + this.setState({ balance, senderWireInfos }); + } + + selectDetail(d: SelectedDetail) { + this.setState({selectedReturn: d}); + } + + async confirm() { + const selectedReturn = this.state.selectedReturn; + if (!selectedReturn) { + return; + } + await returnCoins(selectedReturn); + await this.update(); + this.setState({selectedReturn: undefined, lastConfirmedDetail: selectedReturn}); + } + + async cancel() { + this.setState({selectedReturn: undefined, lastConfirmedDetail: undefined}); + } + + render() { + const balance = this.state.balance; + const senderWireInfos = this.state.senderWireInfos; + if (!balance || !senderWireInfos) { + return <span>...</span>; + } + if (this.state.selectedReturn) { + return ( + <div id="main"> + <ReturnConfirmation + detail={this.state.selectedReturn} + cancel={() => this.cancel()} + confirm={() => this.confirm()} + /> + </div> + ); + } + return ( + <div id="main"> + <h1>Wire electronic cash back to own bank account</h1> + <p>You can send coins back into your own bank account. Note that + you're acting as a merchant when doing this, and thus the same fees apply.</p> + {this.state.lastConfirmedDetail + ? <p className="okaybox">Transfer of {renderAmount(this.state.lastConfirmedDetail.amount)} successfully initiated.</p> + : null} + <ReturnSelectionList + selectDetail={(d) => this.selectDetail(d)} + balance={balance} + senderWireInfos={senderWireInfos} /> + </div> + ); + } +} + + +function main() { + ReactDOM.render(<ReturnCoins />, document.getElementById("container")!); +} + +document.addEventListener("DOMContentLoaded", main); diff --git a/src/webex/style/wallet.css b/src/webex/style/wallet.css index 5773eb396..61dd611e9 100644 --- a/src/webex/style/wallet.css +++ b/src/webex/style/wallet.css @@ -1,3 +1,8 @@ +body { + font-size: 100%; + overflow-y: scroll; +} + #main { border: solid 1px black; border-radius: 10px; @@ -235,3 +240,14 @@ a.actionLink { font-weight: bold; background: #00FA9A; } + + +a.opener { + color: black; +} +.opener-open::before { + content: "\25bc" +} +.opener-collapsed::before { + content: "\25b6 " +} diff --git a/src/webex/wxApi.ts b/src/webex/wxApi.ts index 9d8ba4d1d..1371e27e4 100644 --- a/src/webex/wxApi.ts +++ b/src/webex/wxApi.ts @@ -31,9 +31,11 @@ import { DenominationRecord, ExchangeRecord, PreCoinRecord, + QueryPaymentResult, ReserveCreationInfo, ReserveRecord, - QueryPaymentResult, + SenderWireInfos, + WalletBalance, } from "../types"; import { MessageType, MessageMap } from "./messages"; @@ -296,3 +298,26 @@ export function createReserve(args: { amount: AmountJson, exchange: string, send export function resetDb(): Promise<void> { return callBackend("reset-db", { }); } + +/** + * Get balances for all currencies/exchanges. + */ +export function getBalance(): Promise<WalletBalance> { + return callBackend("balances", { }); +} + + +/** + * Get possible sender wire infos for getting money + * wired from an exchange. + */ +export function getSenderWireInfos(): Promise<SenderWireInfos> { + return callBackend("get-sender-wire-infos", { }); +} + +/** + * Return coins to a bank account. + */ +export function returnCoins(args: { amount: AmountJson, exchange: string, senderWire: object }): Promise<void> { + return callBackend("return-coins", args); +} diff --git a/src/webex/wxBackend.ts b/src/webex/wxBackend.ts index 261477386..974bcb3c2 100644 --- a/src/webex/wxBackend.ts +++ b/src/webex/wxBackend.ts @@ -32,12 +32,13 @@ import { } from "../query"; import { AmountJson, + ConfirmReserveRequest, + CreateReserveRequest, Notifier, ProposalRecord, + ReturnCoinsRequest, } from "../types"; import { - ConfirmReserveRequest, - CreateReserveRequest, Stores, WALLET_DB_VERSION, Wallet, @@ -278,6 +279,18 @@ function handleMessage(sender: MessageSender, } return needsWallet().paymentSucceeded(contractTermsHash, merchantSig); } + case "get-sender-wire-infos": { + return needsWallet().getSenderWireInfos(); + } + case "return-coins": { + const d = { + amount: detail.amount, + exchange: detail.exchange, + senderWire: detail.senderWire, + }; + const req = ReturnCoinsRequest.checked(d); + return needsWallet().returnCoins(req); + } case "check-upgrade": { let dbResetRequired = false; if (!currentWallet) { diff --git a/src/wire.ts b/src/wire.ts new file mode 100644 index 000000000..d61e8eab2 --- /dev/null +++ b/src/wire.ts @@ -0,0 +1,53 @@ +/* + This file is part of TALER + (C) 2017 GNUnet e.V. + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + + +/** + * Display and manipulate wire information. + * + * Right now, all types are hard-coded. In the future, there might be plugins / configurable + * methods or support for the "payto://" URI scheme. + */ + +/** + * Imports. + */ +import * as i18n from "./i18n"; + +/** + * Short summary of the wire information. + * + * Might abbreviate and return the same summary for different + * wire details. + */ +export function summarizeWire(w: any): string { + if (!w.type) { + return i18n.str`Invalid Wire`; + } + switch (w.type.toLowerCase()) { + case "test": + if (!w.account_number && w.account_number !== 0) { + return i18n.str`Invalid Test Wire Detail`; + } + if (!w.bank_uri) { + return i18n.str`Invalid Test Wire Detail`; + } + return i18n.str`Test Wire Acct #${w.account_number} on ${w.bank_uri}`; + default: + return i18n.str`Unknown Wire Detail`; + } +} + diff --git a/tsconfig.json b/tsconfig.json index 349b5969a..b99b28b3e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -64,6 +64,7 @@ "src/webex/pages/payback.tsx", "src/webex/pages/popup.tsx", "src/webex/pages/reset-required.tsx", + "src/webex/pages/return-coins.tsx", "src/webex/pages/show-db.ts", "src/webex/pages/tree.tsx", "src/webex/renderHtml.tsx", diff --git a/webpack.config.js b/webpack.config.js index 34342748b..d2210b092 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -69,11 +69,12 @@ module.exports = function (env) { "confirm-create-reserve": "./src/webex/pages/confirm-create-reserve.tsx", "error": "./src/webex/pages/error.tsx", "logs": "./src/webex/pages/logs.tsx", + "payback": "./src/webex/pages/payback.tsx", "popup": "./src/webex/pages/popup.tsx", + "reset-required": "./src/webex/pages/reset-required.tsx", + "return-coins": "./src/webex/pages/return-coins.tsx", "show-db": "./src/webex/pages/show-db.ts", "tree": "./src/webex/pages/tree.tsx", - "payback": "./src/webex/pages/payback.tsx", - "reset-required": "./src/webex/pages/reset-required.tsx", }, plugins: [ new webpack.optimize.CommonsChunkPlugin({ @@ -7,8 +7,8 @@ resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz#2fc1fe3c211a71071a4eca7b8f7af5842cd1ae7c" "@ava/babel-preset-stage-4@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.0.0.tgz#a613b5e152f529305422546b072d47facfb26291" + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz#ae60be881a0babf7d35f52aba770d1f6194f76bd" dependencies: babel-plugin-check-es2015-constants "^6.8.0" babel-plugin-syntax-trailing-function-commas "^6.20.0" @@ -38,28 +38,35 @@ esutils "^2.0.2" "@types/fs-extra@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-3.0.2.tgz#00cbf48563f377f9ce5cf24237b21b3d9779e055" + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-3.0.3.tgz#1d66eb670ebf657e57c0fda014df340c19d8aa0c" + dependencies: + "@types/node" "*" + +"@types/glob@*": + version "5.0.30" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.30.tgz#1026409c5625a8689074602808d082b2867b8a51" dependencies: + "@types/minimatch" "*" "@types/node" "*" "@types/handlebars@^4.0.31": - version "4.0.32" - resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.32.tgz#637e8d945a9354aab47df7125005490fe9f8e592" + version "4.0.35" + resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.35.tgz#409eb97a3ad6970daba4d586cb6afe3f5e082c01" "@types/highlight.js@^9.1.8": version "9.1.9" resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.1.9.tgz#ed6336955eaf233b75eb7923b9b1f373d045ef01" "@types/lodash@^4.14.37": - version "4.14.64" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.64.tgz#979cf3a3d4a368670840bf9b3e448dc33ffe84ee" + version "4.14.72" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.72.tgz#f090cf6eb1fee1647a0efa1ebe18b0b78ed551c6" "@types/marked@0.0.28": version "0.0.28" resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.0.28.tgz#44ba754e9fa51432583e8eb30a7c4dd249b52faa" -"@types/minimatch@^2.0.29": +"@types/minimatch@*", "@types/minimatch@^2.0.29": version "2.0.29" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-2.0.29.tgz#5002e14f75e2d71e564281df0431c8c1b4a2a36a" @@ -70,28 +77,34 @@ moment "*" "@types/node@*": - version "7.0.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.22.tgz#4593f4d828bdd612929478ea40c67b4f403ca255" + version "8.0.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.20.tgz#65c7375255c24b184c215a5d0b63247c32f01c91" "@types/react-dom@^15.5.0": - version "15.5.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-15.5.0.tgz#7f4fb9613d4051141773242f7b6b5f1a46b34bd9" + version "15.5.2" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-15.5.2.tgz#f7203c75a1728812355f037ea112611d082555e6" dependencies: + "@types/node" "*" "@types/react" "*" -"@types/react@*", "@types/react@^15.0.22": - version "15.0.24" - resolved "https://registry.yarnpkg.com/@types/react/-/react-15.0.24.tgz#8a75299dc37906df327c18ca918bf97a55e7123b" +"@types/react@*": + version "16.0.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.2.tgz#0b31a73cdde6272b719e5b05a7df6d1e2654a804" + +"@types/react@^15.0.22": + version "15.6.1" + resolved "https://registry.yarnpkg.com/@types/react/-/react-15.6.1.tgz#497f7228762da4432e335957cb34fe9b40f150ae" "@types/shelljs@^0.7.0": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.7.1.tgz#30fe144e3bdd37c11c174445bc54190cb7992a45" + version "0.7.4" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.7.4.tgz#137b5f31306eaff4de120ffe5b9d74b297809cfc" dependencies: + "@types/glob" "*" "@types/node" "*" abbrev@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" acorn-dynamic-import@^2.0.0: version "2.0.2" @@ -104,8 +117,8 @@ acorn@^4.0.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" acorn@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" + version "5.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" ajv-keywords@^1.1.1: version "1.5.1" @@ -144,6 +157,10 @@ ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" @@ -152,22 +169,22 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.0.0.tgz#5404e93a544c4fec7f048262977bebfe3155e0c1" +ansi-styles@^3.0.0, ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: - color-convert "^1.0.0" + color-convert "^1.9.0" ansi-styles@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" dependencies: - arrify "^1.0.0" micromatch "^2.1.5" + normalize-path "^2.0.0" append-transform@^0.4.0: version "0.4.0" @@ -176,8 +193,8 @@ append-transform@^0.4.0: default-require-extensions "^1.0.0" aproba@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" archiver-utils@^1.3.0: version "1.3.0" @@ -232,17 +249,25 @@ arr-exclude@^1.0.0: resolved "https://registry.yarnpkg.com/arr-exclude/-/arr-exclude-1.0.0.tgz#dfc7c2e552a270723ccda04cf3128c8cbfe5c631" arr-flatten@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +array-slice@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -262,8 +287,8 @@ arrify@^1.0.0, arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" asap@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" asn1.js@^4.0.0: version "4.9.1" @@ -300,8 +325,8 @@ async@^1.4.0: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" async@^2.0.0, async@^2.1.2: - version "2.4.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" dependencies: lodash "^4.14.0" @@ -314,14 +339,14 @@ auto-bind@^1.1.0: resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.1.0.tgz#93b864dc7ee01a326281775d5c75ca0a751e5961" ava-init@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ava-init/-/ava-init-0.2.0.tgz#9304c8b4c357d66e3dfdae1fbff47b1199d5c55d" + version "0.2.1" + resolved "https://registry.yarnpkg.com/ava-init/-/ava-init-0.2.1.tgz#75ac4c8553326290d2866e63b62fa7035684bd58" dependencies: arr-exclude "^1.0.0" - execa "^0.5.0" + execa "^0.7.0" has-yarn "^1.0.0" read-pkg-up "^2.0.0" - write-pkg "^2.0.0" + write-pkg "^3.1.0" ava@^0.19.1: version "0.19.1" @@ -423,19 +448,19 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: js-tokens "^3.0.0" babel-core@^6.17.0, babel-core@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" dependencies: babel-code-frame "^6.22.0" - babel-generator "^6.24.1" + babel-generator "^6.25.0" babel-helpers "^6.24.1" babel-messages "^6.23.0" babel-register "^6.24.1" babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babylon "^6.11.0" + babel-template "^6.25.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" convert-source-map "^1.1.0" debug "^2.1.1" json5 "^0.5.0" @@ -446,13 +471,13 @@ babel-core@^6.17.0, babel-core@^6.24.1: slash "^1.0.0" source-map "^0.5.0" -babel-generator@^6.1.0, babel-generator@^6.18.0, babel-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" +babel-generator@^6.1.0, babel-generator@^6.18.0, babel-generator@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" dependencies: babel-messages "^6.23.0" babel-runtime "^6.22.0" - babel-types "^6.24.1" + babel-types "^6.25.0" detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.2.0" @@ -661,56 +686,56 @@ babel-register@^6.24.1: source-map-support "^0.4.2" babel-runtime@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.25.0.tgz#33b98eaa5d482bb01a8d1aa6b437ad2b01aec41c" dependencies: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-template@^6.16.0, babel-template@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" dependencies: babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babylon "^6.11.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" lodash "^4.2.0" -babel-traverse@^6.18.0, babel-traverse@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" dependencies: babel-code-frame "^6.22.0" babel-messages "^6.23.0" babel-runtime "^6.22.0" - babel-types "^6.24.1" - babylon "^6.15.0" + babel-types "^6.25.0" + babylon "^6.17.2" debug "^2.2.0" globals "^9.0.0" invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.18.0, babel-types@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" +babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" dependencies: babel-runtime "^6.22.0" esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.1.0, babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: - version "6.17.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" +babylon@^6.1.0, babylon@^6.17.2, babylon@^6.17.4: + version "6.17.4" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" base64-js@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" bcrypt-pbkdf@^1.0.0: version "1.0.1" @@ -727,8 +752,8 @@ big.js@^3.1.3: resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + version "1.9.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.9.0.tgz#66506c16ce6f4d6928a5b3cd6a33ca41e941e37b" bl@^1.0.0: version "1.2.1" @@ -747,8 +772,8 @@ bluebird@^3.0.0, bluebird@^3.4.7: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" boolbase@~1.0.0: version "1.0.0" @@ -761,22 +786,22 @@ boom@2.x.x: hoek "2.x.x" boxen@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102" + version "1.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" dependencies: ansi-align "^2.0.0" camelcase "^4.0.0" - chalk "^1.1.1" + chalk "^2.0.1" cli-boxes "^1.0.0" string-width "^2.0.0" - term-size "^0.1.0" + term-size "^1.2.0" widest-line "^1.0.0" brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: - balanced-match "^0.4.1" + balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: @@ -850,10 +875,6 @@ buffer-crc32@^0.2.1, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" -buffer-shims@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - buffer-xor@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -972,7 +993,15 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chokidar@^1.4.2, chokidar@^1.4.3: +chalk@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chokidar@^1.4.2, chokidar@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -992,14 +1021,15 @@ ci-info@^1.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" dependencies: inherits "^2.0.1" + safe-buffer "^5.0.1" clean-css@4.1.x: - version "4.1.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce" + version "4.1.7" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.7.tgz#b9aea4f85679889cf3eae8b40349ec4ebdfdd032" dependencies: source-map "0.5.x" @@ -1026,10 +1056,10 @@ cli-spinners@^1.0.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.0.0.tgz#ef987ed3d48391ac3dab9180b406a742180d6e6a" cli-truncate@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.0.0.tgz#21eb91f47b3f6560f004db77a769b4668d9c5518" + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" dependencies: - slice-ansi "0.0.4" + slice-ansi "^1.0.0" string-width "^2.0.0" cliui@^2.1.0: @@ -1068,6 +1098,10 @@ clone@^1.0.0, clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + cloneable-readable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" @@ -1096,17 +1130,17 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" -color-convert@^1.0.0: +color-convert@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: color-name "^1.1.1" color-name@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d" + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -colors@^1.0.3, colors@^1.1.2: +colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1116,11 +1150,9 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.x, commander@~2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" +commander@2.11.x, commander@^2.9.0, commander@~2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" common-path-prefix@^1.0.0: version "1.0.0" @@ -1130,7 +1162,7 @@ commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" -compress-commons@^1.1.0: +compress-commons@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.0.tgz#58587092ef20d37cb58baf000112c9278ff73b9f" dependencies: @@ -1158,8 +1190,8 @@ concat-with-sourcemaps@^1.0.0: source-map "^0.5.1" configstore@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1202,10 +1234,10 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" core-js@^2.0.0, core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + version "2.5.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.0.tgz#569c050918be6486b3837552028ae0466b717086" -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1253,20 +1285,29 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn-async@^2.1.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" +create-react-class@^15.6.0: + version "15.6.0" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.0.tgz#ab448497c26566e1e29413e883207d57cfe7bed4" dependencies: - lru-cache "^4.0.0" - which "^1.2.8" + fbjs "^0.8.9" + loose-envify "^1.3.1" + object-assign "^4.1.1" -cross-spawn@^4, cross-spawn@^4.0.0: +cross-spawn@^4: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" dependencies: lru-cache "^4.0.1" which "^1.2.9" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -1274,8 +1315,8 @@ cryptiles@2.x.x: boom "2.x.x" crypto-browserify@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522" + version "3.11.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -1341,8 +1382,8 @@ debug-log@^1.0.1: resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" debug@^2.1.1, debug@^2.2.0, debug@^2.6.3: - version "2.6.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: ms "2.0.0" @@ -1410,8 +1451,8 @@ diff-match-patch@^1.0.0: resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.0.tgz#1cc3c83a490d67f95d91e39f6ad1f2e086b63048" diff@^3.0.0, diff@^3.0.1, diff@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + version "3.3.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9" diffie-hellman@^5.0.0: version "5.0.2" @@ -1434,6 +1475,10 @@ dom-serializer@0: domelementtype "~1.1.1" entities "~1.1.1" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -1466,8 +1511,8 @@ domutils@1.5.1: domelementtype "1" dot-prop@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: is-obj "^1.0.0" @@ -1482,10 +1527,10 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" duplexify@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + version "3.5.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" dependencies: - end-of-stream "1.0.0" + end-of-stream "^1.0.0" inherits "^2.0.1" readable-stream "^2.0.0" stream-shift "^1.0.0" @@ -1513,8 +1558,8 @@ emojis-list@^2.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" empower-core@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.1.tgz#6c187f502fcef7554d57933396aac655483772b1" + version "0.6.2" + resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.2.tgz#5adef566088e31fba80ba0a36df47d7094169144" dependencies: call-signature "0.0.2" core-js "^2.0.0" @@ -1525,11 +1570,11 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@1.0.0, end-of-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" +end-of-stream@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" dependencies: - once "~1.3.0" + once "^1.4.0" end-of-stream@~0.1.5: version "0.1.5" @@ -1537,14 +1582,14 @@ end-of-stream@~0.1.5: dependencies: once "~1.3.0" -enhanced-resolve@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec" +enhanced-resolve@^3.0.0, enhanced-resolve@^3.3.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" object-assign "^4.0.1" - tapable "^0.2.5" + tapable "^0.2.7" entities@~1.1.1: version "1.1.1" @@ -1570,14 +1615,10 @@ es6-error@^4.0.1, es6-error@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.0.2.tgz#eec5c726eacef51b7f6b73c20db6e1b13b069c98" -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escape-string-regexp@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" - espower-location-detector@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5" @@ -1587,9 +1628,9 @@ espower-location-detector@^1.0.0: source-map "^0.5.0" xtend "^4.0.0" -esprima@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" espurify@^1.6.0: version "1.7.0" @@ -1615,23 +1656,12 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" -execa@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" - dependencies: - cross-spawn-async "^2.1.1" - is-stream "^1.1.0" - npm-run-path "^1.0.0" - object-assign "^4.0.1" - path-key "^1.0.0" - strip-eof "^1.0.0" - -execa@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" dependencies: - cross-spawn "^4.0.0" - get-stream "^2.2.0" + cross-spawn "^5.0.1" + get-stream "^3.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" @@ -1650,12 +1680,18 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expand-tilde@^1.2.1, expand-tilde@^1.2.2: +expand-tilde@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" dependencies: os-homedir "^1.0.1" +expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -1672,9 +1708,9 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" fancy-log@^1.1.0: version "1.3.0" @@ -1684,8 +1720,8 @@ fancy-log@^1.1.0: time-stamp "^1.0.0" fbjs@^0.8.9: - version "0.8.12" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" + version "0.8.14" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.14.tgz#d1dbe2be254c35a91e09f31f9cd50a40b2a0ed1c" dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -1734,7 +1770,7 @@ find-up@^1.0.0, find-up@^1.1.2: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -1750,15 +1786,13 @@ findup-sync@^0.4.2: resolve-dir "^0.1.0" fined@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" dependencies: - expand-tilde "^1.2.1" - lodash.assignwith "^4.0.7" - lodash.isempty "^4.2.1" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.pick "^4.2.1" + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" parse-filepath "^1.0.1" first-chunk-stream@^1.0.0: @@ -1783,6 +1817,12 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + foreground-child@^1.3.3, foreground-child@^1.5.3: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" @@ -1819,11 +1859,11 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.29" + node-pre-gyp "^0.6.36" fstream-ignore@^1.0.5: version "1.0.5" @@ -1873,13 +1913,6 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -2006,9 +2039,16 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" +global@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + globals@^9.0.0: - version "9.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" globby@^6.0.0: version "6.1.0" @@ -2064,10 +2104,6 @@ graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - gulp-concat@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/gulp-concat/-/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353" @@ -2144,8 +2180,8 @@ gulp-tar@^1.8.0: through2 "^2.0.0" gulp-typescript@^3.0.2: - version "3.1.6" - resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-3.1.6.tgz#6c67b84364cf3589a9ad6fdea2e3c0bc525c435e" + version "3.2.1" + resolved "https://registry.yarnpkg.com/gulp-typescript/-/gulp-typescript-3.2.1.tgz#52cd77e9c6844e3b9a8bddd88e884ceb46a5db79" dependencies: gulp-util "~3.0.7" source-map "~0.5.3" @@ -2288,10 +2324,11 @@ hash-base@^2.0.0: inherits "^2.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" dependencies: - inherits "^2.0.1" + inherits "^2.0.3" + minimalistic-assert "^1.0.0" hawk@~3.1.3: version "3.1.3" @@ -2307,8 +2344,8 @@ he@1.1.x: resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" highlight.js@^9.0.0: - version "9.11.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.11.0.tgz#47f98c7399918700db2caf230ded12cec41a84ae" + version "9.12.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" hmac-drbg@^1.0.0: version "1.0.1" @@ -2329,23 +2366,23 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.0: +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.4.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" html-minifier@^3.2.3: - version "3.5.1" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.1.tgz#0fbba015129b4ac9a30b887aec66f39d57cd37a9" + version "3.5.3" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.3.tgz#4a275e3b1a16639abb79b4c11191ff0d0fcf1ab9" dependencies: camel-case "3.0.x" clean-css "4.1.x" - commander "2.9.x" + commander "2.11.x" he "1.1.x" ncname "1.0.x" param-case "2.1.x" @@ -2353,8 +2390,8 @@ html-minifier@^3.2.3: uglify-js "3.0.x" html-webpack-plugin@^2.28.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.28.0.tgz#2e7863b57e5fd48fe263303e2ffc934c3064d009" + version "2.30.1" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz#7f9c421b7ea91ec460f56527d78df484ee7537d5" dependencies: bluebird "^3.4.7" html-minifier "^3.2.3" @@ -2385,8 +2422,8 @@ https-browserify@0.0.1: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" hullabaloo-config-manager@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hullabaloo-config-manager/-/hullabaloo-config-manager-1.0.1.tgz#c72be7ba249a67c99b6ba3eb1f55837fa01acd8f" + version "1.1.1" + resolved "https://registry.yarnpkg.com/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz#1d9117813129ad035fd9e8477eaf066911269fe3" dependencies: dot-prop "^4.1.0" es6-error "^4.0.2" @@ -2399,12 +2436,13 @@ hullabaloo-config-manager@^1.0.0: lodash.merge "^4.6.0" md5-hex "^2.0.0" package-hash "^2.0.0" - pkg-dir "^1.0.0" - resolve-from "^2.0.0" + pkg-dir "^2.0.0" + resolve-from "^3.0.0" + safe-buffer "^5.0.1" iconv-lite@~0.4.13: - version "0.4.17" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.17.tgz#4fdaa3b38acbc2c031b045d0edcdfe1ecab18c8d" + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" ieee754@^1.1.4: version "1.1.8" @@ -2414,6 +2452,10 @@ ignore-by-default@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2425,8 +2467,8 @@ indent-string@^2.1.0: repeating "^2.0.0" indent-string@^3.0.0, indent-string@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.1.0.tgz#08ff4334603388399b329e6b9538dc7a3cf5de7d" + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" indexof@0.0.1: version "0.0.1" @@ -2443,7 +2485,7 @@ inherits@1: version "1.0.2" resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2470,8 +2512,8 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" irregular-plurals@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac" + version "1.3.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.3.0.tgz#7af06931bdf74be33dcf585a13e06fccc16caecf" is-absolute@^0.2.3: version "0.2.6" @@ -2507,8 +2549,8 @@ is-ci@^1.0.7: ci-info "^1.0.0" is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" is-equal-shallow@^0.1.3: version "0.1.3" @@ -2568,12 +2610,18 @@ is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" -is-number@^2.0.2, is-number@^2.1.0: +is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" dependencies: kind-of "^3.0.2" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -2588,6 +2636,12 @@ is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" +is-plain-object@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -2660,12 +2714,16 @@ isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" -isobject@^2.0.0: +isobject@^2.0.0, isobject@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" @@ -2677,50 +2735,50 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-lib-coverage@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#caca19decaef3525b5d6331d701f3f3b7ad48528" +istanbul-lib-coverage@^1.1.0, istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" istanbul-lib-hook@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.6.tgz#c0866d1e81cf2d5319249510131fc16dee49231f" + version "1.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc" dependencies: append-transform "^0.4.0" istanbul-lib-instrument@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.1.tgz#169e31bc62c778851a99439dd99c3cc12184d360" + version "1.7.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz#e9fd920e4767f3d19edc765e2d6b3f5ccbd0eea8" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" - babylon "^6.13.0" - istanbul-lib-coverage "^1.1.0" + babylon "^6.17.4" + istanbul-lib-coverage "^1.1.1" semver "^5.3.0" istanbul-lib-report@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.0.tgz#444c4ecca9afa93cf584f56b10f195bf768c0770" + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" dependencies: - istanbul-lib-coverage "^1.1.0" + istanbul-lib-coverage "^1.1.1" mkdirp "^0.5.1" path-parse "^1.0.5" supports-color "^3.1.2" istanbul-lib-source-maps@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.0.tgz#8c7706d497e26feeb6af3e0c28fd5b0669598d0e" + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" dependencies: debug "^2.6.3" - istanbul-lib-coverage "^1.1.0" + istanbul-lib-coverage "^1.1.1" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" istanbul-reports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.0.tgz#1ef3b795889219cfb5fad16365f6ce108d5f8c66" + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e" dependencies: handlebars "^4.0.3" @@ -2793,22 +2851,16 @@ jest-validate@^19.0.2: leven "^2.0.0" pretty-format "^19.0.0" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - js-tokens@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" js-yaml@^3.8.2: - version "3.8.4" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" + version "3.9.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" dependencies: argparse "^1.0.7" - esprima "^3.1.1" + esprima "^4.0.0" jsbn@~0.1.0: version "0.1.1" @@ -2823,8 +2875,8 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" json-loader@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" json-schema@0.2.3: version "0.2.3" @@ -2845,8 +2897,8 @@ json5@^0.5.0, json5@^0.5.1: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" jsonfile@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.0.tgz#92e7c7444e5ffd5fa32e6a9ae8b85034df8347d0" + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" optionalDependencies: graceful-fs "^4.1.6" @@ -2855,13 +2907,13 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" jsprim@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" dependencies: assert-plus "1.0.0" - extsprintf "1.0.2" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" kind-of@^3.0.2: version "3.2.2" @@ -2869,6 +2921,12 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.1.5" +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + last-line-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/last-line-stream/-/last-line-stream-1.0.0.tgz#d1b64d69f86ff24af2d04883a2ceee14520a5600" @@ -2885,10 +2943,6 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lazy-req@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" - lazystream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" @@ -3041,10 +3095,6 @@ lodash._shimkeys@~2.4.1: dependencies: lodash._objecttypes "~2.4.1" -lodash.assignwith@^4.0.7: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" - lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -3098,10 +3148,6 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isempty@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - lodash.isequal@^4.0.0, lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -3144,10 +3190,6 @@ lodash.merge@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -3235,12 +3277,12 @@ lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" -lru-cache@^4.0.0, lru-cache@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" + pseudomap "^1.0.2" + yallist "^2.1.2" make-dir@^1.0.0: version "1.0.0" @@ -3309,10 +3351,10 @@ meow@^3.3.0, meow@^3.7.0: trim-newlines "^1.0.0" merge-source-map@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf" + version "1.0.4" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" dependencies: - source-map "^0.5.3" + source-map "^0.5.6" merge-stream@^1.0.0: version "1.0.1" @@ -3345,20 +3387,26 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.15" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" dependencies: - mime-db "~1.27.0" + mime-db "~1.29.0" mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -3386,7 +3434,7 @@ minimatch@~0.2.11: lru-cache "2" sigmund "~1.0.0" -minimist@0.0.8, minimist@~0.0.1: +minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -3398,6 +3446,10 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -3413,8 +3465,8 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" ms@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + version "0.7.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" multimatch@^2.1.0: version "2.1.0" @@ -3456,8 +3508,8 @@ no-case@^2.2.0: lower-case "^1.1.1" node-fetch@^1.0.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.0.tgz#3ff6c56544f9b7fb00682338bb55ee6f54a8a0ef" + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.2.tgz#c54e9aac57e432875233525f3c891c4159ffefd7" dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -3490,9 +3542,9 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-pre-gyp@^0.6.29: - version "0.6.34" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" dependencies: mkdirp "^0.5.1" nopt "^4.0.1" @@ -3519,8 +3571,8 @@ nopt@^4.0.1: osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.8" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -3533,12 +3585,6 @@ normalize-path@^2.0.0, normalize-path@^2.0.1: dependencies: remove-trailing-separator "^1.0.1" -npm-run-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" - dependencies: - path-key "^1.0.0" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -3546,8 +3592,8 @@ npm-run-path@^2.0.0: path-key "^2.0.0" npmlog@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -3604,7 +3650,7 @@ object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3612,6 +3658,15 @@ object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -3619,6 +3674,12 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.pick@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.2.0.tgz#b5392bee9782da6d9fb7d6afaf539779f1234c2b" + dependencies: + isobject "^2.1.0" + observable-to-promise@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-0.5.0.tgz#c828f0f0dc47e9f86af8a4977c5d55076ce7a91f" @@ -3626,7 +3687,7 @@ observable-to-promise@^0.5.0: is-observable "^0.2.0" symbol-observable "^1.0.4" -once@^1.3.0, once@^1.3.3: +once@^1.3.0, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -3644,7 +3705,7 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -optimist@^0.6.1, optimist@~0.6.0: +optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" dependencies: @@ -3816,10 +3877,6 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-key@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" - path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -3853,8 +3910,8 @@ path-type@^2.0.0: pify "^2.0.0" pbkdf2@^3.0.3: - version "3.0.12" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.12.tgz#be36785c5067ea48d806ff923288c5f750b6b8a2" + version "3.0.13" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.13.tgz#c37d295531e786b1da3e3eadc840426accb0ae25" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -3903,6 +3960,12 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + plur@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" @@ -3915,7 +3978,7 @@ plur@^2.0.0: "po2json@git+https://github.com/mikeedwards/po2json": version "0.4.5" - resolved "git+https://github.com/mikeedwards/po2json#64ba134fc294d6ad60de3ea487ddc1f76c489a2b" + resolved "git+https://github.com/mikeedwards/po2json#e4ebf5fd2efac1e5b1f75e27973e4cb63ce6bcfa" dependencies: gettext-parser "1.1.0" nomnom "1.8.1" @@ -3932,8 +3995,8 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" pretty-error@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.0.tgz#87f4e9d706a24c87d6cbee9fabec001fcf8c75d8" + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" dependencies: renderkid "^2.0.1" utila "~0.4" @@ -3974,17 +4037,21 @@ process@^0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" promise@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" dependencies: asap "~2.0.3" -prop-types@^15.5.7, prop-types@~15.5.7: +prop-types@^15.5.10: version "15.5.10" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" dependencies: @@ -3995,7 +4062,7 @@ prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" -pseudomap@^1.0.1: +pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4030,15 +4097,17 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" randomatic@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" + is-number "^3.0.0" + kind-of "^4.0.0" randombytes@^2.0.0, randombytes@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" + version "2.0.5" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + dependencies: + safe-buffer "^5.1.0" rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: version "1.2.1" @@ -4050,22 +4119,23 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: strip-json-comments "~2.0.1" react-dom@^15.5.4: - version "15.5.4" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.5.4.tgz#ba0c28786fd52ed7e4f2135fe0288d462aef93da" + version "15.6.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.1.tgz#2cb0ed4191038e53c209eb3a79a23e2a4cf99470" dependencies: fbjs "^0.8.9" loose-envify "^1.1.0" object-assign "^4.1.0" - prop-types "~15.5.7" + prop-types "^15.5.10" react@^15.5.4: - version "15.5.4" - resolved "https://registry.yarnpkg.com/react/-/react-15.5.4.tgz#fa83eb01506ab237cdc1c8c3b1cea8de012bf047" + version "15.6.1" + resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df" dependencies: + create-react-class "^15.6.0" fbjs "^0.8.9" loose-envify "^1.1.0" object-assign "^4.1.0" - prop-types "^15.5.7" + prop-types "^15.5.10" read-pkg-up@^1.0.1: version "1.0.1" @@ -4107,15 +4177,15 @@ readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0 string_decoder "~0.10.x" readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: - version "2.2.9" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: - buffer-shims "~1.0.0" core-util-is "~1.0.0" - inherits "~2.0.1" + inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~1.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" util-deprecate "~1.0.1" readable-stream@~1.1.9: @@ -4206,8 +4276,8 @@ release-zalgo@^1.0.0: es6-error "^4.0.1" remove-trailing-separator@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + version "1.0.2" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" renderkid@^2.0.1: version "2.0.1" @@ -4297,9 +4367,13 @@ resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" dependencies: path-parse "^1.0.5" @@ -4329,9 +4403,9 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" semver-diff@^2.0.0: version "2.1.0" @@ -4340,8 +4414,8 @@ semver-diff@^2.0.0: semver "^5.0.3" "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" semver@^4.1.0: version "4.3.6" @@ -4369,9 +4443,19 @@ sha.js@^2.4.0, sha.js@^2.4.8: dependencies: inherits "^2.0.1" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + shelljs@^0.7.0: - version "0.7.7" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -4393,9 +4477,11 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" +slice-ansi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" slide@^1.1.5: version "1.1.6" @@ -4407,15 +4493,21 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -sort-keys@^1.1.1, sort-keys@^1.1.2: +sort-keys@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" dependencies: is-plain-obj "^1.0.0" -source-list-map@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1" +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" source-map-support@^0.4.0, source-map-support@^0.4.2: version "0.4.15" @@ -4467,8 +4559,8 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -4477,7 +4569,6 @@ sshpk@^1.7.0: optionalDependencies: bcrypt-pbkdf "^1.0.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" jsbn "~0.1.0" tweetnacl "~0.14.0" @@ -4497,8 +4588,8 @@ stream-consume@~0.1.0: resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" stream-http@^2.3.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.1.tgz#546a51741ad5a6b07e9e31b0b10441a917df528a" + version "2.7.2" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" @@ -4523,21 +4614,21 @@ string-width@^1.0.1, string-width@^1.0.2: strip-ansi "^3.0.0" string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" + strip-ansi "^4.0.0" string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -string_decoder@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" dependencies: - safe-buffer "^5.0.1" + safe-buffer "~5.1.0" stringify-object@^2.3.0: version "2.4.0" @@ -4562,6 +4653,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" @@ -4628,6 +4725,12 @@ supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" +supports-color@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" + dependencies: + has-flag "^2.0.0" + symbol-observable@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" @@ -4636,9 +4739,9 @@ symbol-observable@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" -tapable@^0.2.5, tapable@~0.2.5: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" +tapable@^0.2.7, tapable@~0.2.5: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" tar-pack@^3.4.0: version "3.4.0" @@ -4670,15 +4773,15 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" -term-size@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" dependencies: - execa "^0.4.0" + execa "^0.7.0" test-exclude@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.0.tgz#04ca70b7390dd38c98d4a003a173806ca7991c91" + version "4.1.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" dependencies: arrify "^1.0.1" micromatch "^2.3.11" @@ -4749,9 +4852,10 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" timers-browserify@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" + version "2.0.3" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.3.tgz#41fd0bdc926a5feedc33a17a8e1f7d491925f7fc" dependencies: + global "^4.3.2" setimmediate "^1.0.4" to-absolute-glob@^0.1.1: @@ -4787,35 +4891,38 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" ts-loader@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-2.1.0.tgz#5a8efcc5c72c06fc49d69bad69c85617c6194f77" + version "2.3.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-2.3.2.tgz#b71b9f0d0062c791a654d462140718f9f7817665" dependencies: - colors "^1.0.3" + chalk "^2.0.1" enhanced-resolve "^3.0.0" loader-utils "^1.0.2" semver "^5.0.1" -tslib@^1.6.0: +tslib@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec" tslint@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.3.2.tgz#e56459fb095a7307f103b84052174f5e3bbef6ed" + version "5.6.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.6.0.tgz#088aa6c6026623338650b2900828ab3edf59f6cf" dependencies: babel-code-frame "^6.22.0" colors "^1.1.2" + commander "^2.9.0" diff "^3.2.0" glob "^7.1.1" - optimist "~0.6.0" + minimatch "^3.0.4" resolve "^1.3.2" semver "^5.3.0" - tslib "^1.6.0" - tsutils "^2.0.0" + tslib "^1.7.1" + tsutils "^2.7.1" -tsutils@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.2.0.tgz#218614657f21c677e4536b4ba75daf8ebce1b367" +tsutils@^2.7.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.8.0.tgz#0160173729b3bf138628dd14a1537e00851d814a" + dependencies: + tslib "^1.7.1" tty-browserify@0.0.0: version "0.0.0" @@ -4840,8 +4947,8 @@ typedoc-default-themes@^0.5.0: resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.5.0.tgz#6dc2433e78ed8bea8e887a3acde2f31785bd6227" typedoc@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.7.1.tgz#b441bffe246bb3e0e598d9ae474e743594bda769" + version "0.7.2" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.7.2.tgz#d9859422b2d7ea604bc4f217e901f82aa1ab2c46" dependencies: "@types/fs-extra" "^3.0.0" "@types/handlebars" "^4.0.31" @@ -4859,30 +4966,30 @@ typedoc@^0.7.1: progress "^2.0.0" shelljs "^0.7.0" typedoc-default-themes "^0.5.0" - typescript "2.3.2" + typescript "2.3.4" -typescript@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.2.tgz#f0f045e196f69a72f06b25fd3bd39d01c3ce9984" +typescript@2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.4.tgz#3d38321828231e434f287514959c37a82b629f42" typescript@next: - version "2.4.0-dev.20170524" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.0-dev.20170524.tgz#f818a6ae2237ffa33aae7b8ed728c6b45c7566ce" + version "2.5.0-dev.20170808" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.0-dev.20170808.tgz#89e017e404b058414d0b992cedfd2d9865164a75" ua-parser-js@^0.7.9: - version "0.7.12" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" + version "0.7.14" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.14.tgz#110d53fa4c3f326c121292bbeac904d2e03387ca" uglify-js@3.0.x: - version "3.0.11" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.11.tgz#81f594b9a24dad76e39da92f8f06e5b3bc8c2e11" + version "3.0.27" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.27.tgz#a97db8c8ba6b9dba4e2f88d86aa9548fa6320034" dependencies: - commander "~2.9.0" + commander "~2.11.0" source-map "~0.5.1" uglify-js@^2.6, uglify-js@^2.8.22, uglify-js@^2.8.27: - version "2.8.27" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c" + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -4935,23 +5042,23 @@ unique-temp-dir@^1.0.0: uid2 "0.0.3" universalify@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.0.tgz#9eb1c4651debcc670cc94f1a75762332bb967778" + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" update-notifier@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" dependencies: boxen "^1.0.0" chalk "^1.0.0" configstore "^3.0.0" + import-lazy "^2.1.0" is-npm "^1.0.0" latest-version "^3.0.0" - lazy-req "^2.0.0" semver-diff "^2.0.0" xdg-basedir "^3.0.0" @@ -4960,8 +5067,8 @@ upper-case@^1.1.1: resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" urijs@^1.18.10: - version "1.18.10" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.18.10.tgz#b94463eaba59a1a796036a467bb633c667f221ab" + version "1.18.12" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.18.12.tgz#f04d91e1fabb29c16fc842f9a14ee8ddc3fda64e" url-parse-lax@^1.0.0: version "1.0.0" @@ -4999,8 +5106,8 @@ utila@~0.4: resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" uuid@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" v8flags@^2.0.2: version "2.1.1" @@ -5019,11 +5126,13 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" dependencies: - extsprintf "1.0.2" + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" vinyl-fs@^0.3.0: version "0.3.14" @@ -5090,14 +5199,13 @@ vinyl@^1.0.0: replace-ext "0.0.1" vinyl@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c" + version "2.1.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" dependencies: - clone "^1.0.0" + clone "^2.1.1" clone-buffer "^1.0.0" clone-stats "^1.0.0" cloneable-readable "^1.0.0" - is-stream "^1.1.0" remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" @@ -5112,11 +5220,11 @@ walkdir@^0.0.11: resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" watchpack@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" + version "1.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" dependencies: async "^2.1.2" - chokidar "^1.4.3" + chokidar "^1.7.0" graceful-fs "^4.1.2" webpack-merge@^4.1.0: @@ -5125,23 +5233,23 @@ webpack-merge@^4.1.0: dependencies: lodash "^4.17.4" -webpack-sources@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" +webpack-sources@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" dependencies: - source-list-map "^1.1.1" + source-list-map "^2.0.0" source-map "~0.5.3" webpack@^2.4.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.6.0.tgz#7e650a92816abff5db5f43316b0b8b19b13d76c1" + version "2.7.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.7.0.tgz#b2a1226804373ffd3d03ea9c6bd525067034f6b1" dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" ajv "^4.7.0" ajv-keywords "^1.1.1" async "^2.1.2" - enhanced-resolve "^3.0.0" + enhanced-resolve "^3.3.0" interpret "^1.0.0" json-loader "^0.5.4" json5 "^0.5.1" @@ -5155,7 +5263,7 @@ webpack@^2.4.1: tapable "~0.2.5" uglify-js "^2.8.27" watchpack "^1.3.1" - webpack-sources "^0.2.3" + webpack-sources "^1.0.1" yargs "^6.0.0" whatwg-fetch@>=0.10.0: @@ -5166,9 +5274,9 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.2.12, which@^1.2.4, which@^1.2.8, which@^1.2.9: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" +which@^1.2.12, which@^1.2.4, which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: isexe "^2.0.0" @@ -5223,7 +5331,7 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" slide "^1.1.5" -write-json-file@^2.0.0: +write-json-file@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.2.0.tgz#51862506bbb3b619eefab7859f1fd6c6d0530876" dependencies: @@ -5234,12 +5342,12 @@ write-json-file@^2.0.0: sort-keys "^1.1.1" write-file-atomic "^2.0.0" -write-pkg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-2.1.0.tgz#353aa44c39c48c21440f5c08ce6abd46141c9c08" +write-pkg@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.1.0.tgz#030a9994cc9993d25b4e75a9f1a1923607291ce9" dependencies: - sort-keys "^1.1.2" - write-json-file "^2.0.0" + sort-keys "^2.0.0" + write-json-file "^2.2.0" xdg-basedir@^3.0.0: version "3.0.0" @@ -5267,7 +5375,7 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yallist@^2.0.0: +yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -5335,10 +5443,10 @@ yazl@^2.1.0: buffer-crc32 "~0.2.3" zip-stream@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.1.1.tgz#5216b48bbb4d2651f64d5c6e6f09eb4a7399d557" + version "1.2.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" dependencies: archiver-utils "^1.3.0" - compress-commons "^1.1.0" + compress-commons "^1.2.0" lodash "^4.8.0" readable-stream "^2.0.0" |