Merge pull request #8054 from MetaMask/Version-v7.7.5

Version v7.7.5 RC
feature/default_network_editable
Thomas Huang 5 years ago committed by GitHub
commit 2285a5077d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      CHANGELOG.md
  2. 6
      app/_locales/en/messages.json
  3. 2
      app/manifest.json
  4. 2
      app/scripts/contentscript.js
  5. 2
      app/scripts/lib/buy-eth-url.js
  6. 2
      test/unit/app/buy-eth-url.spec.js
  7. 58
      test/unit/util_test.js
  8. 13
      ui/app/helpers/utils/util.js
  9. 47
      ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.component.js
  10. 3
      ui/app/pages/confirm-add-suggested-token/confirm-add-suggested-token.container.js
  11. 6
      ui/app/pages/send/send-content/add-recipient/ens-input.component.js
  12. 4
      ui/app/pages/send/send.container.js
  13. 6
      ui/app/pages/settings/contact-list-tab/add-contact/add-contact.component.js
  14. 80
      yarn.lock

@ -2,6 +2,12 @@
## Current Develop Branch ## Current Develop Branch
## 7.7.5 Fri Feb 14 2020
- [#8053](https://github.com/MetaMask/metamask-extension/pull/8053): Inline the source text not the binary encoding for inpage script
- [#8049](https://github.com/MetaMask/metamask-extension/pull/8049): Add warning to watchAsset API when editing a known token
- [#8051](https://github.com/MetaMask/metamask-extension/pull/8051): Update Wyre ETH purchase url
- [#8059](https://github.com/MetaMask/metamask-extension/pull/8059): Attempt ENS resolution on any valid domain name
## 7.7.4 Wed Jan 29 2020 ## 7.7.4 Wed Jan 29 2020
- [#7918](https://github.com/MetaMask/metamask-extension/pull/7918): Update data on Approve screen after updating custom spend limit - [#7918](https://github.com/MetaMask/metamask-extension/pull/7918): Update data on Approve screen after updating custom spend limit
- [#7919](https://github.com/MetaMask/metamask-extension/pull/7919): Allow editing max spend limit - [#7919](https://github.com/MetaMask/metamask-extension/pull/7919): Allow editing max spend limit

@ -715,6 +715,12 @@
"knownAddressRecipient": { "knownAddressRecipient": {
"message": "Known contract address." "message": "Known contract address."
}, },
"knownTokenWarning": {
"message": "This action will edit tokens that are already listed in your wallet, which can be used to phish you. Only approve if you are certain that you mean to change what these tokens represent."
},
"reusedTokenNameWarning": {
"message": "A token here reuses a symbol from another token you watch, this can be confusing or deceptive."
},
"invalidAddressRecipientNotEthNetwork": { "invalidAddressRecipientNotEthNetwork": {
"message": "Not ETH network, set to lowercase" "message": "Not ETH network, set to lowercase"
}, },

@ -1,7 +1,7 @@
{ {
"name": "__MSG_appName__", "name": "__MSG_appName__",
"short_name": "__MSG_appName__", "short_name": "__MSG_appName__",
"version": "7.7.4", "version": "7.7.5",
"manifest_version": 2, "manifest_version": 2,
"author": "https://metamask.io", "author": "https://metamask.io",
"description": "__MSG_appDescription__", "description": "__MSG_appDescription__",

@ -9,7 +9,7 @@ const ObjectMultiplex = require('obj-multiplex')
const extension = require('extensionizer') const extension = require('extensionizer')
const PortStream = require('extension-port-stream') const PortStream = require('extension-port-stream')
const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString() const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js'), 'utf8')
const inpageSuffix = '//# sourceURL=' + extension.runtime.getURL('inpage.js') + '\n' const inpageSuffix = '//# sourceURL=' + extension.runtime.getURL('inpage.js') + '\n'
const inpageBundle = inpageContent + inpageSuffix const inpageBundle = inpageContent + inpageSuffix

@ -17,7 +17,7 @@ function getBuyEthUrl ({ network, amount, address, service }) {
switch (service) { switch (service) {
case 'wyre': case 'wyre':
return `https://dash.sendwyre.com/sign-up` return `https://pay.sendwyre.com/?dest=ethereum:${address}&destCurrency=ETH&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card`
case 'coinswitch': case 'coinswitch':
return `https://metamask.coinswitch.co/?address=${address}&to=eth` return `https://metamask.coinswitch.co/?address=${address}&to=eth`
case 'coinbase': case 'coinbase':

@ -20,7 +20,7 @@ describe('buy-eth-url', function () {
it('returns coinbase url with amount and address for network 1', function () { it('returns coinbase url with amount and address for network 1', function () {
const wyreUrl = getBuyEthUrl(mainnet) const wyreUrl = getBuyEthUrl(mainnet)
assert.equal(wyreUrl, 'https://dash.sendwyre.com/sign-up') assert.equal(wyreUrl, 'https://pay.sendwyre.com/?dest=ethereum:0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc&destCurrency=ETH&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card')
}) })

@ -103,6 +103,64 @@ describe('util', function () {
}) })
}) })
describe('isValidDomainName', function () {
it('should return true when given a valid domain name', function () {
assert.strictEqual(util.isValidDomainName('foo.bar'), true)
})
it('should return true when given a valid subdomain', function () {
assert.strictEqual(util.isValidDomainName('foo.foo.bar'), true)
})
it('should return true when given a single-character domain', function () {
assert.strictEqual(util.isValidDomainName('f.bar'), true)
})
it('should return true when given a unicode TLD', function () {
assert.strictEqual(util.isValidDomainName('台灣.中国'), true)
})
it('should return false when given a domain with unacceptable ASCII characters', function () {
assert.strictEqual(util.isValidDomainName('$.bar'), false)
})
it('should return false when given a TLD that starts with a dash', function () {
assert.strictEqual(util.isValidDomainName('foo.-bar'), false)
})
it('should return false when given a TLD that ends with a dash', function () {
assert.strictEqual(util.isValidDomainName('foo.bar-'), false)
})
it('should return false when given a domain name with a chunk that starts with a dash', function () {
assert.strictEqual(util.isValidDomainName('-foo.bar'), false)
})
it('should return false when given a domain name with a chunk that ends with a dash', function () {
assert.strictEqual(util.isValidDomainName('foo-.bar'), false)
})
it('should return false when given a bare TLD', function () {
assert.strictEqual(util.isValidDomainName('bar'), false)
})
it('should return false when given a domain that starts with a period', function () {
assert.strictEqual(util.isValidDomainName('.bar'), false)
})
it('should return false when given a subdomain that starts with a period', function () {
assert.strictEqual(util.isValidDomainName('.foo.bar'), false)
})
it('should return false when given a domain that ends with a period', function () {
assert.strictEqual(util.isValidDomainName('bar.'), false)
})
it('should return false when given a 1-character TLD', function () {
assert.strictEqual(util.isValidDomainName('foo.b'), false)
})
})
describe('#numericBalance', function () { describe('#numericBalance', function () {
it('should return a BN 0 if given nothing', function () { it('should return a BN 0 if given nothing', function () {
var result = util.numericBalance() var result = util.numericBalance()

@ -2,6 +2,7 @@ const abi = require('human-standard-token-abi')
const ethUtil = require('ethereumjs-util') const ethUtil = require('ethereumjs-util')
const hexToBn = require('../../../../app/scripts/lib/hex-to-bn') const hexToBn = require('../../../../app/scripts/lib/hex-to-bn')
import { DateTime } from 'luxon' import { DateTime } from 'luxon'
import punycode from 'punycode'
const MIN_GAS_PRICE_GWEI_BN = new ethUtil.BN(1) const MIN_GAS_PRICE_GWEI_BN = new ethUtil.BN(1)
const GWEI_FACTOR = new ethUtil.BN(1e9) const GWEI_FACTOR = new ethUtil.BN(1e9)
@ -36,7 +37,7 @@ module.exports = {
miniAddressSummary: miniAddressSummary, miniAddressSummary: miniAddressSummary,
isAllOneCase: isAllOneCase, isAllOneCase: isAllOneCase,
isValidAddress: isValidAddress, isValidAddress: isValidAddress,
isValidENSAddress, isValidDomainName,
numericBalance: numericBalance, numericBalance: numericBalance,
parseBalance: parseBalance, parseBalance: parseBalance,
formatBalance: formatBalance, formatBalance: formatBalance,
@ -99,8 +100,14 @@ function isValidAddress (address) {
return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed) return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed)
} }
function isValidENSAddress (address) { function isValidDomainName (address) {
return address.match(/^.{3,}\.(eth|test|xyz)$/) const match = punycode.toASCII(address)
.toLowerCase()
// Checks that the domain consists of at least one valid domain pieces separated by periods, followed by a tld
// Each piece of domain name has only the characters a-z, 0-9, and a hyphen (but not at the start or end of chunk)
// A chunk has minimum length of 1, but minimum tld is set to 2 for now (no 1-character tlds exist yet)
.match(/^(?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)+[a-z0-9][-a-z0-9]*[a-z0-9]$/)
return match !== null
} }
function isInvalidChecksumAddress (address) { function isInvalidChecksumAddress (address) {

@ -16,6 +16,7 @@ export default class ConfirmAddSuggestedToken extends Component {
addToken: PropTypes.func, addToken: PropTypes.func,
pendingTokens: PropTypes.object, pendingTokens: PropTypes.object,
removeSuggestedTokens: PropTypes.func, removeSuggestedTokens: PropTypes.func,
tokens: PropTypes.array,
} }
componentDidMount () { componentDidMount () {
@ -33,9 +34,11 @@ export default class ConfirmAddSuggestedToken extends Component {
} }
render () { render () {
const { addToken, pendingTokens, removeSuggestedTokens, history } = this.props const { addToken, pendingTokens, tokens, removeSuggestedTokens, history } = this.props
const pendingTokenKey = Object.keys(pendingTokens)[0] const pendingTokenKey = Object.keys(pendingTokens)[0]
const pendingToken = pendingTokens[pendingTokenKey] const pendingToken = pendingTokens[pendingTokenKey]
const hasTokenDuplicates = this.checkTokenDuplicates(pendingTokens, tokens)
const reusesName = this.checkNameReuse(pendingTokens, tokens)
return ( return (
<div className="page-container"> <div className="page-container">
@ -46,6 +49,20 @@ export default class ConfirmAddSuggestedToken extends Component {
<div className="page-container__subtitle"> <div className="page-container__subtitle">
{ this.context.t('likeToAddTokens') } { this.context.t('likeToAddTokens') }
</div> </div>
{ hasTokenDuplicates ?
(
<div className="warning">
{ this.context.t('knownTokenWarning') }
</div>
) : null
}
{ reusesName ?
(
<div className="warning">
{ this.context.t('reusedTokenNameWarning') }
</div>
) : null
}
</div> </div>
<div className="page-container__content"> <div className="page-container__content">
<div className="confirm-add-token"> <div className="confirm-add-token">
@ -119,4 +136,32 @@ export default class ConfirmAddSuggestedToken extends Component {
</div> </div>
) )
} }
checkTokenDuplicates (pendingTokens, tokens) {
const pending = Object.keys(pendingTokens)
const existing = tokens.map(token => token.address)
const dupes = pending.filter((proposed) => {
return existing.includes(proposed)
})
return dupes.length > 0
}
/**
* Returns true if any pendingTokens both:
* - Share a symbol with an existing `tokens` member.
* - Does not share an address with that same `tokens` member.
* This should be flagged as possibly deceptive or confusing.
*/
checkNameReuse (pendingTokens, tokens) {
const duplicates = Object.keys(pendingTokens)
.map((addr) => pendingTokens[addr])
.filter((token) => {
const dupes = tokens.filter(old => old.symbol === token.symbol)
.filter(old => old.address !== token.address)
return dupes.length > 0
})
return duplicates.length > 0
}
} }

@ -8,11 +8,12 @@ const extend = require('xtend')
const { addToken, removeSuggestedTokens } = require('../../store/actions') const { addToken, removeSuggestedTokens } = require('../../store/actions')
const mapStateToProps = ({ metamask }) => { const mapStateToProps = ({ metamask }) => {
const { pendingTokens, suggestedTokens } = metamask const { pendingTokens, suggestedTokens, tokens } = metamask
const params = extend(pendingTokens, suggestedTokens) const params = extend(pendingTokens, suggestedTokens)
return { return {
pendingTokens: params, pendingTokens: params,
tokens,
} }
} }

@ -1,7 +1,7 @@
import React, { Component } from 'react' import React, { Component } from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import c from 'classnames' import c from 'classnames'
import { isValidENSAddress, isValidAddress, isValidAddressHead } from '../../../../helpers/utils/util' import { isValidDomainName, isValidAddress, isValidAddressHead } from '../../../../helpers/utils/util'
import { ellipsify } from '../../send.utils' import { ellipsify } from '../../send.utils'
import debounce from 'debounce' import debounce from 'debounce'
@ -91,7 +91,7 @@ export default class EnsInput extends Component {
this.props.updateEnsResolution(address) this.props.updateEnsResolution(address)
}) })
.catch((reason) => { .catch((reason) => {
if (isValidENSAddress(recipient) && reason.message === 'ENS name not defined.') { if (isValidDomainName(recipient) && reason.message === 'ENS name not defined.') {
this.props.updateEnsResolutionError(this.context.t('ensNotFoundOnCurrentNetwork')) this.props.updateEnsResolutionError(this.context.t('ensNotFoundOnCurrentNetwork'))
} else { } else {
log.error(reason) log.error(reason)
@ -124,7 +124,7 @@ export default class EnsInput extends Component {
return return
} }
if (isValidENSAddress(input)) { if (isValidDomainName(input)) {
this.lookupEnsName(input) this.lookupEnsName(input)
} else if (onValidAddressTyped && isValidAddress(input)) { } else if (onValidAddressTyped && isValidAddress(input)) {
onValidAddressTyped(input) onValidAddressTyped(input)

@ -55,7 +55,7 @@ import {
calcGasTotal, calcGasTotal,
} from './send.utils.js' } from './send.utils.js'
import { import {
isValidENSAddress, isValidDomainName,
} from '../../helpers/utils/util' } from '../../helpers/utils/util'
import { import {
@ -126,7 +126,7 @@ function mapDispatchToProps (dispatch) {
updateSendEnsResolution: (ensResolution) => dispatch(updateSendEnsResolution(ensResolution)), updateSendEnsResolution: (ensResolution) => dispatch(updateSendEnsResolution(ensResolution)),
updateSendEnsResolutionError: (message) => dispatch(updateSendEnsResolutionError(message)), updateSendEnsResolutionError: (message) => dispatch(updateSendEnsResolutionError(message)),
updateToNicknameIfNecessary: (to, toNickname, addressBook) => { updateToNicknameIfNecessary: (to, toNickname, addressBook) => {
if (isValidENSAddress(toNickname)) { if (isValidDomainName(toNickname)) {
const addressBookEntry = addressBook.find(({ address }) => to === address) || {} const addressBookEntry = addressBook.find(({ address }) => to === address) || {}
if (!addressBookEntry.name !== toNickname) { if (!addressBookEntry.name !== toNickname) {
dispatch(updateSendTo(to, addressBookEntry.name || '')) dispatch(updateSendTo(to, addressBookEntry.name || ''))

@ -3,8 +3,8 @@ import PropTypes from 'prop-types'
import Identicon from '../../../../components/ui/identicon' import Identicon from '../../../../components/ui/identicon'
import TextField from '../../../../components/ui/text-field' import TextField from '../../../../components/ui/text-field'
import { CONTACT_LIST_ROUTE } from '../../../../helpers/constants/routes' import { CONTACT_LIST_ROUTE } from '../../../../helpers/constants/routes'
import { isValidAddress, isValidENSAddress } from '../../../../helpers/utils/util' import { isValidAddress, isValidDomainName } from '../../../../helpers/utils/util'
import EnsInput from '../../../../pages/send/send-content/add-recipient/ens-input' import EnsInput from '../../../send/send-content/add-recipient/ens-input'
import PageContainerFooter from '../../../../components/ui/page-container/page-container-footer' import PageContainerFooter from '../../../../components/ui/page-container/page-container-footer'
import debounce from 'lodash.debounce' import debounce from 'lodash.debounce'
@ -51,7 +51,7 @@ export default class AddContact extends PureComponent {
validate = address => { validate = address => {
const valid = isValidAddress(address) const valid = isValidAddress(address)
const validEnsAddress = isValidENSAddress(address) const validEnsAddress = isValidDomainName(address)
if (valid || validEnsAddress || address === '') { if (valid || validEnsAddress || address === '') {
this.setState({ error: '', ethAddress: address }) this.setState({ error: '', ethAddress: address })
} else { } else {

@ -1670,25 +1670,25 @@
normalize-path "^2.0.1" normalize-path "^2.0.1"
through2 "^2.0.3" through2 "^2.0.3"
"@hapi/accept@3.x.x": "@hapi/accept@^3.2.4":
version "3.2.2" version "3.2.4"
resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-3.2.2.tgz#3a033af67be8196c23f8f51aa8756687b972c7cb" resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-3.2.4.tgz#687510529493fe1d7d47954c31aff360d9364bd1"
integrity sha512-UtXlTT59srtMr7ZRBzK2CvyWqFwlf78hPt9jEXqkwfbwiwRH1PRv/qkS8lgr5ZyoG6kfpU3xTgt2X91Yfe/6Yg== integrity sha512-soThGB+QMgfxlh0Vzhzlf3ZOEOPk5biEwcOXhkF0Eedqx8VnhGiggL9UYHrIsOb1rUg3Be3K8kp0iDL2wbVSOQ==
dependencies: dependencies:
"@hapi/boom" "7.x.x" "@hapi/boom" "7.x.x"
"@hapi/hoek" "6.x.x" "@hapi/hoek" "8.x.x"
"@hapi/address@2.x.x": "@hapi/address@2.x.x":
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a"
integrity sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw== integrity sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==
"@hapi/ammo@3.x.x", "@hapi/ammo@^3.1.0": "@hapi/ammo@3.x.x", "@hapi/ammo@^3.1.0", "@hapi/ammo@^3.1.2":
version "3.1.0" version "3.1.2"
resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-3.1.0.tgz#a3281ecb68bf7af2ffa6d0f7656536a7d23700ed" resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-3.1.2.tgz#a9edf5d48d99b75fdcd7ab3dabf9059942a06961"
integrity sha512-iFQBEfm3WwWy8JdPQ8l6qXVLPtzmjITVfaxwl6dfoP8kKv6i2Uk43Ax+ShkNfOVyfEnNggqL2IyZTY3DaaRGNg== integrity sha512-ej9OtFmiZv1qr45g1bxEZNGyaR4jRpyMxU6VhbxjaYThymvOwsyIsUKMZnP5Qw2tfYFuwqCJuIBHGpeIbdX9gQ==
dependencies: dependencies:
"@hapi/hoek" "6.x.x" "@hapi/hoek" "8.x.x"
"@hapi/b64@4.x.x": "@hapi/b64@4.x.x":
version "4.2.0" version "4.2.0"
@ -1717,13 +1717,13 @@
resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a"
integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==
"@hapi/call@5.x.x": "@hapi/call@^5.1.3":
version "5.1.0" version "5.1.3"
resolved "https://registry.yarnpkg.com/@hapi/call/-/call-5.1.0.tgz#91e4c434318003173d96d211d90d35736a33945e" resolved "https://registry.yarnpkg.com/@hapi/call/-/call-5.1.3.tgz#217af45e3bc3d38b03aa5c9edfe1be939eee3741"
integrity sha512-CiVEXjD/jiIHBqufBW3pdedshEMjRmHtff7m1puot8j4MUmuKRbLlh0DB8fv6QqH/7/55pH1qgFj300r0WpyMw== integrity sha512-5DfWpMk7qZiYhvBhM5oUiT4GQ/O8a2rFR121/PdwA/eZ2C1EsuD547ZggMKAR5bZ+FtxOf0fdM20zzcXzq2mZA==
dependencies: dependencies:
"@hapi/boom" "7.x.x" "@hapi/boom" "7.x.x"
"@hapi/hoek" "6.x.x" "@hapi/hoek" "8.x.x"
"@hapi/catbox-memory@4.x.x": "@hapi/catbox-memory@4.x.x":
version "4.1.0" version "4.1.0"
@ -1743,10 +1743,10 @@
"@hapi/joi" "15.x.x" "@hapi/joi" "15.x.x"
"@hapi/podium" "3.x.x" "@hapi/podium" "3.x.x"
"@hapi/content@4.x.x", "@hapi/content@^4.1.0": "@hapi/content@^4.1.0", "@hapi/content@^4.1.1":
version "4.1.0" version "4.1.1"
resolved "https://registry.yarnpkg.com/@hapi/content/-/content-4.1.0.tgz#5265516949ca081e85a43e97c1058ff53fc69714" resolved "https://registry.yarnpkg.com/@hapi/content/-/content-4.1.1.tgz#179673d1e2b7eb36c564d8f9605d019bd2252cbf"
integrity sha512-hv2Czsl49hnWDEfRZOFow/BmYbKyfEknmk3k83gOp6moFn5ceHB4xVcna8OwsGfy8dxO81lhpPy+JgQEaU4SWw== integrity sha512-3TWvmwpVPxFSF3KBjKZ8yDqIKKZZIm7VurDSweYpXYENZrJH3C1hd1+qEQW9wQaUaI76pPBLGrXl6I3B7i3ipA==
dependencies: dependencies:
"@hapi/boom" "7.x.x" "@hapi/boom" "7.x.x"
@ -1763,26 +1763,26 @@
integrity sha512-Bsfp/+1Gyf70eGtnIgmScvrH8sSypO3TcK3Zf0QdHnzn/ACnAkI6KLtGACmNRPEzzIy+W7aJX5E+1fc9GwIABQ== integrity sha512-Bsfp/+1Gyf70eGtnIgmScvrH8sSypO3TcK3Zf0QdHnzn/ACnAkI6KLtGACmNRPEzzIy+W7aJX5E+1fc9GwIABQ==
"@hapi/hapi@^18.3.1": "@hapi/hapi@^18.3.1":
version "18.3.1" version "18.4.1"
resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-18.3.1.tgz#936d1e24551b11486eabd6a4974bea4ec2127669" resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-18.4.1.tgz#023fbc131074b1cb2cd7f6766d65f4b0e92df788"
integrity sha512-gBiU9isWWezrg0ucX95Ph6AY6fUKZub3FxKapaleoFBJDOUcxTYiQR6Lha2zvHalIFoTl3K04O3Yr/5pD17QkQ== integrity sha512-9HjVGa0Z4Qv9jk9AVoUdJMQLA+KuZ+liKWyEEkVBx3e3H1F0JM6aGbPkY9jRfwsITBWGBU2iXazn65SFKSi/tg==
dependencies: dependencies:
"@hapi/accept" "3.x.x" "@hapi/accept" "^3.2.4"
"@hapi/ammo" "3.x.x" "@hapi/ammo" "^3.1.2"
"@hapi/boom" "7.x.x" "@hapi/boom" "7.x.x"
"@hapi/bounce" "1.x.x" "@hapi/bounce" "1.x.x"
"@hapi/call" "5.x.x" "@hapi/call" "^5.1.3"
"@hapi/catbox" "10.x.x" "@hapi/catbox" "10.x.x"
"@hapi/catbox-memory" "4.x.x" "@hapi/catbox-memory" "4.x.x"
"@hapi/heavy" "6.x.x" "@hapi/heavy" "6.x.x"
"@hapi/hoek" "6.x.x" "@hapi/hoek" "8.x.x"
"@hapi/joi" "15.x.x" "@hapi/joi" "15.x.x"
"@hapi/mimos" "4.x.x" "@hapi/mimos" "4.x.x"
"@hapi/podium" "3.x.x" "@hapi/podium" "3.x.x"
"@hapi/shot" "4.x.x" "@hapi/shot" "4.x.x"
"@hapi/somever" "2.x.x" "@hapi/somever" "2.x.x"
"@hapi/statehood" "6.x.x" "@hapi/statehood" "6.x.x"
"@hapi/subtext" "6.x.x" "@hapi/subtext" "^6.1.3"
"@hapi/teamwork" "3.x.x" "@hapi/teamwork" "3.x.x"
"@hapi/topo" "3.x.x" "@hapi/topo" "3.x.x"
@ -1858,15 +1858,15 @@
"@hapi/hoek" "6.x.x" "@hapi/hoek" "6.x.x"
"@hapi/vise" "3.x.x" "@hapi/vise" "3.x.x"
"@hapi/pez@4.x.x": "@hapi/pez@^4.1.2":
version "4.1.0" version "4.1.2"
resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-4.1.0.tgz#97a88e5d19e756efbd24e5f583d59fa8db1d6cba" resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-4.1.2.tgz#14984d0c31fed348f10c962968a21d9761f55503"
integrity sha512-c+AxL8/cCj+7FB+tzJ5FhWKYP8zF7/7mA3Ft3a5y7h6YT26qzhj5d2JY27jur30KaZbrZAd4ofXXkqvE/IpJlA== integrity sha512-8zSdJ8cZrJLFldTgwjU9Fb1JebID+aBCrCsycgqKYe0OZtM2r3Yv3aAwW5z97VsZWCROC1Vx6Mdn4rujh5Ktcg==
dependencies: dependencies:
"@hapi/b64" "4.x.x" "@hapi/b64" "4.x.x"
"@hapi/boom" "7.x.x" "@hapi/boom" "7.x.x"
"@hapi/content" "4.x.x" "@hapi/content" "^4.1.1"
"@hapi/hoek" "6.x.x" "@hapi/hoek" "8.x.x"
"@hapi/nigel" "3.x.x" "@hapi/nigel" "3.x.x"
"@hapi/podium@3.x.x": "@hapi/podium@3.x.x":
@ -1906,17 +1906,17 @@
"@hapi/iron" "5.x.x" "@hapi/iron" "5.x.x"
"@hapi/joi" "15.x.x" "@hapi/joi" "15.x.x"
"@hapi/subtext@6.x.x": "@hapi/subtext@^6.1.3":
version "6.1.2" version "6.1.3"
resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-6.1.2.tgz#87754f0c25b4e2676575a3686541e5b555b0c717" resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-6.1.3.tgz#bbd07771ae2a4e73ac360c93ed74ac641718b9c6"
integrity sha512-G1kqD1E2QdxpvpL26WieIyo3z0qCa/sAGSa2TJI/PYPWCR9rL0rqFvhWY774xPZ4uK1PV3TIaJcx8AruAvxclg== integrity sha512-qWN6NbiHNzohVcJMeAlpku/vzbyH4zIpnnMPMPioQMwIxbPFKeNViDCNI6fVBbMPBiw/xB4FjqiJkRG5P9eWWg==
dependencies: dependencies:
"@hapi/boom" "7.x.x" "@hapi/boom" "7.x.x"
"@hapi/bourne" "1.x.x" "@hapi/bourne" "1.x.x"
"@hapi/content" "4.x.x" "@hapi/content" "^4.1.1"
"@hapi/file" "1.x.x" "@hapi/file" "1.x.x"
"@hapi/hoek" "8.x.x" "@hapi/hoek" "8.x.x"
"@hapi/pez" "4.x.x" "@hapi/pez" "^4.1.2"
"@hapi/wreck" "15.x.x" "@hapi/wreck" "15.x.x"
"@hapi/teamwork@3.x.x": "@hapi/teamwork@3.x.x":
@ -7576,7 +7576,7 @@ cross-spawn@^4:
lru-cache "^4.0.1" lru-cache "^4.0.1"
which "^1.2.9" which "^1.2.9"
cross-spawn@^5.0.1: cross-spawn@^5.0.1, cross-spawn@^5.1.0:
version "5.1.0" version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=

Loading…
Cancel
Save