From 695b157e7b511a94a18ada1578ece2e4e838f869 Mon Sep 17 00:00:00 2001 From: MikeCheng1208 Date: Fri, 4 May 2018 19:57:19 +0800 Subject: [PATCH 01/64] Intergrate ENS with IPFS --- app/404.html | 28 + app/error.html | 79 ++ app/images/404.png | Bin 0 -> 39401 bytes app/images/cancel.png | Bin 0 -> 10928 bytes app/images/deadface.png | Bin 0 -> 8333 bytes app/images/loginglogo.svg | 53 + app/images/logo.png | Bin 0 -> 6589 bytes app/images/pw-128x128.png | Bin 0 -> 94988 bytes app/images/pw-48x48.png | Bin 0 -> 3279 bytes app/images/pw128x128.png | Bin 0 -> 94988 bytes app/loading.html | 35 + app/manifest.json | 15 +- app/no_mainnet.html | 59 + app/scripts/background.js | 10 + app/scripts/lib/contracts/registrar.js | 1 + app/scripts/lib/contracts/resolver.js | 2 + app/scripts/lib/portalnetwork.js | 33 + app/scripts/lib/resolver.js | 46 + npm-debug.log.2168057278 | 1790 ++++++++++++++++++++++++ old-ui/app/app.js | 8 + package.json | 4 +- 21 files changed, 2157 insertions(+), 6 deletions(-) create mode 100644 app/404.html create mode 100644 app/error.html create mode 100644 app/images/404.png create mode 100644 app/images/cancel.png create mode 100644 app/images/deadface.png create mode 100644 app/images/loginglogo.svg create mode 100644 app/images/logo.png create mode 100644 app/images/pw-128x128.png create mode 100644 app/images/pw-48x48.png create mode 100644 app/images/pw128x128.png create mode 100644 app/loading.html create mode 100644 app/no_mainnet.html create mode 100644 app/scripts/lib/contracts/registrar.js create mode 100644 app/scripts/lib/contracts/resolver.js create mode 100644 app/scripts/lib/portalnetwork.js create mode 100644 app/scripts/lib/resolver.js create mode 100644 npm-debug.log.2168057278 diff --git a/app/404.html b/app/404.html new file mode 100644 index 000000000..2fbf1e311 --- /dev/null +++ b/app/404.html @@ -0,0 +1,28 @@ + + + 404 + + + + + + \ No newline at end of file diff --git a/app/error.html b/app/error.html new file mode 100644 index 000000000..d4484d8e3 --- /dev/null +++ b/app/error.html @@ -0,0 +1,79 @@ + + + Portal Network + + + + +
+ +

not found

+

Powered by Portal Network

+
+ + + diff --git a/app/images/404.png b/app/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a767dde6a8c34887ce64d288f19607c9dfbcbf GIT binary patch literal 39401 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 literal 0 HcmV?d00001 diff --git a/app/images/cancel.png b/app/images/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0eb11432bec38190a311f4edc7dad8bfe80c41 GIT binary patch literal 10928 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 literal 0 HcmV?d00001 diff --git a/app/images/loginglogo.svg b/app/images/loginglogo.svg new file mode 100644 index 000000000..ca8b0a2ee --- /dev/null +++ b/app/images/loginglogo.svg @@ -0,0 +1,53 @@ + + + + logo2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/images/logo.png b/app/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..db6ba7d6cf713c9b18c4034113eb93a58bdac04d GIT binary patch literal 6589 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 literal 0 HcmV?d00001 diff --git a/app/images/pw-128x128.png b/app/images/pw-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..a0eb1b730013beceb9ad3418fe5d23ea187184c1 GIT binary patch literal 94988 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
GVAEL5+&&W7QJ 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 Of3lKF5@pW}1O7iq?#ST) literal 0 HcmV?d00001 diff --git a/app/images/pw-48x48.png b/app/images/pw-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..a96c59e15c30a3a8198ad0185d13dd6d8aabfa48 GIT binary patch literal 3279 zcmY*bc{~(a8=hed#!h8tOp3@J*@hXiFWDtzFqSEdn68P$%qU9;myq3OE8Ad7$U0e) zeQ-lDZIOWm0EIDzhBjt~hESUjtS=_O2LO;w^+uuWOwY^qdGe!BeS`AnAR%FPadC-u zsHj&R10DU)z7A^PqbxT!x)3j&3IHjKoV?T0)4^7(v`if6O7G=(VQ2T?cfyt=bjVs! zR?ZWJ8UWO1ys>~FRwSUV(&t16t^vFRf#PgvEU=CywIYC0=lvm0ew+gJgZ^Sp8O#Lv zsu5N`TEvoB5CIjfQ0QV-T0#0#z_-@>MWvbUw8}#N-_za1a4+# zhC@u&V<~1*v>r3HP3v{3k&lhHP z9kmkZf^oQlyJBUj?Trmo^h9I5d=&A4!AEESKo_rlWCr@+JfZl&fS^!qJRJ5XLi@-* zb}PZ4e?o9K;IJ!JHc&%sh!0d<@q(fBN7I9#x{l2TY$ zm|~ckA~wWNNkvObOG#N(NmW(h2%!*qI|%2AR|pC{{TIo9crN*bdWT?waTsh6^qAMv z3wsL(hry18{uzJeiNpB*S1Bm;@3M{xR64# zC-VP%f9vQf9gF`@GJjS2r}wB-J&3N-KW)>4Sa!*{95sH&>=M$!pJg>GB6xh_WbZ|# zdMRXDmY~@qT{c_(^JC-4fQ(+YiVANN-}Ba$;^*25t*dEvMuq9-y&su%EKh=L_jnVS z4N^>4x*Ce_O_p8F`|azEtWJytW$d-I)axJL4^~@e-qg1b1{K>g=mWX%h1t-xriI*y zwNH(N4lT`00?-Fa^}~rAq}_}B{M=RBV2MLtkS^$;I&?1XJc*GR?Y3YMES)N_)QKXW z688iO@m$aow?xa#z9{+SMh$7}O$@NMu&88%S@hGF+2+_-0lTFd+fA$WhJ z53DxonlyXr=eguAC|;+W_Fms9$6A>X-$ep*HLHwqzT*)O#Pey5Bn+91$agGh?ugeb z96*J5PT&ePu<4vB}Dj3rHD4 zLkDYTH~oDflQ=jZn30hYaz{0bX9!SBh;9OaOQglnI0aQWm@yOb(b_Nri|`s`nr56-QC@vMVHY$H8eQ*UhU4$jWSbbL@!1i>1O#0#`Hvn4$f`i)_I8Z@Er(2 z|0}W0^mI;??zh!GiJNUjn-Q(j^$26&_>yZsC$N3;X_wQBL9nF ziU7aZKL1{2@Ez8KKV&s4oYOWkX;CM_&-`dJ=QT-nBoa$VBes6Xm(^4*%a=oJdaqJv zxaMBRJe&a>_}i}mgr@wNDx&qTIXINeY9eA4*rnRt0j(E8HS?Z?o`dRX|@0YVj8>PUW5{bnBJ?(VK30FUQ;U(?K* zpJ{|}*&IwP|G@aP3j7+y&%S&5`VS{=a`wVl<30OI(9?t9cohM6WK;uR{NRddZY1rt zwrMyka=S6cYhl}3xIXe?^5Nu3JA)bjVc(kNlxLc%%Q>`L8lvus;B}ZqqfL%8-vGaZ z;Z`g1(Tc6$1boJ_06u#1)x0r9@Gaj;W61oC(&|X5DY4Vbp(g`k)H!Vi=Mo8lAX}>R zdYUktRU_qD(`%6n;dfujJO3al_B-+06TGy9&^3~Vk_%I+;3*IK10=GmWNNQH5gB2t zNR(ikXOZce1KnlG?H@bjzFyS+t0Q?w4ECwAb60xB9OQaCDr0og>=qC&Skc77&YVJA z;7!KPJB*CEKcxPWCPxRzR0fx0B1Fgf_mHji9XBH%imBx6>`-J#&9Pfka*MRhxM_xB z9*4?^2;?56B&Y9wJ?g^)iYvQ~Dxp#8bU=UmwJ8mCbsxSCNg=qf82f!$cepyvoCQfx z*ff>ztW_xO9{(u9IpMW<%kTU3ingA2G-|RLN~1=$IlHc$=GQj*w2#$ve3>HixUE5> z&g0S^s{uLgK`Hk_@3&!UeN9cxv(%vVFs=HqtSv2CImdbxyI7>Yli;HT)}cezyKz(F zI+z{R9i6SD9noA_z_4&`?%?3AVPYGE0mhYjuUIo#$i(?s6$H6v*gq9@MS@=JZd;{v zColxA4y?K%grgA9?KEaMUHJI{Q%e1<`C7E66yy7TT3c-4!uKE-7z^0ORen%IxdkgGS;bf8n>7G6tX}Sn{*#$8&^mzDjZu^i(%z ztKhDDK){ZUvjE0upT86lie`MVLWB~r@xtd9Bp2l)`cyAs)lf=QVZoqVm};z7}lNyR?7&1m0A*}u zX7; zThI+>56KAl5QV-G(f0=l@>4JP>>{y^`KA6#a--iGV|JyV#Z(@#;vzV&7y@p}n6zo{jRGr+x&PAnRRsCT(CvWZi&L65v-w zTxC>M5Xt_|#xBp#e7ac6Pk;2NV7BQnRM=FVnZa@){v;h@rSR$aH*IEQeW}I(Mf^7p CTHxIP literal 0 HcmV?d00001 diff --git a/app/images/pw128x128.png b/app/images/pw128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..a0eb1b730013beceb9ad3418fe5d23ea187184c1 GIT binary patch literal 94988 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
GVAEL5+&&W7QJ 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 Of3lKF5@pW}1O7iq?#ST) literal 0 HcmV?d00001 diff --git a/app/loading.html b/app/loading.html new file mode 100644 index 000000000..bbf1c1b4e --- /dev/null +++ b/app/loading.html @@ -0,0 +1,35 @@ + + + Portal Network + + + + + + diff --git a/app/manifest.json b/app/manifest.json index 3e5eed205..0f5a2566f 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_appName__", "short_name": "__MSG_appName__", - "version": "4.6.0", + "version": "4.6.2", "manifest_version": 2, "author": "https://metamask.io", "description": "__MSG_appDescription__", @@ -59,14 +59,19 @@ "unlimitedStorage", "clipboardWrite", "http://localhost:8545/", - "https://*.infura.io/" + "https://*.infura.io/", + "activeTab", + "webRequest", + "*://*.eth/" ], "web_accessible_resources": [ - "inpage.js" + "inpage.js", + "*" ], "externally_connectable": { "matches": [ "https://metamask.io/*" ] - } -} \ No newline at end of file + }, + "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" +} diff --git a/app/no_mainnet.html b/app/no_mainnet.html new file mode 100644 index 000000000..f90e6d397 --- /dev/null +++ b/app/no_mainnet.html @@ -0,0 +1,59 @@ + + + + + no_mainnet + + + +
+ +

ENS resolver only support on Ethereum mainnet

+
+ + \ No newline at end of file diff --git a/app/scripts/background.js b/app/scripts/background.js index 686296329..fc2ad5773 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -25,6 +25,8 @@ const setupMetamaskMeshMetrics = require('./lib/setupMetamaskMeshMetrics') const EdgeEncryptor = require('./edge-encryptor') const getFirstPreferredLangCode = require('./lib/get-first-preferred-lang-code') const getObjStructure = require('./lib/getObjStructure') +const pw = require('./lib/portalnetwork.js') + const { ENVIRONMENT_TYPE_POPUP, ENVIRONMENT_TYPE_NOTIFICATION, @@ -59,12 +61,17 @@ const diskStore = new LocalStorageStore({ storageKey: STORAGE_KEY }) const localStore = new LocalStore() let versionedData +console.log('localStore', localStore); +console.log('diskStore', diskStore); + // initialization flow initialize().catch(log.error) // setup metamask mesh testing container setupMetamaskMeshMetrics() + + /** * An object representing a transaction, in whatever state it is in. * @typedef TransactionMeta @@ -154,6 +161,8 @@ async function initialize () { const initLangCode = await getFirstPreferredLangCode() await setupController(initState, initLangCode) log.debug('MetaMask initialization complete.') + // porto network init + pw(initState.NetworkController.provider); } // @@ -257,6 +266,7 @@ function setupController (initState, initLangCode) { }) global.metamaskController = controller + // report failed transactions to Sentry controller.txController.on(`tx:status-update`, (txId, status) => { if (status !== 'failed') return diff --git a/app/scripts/lib/contracts/registrar.js b/app/scripts/lib/contracts/registrar.js new file mode 100644 index 000000000..980a64d7f --- /dev/null +++ b/app/scripts/lib/contracts/registrar.js @@ -0,0 +1 @@ +module.exports = [{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"label","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"name":"","type":"uint64"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"label","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"}] \ No newline at end of file diff --git a/app/scripts/lib/contracts/resolver.js b/app/scripts/lib/contracts/resolver.js new file mode 100644 index 000000000..f42777cc7 --- /dev/null +++ b/app/scripts/lib/contracts/resolver.js @@ -0,0 +1,2 @@ +module.exports = +[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"},{"name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"name":"contentType","type":"uint256"},{"name":"data","type":"bytes"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"x","type":"bytes32"},{"name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"content","outputs":[{"name":"ret","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"addr","outputs":[{"name":"ret","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"contentType","type":"uint256"},{"name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"name","outputs":[{"name":"ret","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"hash","type":"bytes32"}],"name":"setContent","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"name":"x","type":"bytes32"},{"name":"y","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"addr","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"ensAddr","type":"address"}],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"hash","type":"bytes32"}],"name":"ContentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"x","type":"bytes32"},{"indexed":false,"name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"}] \ No newline at end of file diff --git a/app/scripts/lib/portalnetwork.js b/app/scripts/lib/portalnetwork.js new file mode 100644 index 000000000..5ff4f5ecf --- /dev/null +++ b/app/scripts/lib/portalnetwork.js @@ -0,0 +1,33 @@ +const extension = require('extensionizer') +const resolver = require('./resolver.js'); +module.exports = function (provider) { + extension.webRequest.onBeforeRequest.addListener(details => { + let name = details.url.substring(7, details.url.length - 1); + extension.tabs.getSelected(null, tab => { + extension.tabs.update(tab.id, { url: "loading.html" }); + + setTimeout(() => { + return extension.tabs.update(tab.id, { url: "404.html" }); + }, 60000); + + resolver.resolve(name, provider).then(ipfsHash => { + let url = "https://gateway.ipfs.io/ipfs/" + ipfsHash; + return fetch(url, {method: "HEAD"}).then(response => response.status).then(statusCode => { + if (statusCode !== 200) return "Local" + extension.tabs.update(tab.id, { url: url }) + }) + .catch(err => { + url = "https://gateway.ipfs.io/ipfs/" + ipfsHash + extension.tabs.update(tab.id, {url: url}) + return err + }) + }) + .catch(err => { + let nameWithoutTld = name.substring(0, name.lastIndexOf('.')) + let url = err === "no_mainnet" ? "no_mainnet" : "error" + extension.tabs.update(tab.id, {url: `${url}.html?name=${name}`}) + }) + }) + return { cancel: true } + }, {urls: ["*://*.eth/"]}) +} \ No newline at end of file diff --git a/app/scripts/lib/resolver.js b/app/scripts/lib/resolver.js new file mode 100644 index 000000000..43ccec0cc --- /dev/null +++ b/app/scripts/lib/resolver.js @@ -0,0 +1,46 @@ +const namehash = require('eth-ens-namehash') +const multihash = require('multihashes') +const REGISTRAR_ENS_MAIN_NET = "0x314159265dd8dbb310642f98f50c066173c1259b" +const HttpProvider = require('ethjs-provider-http') +const Eth = require('ethjs-query') +const EthContract = require('ethjs-contract') +const registrarAbi = require('./contracts/registrar') +const resolverAbi = require('./contracts/resolver') +function ens(name, provider) { + // provider need mainnet + let eth = new Eth(new HttpProvider(provider.rpcTarget)) + let hash = namehash.hash(name) + let contract = new EthContract(eth) + let Registrar = contract(registrarAbi).at(REGISTRAR_ENS_MAIN_NET) + return new Promise((resolve, reject) => { + if (provider.type !== "mainnet") reject('no_mainnet') + Registrar.resolver(hash).then((address) => { + if (address === '0x0000000000000000000000000000000000000000') { + reject(null) + } else { + let Resolver = contract(resolverAbi).at(address["0"]) + return Resolver.content(hash) + } + }).then((contentHash) => { + if (contentHash["0"] === '0x0000000000000000000000000000000000000000000000000000000000000000') reject(null) + if (contentHash.ret !== "0x") { + let hex = contentHash["0"].substring(2) + let buf = multihash.fromHexString(hex) + resolve(multihash.toB58String(multihash.encode(buf, 'sha2-256'))) + } else { + reject('fisk') + } + }) + }) +} +module.exports.resolve = function (name, provider) { + let path = name.split("."); + let tld = path[path.length - 1]; + if (tld === 'eth') { + return ens(name, provider); + } else { + return new Promise((resolve, reject) => { + reject(null) + }) + } +} diff --git a/npm-debug.log.2168057278 b/npm-debug.log.2168057278 new file mode 100644 index 000000000..1fe88a200 --- /dev/null +++ b/npm-debug.log.2168057278 @@ -0,0 +1,1790 @@ +0 info it worked if it ends with ok +1 verbose cli [ '/Users/zhiyuan/.nvm/versions/node/v8.9.1/bin/node', +1 verbose cli '/usr/local/bin/npm', +1 verbose cli 'i' ] +2 info using npm@3.10.10 +3 info using node@v8.9.1 +4 silly loadCurrentTree Starting +5 silly install loadCurrentTree +6 silly install readLocalPackageData +7 silly install normalizeTree +8 silly loadCurrentTree Finishing +9 silly loadIdealTree Starting +10 silly install loadIdealTree +11 silly cloneCurrentTree Starting +12 silly install cloneCurrentTreeToIdealTree +13 silly cloneCurrentTree Finishing +14 silly loadShrinkwrap Starting +15 silly install loadShrinkwrap +16 silly loadShrinkwrap Finishing +17 silly loadAllDepsIntoIdealTree Starting +18 silly install loadAllDepsIntoIdealTree +19 silly fetchNamedPackageData web3 +20 silly mapToRegistry name web3 +21 silly mapToRegistry using default registry +22 silly mapToRegistry registry https://registry.npmjs.org/ +23 silly mapToRegistry data Result { +23 silly mapToRegistry raw: 'web3', +23 silly mapToRegistry scope: null, +23 silly mapToRegistry escapedName: 'web3', +23 silly mapToRegistry name: 'web3', +23 silly mapToRegistry rawSpec: '', +23 silly mapToRegistry spec: 'latest', +23 silly mapToRegistry type: 'tag' } +24 silly mapToRegistry uri https://registry.npmjs.org/web3 +25 verbose request uri https://registry.npmjs.org/web3 +26 verbose request no auth needed +27 info attempt registry request try #1 at 18:56:16 +28 verbose request id fa232f2c52d33dca +29 verbose etag "5ad0c548-2f408" +30 verbose lastModified Fri, 13 Apr 2018 14:57:12 GMT +31 http request GET https://registry.npmjs.org/web3 +32 http 304 https://registry.npmjs.org/web3 +33 verbose headers { date: 'Thu, 26 Apr 2018 10:56:17 GMT', +33 verbose headers via: '1.1 varnish', +33 verbose headers 'cache-control': 'max-age=300', +33 verbose headers etag: '"5ad0c548-2f408"', +33 verbose headers age: '0', +33 verbose headers connection: 'keep-alive', +33 verbose headers 'x-served-by': 'cache-itm18829-ITM', +33 verbose headers 'x-cache': 'MISS', +33 verbose headers 'x-cache-hits': '0', +33 verbose headers 'x-timer': 'S1524740177.293484,VS0,VE282', +33 verbose headers vary: 'Accept-Encoding, Accept' } +34 silly get cb [ 304, +34 silly get { date: 'Thu, 26 Apr 2018 10:56:17 GMT', +34 silly get via: '1.1 varnish', +34 silly get 'cache-control': 'max-age=300', +34 silly get etag: '"5ad0c548-2f408"', +34 silly get age: '0', +34 silly get connection: 'keep-alive', +34 silly get 'x-served-by': 'cache-itm18829-ITM', +34 silly get 'x-cache': 'MISS', +34 silly get 'x-cache-hits': '0', +34 silly get 'x-timer': 'S1524740177.293484,VS0,VE282', +34 silly get vary: 'Accept-Encoding, Accept' } ] +35 verbose etag https://registry.npmjs.org/web3 from cache +36 verbose get saving web3 to /Users/zhiyuan/.npm/registry.npmjs.org/web3/.cache.json +37 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +38 silly resolveWithNewModule web3@1.0.0-beta.34 checking installable status +39 silly cache add args [ 'web3@^1.0.0-beta.26', null ] +40 verbose cache add spec web3@^1.0.0-beta.26 +41 silly cache add parsed spec Result { +41 silly cache add raw: 'web3@^1.0.0-beta.26', +41 silly cache add scope: null, +41 silly cache add escapedName: 'web3', +41 silly cache add name: 'web3', +41 silly cache add rawSpec: '^1.0.0-beta.26', +41 silly cache add spec: '>=1.0.0-beta.26 <2.0.0', +41 silly cache add type: 'range' } +42 silly addNamed web3@>=1.0.0-beta.26 <2.0.0 +43 verbose addNamed ">=1.0.0-beta.26 <2.0.0" is a valid semver range for web3 +44 silly addNameRange { name: 'web3', range: '>=1.0.0-beta.26 <2.0.0', hasData: false } +45 silly mapToRegistry name web3 +46 silly mapToRegistry using default registry +47 silly mapToRegistry registry https://registry.npmjs.org/ +48 silly mapToRegistry data Result { +48 silly mapToRegistry raw: 'web3', +48 silly mapToRegistry scope: null, +48 silly mapToRegistry escapedName: 'web3', +48 silly mapToRegistry name: 'web3', +48 silly mapToRegistry rawSpec: '', +48 silly mapToRegistry spec: 'latest', +48 silly mapToRegistry type: 'tag' } +49 silly mapToRegistry uri https://registry.npmjs.org/web3 +50 verbose addNameRange registry:https://registry.npmjs.org/web3 not in flight; fetching +51 verbose get https://registry.npmjs.org/web3 not expired, no request +52 silly addNameRange number 2 { name: 'web3', range: '>=1.0.0-beta.26 <2.0.0', hasData: true } +53 silly addNameRange versions [ 'web3', +53 silly addNameRange [ '0.2.5', +53 silly addNameRange '0.2.6', +53 silly addNameRange '0.2.7', +53 silly addNameRange '0.2.8', +53 silly addNameRange '0.3.0', +53 silly addNameRange '0.3.1', +53 silly addNameRange '0.3.2', +53 silly addNameRange '0.3.3', +53 silly addNameRange '0.3.4', +53 silly addNameRange '0.3.6', +53 silly addNameRange '0.4.0', +53 silly addNameRange '0.4.1', +53 silly addNameRange '0.4.2', +53 silly addNameRange '0.4.3', +53 silly addNameRange '0.5.0', +53 silly addNameRange '0.6.0', +53 silly addNameRange '0.7.0', +53 silly addNameRange '0.7.1', +53 silly addNameRange '0.8.0', +53 silly addNameRange '0.8.1', +53 silly addNameRange '0.9.0', +53 silly addNameRange '0.9.1', +53 silly addNameRange '0.9.2', +53 silly addNameRange '0.10.0', +53 silly addNameRange '0.11.0', +53 silly addNameRange '0.12.0', +53 silly addNameRange '0.12.1', +53 silly addNameRange '0.12.2', +53 silly addNameRange '0.13.0', +53 silly addNameRange '0.14.0', +53 silly addNameRange '0.14.1', +53 silly addNameRange '0.15.0', +53 silly addNameRange '0.15.1', +53 silly addNameRange '0.15.2', +53 silly addNameRange '0.15.3', +53 silly addNameRange '0.16.0', +53 silly addNameRange '0.17.0-alpha', +53 silly addNameRange '0.17.0-beta', +53 silly addNameRange '0.18.0', +53 silly addNameRange '0.18.1', +53 silly addNameRange '0.18.2', +53 silly addNameRange '0.18.4', +53 silly addNameRange '0.19.0', +53 silly addNameRange '0.19.1', +53 silly addNameRange '0.20.0', +53 silly addNameRange '0.20.1', +53 silly addNameRange '1.0.0-beta1', +53 silly addNameRange '1.0.0-beta2', +53 silly addNameRange '1.0.0-beta.1', +53 silly addNameRange '1.0.0-beta.2', +53 silly addNameRange '1.0.0-beta.3', +53 silly addNameRange '1.0.0-beta.4', +53 silly addNameRange '1.0.0-beta.5', +53 silly addNameRange '1.0.0-beta.6', +53 silly addNameRange '1.0.0-beta.7', +53 silly addNameRange '1.0.0-beta.9', +53 silly addNameRange '1.0.0-beta.10', +53 silly addNameRange '1.0.0-beta.11', +53 silly addNameRange '1.0.0-beta.12', +53 silly addNameRange '1.0.0-beta.13', +53 silly addNameRange '1.0.0-beta.14', +53 silly addNameRange '1.0.0-beta.15', +53 silly addNameRange '1.0.0-beta.16', +53 silly addNameRange '1.0.0-beta.17', +53 silly addNameRange '1.0.0-beta.18', +53 silly addNameRange '0.20.2', +53 silly addNameRange '1.0.0-beta.19', +53 silly addNameRange '1.0.0-beta.20', +53 silly addNameRange '1.0.0-beta.21', +53 silly addNameRange '1.0.0-beta.22', +53 silly addNameRange '1.0.0-beta.23', +53 silly addNameRange '1.0.0-beta.24', +53 silly addNameRange '1.0.0-beta.25', +53 silly addNameRange '1.0.0-beta.26', +53 silly addNameRange '0.20.3', +53 silly addNameRange '1.0.0-beta.27', +53 silly addNameRange '1.0.0-beta.28', +53 silly addNameRange '0.20.4', +53 silly addNameRange '1.0.0-beta.29', +53 silly addNameRange '0.20.5', +53 silly addNameRange '1.0.0-beta.30', +53 silly addNameRange '1.0.0-beta.31', +53 silly addNameRange '0.20.6', +53 silly addNameRange '1.0.0-beta.32', +53 silly addNameRange '1.0.0-beta.33', +53 silly addNameRange '1.0.0-beta.34' ] ] +54 silly addNamed web3@1.0.0-beta.34 +55 verbose addNamed "1.0.0-beta.34" is a plain semver version for web3 +56 silly cache afterAdd web3@1.0.0-beta.34 +57 verbose afterAdd /Users/zhiyuan/.npm/web3/1.0.0-beta.34/package/package.json not in flight; writing +58 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +59 verbose afterAdd /Users/zhiyuan/.npm/web3/1.0.0-beta.34/package/package.json written +60 silly fetchNamedPackageData chai +61 silly mapToRegistry name chai +62 silly mapToRegistry using default registry +63 silly mapToRegistry registry https://registry.npmjs.org/ +64 silly mapToRegistry data Result { +64 silly mapToRegistry raw: 'chai', +64 silly mapToRegistry scope: null, +64 silly mapToRegistry escapedName: 'chai', +64 silly mapToRegistry name: 'chai', +64 silly mapToRegistry rawSpec: '', +64 silly mapToRegistry spec: 'latest', +64 silly mapToRegistry type: 'tag' } +65 silly mapToRegistry uri https://registry.npmjs.org/chai +66 verbose request uri https://registry.npmjs.org/chai +67 verbose request no auth needed +68 info attempt registry request try #1 at 18:56:17 +69 verbose etag "5ab1b9cc-1a27c" +70 verbose lastModified Wed, 21 Mar 2018 1:47:56 GMT +71 http request GET https://registry.npmjs.org/chai +72 http 304 https://registry.npmjs.org/chai +73 verbose headers { date: 'Thu, 26 Apr 2018 10:56:17 GMT', +73 verbose headers via: '1.1 varnish', +73 verbose headers 'cache-control': 'max-age=300', +73 verbose headers etag: '"5ab1b9cc-1a27c"', +73 verbose headers age: '8579', +73 verbose headers connection: 'keep-alive', +73 verbose headers 'x-served-by': 'cache-itm18829-ITM', +73 verbose headers 'x-cache': 'HIT', +73 verbose headers 'x-cache-hits': '28', +73 verbose headers 'x-timer': 'S1524740178.704226,VS0,VE0', +73 verbose headers vary: 'Accept-Encoding, Accept' } +74 silly get cb [ 304, +74 silly get { date: 'Thu, 26 Apr 2018 10:56:17 GMT', +74 silly get via: '1.1 varnish', +74 silly get 'cache-control': 'max-age=300', +74 silly get etag: '"5ab1b9cc-1a27c"', +74 silly get age: '8579', +74 silly get connection: 'keep-alive', +74 silly get 'x-served-by': 'cache-itm18829-ITM', +74 silly get 'x-cache': 'HIT', +74 silly get 'x-cache-hits': '28', +74 silly get 'x-timer': 'S1524740178.704226,VS0,VE0', +74 silly get vary: 'Accept-Encoding, Accept' } ] +75 verbose etag https://registry.npmjs.org/chai from cache +76 verbose get saving chai to /Users/zhiyuan/.npm/registry.npmjs.org/chai/.cache.json +77 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +78 silly resolveWithNewModule chai@3.5.0 checking installable status +79 silly cache add args [ 'chai@^3.5.0', null ] +80 verbose cache add spec chai@^3.5.0 +81 silly cache add parsed spec Result { +81 silly cache add raw: 'chai@^3.5.0', +81 silly cache add scope: null, +81 silly cache add escapedName: 'chai', +81 silly cache add name: 'chai', +81 silly cache add rawSpec: '^3.5.0', +81 silly cache add spec: '>=3.5.0 <4.0.0', +81 silly cache add type: 'range' } +82 silly addNamed chai@>=3.5.0 <4.0.0 +83 verbose addNamed ">=3.5.0 <4.0.0" is a valid semver range for chai +84 silly addNameRange { name: 'chai', range: '>=3.5.0 <4.0.0', hasData: false } +85 silly mapToRegistry name chai +86 silly mapToRegistry using default registry +87 silly mapToRegistry registry https://registry.npmjs.org/ +88 silly mapToRegistry data Result { +88 silly mapToRegistry raw: 'chai', +88 silly mapToRegistry scope: null, +88 silly mapToRegistry escapedName: 'chai', +88 silly mapToRegistry name: 'chai', +88 silly mapToRegistry rawSpec: '', +88 silly mapToRegistry spec: 'latest', +88 silly mapToRegistry type: 'tag' } +89 silly mapToRegistry uri https://registry.npmjs.org/chai +90 verbose addNameRange registry:https://registry.npmjs.org/chai not in flight; fetching +91 verbose get https://registry.npmjs.org/chai not expired, no request +92 silly addNameRange number 2 { name: 'chai', range: '>=3.5.0 <4.0.0', hasData: true } +93 silly addNameRange versions [ 'chai', +93 silly addNameRange [ '0.0.1', +93 silly addNameRange '0.0.2', +93 silly addNameRange '0.1.0', +93 silly addNameRange '0.1.1', +93 silly addNameRange '0.1.2', +93 silly addNameRange '0.1.3', +93 silly addNameRange '0.1.4', +93 silly addNameRange '0.1.5', +93 silly addNameRange '0.1.6', +93 silly addNameRange '0.1.7', +93 silly addNameRange '0.2.0', +93 silly addNameRange '0.2.1', +93 silly addNameRange '0.2.2', +93 silly addNameRange '0.2.3', +93 silly addNameRange '0.2.4', +93 silly addNameRange '0.3.0', +93 silly addNameRange '0.3.1', +93 silly addNameRange '0.3.2', +93 silly addNameRange '0.3.3', +93 silly addNameRange '0.3.4', +93 silly addNameRange '0.4.0', +93 silly addNameRange '0.4.1', +93 silly addNameRange '0.4.2', +93 silly addNameRange '0.5.0', +93 silly addNameRange '0.5.1', +93 silly addNameRange '0.5.2', +93 silly addNameRange '0.5.3', +93 silly addNameRange '1.0.0', +93 silly addNameRange '1.0.1', +93 silly addNameRange '1.0.2', +93 silly addNameRange '1.0.3', +93 silly addNameRange '1.0.4', +93 silly addNameRange '1.1.0', +93 silly addNameRange '1.1.1', +93 silly addNameRange '1.2.0', +93 silly addNameRange '1.3.0', +93 silly addNameRange '1.4.0', +93 silly addNameRange '1.4.1', +93 silly addNameRange '1.4.2', +93 silly addNameRange '1.5.0', +93 silly addNameRange '1.6.0', +93 silly addNameRange '1.6.1', +93 silly addNameRange '1.7.0', +93 silly addNameRange '1.7.1', +93 silly addNameRange '1.7.2', +93 silly addNameRange '1.8.0', +93 silly addNameRange '1.8.1', +93 silly addNameRange '1.9.0', +93 silly addNameRange '1.9.1', +93 silly addNameRange '1.9.2', +93 silly addNameRange '1.10.0', +93 silly addNameRange '2.0.0', +93 silly addNameRange '2.1.0', +93 silly addNameRange '2.1.1', +93 silly addNameRange '2.1.2', +93 silly addNameRange '2.2.0', +93 silly addNameRange '2.3.0', +93 silly addNameRange '3.0.0', +93 silly addNameRange '3.1.0', +93 silly addNameRange '3.2.0', +93 silly addNameRange '3.3.0', +93 silly addNameRange '3.4.0', +93 silly addNameRange '3.4.1', +93 silly addNameRange '3.5.0', +93 silly addNameRange '4.0.0-canary.1', +93 silly addNameRange '4.0.0-canary.2', +93 silly addNameRange '4.0.0', +93 silly addNameRange '4.0.1', +93 silly addNameRange '4.0.2', +93 silly addNameRange '4.1.0', +93 silly addNameRange '4.1.1', +93 silly addNameRange '4.1.2' ] ] +94 silly addNamed chai@3.5.0 +95 verbose addNamed "3.5.0" is a plain semver version for chai +96 silly cache afterAdd chai@3.5.0 +97 verbose afterAdd /Users/zhiyuan/.npm/chai/3.5.0/package/package.json not in flight; writing +98 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +99 verbose afterAdd /Users/zhiyuan/.npm/chai/3.5.0/package/package.json written +100 silly fetchNamedPackageData deep-eql +101 silly mapToRegistry name deep-eql +102 silly mapToRegistry using default registry +103 silly mapToRegistry registry https://registry.npmjs.org/ +104 silly mapToRegistry data Result { +104 silly mapToRegistry raw: 'deep-eql', +104 silly mapToRegistry scope: null, +104 silly mapToRegistry escapedName: 'deep-eql', +104 silly mapToRegistry name: 'deep-eql', +104 silly mapToRegistry rawSpec: '', +104 silly mapToRegistry spec: 'latest', +104 silly mapToRegistry type: 'tag' } +105 silly mapToRegistry uri https://registry.npmjs.org/deep-eql +106 silly fetchNamedPackageData type-detect +107 silly mapToRegistry name type-detect +108 silly mapToRegistry using default registry +109 silly mapToRegistry registry https://registry.npmjs.org/ +110 silly mapToRegistry data Result { +110 silly mapToRegistry raw: 'type-detect', +110 silly mapToRegistry scope: null, +110 silly mapToRegistry escapedName: 'type-detect', +110 silly mapToRegistry name: 'type-detect', +110 silly mapToRegistry rawSpec: '', +110 silly mapToRegistry spec: 'latest', +110 silly mapToRegistry type: 'tag' } +111 silly mapToRegistry uri https://registry.npmjs.org/type-detect +112 verbose request uri https://registry.npmjs.org/deep-eql +113 verbose request no auth needed +114 info attempt registry request try #1 at 18:56:18 +115 verbose etag "5aaf3dfa-8ad2" +116 verbose lastModified Mon, 19 Mar 2018 4:35:06 GMT +117 http request GET https://registry.npmjs.org/deep-eql +118 verbose request uri https://registry.npmjs.org/type-detect +119 verbose request no auth needed +120 info attempt registry request try #1 at 18:56:18 +121 verbose etag "5aa7fe02-c438" +122 verbose lastModified Tue, 13 Mar 2018 16:36:18 GMT +123 http request GET https://registry.npmjs.org/type-detect +124 http 304 https://registry.npmjs.org/deep-eql +125 verbose headers { date: 'Thu, 26 Apr 2018 10:56:18 GMT', +125 verbose headers via: '1.1 varnish', +125 verbose headers 'cache-control': 'max-age=300', +125 verbose headers etag: '"5aaf3dfa-8ad2"', +125 verbose headers age: '3926', +125 verbose headers connection: 'keep-alive', +125 verbose headers 'x-served-by': 'cache-itm18829-ITM', +125 verbose headers 'x-cache': 'HIT', +125 verbose headers 'x-cache-hits': '1', +125 verbose headers 'x-timer': 'S1524740179.691568,VS0,VE1', +125 verbose headers vary: 'Accept-Encoding, Accept' } +126 silly get cb [ 304, +126 silly get { date: 'Thu, 26 Apr 2018 10:56:18 GMT', +126 silly get via: '1.1 varnish', +126 silly get 'cache-control': 'max-age=300', +126 silly get etag: '"5aaf3dfa-8ad2"', +126 silly get age: '3926', +126 silly get connection: 'keep-alive', +126 silly get 'x-served-by': 'cache-itm18829-ITM', +126 silly get 'x-cache': 'HIT', +126 silly get 'x-cache-hits': '1', +126 silly get 'x-timer': 'S1524740179.691568,VS0,VE1', +126 silly get vary: 'Accept-Encoding, Accept' } ] +127 verbose etag https://registry.npmjs.org/deep-eql from cache +128 verbose get saving deep-eql to /Users/zhiyuan/.npm/registry.npmjs.org/deep-eql/.cache.json +129 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +130 silly resolveWithNewModule deep-eql@0.1.3 checking installable status +131 silly cache add args [ 'deep-eql@^0.1.3', null ] +132 verbose cache add spec deep-eql@^0.1.3 +133 silly cache add parsed spec Result { +133 silly cache add raw: 'deep-eql@^0.1.3', +133 silly cache add scope: null, +133 silly cache add escapedName: 'deep-eql', +133 silly cache add name: 'deep-eql', +133 silly cache add rawSpec: '^0.1.3', +133 silly cache add spec: '>=0.1.3 <0.2.0', +133 silly cache add type: 'range' } +134 silly addNamed deep-eql@>=0.1.3 <0.2.0 +135 verbose addNamed ">=0.1.3 <0.2.0" is a valid semver range for deep-eql +136 silly addNameRange { name: 'deep-eql', range: '>=0.1.3 <0.2.0', hasData: false } +137 silly mapToRegistry name deep-eql +138 silly mapToRegistry using default registry +139 silly mapToRegistry registry https://registry.npmjs.org/ +140 silly mapToRegistry data Result { +140 silly mapToRegistry raw: 'deep-eql', +140 silly mapToRegistry scope: null, +140 silly mapToRegistry escapedName: 'deep-eql', +140 silly mapToRegistry name: 'deep-eql', +140 silly mapToRegistry rawSpec: '', +140 silly mapToRegistry spec: 'latest', +140 silly mapToRegistry type: 'tag' } +141 silly mapToRegistry uri https://registry.npmjs.org/deep-eql +142 verbose addNameRange registry:https://registry.npmjs.org/deep-eql not in flight; fetching +143 verbose get https://registry.npmjs.org/deep-eql not expired, no request +144 silly addNameRange number 2 { name: 'deep-eql', range: '>=0.1.3 <0.2.0', hasData: true } +145 silly addNameRange versions [ 'deep-eql', +145 silly addNameRange [ '0.1.0', +145 silly addNameRange '0.1.1', +145 silly addNameRange '0.1.2', +145 silly addNameRange '0.1.3', +145 silly addNameRange '1.0.0', +145 silly addNameRange '1.0.1', +145 silly addNameRange '1.0.2', +145 silly addNameRange '1.0.3', +145 silly addNameRange '2.0.0', +145 silly addNameRange '2.0.1', +145 silly addNameRange '2.0.2', +145 silly addNameRange '3.0.0', +145 silly addNameRange '3.0.1' ] ] +146 silly addNamed deep-eql@0.1.3 +147 verbose addNamed "0.1.3" is a plain semver version for deep-eql +148 silly cache afterAdd deep-eql@0.1.3 +149 verbose afterAdd /Users/zhiyuan/.npm/deep-eql/0.1.3/package/package.json not in flight; writing +150 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +151 verbose afterAdd /Users/zhiyuan/.npm/deep-eql/0.1.3/package/package.json written +152 http 304 https://registry.npmjs.org/type-detect +153 verbose headers { date: 'Thu, 26 Apr 2018 10:56:18 GMT', +153 verbose headers via: '1.1 varnish', +153 verbose headers 'cache-control': 'max-age=300', +153 verbose headers etag: '"5aa7fe02-c438"', +153 verbose headers age: '9570', +153 verbose headers connection: 'keep-alive', +153 verbose headers 'x-served-by': 'cache-itm18831-ITM', +153 verbose headers 'x-cache': 'HIT', +153 verbose headers 'x-cache-hits': '8', +153 verbose headers 'x-timer': 'S1524740179.771934,VS0,VE0', +153 verbose headers vary: 'Accept-Encoding, Accept' } +154 silly get cb [ 304, +154 silly get { date: 'Thu, 26 Apr 2018 10:56:18 GMT', +154 silly get via: '1.1 varnish', +154 silly get 'cache-control': 'max-age=300', +154 silly get etag: '"5aa7fe02-c438"', +154 silly get age: '9570', +154 silly get connection: 'keep-alive', +154 silly get 'x-served-by': 'cache-itm18831-ITM', +154 silly get 'x-cache': 'HIT', +154 silly get 'x-cache-hits': '8', +154 silly get 'x-timer': 'S1524740179.771934,VS0,VE0', +154 silly get vary: 'Accept-Encoding, Accept' } ] +155 verbose etag https://registry.npmjs.org/type-detect from cache +156 verbose get saving type-detect to /Users/zhiyuan/.npm/registry.npmjs.org/type-detect/.cache.json +157 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +158 silly resolveWithNewModule type-detect@1.0.0 checking installable status +159 silly cache add args [ 'type-detect@^1.0.0', null ] +160 verbose cache add spec type-detect@^1.0.0 +161 silly cache add parsed spec Result { +161 silly cache add raw: 'type-detect@^1.0.0', +161 silly cache add scope: null, +161 silly cache add escapedName: 'type-detect', +161 silly cache add name: 'type-detect', +161 silly cache add rawSpec: '^1.0.0', +161 silly cache add spec: '>=1.0.0 <2.0.0', +161 silly cache add type: 'range' } +162 silly addNamed type-detect@>=1.0.0 <2.0.0 +163 verbose addNamed ">=1.0.0 <2.0.0" is a valid semver range for type-detect +164 silly addNameRange { name: 'type-detect', range: '>=1.0.0 <2.0.0', hasData: false } +165 silly mapToRegistry name type-detect +166 silly mapToRegistry using default registry +167 silly mapToRegistry registry https://registry.npmjs.org/ +168 silly mapToRegistry data Result { +168 silly mapToRegistry raw: 'type-detect', +168 silly mapToRegistry scope: null, +168 silly mapToRegistry escapedName: 'type-detect', +168 silly mapToRegistry name: 'type-detect', +168 silly mapToRegistry rawSpec: '', +168 silly mapToRegistry spec: 'latest', +168 silly mapToRegistry type: 'tag' } +169 silly mapToRegistry uri https://registry.npmjs.org/type-detect +170 verbose addNameRange registry:https://registry.npmjs.org/type-detect not in flight; fetching +171 verbose get https://registry.npmjs.org/type-detect not expired, no request +172 silly addNameRange number 2 { name: 'type-detect', range: '>=1.0.0 <2.0.0', hasData: true } +173 silly addNameRange versions [ 'type-detect', +173 silly addNameRange [ '0.1.0', +173 silly addNameRange '0.1.1', +173 silly addNameRange '0.1.2', +173 silly addNameRange '1.0.0', +173 silly addNameRange '2.0.0', +173 silly addNameRange '2.0.1', +173 silly addNameRange '2.0.2', +173 silly addNameRange '3.0.0', +173 silly addNameRange '4.0.0', +173 silly addNameRange '4.0.1', +173 silly addNameRange '4.0.2', +173 silly addNameRange '4.0.3', +173 silly addNameRange '4.0.5', +173 silly addNameRange '4.0.6', +173 silly addNameRange '4.0.7', +173 silly addNameRange '4.0.8' ] ] +174 silly addNamed type-detect@1.0.0 +175 verbose addNamed "1.0.0" is a plain semver version for type-detect +176 silly cache afterAdd type-detect@1.0.0 +177 verbose afterAdd /Users/zhiyuan/.npm/type-detect/1.0.0/package/package.json not in flight; writing +178 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +179 verbose afterAdd /Users/zhiyuan/.npm/type-detect/1.0.0/package/package.json written +180 silly fetchNamedPackageData type-detect +181 silly mapToRegistry name type-detect +182 silly mapToRegistry using default registry +183 silly mapToRegistry registry https://registry.npmjs.org/ +184 silly mapToRegistry data Result { +184 silly mapToRegistry raw: 'type-detect', +184 silly mapToRegistry scope: null, +184 silly mapToRegistry escapedName: 'type-detect', +184 silly mapToRegistry name: 'type-detect', +184 silly mapToRegistry rawSpec: '', +184 silly mapToRegistry spec: 'latest', +184 silly mapToRegistry type: 'tag' } +185 silly mapToRegistry uri https://registry.npmjs.org/type-detect +186 silly resolveWithNewModule type-detect@0.1.1 checking installable status +187 silly cache add args [ 'type-detect@0.1.1', null ] +188 verbose cache add spec type-detect@0.1.1 +189 silly cache add parsed spec Result { +189 silly cache add raw: 'type-detect@0.1.1', +189 silly cache add scope: null, +189 silly cache add escapedName: 'type-detect', +189 silly cache add name: 'type-detect', +189 silly cache add rawSpec: '0.1.1', +189 silly cache add spec: '0.1.1', +189 silly cache add type: 'version' } +190 silly addNamed type-detect@0.1.1 +191 verbose addNamed "0.1.1" is a plain semver version for type-detect +192 silly mapToRegistry name type-detect +193 silly mapToRegistry using default registry +194 silly mapToRegistry registry https://registry.npmjs.org/ +195 silly mapToRegistry data Result { +195 silly mapToRegistry raw: 'type-detect', +195 silly mapToRegistry scope: null, +195 silly mapToRegistry escapedName: 'type-detect', +195 silly mapToRegistry name: 'type-detect', +195 silly mapToRegistry rawSpec: '', +195 silly mapToRegistry spec: 'latest', +195 silly mapToRegistry type: 'tag' } +196 silly mapToRegistry uri https://registry.npmjs.org/type-detect +197 verbose addNameVersion registry:https://registry.npmjs.org/type-detect not in flight; fetching +198 verbose get https://registry.npmjs.org/type-detect not expired, no request +199 silly cache afterAdd type-detect@0.1.1 +200 verbose afterAdd /Users/zhiyuan/.npm/type-detect/0.1.1/package/package.json not in flight; writing +201 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +202 verbose afterAdd /Users/zhiyuan/.npm/type-detect/0.1.1/package/package.json written +203 silly fetchNamedPackageData babelify +204 silly mapToRegistry name babelify +205 silly mapToRegistry using default registry +206 silly mapToRegistry registry https://registry.npmjs.org/ +207 silly mapToRegistry data Result { +207 silly mapToRegistry raw: 'babelify', +207 silly mapToRegistry scope: null, +207 silly mapToRegistry escapedName: 'babelify', +207 silly mapToRegistry name: 'babelify', +207 silly mapToRegistry rawSpec: '', +207 silly mapToRegistry spec: 'latest', +207 silly mapToRegistry type: 'tag' } +208 silly mapToRegistry uri https://registry.npmjs.org/babelify +209 verbose request uri https://registry.npmjs.org/babelify +210 verbose request no auth needed +211 info attempt registry request try #1 at 18:56:21 +212 verbose etag "5aa00885-7e14" +213 verbose lastModified Wed, 7 Mar 2018 15:43:01 GMT +214 http request GET https://registry.npmjs.org/babelify +215 http 304 https://registry.npmjs.org/babelify +216 verbose headers { date: 'Thu, 26 Apr 2018 10:56:21 GMT', +216 verbose headers via: '1.1 varnish', +216 verbose headers 'cache-control': 'max-age=300', +216 verbose headers etag: '"5aa00885-7e14"', +216 verbose headers age: '10141', +216 verbose headers connection: 'keep-alive', +216 verbose headers 'x-served-by': 'cache-itm18829-ITM', +216 verbose headers 'x-cache': 'HIT', +216 verbose headers 'x-cache-hits': '5', +216 verbose headers 'x-timer': 'S1524740182.895851,VS0,VE0', +216 verbose headers vary: 'Accept-Encoding, Accept' } +217 silly get cb [ 304, +217 silly get { date: 'Thu, 26 Apr 2018 10:56:21 GMT', +217 silly get via: '1.1 varnish', +217 silly get 'cache-control': 'max-age=300', +217 silly get etag: '"5aa00885-7e14"', +217 silly get age: '10141', +217 silly get connection: 'keep-alive', +217 silly get 'x-served-by': 'cache-itm18829-ITM', +217 silly get 'x-cache': 'HIT', +217 silly get 'x-cache-hits': '5', +217 silly get 'x-timer': 'S1524740182.895851,VS0,VE0', +217 silly get vary: 'Accept-Encoding, Accept' } ] +218 verbose etag https://registry.npmjs.org/babelify from cache +219 verbose get saving babelify to /Users/zhiyuan/.npm/registry.npmjs.org/babelify/.cache.json +220 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +221 silly resolveWithNewModule babelify@7.3.0 checking installable status +222 silly cache add args [ 'babelify@^7.3.0', null ] +223 verbose cache add spec babelify@^7.3.0 +224 silly cache add parsed spec Result { +224 silly cache add raw: 'babelify@^7.3.0', +224 silly cache add scope: null, +224 silly cache add escapedName: 'babelify', +224 silly cache add name: 'babelify', +224 silly cache add rawSpec: '^7.3.0', +224 silly cache add spec: '>=7.3.0 <8.0.0', +224 silly cache add type: 'range' } +225 silly addNamed babelify@>=7.3.0 <8.0.0 +226 verbose addNamed ">=7.3.0 <8.0.0" is a valid semver range for babelify +227 silly addNameRange { name: 'babelify', range: '>=7.3.0 <8.0.0', hasData: false } +228 silly mapToRegistry name babelify +229 silly mapToRegistry using default registry +230 silly mapToRegistry registry https://registry.npmjs.org/ +231 silly mapToRegistry data Result { +231 silly mapToRegistry raw: 'babelify', +231 silly mapToRegistry scope: null, +231 silly mapToRegistry escapedName: 'babelify', +231 silly mapToRegistry name: 'babelify', +231 silly mapToRegistry rawSpec: '', +231 silly mapToRegistry spec: 'latest', +231 silly mapToRegistry type: 'tag' } +232 silly mapToRegistry uri https://registry.npmjs.org/babelify +233 verbose addNameRange registry:https://registry.npmjs.org/babelify not in flight; fetching +234 verbose get https://registry.npmjs.org/babelify not expired, no request +235 silly addNameRange number 2 { name: 'babelify', range: '>=7.3.0 <8.0.0', hasData: true } +236 silly addNameRange versions [ 'babelify', +236 silly addNameRange [ '5.0.1', +236 silly addNameRange '5.0.2', +236 silly addNameRange '5.0.3', +236 silly addNameRange '5.0.4', +236 silly addNameRange '6.0.0', +236 silly addNameRange '5.0.5', +236 silly addNameRange '6.0.1', +236 silly addNameRange '6.0.2', +236 silly addNameRange '6.1.0', +236 silly addNameRange '6.1.1', +236 silly addNameRange '6.1.2', +236 silly addNameRange '6.1.3', +236 silly addNameRange '6.2.0', +236 silly addNameRange '6.3.0', +236 silly addNameRange '6.4.0', +236 silly addNameRange '7.0.0', +236 silly addNameRange '7.0.1', +236 silly addNameRange '7.0.2', +236 silly addNameRange '7.1.0', +236 silly addNameRange '7.2.0', +236 silly addNameRange '7.3.0', +236 silly addNameRange '8.0.0' ] ] +237 silly addNamed babelify@7.3.0 +238 verbose addNamed "7.3.0" is a plain semver version for babelify +239 silly cache afterAdd babelify@7.3.0 +240 verbose afterAdd /Users/zhiyuan/.npm/babelify/7.3.0/package/package.json not in flight; writing +241 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +242 verbose afterAdd /Users/zhiyuan/.npm/babelify/7.3.0/package/package.json written +243 silly fetchNamedPackageData babelify +244 silly mapToRegistry name babelify +245 silly mapToRegistry using default registry +246 silly mapToRegistry registry https://registry.npmjs.org/ +247 silly mapToRegistry data Result { +247 silly mapToRegistry raw: 'babelify', +247 silly mapToRegistry scope: null, +247 silly mapToRegistry escapedName: 'babelify', +247 silly mapToRegistry name: 'babelify', +247 silly mapToRegistry rawSpec: '', +247 silly mapToRegistry spec: 'latest', +247 silly mapToRegistry type: 'tag' } +248 silly mapToRegistry uri https://registry.npmjs.org/babelify +249 silly resolveWithNewModule babelify@7.3.0 checking installable status +250 silly fetchNamedPackageData babelify +251 silly mapToRegistry name babelify +252 silly mapToRegistry using default registry +253 silly mapToRegistry registry https://registry.npmjs.org/ +254 silly mapToRegistry data Result { +254 silly mapToRegistry raw: 'babelify', +254 silly mapToRegistry scope: null, +254 silly mapToRegistry escapedName: 'babelify', +254 silly mapToRegistry name: 'babelify', +254 silly mapToRegistry rawSpec: '', +254 silly mapToRegistry spec: 'latest', +254 silly mapToRegistry type: 'tag' } +255 silly mapToRegistry uri https://registry.npmjs.org/babelify +256 silly resolveWithNewModule babelify@7.3.0 checking installable status +257 silly fetchNamedPackageData chai +258 silly mapToRegistry name chai +259 silly mapToRegistry using default registry +260 silly mapToRegistry registry https://registry.npmjs.org/ +261 silly mapToRegistry data Result { +261 silly mapToRegistry raw: 'chai', +261 silly mapToRegistry scope: null, +261 silly mapToRegistry escapedName: 'chai', +261 silly mapToRegistry name: 'chai', +261 silly mapToRegistry rawSpec: '', +261 silly mapToRegistry spec: 'latest', +261 silly mapToRegistry type: 'tag' } +262 silly mapToRegistry uri https://registry.npmjs.org/chai +263 silly resolveWithNewModule chai@3.5.0 checking installable status +264 silly fetchNamedPackageData mocha +265 silly mapToRegistry name mocha +266 silly mapToRegistry using default registry +267 silly mapToRegistry registry https://registry.npmjs.org/ +268 silly mapToRegistry data Result { +268 silly mapToRegistry raw: 'mocha', +268 silly mapToRegistry scope: null, +268 silly mapToRegistry escapedName: 'mocha', +268 silly mapToRegistry name: 'mocha', +268 silly mapToRegistry rawSpec: '', +268 silly mapToRegistry spec: 'latest', +268 silly mapToRegistry type: 'tag' } +269 silly mapToRegistry uri https://registry.npmjs.org/mocha +270 verbose request uri https://registry.npmjs.org/mocha +271 verbose request no auth needed +272 info attempt registry request try #1 at 18:56:22 +273 verbose etag "5ae024a2-101a5b" +274 verbose lastModified Wed, 25 Apr 2018 6:48:02 GMT +275 http request GET https://registry.npmjs.org/mocha +276 http 304 https://registry.npmjs.org/mocha +277 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +277 verbose headers via: '1.1 varnish', +277 verbose headers 'cache-control': 'max-age=300', +277 verbose headers etag: '"5ae024a2-101a5b"', +277 verbose headers age: '9545', +277 verbose headers connection: 'keep-alive', +277 verbose headers 'x-served-by': 'cache-itm18831-ITM', +277 verbose headers 'x-cache': 'HIT', +277 verbose headers 'x-cache-hits': '19', +277 verbose headers 'x-timer': 'S1524740183.281515,VS0,VE0', +277 verbose headers vary: 'Accept-Encoding, Accept' } +278 silly get cb [ 304, +278 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +278 silly get via: '1.1 varnish', +278 silly get 'cache-control': 'max-age=300', +278 silly get etag: '"5ae024a2-101a5b"', +278 silly get age: '9545', +278 silly get connection: 'keep-alive', +278 silly get 'x-served-by': 'cache-itm18831-ITM', +278 silly get 'x-cache': 'HIT', +278 silly get 'x-cache-hits': '19', +278 silly get 'x-timer': 'S1524740183.281515,VS0,VE0', +278 silly get vary: 'Accept-Encoding, Accept' } ] +279 verbose etag https://registry.npmjs.org/mocha from cache +280 verbose get saving mocha to /Users/zhiyuan/.npm/registry.npmjs.org/mocha/.cache.json +281 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +282 silly resolveWithNewModule mocha@3.3.0 checking installable status +283 silly cache add args [ 'mocha@~3.3.0', null ] +284 verbose cache add spec mocha@~3.3.0 +285 silly cache add parsed spec Result { +285 silly cache add raw: 'mocha@~3.3.0', +285 silly cache add scope: null, +285 silly cache add escapedName: 'mocha', +285 silly cache add name: 'mocha', +285 silly cache add rawSpec: '~3.3.0', +285 silly cache add spec: '>=3.3.0 <3.4.0', +285 silly cache add type: 'range' } +286 silly addNamed mocha@>=3.3.0 <3.4.0 +287 verbose addNamed ">=3.3.0 <3.4.0" is a valid semver range for mocha +288 silly addNameRange { name: 'mocha', range: '>=3.3.0 <3.4.0', hasData: false } +289 silly mapToRegistry name mocha +290 silly mapToRegistry using default registry +291 silly mapToRegistry registry https://registry.npmjs.org/ +292 silly mapToRegistry data Result { +292 silly mapToRegistry raw: 'mocha', +292 silly mapToRegistry scope: null, +292 silly mapToRegistry escapedName: 'mocha', +292 silly mapToRegistry name: 'mocha', +292 silly mapToRegistry rawSpec: '', +292 silly mapToRegistry spec: 'latest', +292 silly mapToRegistry type: 'tag' } +293 silly mapToRegistry uri https://registry.npmjs.org/mocha +294 verbose addNameRange registry:https://registry.npmjs.org/mocha not in flight; fetching +295 verbose get https://registry.npmjs.org/mocha not expired, no request +296 silly addNameRange number 2 { name: 'mocha', range: '>=3.3.0 <3.4.0', hasData: true } +297 silly addNameRange versions [ 'mocha', +297 silly addNameRange [ '0.0.1-alpha1', +297 silly addNameRange '0.0.1-alpha2', +297 silly addNameRange '0.0.1-alpha3', +297 silly addNameRange '0.0.1-alpha4', +297 silly addNameRange '0.0.1-alpha5', +297 silly addNameRange '0.0.1-alpha6', +297 silly addNameRange '0.0.1', +297 silly addNameRange '0.0.2', +297 silly addNameRange '0.0.3', +297 silly addNameRange '0.0.4', +297 silly addNameRange '0.0.5', +297 silly addNameRange '0.0.6', +297 silly addNameRange '0.0.7', +297 silly addNameRange '0.0.8', +297 silly addNameRange '0.1.0', +297 silly addNameRange '0.2.0', +297 silly addNameRange '0.3.0', +297 silly addNameRange '0.3.1', +297 silly addNameRange '0.3.2', +297 silly addNameRange '0.3.3', +297 silly addNameRange '0.3.4', +297 silly addNameRange '0.3.6', +297 silly addNameRange '0.4.0', +297 silly addNameRange '0.5.0', +297 silly addNameRange '0.6.0', +297 silly addNameRange '0.7.0', +297 silly addNameRange '0.7.1', +297 silly addNameRange '0.8.0', +297 silly addNameRange '0.8.1', +297 silly addNameRange '0.9.0', +297 silly addNameRange '0.10.0', +297 silly addNameRange '0.10.1', +297 silly addNameRange '0.10.2', +297 silly addNameRange '0.11.0', +297 silly addNameRange '0.12.0', +297 silly addNameRange '0.12.1', +297 silly addNameRange '0.13.0', +297 silly addNameRange '0.14.0', +297 silly addNameRange '0.14.1', +297 silly addNameRange '1.0.0', +297 silly addNameRange '1.0.1', +297 silly addNameRange '1.0.2', +297 silly addNameRange '1.0.3', +297 silly addNameRange '1.1.0', +297 silly addNameRange '1.2.0', +297 silly addNameRange '1.2.1', +297 silly addNameRange '1.2.2', +297 silly addNameRange '1.3.0', +297 silly addNameRange '1.3.1', +297 silly addNameRange '1.3.2', +297 silly addNameRange '1.4.0', +297 silly addNameRange '1.4.1', +297 silly addNameRange '1.4.2', +297 silly addNameRange '1.4.3', +297 silly addNameRange '1.5.0', +297 silly addNameRange '1.6.0', +297 silly addNameRange '1.7.0', +297 silly addNameRange '1.7.1', +297 silly addNameRange '1.7.2', +297 silly addNameRange '1.7.3', +297 silly addNameRange '1.7.4', +297 silly addNameRange '1.8.0', +297 silly addNameRange '1.8.1', +297 silly addNameRange '1.8.2', +297 silly addNameRange '1.9.0', +297 silly addNameRange '1.10.0', +297 silly addNameRange '1.11.0', +297 silly addNameRange '1.12.0', +297 silly addNameRange '1.12.1', +297 silly addNameRange '1.13.0', +297 silly addNameRange '1.14.0', +297 silly addNameRange '1.15.0', +297 silly addNameRange '1.15.1', +297 silly addNameRange '1.16.0', +297 silly addNameRange '1.16.1', +297 silly addNameRange '1.16.2', +297 silly addNameRange '1.17.0', +297 silly addNameRange '1.17.1', +297 silly addNameRange '1.18.0', +297 silly addNameRange '1.18.1', +297 silly addNameRange '1.18.2', +297 silly addNameRange '1.19.0', +297 silly addNameRange '1.20.0', +297 silly addNameRange '1.20.1', +297 silly addNameRange '1.21.0', +297 silly addNameRange '1.21.1', +297 silly addNameRange '1.21.2', +297 silly addNameRange '1.21.3', +297 silly addNameRange '1.21.4', +297 silly addNameRange '1.21.5', +297 silly addNameRange '2.0.0', +297 silly addNameRange '2.0.1', +297 silly addNameRange '2.1.0', +297 silly addNameRange '2.2.0', +297 silly addNameRange '2.2.1', +297 silly addNameRange '2.2.3', +297 silly addNameRange '2.2.4', +297 silly addNameRange '2.2.5', +297 silly addNameRange '2.3.0', +297 silly addNameRange '2.3.1', +297 silly addNameRange ... 40 more items ] ] +298 silly addNamed mocha@3.3.0 +299 verbose addNamed "3.3.0" is a plain semver version for mocha +300 silly cache afterAdd mocha@3.3.0 +301 verbose afterAdd /Users/zhiyuan/.npm/mocha/3.3.0/package/package.json not in flight; writing +302 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +303 verbose afterAdd /Users/zhiyuan/.npm/mocha/3.3.0/package/package.json written +304 silly fetchNamedPackageData deep-eql +305 silly mapToRegistry name deep-eql +306 silly mapToRegistry using default registry +307 silly mapToRegistry registry https://registry.npmjs.org/ +308 silly mapToRegistry data Result { +308 silly mapToRegistry raw: 'deep-eql', +308 silly mapToRegistry scope: null, +308 silly mapToRegistry escapedName: 'deep-eql', +308 silly mapToRegistry name: 'deep-eql', +308 silly mapToRegistry rawSpec: '', +308 silly mapToRegistry spec: 'latest', +308 silly mapToRegistry type: 'tag' } +309 silly mapToRegistry uri https://registry.npmjs.org/deep-eql +310 silly resolveWithNewModule deep-eql@0.1.3 checking installable status +311 silly fetchNamedPackageData type-detect +312 silly mapToRegistry name type-detect +313 silly mapToRegistry using default registry +314 silly mapToRegistry registry https://registry.npmjs.org/ +315 silly mapToRegistry data Result { +315 silly mapToRegistry raw: 'type-detect', +315 silly mapToRegistry scope: null, +315 silly mapToRegistry escapedName: 'type-detect', +315 silly mapToRegistry name: 'type-detect', +315 silly mapToRegistry rawSpec: '', +315 silly mapToRegistry spec: 'latest', +315 silly mapToRegistry type: 'tag' } +316 silly mapToRegistry uri https://registry.npmjs.org/type-detect +317 silly resolveWithNewModule type-detect@1.0.0 checking installable status +318 silly fetchNamedPackageData type-detect +319 silly mapToRegistry name type-detect +320 silly mapToRegistry using default registry +321 silly mapToRegistry registry https://registry.npmjs.org/ +322 silly mapToRegistry data Result { +322 silly mapToRegistry raw: 'type-detect', +322 silly mapToRegistry scope: null, +322 silly mapToRegistry escapedName: 'type-detect', +322 silly mapToRegistry name: 'type-detect', +322 silly mapToRegistry rawSpec: '', +322 silly mapToRegistry spec: 'latest', +322 silly mapToRegistry type: 'tag' } +323 silly mapToRegistry uri https://registry.npmjs.org/type-detect +324 silly resolveWithNewModule type-detect@0.1.1 checking installable status +325 silly cache add args [ 'type-detect@0.1.1', null ] +326 verbose cache add spec type-detect@0.1.1 +327 silly cache add parsed spec Result { +327 silly cache add raw: 'type-detect@0.1.1', +327 silly cache add scope: null, +327 silly cache add escapedName: 'type-detect', +327 silly cache add name: 'type-detect', +327 silly cache add rawSpec: '0.1.1', +327 silly cache add spec: '0.1.1', +327 silly cache add type: 'version' } +328 silly addNamed type-detect@0.1.1 +329 verbose addNamed "0.1.1" is a plain semver version for type-detect +330 silly mapToRegistry name type-detect +331 silly mapToRegistry using default registry +332 silly mapToRegistry registry https://registry.npmjs.org/ +333 silly mapToRegistry data Result { +333 silly mapToRegistry raw: 'type-detect', +333 silly mapToRegistry scope: null, +333 silly mapToRegistry escapedName: 'type-detect', +333 silly mapToRegistry name: 'type-detect', +333 silly mapToRegistry rawSpec: '', +333 silly mapToRegistry spec: 'latest', +333 silly mapToRegistry type: 'tag' } +334 silly mapToRegistry uri https://registry.npmjs.org/type-detect +335 verbose addNameVersion registry:https://registry.npmjs.org/type-detect not in flight; fetching +336 verbose get https://registry.npmjs.org/type-detect not expired, no request +337 silly cache afterAdd type-detect@0.1.1 +338 verbose afterAdd /Users/zhiyuan/.npm/type-detect/0.1.1/package/package.json not in flight; writing +339 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +340 verbose afterAdd /Users/zhiyuan/.npm/type-detect/0.1.1/package/package.json written +341 silly fetchNamedPackageData browser-stdout +342 silly mapToRegistry name browser-stdout +343 silly mapToRegistry using default registry +344 silly mapToRegistry registry https://registry.npmjs.org/ +345 silly mapToRegistry data Result { +345 silly mapToRegistry raw: 'browser-stdout', +345 silly mapToRegistry scope: null, +345 silly mapToRegistry escapedName: 'browser-stdout', +345 silly mapToRegistry name: 'browser-stdout', +345 silly mapToRegistry rawSpec: '', +345 silly mapToRegistry spec: 'latest', +345 silly mapToRegistry type: 'tag' } +346 silly mapToRegistry uri https://registry.npmjs.org/browser-stdout +347 silly fetchNamedPackageData debug +348 silly mapToRegistry name debug +349 silly mapToRegistry using default registry +350 silly mapToRegistry registry https://registry.npmjs.org/ +351 silly mapToRegistry data Result { +351 silly mapToRegistry raw: 'debug', +351 silly mapToRegistry scope: null, +351 silly mapToRegistry escapedName: 'debug', +351 silly mapToRegistry name: 'debug', +351 silly mapToRegistry rawSpec: '', +351 silly mapToRegistry spec: 'latest', +351 silly mapToRegistry type: 'tag' } +352 silly mapToRegistry uri https://registry.npmjs.org/debug +353 silly fetchNamedPackageData diff +354 silly mapToRegistry name diff +355 silly mapToRegistry using default registry +356 silly mapToRegistry registry https://registry.npmjs.org/ +357 silly mapToRegistry data Result { +357 silly mapToRegistry raw: 'diff', +357 silly mapToRegistry scope: null, +357 silly mapToRegistry escapedName: 'diff', +357 silly mapToRegistry name: 'diff', +357 silly mapToRegistry rawSpec: '', +357 silly mapToRegistry spec: 'latest', +357 silly mapToRegistry type: 'tag' } +358 silly mapToRegistry uri https://registry.npmjs.org/diff +359 silly fetchNamedPackageData glob +360 silly mapToRegistry name glob +361 silly mapToRegistry using default registry +362 silly mapToRegistry registry https://registry.npmjs.org/ +363 silly mapToRegistry data Result { +363 silly mapToRegistry raw: 'glob', +363 silly mapToRegistry scope: null, +363 silly mapToRegistry escapedName: 'glob', +363 silly mapToRegistry name: 'glob', +363 silly mapToRegistry rawSpec: '', +363 silly mapToRegistry spec: 'latest', +363 silly mapToRegistry type: 'tag' } +364 silly mapToRegistry uri https://registry.npmjs.org/glob +365 silly fetchNamedPackageData growl +366 silly mapToRegistry name growl +367 silly mapToRegistry using default registry +368 silly mapToRegistry registry https://registry.npmjs.org/ +369 silly mapToRegistry data Result { +369 silly mapToRegistry raw: 'growl', +369 silly mapToRegistry scope: null, +369 silly mapToRegistry escapedName: 'growl', +369 silly mapToRegistry name: 'growl', +369 silly mapToRegistry rawSpec: '', +369 silly mapToRegistry spec: 'latest', +369 silly mapToRegistry type: 'tag' } +370 silly mapToRegistry uri https://registry.npmjs.org/growl +371 silly fetchNamedPackageData json3 +372 silly mapToRegistry name json3 +373 silly mapToRegistry using default registry +374 silly mapToRegistry registry https://registry.npmjs.org/ +375 silly mapToRegistry data Result { +375 silly mapToRegistry raw: 'json3', +375 silly mapToRegistry scope: null, +375 silly mapToRegistry escapedName: 'json3', +375 silly mapToRegistry name: 'json3', +375 silly mapToRegistry rawSpec: '', +375 silly mapToRegistry spec: 'latest', +375 silly mapToRegistry type: 'tag' } +376 silly mapToRegistry uri https://registry.npmjs.org/json3 +377 silly fetchNamedPackageData lodash.create +378 silly mapToRegistry name lodash.create +379 silly mapToRegistry using default registry +380 silly mapToRegistry registry https://registry.npmjs.org/ +381 silly mapToRegistry data Result { +381 silly mapToRegistry raw: 'lodash.create', +381 silly mapToRegistry scope: null, +381 silly mapToRegistry escapedName: 'lodash.create', +381 silly mapToRegistry name: 'lodash.create', +381 silly mapToRegistry rawSpec: '', +381 silly mapToRegistry spec: 'latest', +381 silly mapToRegistry type: 'tag' } +382 silly mapToRegistry uri https://registry.npmjs.org/lodash.create +383 silly fetchNamedPackageData supports-color +384 silly mapToRegistry name supports-color +385 silly mapToRegistry using default registry +386 silly mapToRegistry registry https://registry.npmjs.org/ +387 silly mapToRegistry data Result { +387 silly mapToRegistry raw: 'supports-color', +387 silly mapToRegistry scope: null, +387 silly mapToRegistry escapedName: 'supports-color', +387 silly mapToRegistry name: 'supports-color', +387 silly mapToRegistry rawSpec: '', +387 silly mapToRegistry spec: 'latest', +387 silly mapToRegistry type: 'tag' } +388 silly mapToRegistry uri https://registry.npmjs.org/supports-color +389 verbose request uri https://registry.npmjs.org/diff +390 verbose request no auth needed +391 info attempt registry request try #1 at 18:56:23 +392 verbose etag "5ab116ee-fcf1" +393 verbose lastModified Tue, 20 Mar 2018 14:13:02 GMT +394 http request GET https://registry.npmjs.org/diff +395 verbose request uri https://registry.npmjs.org/browser-stdout +396 verbose request no auth needed +397 info attempt registry request try #1 at 18:56:23 +398 verbose etag "5a95956a-1ece" +399 verbose lastModified Tue, 27 Feb 2018 17:29:14 GMT +400 http request GET https://registry.npmjs.org/browser-stdout +401 verbose request uri https://registry.npmjs.org/debug +402 verbose request no auth needed +403 info attempt registry request try #1 at 18:56:23 +404 verbose etag "5ae04225-1954d" +405 verbose lastModified Wed, 25 Apr 2018 8:53:57 GMT +406 http request GET https://registry.npmjs.org/debug +407 verbose request uri https://registry.npmjs.org/glob +408 verbose request no auth needed +409 info attempt registry request try #1 at 18:56:23 +410 verbose etag "5ad07458-20247" +411 verbose lastModified Fri, 13 Apr 2018 9:11:52 GMT +412 http request GET https://registry.npmjs.org/glob +413 verbose request uri https://registry.npmjs.org/growl +414 verbose request no auth needed +415 info attempt registry request try #1 at 18:56:23 +416 verbose etag "5ac4f2eb-64f9" +417 verbose lastModified Wed, 4 Apr 2018 15:44:43 GMT +418 http request GET https://registry.npmjs.org/growl +419 verbose request uri https://registry.npmjs.org/supports-color +420 verbose request no auth needed +421 info attempt registry request try #1 at 18:56:23 +422 verbose etag "5ad570bb-beb1" +423 verbose lastModified Tue, 17 Apr 2018 3:57:47 GMT +424 http request GET https://registry.npmjs.org/supports-color +425 verbose request uri https://registry.npmjs.org/json3 +426 verbose request no auth needed +427 info attempt registry request try #1 at 18:56:23 +428 verbose etag "5a5f46ca-5e53" +429 verbose lastModified Wed, 17 Jan 2018 12:51:22 GMT +430 http request GET https://registry.npmjs.org/json3 +431 verbose request uri https://registry.npmjs.org/lodash.create +432 verbose request no auth needed +433 info attempt registry request try #1 at 18:56:23 +434 verbose etag "57f67fb1-58a8" +435 verbose lastModified Thu, 6 Oct 2016 16:45:37 GMT +436 http request GET https://registry.npmjs.org/lodash.create +437 http 304 https://registry.npmjs.org/browser-stdout +438 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +438 verbose headers via: '1.1 varnish', +438 verbose headers 'cache-control': 'max-age=300', +438 verbose headers etag: '"5a95956a-1ece"', +438 verbose headers age: '4091', +438 verbose headers connection: 'keep-alive', +438 verbose headers 'x-served-by': 'cache-itm18831-ITM', +438 verbose headers 'x-cache': 'HIT', +438 verbose headers 'x-cache-hits': '3', +438 verbose headers 'x-timer': 'S1524740184.801872,VS0,VE0', +438 verbose headers vary: 'Accept-Encoding, Accept' } +439 silly get cb [ 304, +439 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +439 silly get via: '1.1 varnish', +439 silly get 'cache-control': 'max-age=300', +439 silly get etag: '"5a95956a-1ece"', +439 silly get age: '4091', +439 silly get connection: 'keep-alive', +439 silly get 'x-served-by': 'cache-itm18831-ITM', +439 silly get 'x-cache': 'HIT', +439 silly get 'x-cache-hits': '3', +439 silly get 'x-timer': 'S1524740184.801872,VS0,VE0', +439 silly get vary: 'Accept-Encoding, Accept' } ] +440 verbose etag https://registry.npmjs.org/browser-stdout from cache +441 verbose get saving browser-stdout to /Users/zhiyuan/.npm/registry.npmjs.org/browser-stdout/.cache.json +442 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +443 http 304 https://registry.npmjs.org/diff +444 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +444 verbose headers via: '1.1 varnish', +444 verbose headers 'cache-control': 'max-age=300', +444 verbose headers etag: '"5ab116ee-fcf1"', +444 verbose headers age: '10752', +444 verbose headers connection: 'keep-alive', +444 verbose headers 'x-served-by': 'cache-itm18829-ITM', +444 verbose headers 'x-cache': 'HIT', +444 verbose headers 'x-cache-hits': '20', +444 verbose headers 'x-timer': 'S1524740184.808632,VS0,VE0', +444 verbose headers vary: 'Accept-Encoding, Accept' } +445 silly get cb [ 304, +445 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +445 silly get via: '1.1 varnish', +445 silly get 'cache-control': 'max-age=300', +445 silly get etag: '"5ab116ee-fcf1"', +445 silly get age: '10752', +445 silly get connection: 'keep-alive', +445 silly get 'x-served-by': 'cache-itm18829-ITM', +445 silly get 'x-cache': 'HIT', +445 silly get 'x-cache-hits': '20', +445 silly get 'x-timer': 'S1524740184.808632,VS0,VE0', +445 silly get vary: 'Accept-Encoding, Accept' } ] +446 verbose etag https://registry.npmjs.org/diff from cache +447 verbose get saving diff to /Users/zhiyuan/.npm/registry.npmjs.org/diff/.cache.json +448 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +449 silly resolveWithNewModule browser-stdout@1.3.0 checking installable status +450 silly cache add args [ 'browser-stdout@1.3.0', null ] +451 verbose cache add spec browser-stdout@1.3.0 +452 silly cache add parsed spec Result { +452 silly cache add raw: 'browser-stdout@1.3.0', +452 silly cache add scope: null, +452 silly cache add escapedName: 'browser-stdout', +452 silly cache add name: 'browser-stdout', +452 silly cache add rawSpec: '1.3.0', +452 silly cache add spec: '1.3.0', +452 silly cache add type: 'version' } +453 silly addNamed browser-stdout@1.3.0 +454 verbose addNamed "1.3.0" is a plain semver version for browser-stdout +455 silly mapToRegistry name browser-stdout +456 silly mapToRegistry using default registry +457 silly mapToRegistry registry https://registry.npmjs.org/ +458 silly mapToRegistry data Result { +458 silly mapToRegistry raw: 'browser-stdout', +458 silly mapToRegistry scope: null, +458 silly mapToRegistry escapedName: 'browser-stdout', +458 silly mapToRegistry name: 'browser-stdout', +458 silly mapToRegistry rawSpec: '', +458 silly mapToRegistry spec: 'latest', +458 silly mapToRegistry type: 'tag' } +459 silly mapToRegistry uri https://registry.npmjs.org/browser-stdout +460 verbose addNameVersion registry:https://registry.npmjs.org/browser-stdout not in flight; fetching +461 verbose get https://registry.npmjs.org/browser-stdout not expired, no request +462 silly cache afterAdd browser-stdout@1.3.0 +463 verbose afterAdd /Users/zhiyuan/.npm/browser-stdout/1.3.0/package/package.json not in flight; writing +464 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +465 silly resolveWithNewModule diff@3.2.0 checking installable status +466 silly cache add args [ 'diff@3.2.0', null ] +467 verbose cache add spec diff@3.2.0 +468 silly cache add parsed spec Result { +468 silly cache add raw: 'diff@3.2.0', +468 silly cache add scope: null, +468 silly cache add escapedName: 'diff', +468 silly cache add name: 'diff', +468 silly cache add rawSpec: '3.2.0', +468 silly cache add spec: '3.2.0', +468 silly cache add type: 'version' } +469 silly addNamed diff@3.2.0 +470 verbose addNamed "3.2.0" is a plain semver version for diff +471 silly mapToRegistry name diff +472 silly mapToRegistry using default registry +473 silly mapToRegistry registry https://registry.npmjs.org/ +474 silly mapToRegistry data Result { +474 silly mapToRegistry raw: 'diff', +474 silly mapToRegistry scope: null, +474 silly mapToRegistry escapedName: 'diff', +474 silly mapToRegistry name: 'diff', +474 silly mapToRegistry rawSpec: '', +474 silly mapToRegistry spec: 'latest', +474 silly mapToRegistry type: 'tag' } +475 silly mapToRegistry uri https://registry.npmjs.org/diff +476 verbose addNameVersion registry:https://registry.npmjs.org/diff not in flight; fetching +477 verbose get https://registry.npmjs.org/diff not expired, no request +478 verbose afterAdd /Users/zhiyuan/.npm/browser-stdout/1.3.0/package/package.json written +479 silly cache afterAdd diff@3.2.0 +480 verbose afterAdd /Users/zhiyuan/.npm/diff/3.2.0/package/package.json not in flight; writing +481 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +482 verbose afterAdd /Users/zhiyuan/.npm/diff/3.2.0/package/package.json written +483 http 304 https://registry.npmjs.org/growl +484 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +484 verbose headers via: '1.1 varnish', +484 verbose headers 'cache-control': 'max-age=300', +484 verbose headers etag: '"5ac4f2eb-64f9"', +484 verbose headers age: '5622', +484 verbose headers connection: 'keep-alive', +484 verbose headers 'x-served-by': 'cache-itm18833-ITM', +484 verbose headers 'x-cache': 'HIT', +484 verbose headers 'x-cache-hits': '3', +484 verbose headers 'x-timer': 'S1524740184.886983,VS0,VE0', +484 verbose headers vary: 'Accept-Encoding, Accept' } +485 silly get cb [ 304, +485 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +485 silly get via: '1.1 varnish', +485 silly get 'cache-control': 'max-age=300', +485 silly get etag: '"5ac4f2eb-64f9"', +485 silly get age: '5622', +485 silly get connection: 'keep-alive', +485 silly get 'x-served-by': 'cache-itm18833-ITM', +485 silly get 'x-cache': 'HIT', +485 silly get 'x-cache-hits': '3', +485 silly get 'x-timer': 'S1524740184.886983,VS0,VE0', +485 silly get vary: 'Accept-Encoding, Accept' } ] +486 verbose etag https://registry.npmjs.org/growl from cache +487 verbose get saving growl to /Users/zhiyuan/.npm/registry.npmjs.org/growl/.cache.json +488 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +489 silly resolveWithNewModule growl@1.9.2 checking installable status +490 silly cache add args [ 'growl@1.9.2', null ] +491 verbose cache add spec growl@1.9.2 +492 silly cache add parsed spec Result { +492 silly cache add raw: 'growl@1.9.2', +492 silly cache add scope: null, +492 silly cache add escapedName: 'growl', +492 silly cache add name: 'growl', +492 silly cache add rawSpec: '1.9.2', +492 silly cache add spec: '1.9.2', +492 silly cache add type: 'version' } +493 silly addNamed growl@1.9.2 +494 verbose addNamed "1.9.2" is a plain semver version for growl +495 silly mapToRegistry name growl +496 silly mapToRegistry using default registry +497 silly mapToRegistry registry https://registry.npmjs.org/ +498 silly mapToRegistry data Result { +498 silly mapToRegistry raw: 'growl', +498 silly mapToRegistry scope: null, +498 silly mapToRegistry escapedName: 'growl', +498 silly mapToRegistry name: 'growl', +498 silly mapToRegistry rawSpec: '', +498 silly mapToRegistry spec: 'latest', +498 silly mapToRegistry type: 'tag' } +499 silly mapToRegistry uri https://registry.npmjs.org/growl +500 verbose addNameVersion registry:https://registry.npmjs.org/growl not in flight; fetching +501 verbose get https://registry.npmjs.org/growl not expired, no request +502 silly cache afterAdd growl@1.9.2 +503 verbose afterAdd /Users/zhiyuan/.npm/growl/1.9.2/package/package.json not in flight; writing +504 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +505 http 304 https://registry.npmjs.org/lodash.create +506 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +506 verbose headers via: '1.1 varnish', +506 verbose headers 'cache-control': 'max-age=300', +506 verbose headers etag: '"57f67fb1-58a8"', +506 verbose headers age: '4091', +506 verbose headers connection: 'keep-alive', +506 verbose headers 'x-served-by': 'cache-itm18822-ITM', +506 verbose headers 'x-cache': 'HIT', +506 verbose headers 'x-cache-hits': '1', +506 verbose headers 'x-timer': 'S1524740184.892490,VS0,VE0', +506 verbose headers vary: 'Accept-Encoding, Accept' } +507 silly get cb [ 304, +507 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +507 silly get via: '1.1 varnish', +507 silly get 'cache-control': 'max-age=300', +507 silly get etag: '"57f67fb1-58a8"', +507 silly get age: '4091', +507 silly get connection: 'keep-alive', +507 silly get 'x-served-by': 'cache-itm18822-ITM', +507 silly get 'x-cache': 'HIT', +507 silly get 'x-cache-hits': '1', +507 silly get 'x-timer': 'S1524740184.892490,VS0,VE0', +507 silly get vary: 'Accept-Encoding, Accept' } ] +508 verbose etag https://registry.npmjs.org/lodash.create from cache +509 verbose get saving lodash.create to /Users/zhiyuan/.npm/registry.npmjs.org/lodash.create/.cache.json +510 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +511 verbose afterAdd /Users/zhiyuan/.npm/growl/1.9.2/package/package.json written +512 http 304 https://registry.npmjs.org/glob +513 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +513 verbose headers via: '1.1 varnish', +513 verbose headers 'cache-control': 'max-age=300', +513 verbose headers etag: '"5ad07458-20247"', +513 verbose headers age: '4319', +513 verbose headers connection: 'keep-alive', +513 verbose headers 'x-served-by': 'cache-itm18826-ITM', +513 verbose headers 'x-cache': 'HIT', +513 verbose headers 'x-cache-hits': '39', +513 verbose headers 'x-timer': 'S1524740184.893438,VS0,VE0', +513 verbose headers vary: 'Accept-Encoding, Accept' } +514 silly get cb [ 304, +514 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +514 silly get via: '1.1 varnish', +514 silly get 'cache-control': 'max-age=300', +514 silly get etag: '"5ad07458-20247"', +514 silly get age: '4319', +514 silly get connection: 'keep-alive', +514 silly get 'x-served-by': 'cache-itm18826-ITM', +514 silly get 'x-cache': 'HIT', +514 silly get 'x-cache-hits': '39', +514 silly get 'x-timer': 'S1524740184.893438,VS0,VE0', +514 silly get vary: 'Accept-Encoding, Accept' } ] +515 verbose etag https://registry.npmjs.org/glob from cache +516 verbose get saving glob to /Users/zhiyuan/.npm/registry.npmjs.org/glob/.cache.json +517 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +518 http 304 https://registry.npmjs.org/debug +519 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +519 verbose headers via: '1.1 varnish', +519 verbose headers 'cache-control': 'max-age=300', +519 verbose headers etag: '"5ae04225-1954d"', +519 verbose headers age: '7181', +519 verbose headers connection: 'keep-alive', +519 verbose headers 'x-served-by': 'cache-itm18820-ITM', +519 verbose headers 'x-cache': 'HIT', +519 verbose headers 'x-cache-hits': '54', +519 verbose headers 'x-timer': 'S1524740184.901937,VS0,VE0', +519 verbose headers vary: 'Accept-Encoding, Accept' } +520 silly get cb [ 304, +520 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +520 silly get via: '1.1 varnish', +520 silly get 'cache-control': 'max-age=300', +520 silly get etag: '"5ae04225-1954d"', +520 silly get age: '7181', +520 silly get connection: 'keep-alive', +520 silly get 'x-served-by': 'cache-itm18820-ITM', +520 silly get 'x-cache': 'HIT', +520 silly get 'x-cache-hits': '54', +520 silly get 'x-timer': 'S1524740184.901937,VS0,VE0', +520 silly get vary: 'Accept-Encoding, Accept' } ] +521 verbose etag https://registry.npmjs.org/debug from cache +522 verbose get saving debug to /Users/zhiyuan/.npm/registry.npmjs.org/debug/.cache.json +523 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +524 silly resolveWithNewModule lodash.create@3.1.1 checking installable status +525 silly cache add args [ 'lodash.create@3.1.1', null ] +526 verbose cache add spec lodash.create@3.1.1 +527 silly cache add parsed spec Result { +527 silly cache add raw: 'lodash.create@3.1.1', +527 silly cache add scope: null, +527 silly cache add escapedName: 'lodash.create', +527 silly cache add name: 'lodash.create', +527 silly cache add rawSpec: '3.1.1', +527 silly cache add spec: '3.1.1', +527 silly cache add type: 'version' } +528 silly addNamed lodash.create@3.1.1 +529 verbose addNamed "3.1.1" is a plain semver version for lodash.create +530 silly mapToRegistry name lodash.create +531 silly mapToRegistry using default registry +532 silly mapToRegistry registry https://registry.npmjs.org/ +533 silly mapToRegistry data Result { +533 silly mapToRegistry raw: 'lodash.create', +533 silly mapToRegistry scope: null, +533 silly mapToRegistry escapedName: 'lodash.create', +533 silly mapToRegistry name: 'lodash.create', +533 silly mapToRegistry rawSpec: '', +533 silly mapToRegistry spec: 'latest', +533 silly mapToRegistry type: 'tag' } +534 silly mapToRegistry uri https://registry.npmjs.org/lodash.create +535 verbose addNameVersion registry:https://registry.npmjs.org/lodash.create not in flight; fetching +536 verbose get https://registry.npmjs.org/lodash.create not expired, no request +537 http 304 https://registry.npmjs.org/supports-color +538 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +538 verbose headers via: '1.1 varnish', +538 verbose headers 'cache-control': 'max-age=300', +538 verbose headers etag: '"5ad570bb-beb1"', +538 verbose headers age: '1271', +538 verbose headers connection: 'keep-alive', +538 verbose headers 'x-served-by': 'cache-itm18831-ITM', +538 verbose headers 'x-cache': 'HIT', +538 verbose headers 'x-cache-hits': '12', +538 verbose headers 'x-timer': 'S1524740184.910672,VS0,VE0', +538 verbose headers vary: 'Accept-Encoding, Accept' } +539 silly get cb [ 304, +539 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +539 silly get via: '1.1 varnish', +539 silly get 'cache-control': 'max-age=300', +539 silly get etag: '"5ad570bb-beb1"', +539 silly get age: '1271', +539 silly get connection: 'keep-alive', +539 silly get 'x-served-by': 'cache-itm18831-ITM', +539 silly get 'x-cache': 'HIT', +539 silly get 'x-cache-hits': '12', +539 silly get 'x-timer': 'S1524740184.910672,VS0,VE0', +539 silly get vary: 'Accept-Encoding, Accept' } ] +540 verbose etag https://registry.npmjs.org/supports-color from cache +541 verbose get saving supports-color to /Users/zhiyuan/.npm/registry.npmjs.org/supports-color/.cache.json +542 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +543 silly cache afterAdd lodash.create@3.1.1 +544 verbose afterAdd /Users/zhiyuan/.npm/lodash.create/3.1.1/package/package.json not in flight; writing +545 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +546 silly resolveWithNewModule debug@2.6.0 checking installable status +547 silly cache add args [ 'debug@2.6.0', null ] +548 verbose cache add spec debug@2.6.0 +549 silly cache add parsed spec Result { +549 silly cache add raw: 'debug@2.6.0', +549 silly cache add scope: null, +549 silly cache add escapedName: 'debug', +549 silly cache add name: 'debug', +549 silly cache add rawSpec: '2.6.0', +549 silly cache add spec: '2.6.0', +549 silly cache add type: 'version' } +550 silly addNamed debug@2.6.0 +551 verbose addNamed "2.6.0" is a plain semver version for debug +552 silly mapToRegistry name debug +553 silly mapToRegistry using default registry +554 silly mapToRegistry registry https://registry.npmjs.org/ +555 silly mapToRegistry data Result { +555 silly mapToRegistry raw: 'debug', +555 silly mapToRegistry scope: null, +555 silly mapToRegistry escapedName: 'debug', +555 silly mapToRegistry name: 'debug', +555 silly mapToRegistry rawSpec: '', +555 silly mapToRegistry spec: 'latest', +555 silly mapToRegistry type: 'tag' } +556 silly mapToRegistry uri https://registry.npmjs.org/debug +557 verbose addNameVersion registry:https://registry.npmjs.org/debug not in flight; fetching +558 silly resolveWithNewModule glob@7.1.1 checking installable status +559 silly cache add args [ 'glob@7.1.1', null ] +560 verbose cache add spec glob@7.1.1 +561 silly cache add parsed spec Result { +561 silly cache add raw: 'glob@7.1.1', +561 silly cache add scope: null, +561 silly cache add escapedName: 'glob', +561 silly cache add name: 'glob', +561 silly cache add rawSpec: '7.1.1', +561 silly cache add spec: '7.1.1', +561 silly cache add type: 'version' } +562 silly addNamed glob@7.1.1 +563 verbose addNamed "7.1.1" is a plain semver version for glob +564 silly mapToRegistry name glob +565 silly mapToRegistry using default registry +566 silly mapToRegistry registry https://registry.npmjs.org/ +567 silly mapToRegistry data Result { +567 silly mapToRegistry raw: 'glob', +567 silly mapToRegistry scope: null, +567 silly mapToRegistry escapedName: 'glob', +567 silly mapToRegistry name: 'glob', +567 silly mapToRegistry rawSpec: '', +567 silly mapToRegistry spec: 'latest', +567 silly mapToRegistry type: 'tag' } +568 silly mapToRegistry uri https://registry.npmjs.org/glob +569 verbose addNameVersion registry:https://registry.npmjs.org/glob not in flight; fetching +570 verbose get https://registry.npmjs.org/debug not expired, no request +571 verbose get https://registry.npmjs.org/glob not expired, no request +572 http 304 https://registry.npmjs.org/json3 +573 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +573 verbose headers via: '1.1 varnish', +573 verbose headers 'cache-control': 'max-age=300', +573 verbose headers etag: '"5a5f46ca-5e53"', +573 verbose headers age: '4986', +573 verbose headers connection: 'keep-alive', +573 verbose headers 'x-served-by': 'cache-itm18824-ITM', +573 verbose headers 'x-cache': 'HIT', +573 verbose headers 'x-cache-hits': '5', +573 verbose headers 'x-timer': 'S1524740184.916670,VS0,VE0', +573 verbose headers vary: 'Accept-Encoding, Accept' } +574 silly get cb [ 304, +574 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', +574 silly get via: '1.1 varnish', +574 silly get 'cache-control': 'max-age=300', +574 silly get etag: '"5a5f46ca-5e53"', +574 silly get age: '4986', +574 silly get connection: 'keep-alive', +574 silly get 'x-served-by': 'cache-itm18824-ITM', +574 silly get 'x-cache': 'HIT', +574 silly get 'x-cache-hits': '5', +574 silly get 'x-timer': 'S1524740184.916670,VS0,VE0', +574 silly get vary: 'Accept-Encoding, Accept' } ] +575 verbose etag https://registry.npmjs.org/json3 from cache +576 verbose get saving json3 to /Users/zhiyuan/.npm/registry.npmjs.org/json3/.cache.json +577 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +578 verbose afterAdd /Users/zhiyuan/.npm/lodash.create/3.1.1/package/package.json written +579 silly cache afterAdd debug@2.6.0 +580 verbose afterAdd /Users/zhiyuan/.npm/debug/2.6.0/package/package.json not in flight; writing +581 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +582 silly cache afterAdd glob@7.1.1 +583 verbose afterAdd /Users/zhiyuan/.npm/glob/7.1.1/package/package.json not in flight; writing +584 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +585 silly resolveWithNewModule supports-color@3.1.2 checking installable status +586 silly cache add args [ 'supports-color@3.1.2', null ] +587 verbose cache add spec supports-color@3.1.2 +588 silly cache add parsed spec Result { +588 silly cache add raw: 'supports-color@3.1.2', +588 silly cache add scope: null, +588 silly cache add escapedName: 'supports-color', +588 silly cache add name: 'supports-color', +588 silly cache add rawSpec: '3.1.2', +588 silly cache add spec: '3.1.2', +588 silly cache add type: 'version' } +589 silly addNamed supports-color@3.1.2 +590 verbose addNamed "3.1.2" is a plain semver version for supports-color +591 silly mapToRegistry name supports-color +592 silly mapToRegistry using default registry +593 silly mapToRegistry registry https://registry.npmjs.org/ +594 silly mapToRegistry data Result { +594 silly mapToRegistry raw: 'supports-color', +594 silly mapToRegistry scope: null, +594 silly mapToRegistry escapedName: 'supports-color', +594 silly mapToRegistry name: 'supports-color', +594 silly mapToRegistry rawSpec: '', +594 silly mapToRegistry spec: 'latest', +594 silly mapToRegistry type: 'tag' } +595 silly mapToRegistry uri https://registry.npmjs.org/supports-color +596 verbose addNameVersion registry:https://registry.npmjs.org/supports-color not in flight; fetching +597 verbose get https://registry.npmjs.org/supports-color not expired, no request +598 verbose afterAdd /Users/zhiyuan/.npm/glob/7.1.1/package/package.json written +599 verbose afterAdd /Users/zhiyuan/.npm/debug/2.6.0/package/package.json written +600 silly resolveWithNewModule json3@3.3.2 checking installable status +601 silly cache add args [ 'json3@3.3.2', null ] +602 verbose cache add spec json3@3.3.2 +603 silly cache add parsed spec Result { +603 silly cache add raw: 'json3@3.3.2', +603 silly cache add scope: null, +603 silly cache add escapedName: 'json3', +603 silly cache add name: 'json3', +603 silly cache add rawSpec: '3.3.2', +603 silly cache add spec: '3.3.2', +603 silly cache add type: 'version' } +604 silly addNamed json3@3.3.2 +605 verbose addNamed "3.3.2" is a plain semver version for json3 +606 silly mapToRegistry name json3 +607 silly mapToRegistry using default registry +608 silly mapToRegistry registry https://registry.npmjs.org/ +609 silly mapToRegistry data Result { +609 silly mapToRegistry raw: 'json3', +609 silly mapToRegistry scope: null, +609 silly mapToRegistry escapedName: 'json3', +609 silly mapToRegistry name: 'json3', +609 silly mapToRegistry rawSpec: '', +609 silly mapToRegistry spec: 'latest', +609 silly mapToRegistry type: 'tag' } +610 silly mapToRegistry uri https://registry.npmjs.org/json3 +611 verbose addNameVersion registry:https://registry.npmjs.org/json3 not in flight; fetching +612 silly cache afterAdd supports-color@3.1.2 +613 verbose afterAdd /Users/zhiyuan/.npm/supports-color/3.1.2/package/package.json not in flight; writing +614 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +615 verbose get https://registry.npmjs.org/json3 not expired, no request +616 verbose afterAdd /Users/zhiyuan/.npm/supports-color/3.1.2/package/package.json written +617 silly cache afterAdd json3@3.3.2 +618 verbose afterAdd /Users/zhiyuan/.npm/json3/3.3.2/package/package.json not in flight; writing +619 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +620 verbose afterAdd /Users/zhiyuan/.npm/json3/3.3.2/package/package.json written +621 silly fetchNamedPackageData ms +622 silly mapToRegistry name ms +623 silly mapToRegistry using default registry +624 silly mapToRegistry registry https://registry.npmjs.org/ +625 silly mapToRegistry data Result { +625 silly mapToRegistry raw: 'ms', +625 silly mapToRegistry scope: null, +625 silly mapToRegistry escapedName: 'ms', +625 silly mapToRegistry name: 'ms', +625 silly mapToRegistry rawSpec: '', +625 silly mapToRegistry spec: 'latest', +625 silly mapToRegistry type: 'tag' } +626 silly mapToRegistry uri https://registry.npmjs.org/ms +627 verbose request uri https://registry.npmjs.org/ms +628 verbose request no auth needed +629 info attempt registry request try #1 at 18:56:23 +630 verbose etag "5aa9402e-498a" +631 verbose lastModified Wed, 14 Mar 2018 15:30:54 GMT +632 http request GET https://registry.npmjs.org/ms +633 http 304 https://registry.npmjs.org/ms +634 verbose headers { date: 'Thu, 26 Apr 2018 10:56:24 GMT', +634 verbose headers via: '1.1 varnish', +634 verbose headers 'cache-control': 'max-age=300', +634 verbose headers etag: '"5aa9402e-498a"', +634 verbose headers age: '12605', +634 verbose headers connection: 'keep-alive', +634 verbose headers 'x-served-by': 'cache-itm18831-ITM', +634 verbose headers 'x-cache': 'HIT', +634 verbose headers 'x-cache-hits': '61', +634 verbose headers 'x-timer': 'S1524740184.022726,VS0,VE0', +634 verbose headers vary: 'Accept-Encoding, Accept' } +635 silly get cb [ 304, +635 silly get { date: 'Thu, 26 Apr 2018 10:56:24 GMT', +635 silly get via: '1.1 varnish', +635 silly get 'cache-control': 'max-age=300', +635 silly get etag: '"5aa9402e-498a"', +635 silly get age: '12605', +635 silly get connection: 'keep-alive', +635 silly get 'x-served-by': 'cache-itm18831-ITM', +635 silly get 'x-cache': 'HIT', +635 silly get 'x-cache-hits': '61', +635 silly get 'x-timer': 'S1524740184.022726,VS0,VE0', +635 silly get vary: 'Accept-Encoding, Accept' } ] +636 verbose etag https://registry.npmjs.org/ms from cache +637 verbose get saving ms to /Users/zhiyuan/.npm/registry.npmjs.org/ms/.cache.json +638 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +639 silly resolveWithNewModule ms@0.7.2 checking installable status +640 silly cache add args [ 'ms@0.7.2', null ] +641 verbose cache add spec ms@0.7.2 +642 silly cache add parsed spec Result { +642 silly cache add raw: 'ms@0.7.2', +642 silly cache add scope: null, +642 silly cache add escapedName: 'ms', +642 silly cache add name: 'ms', +642 silly cache add rawSpec: '0.7.2', +642 silly cache add spec: '0.7.2', +642 silly cache add type: 'version' } +643 silly addNamed ms@0.7.2 +644 verbose addNamed "0.7.2" is a plain semver version for ms +645 silly mapToRegistry name ms +646 silly mapToRegistry using default registry +647 silly mapToRegistry registry https://registry.npmjs.org/ +648 silly mapToRegistry data Result { +648 silly mapToRegistry raw: 'ms', +648 silly mapToRegistry scope: null, +648 silly mapToRegistry escapedName: 'ms', +648 silly mapToRegistry name: 'ms', +648 silly mapToRegistry rawSpec: '', +648 silly mapToRegistry spec: 'latest', +648 silly mapToRegistry type: 'tag' } +649 silly mapToRegistry uri https://registry.npmjs.org/ms +650 verbose addNameVersion registry:https://registry.npmjs.org/ms not in flight; fetching +651 verbose get https://registry.npmjs.org/ms not expired, no request +652 silly cache afterAdd ms@0.7.2 +653 verbose afterAdd /Users/zhiyuan/.npm/ms/0.7.2/package/package.json not in flight; writing +654 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +655 verbose afterAdd /Users/zhiyuan/.npm/ms/0.7.2/package/package.json written +656 silly fetchNamedPackageData lodash._basecreate +657 silly mapToRegistry name lodash._basecreate +658 silly mapToRegistry using default registry +659 silly mapToRegistry registry https://registry.npmjs.org/ +660 silly mapToRegistry data Result { +660 silly mapToRegistry raw: 'lodash._basecreate', +660 silly mapToRegistry scope: null, +660 silly mapToRegistry escapedName: 'lodash._basecreate', +660 silly mapToRegistry name: 'lodash._basecreate', +660 silly mapToRegistry rawSpec: '', +660 silly mapToRegistry spec: 'latest', +660 silly mapToRegistry type: 'tag' } +661 silly mapToRegistry uri https://registry.npmjs.org/lodash._basecreate +662 verbose request uri https://registry.npmjs.org/lodash._basecreate +663 verbose request no auth needed +664 info attempt registry request try #1 at 18:56:23 +665 verbose etag "57f681c8-329b" +666 verbose lastModified Thu, 6 Oct 2016 16:54:32 GMT +667 http request GET https://registry.npmjs.org/lodash._basecreate +668 http 304 https://registry.npmjs.org/lodash._basecreate +669 verbose headers { date: 'Thu, 26 Apr 2018 10:56:24 GMT', +669 verbose headers via: '1.1 varnish', +669 verbose headers 'cache-control': 'max-age=300', +669 verbose headers etag: '"57f681c8-329b"', +669 verbose headers age: '4090', +669 verbose headers connection: 'keep-alive', +669 verbose headers 'x-served-by': 'cache-itm18829-ITM', +669 verbose headers 'x-cache': 'HIT', +669 verbose headers 'x-cache-hits': '1', +669 verbose headers 'x-timer': 'S1524740184.150124,VS0,VE0', +669 verbose headers vary: 'Accept-Encoding, Accept' } +670 silly get cb [ 304, +670 silly get { date: 'Thu, 26 Apr 2018 10:56:24 GMT', +670 silly get via: '1.1 varnish', +670 silly get 'cache-control': 'max-age=300', +670 silly get etag: '"57f681c8-329b"', +670 silly get age: '4090', +670 silly get connection: 'keep-alive', +670 silly get 'x-served-by': 'cache-itm18829-ITM', +670 silly get 'x-cache': 'HIT', +670 silly get 'x-cache-hits': '1', +670 silly get 'x-timer': 'S1524740184.150124,VS0,VE0', +670 silly get vary: 'Accept-Encoding, Accept' } ] +671 verbose etag https://registry.npmjs.org/lodash._basecreate from cache +672 verbose get saving lodash._basecreate to /Users/zhiyuan/.npm/registry.npmjs.org/lodash._basecreate/.cache.json +673 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +674 silly resolveWithNewModule lodash._basecreate@3.0.3 checking installable status +675 silly cache add args [ 'lodash._basecreate@^3.0.0', null ] +676 verbose cache add spec lodash._basecreate@^3.0.0 +677 silly cache add parsed spec Result { +677 silly cache add raw: 'lodash._basecreate@^3.0.0', +677 silly cache add scope: null, +677 silly cache add escapedName: 'lodash._basecreate', +677 silly cache add name: 'lodash._basecreate', +677 silly cache add rawSpec: '^3.0.0', +677 silly cache add spec: '>=3.0.0 <4.0.0', +677 silly cache add type: 'range' } +678 silly addNamed lodash._basecreate@>=3.0.0 <4.0.0 +679 verbose addNamed ">=3.0.0 <4.0.0" is a valid semver range for lodash._basecreate +680 silly addNameRange { name: 'lodash._basecreate', +680 silly addNameRange range: '>=3.0.0 <4.0.0', +680 silly addNameRange hasData: false } +681 silly mapToRegistry name lodash._basecreate +682 silly mapToRegistry using default registry +683 silly mapToRegistry registry https://registry.npmjs.org/ +684 silly mapToRegistry data Result { +684 silly mapToRegistry raw: 'lodash._basecreate', +684 silly mapToRegistry scope: null, +684 silly mapToRegistry escapedName: 'lodash._basecreate', +684 silly mapToRegistry name: 'lodash._basecreate', +684 silly mapToRegistry rawSpec: '', +684 silly mapToRegistry spec: 'latest', +684 silly mapToRegistry type: 'tag' } +685 silly mapToRegistry uri https://registry.npmjs.org/lodash._basecreate +686 verbose addNameRange registry:https://registry.npmjs.org/lodash._basecreate not in flight; fetching +687 verbose get https://registry.npmjs.org/lodash._basecreate not expired, no request +688 silly addNameRange number 2 { name: 'lodash._basecreate', +688 silly addNameRange range: '>=3.0.0 <4.0.0', +688 silly addNameRange hasData: true } +689 silly addNameRange versions [ 'lodash._basecreate', +689 silly addNameRange [ '2.3.0', '2.4.0', '2.4.1', '3.0.0', '3.0.1', '3.0.2', '3.0.3' ] ] +690 silly addNamed lodash._basecreate@3.0.3 +691 verbose addNamed "3.0.3" is a plain semver version for lodash._basecreate +692 silly cache afterAdd lodash._basecreate@3.0.3 +693 verbose afterAdd /Users/zhiyuan/.npm/lodash._basecreate/3.0.3/package/package.json not in flight; writing +694 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing +695 verbose afterAdd /Users/zhiyuan/.npm/lodash._basecreate/3.0.3/package/package.json written +696 silly fetchNamedPackageData del +697 silly mapToRegistry name del +698 silly mapToRegistry using default registry +699 silly mapToRegistry registry https://registry.npmjs.org/ +700 silly mapToRegistry data Result { +700 silly mapToRegistry raw: 'del', +700 silly mapToRegistry scope: null, +700 silly mapToRegistry escapedName: 'del', +700 silly mapToRegistry name: 'del', +700 silly mapToRegistry rawSpec: '', +700 silly mapToRegistry spec: 'latest', +700 silly mapToRegistry type: 'tag' } +701 silly mapToRegistry uri https://registry.npmjs.org/del +702 verbose stack Error: write EIO +702 verbose stack at _errnoException (util.js:1024:11) +702 verbose stack at WriteWrap.afterWrite [as oncomplete] (net.js:867:14) +703 verbose cwd /Users/zhiyuan/Desktop/www/portalnetwork-project/metamask-extension +704 error Darwin 16.7.0 +705 error argv "/Users/zhiyuan/.nvm/versions/node/v8.9.1/bin/node" "/usr/local/bin/npm" "i" +706 error node v8.9.1 +707 error npm v3.10.10 +708 error code EIO +709 error errno EIO +710 error syscall write +711 error write EIO +712 error If you need help, you may report this error at: +712 error +713 verbose exit [ 1, true ] diff --git a/old-ui/app/app.js b/old-ui/app/app.js index abeb4f3f9..cd6292e79 100644 --- a/old-ui/app/app.js +++ b/old-ui/app/app.js @@ -183,6 +183,14 @@ App.prototype.renderAppBar = function () { this.setState({ isNetworkMenuOpen: !isNetworkMenuOpen }) }, }), + + // mike test img + h('img', { + height: 24, + width: 24, + src: './images/pw-48x48.png', + }), + ]), props.isUnlocked && h('div', { diff --git a/package.json b/package.json index 372ffbfa5..910544f60 100644 --- a/package.json +++ b/package.json @@ -191,7 +191,9 @@ "web3": "^0.20.1", "web3-provider-engine": "^14.0.5", "web3-stream-provider": "^3.0.1", - "xtend": "^4.0.1" + "xtend": "^4.0.1", + "multihashes": "^0.4.12", + "eth-ens-namehash": "^2.0.8" }, "devDependencies": { "@sentry/cli": "^1.30.3", From 88a6b4edc79a27e9d94dc4ec25e9de02153abc5d Mon Sep 17 00:00:00 2001 From: MikeCheng1208 Date: Mon, 7 May 2018 18:19:17 +0800 Subject: [PATCH 02/64] setTimeout bug fix --- app/scripts/lib/portalnetwork.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/scripts/lib/portalnetwork.js b/app/scripts/lib/portalnetwork.js index 5ff4f5ecf..960871ebc 100644 --- a/app/scripts/lib/portalnetwork.js +++ b/app/scripts/lib/portalnetwork.js @@ -3,16 +3,18 @@ const resolver = require('./resolver.js'); module.exports = function (provider) { extension.webRequest.onBeforeRequest.addListener(details => { let name = details.url.substring(7, details.url.length - 1); + let clearTime = null; extension.tabs.getSelected(null, tab => { extension.tabs.update(tab.id, { url: "loading.html" }); - setTimeout(() => { + clearTime = setTimeout(() => { return extension.tabs.update(tab.id, { url: "404.html" }); }, 60000); resolver.resolve(name, provider).then(ipfsHash => { + clearTimeout(clearTime); let url = "https://gateway.ipfs.io/ipfs/" + ipfsHash; - return fetch(url, {method: "HEAD"}).then(response => response.status).then(statusCode => { + return fetch(url, { method: "HEAD" }).then(response => response.status).then(statusCode => { if (statusCode !== 200) return "Local" extension.tabs.update(tab.id, { url: url }) }) @@ -23,6 +25,7 @@ module.exports = function (provider) { }) }) .catch(err => { + clearTimeout(clearTime); let nameWithoutTld = name.substring(0, name.lastIndexOf('.')) let url = err === "no_mainnet" ? "no_mainnet" : "error" extension.tabs.update(tab.id, {url: `${url}.html?name=${name}`}) From 8b8cc94f6f8cb949ee214e814d9d8949d17ddd16 Mon Sep 17 00:00:00 2001 From: MikeCheng1208 Date: Fri, 4 May 2018 19:57:19 +0800 Subject: [PATCH 03/64] Intergrate ENS with IPFS --- app/manifest.json | 4 ++++ app/scripts/lib/portalnetwork.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/manifest.json b/app/manifest.json index 0f5a2566f..ad500e40a 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -74,4 +74,8 @@ ] }, "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" +<<<<<<< HEAD } +======= +} +>>>>>>> Intergrate ENS with IPFS diff --git a/app/scripts/lib/portalnetwork.js b/app/scripts/lib/portalnetwork.js index 960871ebc..977f17926 100644 --- a/app/scripts/lib/portalnetwork.js +++ b/app/scripts/lib/portalnetwork.js @@ -33,4 +33,4 @@ module.exports = function (provider) { }) return { cancel: true } }, {urls: ["*://*.eth/"]}) -} \ No newline at end of file +} From 86ead431c3e07eff3ff9deae42ab0994ca998229 Mon Sep 17 00:00:00 2001 From: Yung chieh Tsai Date: Thu, 24 May 2018 22:37:41 +0700 Subject: [PATCH 04/64] Update manifest.json --- app/manifest.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/manifest.json b/app/manifest.json index ad500e40a..0f5a2566f 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -74,8 +74,4 @@ ] }, "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" -<<<<<<< HEAD } -======= -} ->>>>>>> Intergrate ENS with IPFS From 829deacb57a23ec8027269c93cdef3f3735d1710 Mon Sep 17 00:00:00 2001 From: Yung chieh Tsai Date: Thu, 24 May 2018 23:08:02 +0700 Subject: [PATCH 05/64] Rename files --- app/404.html | 2 +- app/error.html | 2 +- app/loading.html | 2 +- app/no_mainnet.html | 59 - app/scripts/background.js | 8 +- app/scripts/lib/ipfsContent.js | 36 + app/scripts/lib/portalnetwork.js | 36 - app/scripts/lib/resolver.js | 37 +- app/unsupport.html | 59 + npm-debug.log.2168057278 | 1790 ------------------------------ 10 files changed, 119 insertions(+), 1912 deletions(-) delete mode 100644 app/no_mainnet.html create mode 100644 app/scripts/lib/ipfsContent.js delete mode 100644 app/scripts/lib/portalnetwork.js create mode 100644 app/unsupport.html delete mode 100644 npm-debug.log.2168057278 diff --git a/app/404.html b/app/404.html index 2fbf1e311..0dbab69a7 100644 --- a/app/404.html +++ b/app/404.html @@ -1,6 +1,6 @@ - 404 + MetaMask - -
- -

ENS resolver only support on Ethereum mainnet

-
- - \ No newline at end of file diff --git a/app/scripts/background.js b/app/scripts/background.js index fc2ad5773..672a2dcac 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -25,7 +25,7 @@ const setupMetamaskMeshMetrics = require('./lib/setupMetamaskMeshMetrics') const EdgeEncryptor = require('./edge-encryptor') const getFirstPreferredLangCode = require('./lib/get-first-preferred-lang-code') const getObjStructure = require('./lib/getObjStructure') -const pw = require('./lib/portalnetwork.js') +const ipfsContent = require('./lib/ipfsContent.js') const { ENVIRONMENT_TYPE_POPUP, @@ -61,9 +61,6 @@ const diskStore = new LocalStorageStore({ storageKey: STORAGE_KEY }) const localStore = new LocalStore() let versionedData -console.log('localStore', localStore); -console.log('diskStore', diskStore); - // initialization flow initialize().catch(log.error) @@ -161,8 +158,7 @@ async function initialize () { const initLangCode = await getFirstPreferredLangCode() await setupController(initState, initLangCode) log.debug('MetaMask initialization complete.') - // porto network init - pw(initState.NetworkController.provider); + ipfsContent(initState.NetworkController.provider) } // diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js new file mode 100644 index 000000000..4d66745e9 --- /dev/null +++ b/app/scripts/lib/ipfsContent.js @@ -0,0 +1,36 @@ +const extension = require('extensionizer') +const resolver = require('./resolver.js') + +module.exports = function (provider) { + extension.webRequest.onBeforeRequest.addListener(details => { + const name = details.url.substring(7, details.url.length - 1) + let clearTime = null + extension.tabs.getSelected(null, tab => { + extension.tabs.update(tab.id, { url: 'loading.html' }) + + clearTime = setTimeout(() => { + return extension.tabs.update(tab.id, { url: '404.html' }) + }, 60000) + + resolver.resolve(name, provider).then(ipfsHash => { + clearTimeout(clearTime) + let url = 'https://gateway.ipfs.io/ipfs/' + ipfsHash + return fetch(url, { method: 'HEAD' }).then(response => response.status).then(statusCode => { + if (statusCode !== 200) return 'Local' + extension.tabs.update(tab.id, { url: url }) + }) + .catch(err => { + url = 'https://gateway.ipfs.io/ipfs/' + ipfsHash + extension.tabs.update(tab.id, {url: url}) + return err + }) + }) + .catch(err => { + clearTimeout(clearTime) + const url = err === 'unsupport' ? 'unsupport' : 'error' + extension.tabs.update(tab.id, {url: `${url}.html?name=${name}`}) + }) + }) + return { cancel: true } + }, {urls: ['*://*.eth/']}) +} diff --git a/app/scripts/lib/portalnetwork.js b/app/scripts/lib/portalnetwork.js deleted file mode 100644 index 977f17926..000000000 --- a/app/scripts/lib/portalnetwork.js +++ /dev/null @@ -1,36 +0,0 @@ -const extension = require('extensionizer') -const resolver = require('./resolver.js'); -module.exports = function (provider) { - extension.webRequest.onBeforeRequest.addListener(details => { - let name = details.url.substring(7, details.url.length - 1); - let clearTime = null; - extension.tabs.getSelected(null, tab => { - extension.tabs.update(tab.id, { url: "loading.html" }); - - clearTime = setTimeout(() => { - return extension.tabs.update(tab.id, { url: "404.html" }); - }, 60000); - - resolver.resolve(name, provider).then(ipfsHash => { - clearTimeout(clearTime); - let url = "https://gateway.ipfs.io/ipfs/" + ipfsHash; - return fetch(url, { method: "HEAD" }).then(response => response.status).then(statusCode => { - if (statusCode !== 200) return "Local" - extension.tabs.update(tab.id, { url: url }) - }) - .catch(err => { - url = "https://gateway.ipfs.io/ipfs/" + ipfsHash - extension.tabs.update(tab.id, {url: url}) - return err - }) - }) - .catch(err => { - clearTimeout(clearTime); - let nameWithoutTld = name.substring(0, name.lastIndexOf('.')) - let url = err === "no_mainnet" ? "no_mainnet" : "error" - extension.tabs.update(tab.id, {url: `${url}.html?name=${name}`}) - }) - }) - return { cancel: true } - }, {urls: ["*://*.eth/"]}) -} diff --git a/app/scripts/lib/resolver.js b/app/scripts/lib/resolver.js index 43ccec0cc..dec43c481 100644 --- a/app/scripts/lib/resolver.js +++ b/app/scripts/lib/resolver.js @@ -1,43 +1,44 @@ const namehash = require('eth-ens-namehash') const multihash = require('multihashes') -const REGISTRAR_ENS_MAIN_NET = "0x314159265dd8dbb310642f98f50c066173c1259b" +const REGISTRAR_ENS_MAIN_NET = '0x314159265dd8dbb310642f98f50c066173c1259b' const HttpProvider = require('ethjs-provider-http') const Eth = require('ethjs-query') const EthContract = require('ethjs-contract') const registrarAbi = require('./contracts/registrar') const resolverAbi = require('./contracts/resolver') -function ens(name, provider) { - // provider need mainnet - let eth = new Eth(new HttpProvider(provider.rpcTarget)) - let hash = namehash.hash(name) - let contract = new EthContract(eth) - let Registrar = contract(registrarAbi).at(REGISTRAR_ENS_MAIN_NET) + +function ens (name, provider) { + const eth = new Eth(new HttpProvider(provider.rpcTarget)) + const hash = namehash.hash(name) + const contract = new EthContract(eth) + const Registrar = contract(registrarAbi).at(REGISTRAR_ENS_MAIN_NET) return new Promise((resolve, reject) => { - if (provider.type !== "mainnet") reject('no_mainnet') + if (provider.type !== 'mainnet') reject('unsupport') Registrar.resolver(hash).then((address) => { if (address === '0x0000000000000000000000000000000000000000') { reject(null) } else { - let Resolver = contract(resolverAbi).at(address["0"]) + const Resolver = contract(resolverAbi).at(address['0']) return Resolver.content(hash) } }).then((contentHash) => { - if (contentHash["0"] === '0x0000000000000000000000000000000000000000000000000000000000000000') reject(null) - if (contentHash.ret !== "0x") { - let hex = contentHash["0"].substring(2) - let buf = multihash.fromHexString(hex) - resolve(multihash.toB58String(multihash.encode(buf, 'sha2-256'))) + if (contentHash['0'] === '0x0000000000000000000000000000000000000000000000000000000000000000') reject(null) + if (contentHash.ret !== '0x') { + const hex = contentHash['0'].substring(2) + const buf = multihash.fromHexString(hex) + resolve(multihash.toB58String(buf)) } else { - reject('fisk') + reject(null) } }) }) } + module.exports.resolve = function (name, provider) { - let path = name.split("."); - let tld = path[path.length - 1]; + const path = name.split('.') + const tld = path[path.length - 1] if (tld === 'eth') { - return ens(name, provider); + return ens(name, provider) } else { return new Promise((resolve, reject) => { reject(null) diff --git a/app/unsupport.html b/app/unsupport.html new file mode 100644 index 000000000..6f514eb17 --- /dev/null +++ b/app/unsupport.html @@ -0,0 +1,59 @@ + + + + + MetaMask + + + +
+ +

ENS resolver only support on Ethereum mainnet

+
+ + \ No newline at end of file diff --git a/npm-debug.log.2168057278 b/npm-debug.log.2168057278 deleted file mode 100644 index 1fe88a200..000000000 --- a/npm-debug.log.2168057278 +++ /dev/null @@ -1,1790 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ '/Users/zhiyuan/.nvm/versions/node/v8.9.1/bin/node', -1 verbose cli '/usr/local/bin/npm', -1 verbose cli 'i' ] -2 info using npm@3.10.10 -3 info using node@v8.9.1 -4 silly loadCurrentTree Starting -5 silly install loadCurrentTree -6 silly install readLocalPackageData -7 silly install normalizeTree -8 silly loadCurrentTree Finishing -9 silly loadIdealTree Starting -10 silly install loadIdealTree -11 silly cloneCurrentTree Starting -12 silly install cloneCurrentTreeToIdealTree -13 silly cloneCurrentTree Finishing -14 silly loadShrinkwrap Starting -15 silly install loadShrinkwrap -16 silly loadShrinkwrap Finishing -17 silly loadAllDepsIntoIdealTree Starting -18 silly install loadAllDepsIntoIdealTree -19 silly fetchNamedPackageData web3 -20 silly mapToRegistry name web3 -21 silly mapToRegistry using default registry -22 silly mapToRegistry registry https://registry.npmjs.org/ -23 silly mapToRegistry data Result { -23 silly mapToRegistry raw: 'web3', -23 silly mapToRegistry scope: null, -23 silly mapToRegistry escapedName: 'web3', -23 silly mapToRegistry name: 'web3', -23 silly mapToRegistry rawSpec: '', -23 silly mapToRegistry spec: 'latest', -23 silly mapToRegistry type: 'tag' } -24 silly mapToRegistry uri https://registry.npmjs.org/web3 -25 verbose request uri https://registry.npmjs.org/web3 -26 verbose request no auth needed -27 info attempt registry request try #1 at 18:56:16 -28 verbose request id fa232f2c52d33dca -29 verbose etag "5ad0c548-2f408" -30 verbose lastModified Fri, 13 Apr 2018 14:57:12 GMT -31 http request GET https://registry.npmjs.org/web3 -32 http 304 https://registry.npmjs.org/web3 -33 verbose headers { date: 'Thu, 26 Apr 2018 10:56:17 GMT', -33 verbose headers via: '1.1 varnish', -33 verbose headers 'cache-control': 'max-age=300', -33 verbose headers etag: '"5ad0c548-2f408"', -33 verbose headers age: '0', -33 verbose headers connection: 'keep-alive', -33 verbose headers 'x-served-by': 'cache-itm18829-ITM', -33 verbose headers 'x-cache': 'MISS', -33 verbose headers 'x-cache-hits': '0', -33 verbose headers 'x-timer': 'S1524740177.293484,VS0,VE282', -33 verbose headers vary: 'Accept-Encoding, Accept' } -34 silly get cb [ 304, -34 silly get { date: 'Thu, 26 Apr 2018 10:56:17 GMT', -34 silly get via: '1.1 varnish', -34 silly get 'cache-control': 'max-age=300', -34 silly get etag: '"5ad0c548-2f408"', -34 silly get age: '0', -34 silly get connection: 'keep-alive', -34 silly get 'x-served-by': 'cache-itm18829-ITM', -34 silly get 'x-cache': 'MISS', -34 silly get 'x-cache-hits': '0', -34 silly get 'x-timer': 'S1524740177.293484,VS0,VE282', -34 silly get vary: 'Accept-Encoding, Accept' } ] -35 verbose etag https://registry.npmjs.org/web3 from cache -36 verbose get saving web3 to /Users/zhiyuan/.npm/registry.npmjs.org/web3/.cache.json -37 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -38 silly resolveWithNewModule web3@1.0.0-beta.34 checking installable status -39 silly cache add args [ 'web3@^1.0.0-beta.26', null ] -40 verbose cache add spec web3@^1.0.0-beta.26 -41 silly cache add parsed spec Result { -41 silly cache add raw: 'web3@^1.0.0-beta.26', -41 silly cache add scope: null, -41 silly cache add escapedName: 'web3', -41 silly cache add name: 'web3', -41 silly cache add rawSpec: '^1.0.0-beta.26', -41 silly cache add spec: '>=1.0.0-beta.26 <2.0.0', -41 silly cache add type: 'range' } -42 silly addNamed web3@>=1.0.0-beta.26 <2.0.0 -43 verbose addNamed ">=1.0.0-beta.26 <2.0.0" is a valid semver range for web3 -44 silly addNameRange { name: 'web3', range: '>=1.0.0-beta.26 <2.0.0', hasData: false } -45 silly mapToRegistry name web3 -46 silly mapToRegistry using default registry -47 silly mapToRegistry registry https://registry.npmjs.org/ -48 silly mapToRegistry data Result { -48 silly mapToRegistry raw: 'web3', -48 silly mapToRegistry scope: null, -48 silly mapToRegistry escapedName: 'web3', -48 silly mapToRegistry name: 'web3', -48 silly mapToRegistry rawSpec: '', -48 silly mapToRegistry spec: 'latest', -48 silly mapToRegistry type: 'tag' } -49 silly mapToRegistry uri https://registry.npmjs.org/web3 -50 verbose addNameRange registry:https://registry.npmjs.org/web3 not in flight; fetching -51 verbose get https://registry.npmjs.org/web3 not expired, no request -52 silly addNameRange number 2 { name: 'web3', range: '>=1.0.0-beta.26 <2.0.0', hasData: true } -53 silly addNameRange versions [ 'web3', -53 silly addNameRange [ '0.2.5', -53 silly addNameRange '0.2.6', -53 silly addNameRange '0.2.7', -53 silly addNameRange '0.2.8', -53 silly addNameRange '0.3.0', -53 silly addNameRange '0.3.1', -53 silly addNameRange '0.3.2', -53 silly addNameRange '0.3.3', -53 silly addNameRange '0.3.4', -53 silly addNameRange '0.3.6', -53 silly addNameRange '0.4.0', -53 silly addNameRange '0.4.1', -53 silly addNameRange '0.4.2', -53 silly addNameRange '0.4.3', -53 silly addNameRange '0.5.0', -53 silly addNameRange '0.6.0', -53 silly addNameRange '0.7.0', -53 silly addNameRange '0.7.1', -53 silly addNameRange '0.8.0', -53 silly addNameRange '0.8.1', -53 silly addNameRange '0.9.0', -53 silly addNameRange '0.9.1', -53 silly addNameRange '0.9.2', -53 silly addNameRange '0.10.0', -53 silly addNameRange '0.11.0', -53 silly addNameRange '0.12.0', -53 silly addNameRange '0.12.1', -53 silly addNameRange '0.12.2', -53 silly addNameRange '0.13.0', -53 silly addNameRange '0.14.0', -53 silly addNameRange '0.14.1', -53 silly addNameRange '0.15.0', -53 silly addNameRange '0.15.1', -53 silly addNameRange '0.15.2', -53 silly addNameRange '0.15.3', -53 silly addNameRange '0.16.0', -53 silly addNameRange '0.17.0-alpha', -53 silly addNameRange '0.17.0-beta', -53 silly addNameRange '0.18.0', -53 silly addNameRange '0.18.1', -53 silly addNameRange '0.18.2', -53 silly addNameRange '0.18.4', -53 silly addNameRange '0.19.0', -53 silly addNameRange '0.19.1', -53 silly addNameRange '0.20.0', -53 silly addNameRange '0.20.1', -53 silly addNameRange '1.0.0-beta1', -53 silly addNameRange '1.0.0-beta2', -53 silly addNameRange '1.0.0-beta.1', -53 silly addNameRange '1.0.0-beta.2', -53 silly addNameRange '1.0.0-beta.3', -53 silly addNameRange '1.0.0-beta.4', -53 silly addNameRange '1.0.0-beta.5', -53 silly addNameRange '1.0.0-beta.6', -53 silly addNameRange '1.0.0-beta.7', -53 silly addNameRange '1.0.0-beta.9', -53 silly addNameRange '1.0.0-beta.10', -53 silly addNameRange '1.0.0-beta.11', -53 silly addNameRange '1.0.0-beta.12', -53 silly addNameRange '1.0.0-beta.13', -53 silly addNameRange '1.0.0-beta.14', -53 silly addNameRange '1.0.0-beta.15', -53 silly addNameRange '1.0.0-beta.16', -53 silly addNameRange '1.0.0-beta.17', -53 silly addNameRange '1.0.0-beta.18', -53 silly addNameRange '0.20.2', -53 silly addNameRange '1.0.0-beta.19', -53 silly addNameRange '1.0.0-beta.20', -53 silly addNameRange '1.0.0-beta.21', -53 silly addNameRange '1.0.0-beta.22', -53 silly addNameRange '1.0.0-beta.23', -53 silly addNameRange '1.0.0-beta.24', -53 silly addNameRange '1.0.0-beta.25', -53 silly addNameRange '1.0.0-beta.26', -53 silly addNameRange '0.20.3', -53 silly addNameRange '1.0.0-beta.27', -53 silly addNameRange '1.0.0-beta.28', -53 silly addNameRange '0.20.4', -53 silly addNameRange '1.0.0-beta.29', -53 silly addNameRange '0.20.5', -53 silly addNameRange '1.0.0-beta.30', -53 silly addNameRange '1.0.0-beta.31', -53 silly addNameRange '0.20.6', -53 silly addNameRange '1.0.0-beta.32', -53 silly addNameRange '1.0.0-beta.33', -53 silly addNameRange '1.0.0-beta.34' ] ] -54 silly addNamed web3@1.0.0-beta.34 -55 verbose addNamed "1.0.0-beta.34" is a plain semver version for web3 -56 silly cache afterAdd web3@1.0.0-beta.34 -57 verbose afterAdd /Users/zhiyuan/.npm/web3/1.0.0-beta.34/package/package.json not in flight; writing -58 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -59 verbose afterAdd /Users/zhiyuan/.npm/web3/1.0.0-beta.34/package/package.json written -60 silly fetchNamedPackageData chai -61 silly mapToRegistry name chai -62 silly mapToRegistry using default registry -63 silly mapToRegistry registry https://registry.npmjs.org/ -64 silly mapToRegistry data Result { -64 silly mapToRegistry raw: 'chai', -64 silly mapToRegistry scope: null, -64 silly mapToRegistry escapedName: 'chai', -64 silly mapToRegistry name: 'chai', -64 silly mapToRegistry rawSpec: '', -64 silly mapToRegistry spec: 'latest', -64 silly mapToRegistry type: 'tag' } -65 silly mapToRegistry uri https://registry.npmjs.org/chai -66 verbose request uri https://registry.npmjs.org/chai -67 verbose request no auth needed -68 info attempt registry request try #1 at 18:56:17 -69 verbose etag "5ab1b9cc-1a27c" -70 verbose lastModified Wed, 21 Mar 2018 1:47:56 GMT -71 http request GET https://registry.npmjs.org/chai -72 http 304 https://registry.npmjs.org/chai -73 verbose headers { date: 'Thu, 26 Apr 2018 10:56:17 GMT', -73 verbose headers via: '1.1 varnish', -73 verbose headers 'cache-control': 'max-age=300', -73 verbose headers etag: '"5ab1b9cc-1a27c"', -73 verbose headers age: '8579', -73 verbose headers connection: 'keep-alive', -73 verbose headers 'x-served-by': 'cache-itm18829-ITM', -73 verbose headers 'x-cache': 'HIT', -73 verbose headers 'x-cache-hits': '28', -73 verbose headers 'x-timer': 'S1524740178.704226,VS0,VE0', -73 verbose headers vary: 'Accept-Encoding, Accept' } -74 silly get cb [ 304, -74 silly get { date: 'Thu, 26 Apr 2018 10:56:17 GMT', -74 silly get via: '1.1 varnish', -74 silly get 'cache-control': 'max-age=300', -74 silly get etag: '"5ab1b9cc-1a27c"', -74 silly get age: '8579', -74 silly get connection: 'keep-alive', -74 silly get 'x-served-by': 'cache-itm18829-ITM', -74 silly get 'x-cache': 'HIT', -74 silly get 'x-cache-hits': '28', -74 silly get 'x-timer': 'S1524740178.704226,VS0,VE0', -74 silly get vary: 'Accept-Encoding, Accept' } ] -75 verbose etag https://registry.npmjs.org/chai from cache -76 verbose get saving chai to /Users/zhiyuan/.npm/registry.npmjs.org/chai/.cache.json -77 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -78 silly resolveWithNewModule chai@3.5.0 checking installable status -79 silly cache add args [ 'chai@^3.5.0', null ] -80 verbose cache add spec chai@^3.5.0 -81 silly cache add parsed spec Result { -81 silly cache add raw: 'chai@^3.5.0', -81 silly cache add scope: null, -81 silly cache add escapedName: 'chai', -81 silly cache add name: 'chai', -81 silly cache add rawSpec: '^3.5.0', -81 silly cache add spec: '>=3.5.0 <4.0.0', -81 silly cache add type: 'range' } -82 silly addNamed chai@>=3.5.0 <4.0.0 -83 verbose addNamed ">=3.5.0 <4.0.0" is a valid semver range for chai -84 silly addNameRange { name: 'chai', range: '>=3.5.0 <4.0.0', hasData: false } -85 silly mapToRegistry name chai -86 silly mapToRegistry using default registry -87 silly mapToRegistry registry https://registry.npmjs.org/ -88 silly mapToRegistry data Result { -88 silly mapToRegistry raw: 'chai', -88 silly mapToRegistry scope: null, -88 silly mapToRegistry escapedName: 'chai', -88 silly mapToRegistry name: 'chai', -88 silly mapToRegistry rawSpec: '', -88 silly mapToRegistry spec: 'latest', -88 silly mapToRegistry type: 'tag' } -89 silly mapToRegistry uri https://registry.npmjs.org/chai -90 verbose addNameRange registry:https://registry.npmjs.org/chai not in flight; fetching -91 verbose get https://registry.npmjs.org/chai not expired, no request -92 silly addNameRange number 2 { name: 'chai', range: '>=3.5.0 <4.0.0', hasData: true } -93 silly addNameRange versions [ 'chai', -93 silly addNameRange [ '0.0.1', -93 silly addNameRange '0.0.2', -93 silly addNameRange '0.1.0', -93 silly addNameRange '0.1.1', -93 silly addNameRange '0.1.2', -93 silly addNameRange '0.1.3', -93 silly addNameRange '0.1.4', -93 silly addNameRange '0.1.5', -93 silly addNameRange '0.1.6', -93 silly addNameRange '0.1.7', -93 silly addNameRange '0.2.0', -93 silly addNameRange '0.2.1', -93 silly addNameRange '0.2.2', -93 silly addNameRange '0.2.3', -93 silly addNameRange '0.2.4', -93 silly addNameRange '0.3.0', -93 silly addNameRange '0.3.1', -93 silly addNameRange '0.3.2', -93 silly addNameRange '0.3.3', -93 silly addNameRange '0.3.4', -93 silly addNameRange '0.4.0', -93 silly addNameRange '0.4.1', -93 silly addNameRange '0.4.2', -93 silly addNameRange '0.5.0', -93 silly addNameRange '0.5.1', -93 silly addNameRange '0.5.2', -93 silly addNameRange '0.5.3', -93 silly addNameRange '1.0.0', -93 silly addNameRange '1.0.1', -93 silly addNameRange '1.0.2', -93 silly addNameRange '1.0.3', -93 silly addNameRange '1.0.4', -93 silly addNameRange '1.1.0', -93 silly addNameRange '1.1.1', -93 silly addNameRange '1.2.0', -93 silly addNameRange '1.3.0', -93 silly addNameRange '1.4.0', -93 silly addNameRange '1.4.1', -93 silly addNameRange '1.4.2', -93 silly addNameRange '1.5.0', -93 silly addNameRange '1.6.0', -93 silly addNameRange '1.6.1', -93 silly addNameRange '1.7.0', -93 silly addNameRange '1.7.1', -93 silly addNameRange '1.7.2', -93 silly addNameRange '1.8.0', -93 silly addNameRange '1.8.1', -93 silly addNameRange '1.9.0', -93 silly addNameRange '1.9.1', -93 silly addNameRange '1.9.2', -93 silly addNameRange '1.10.0', -93 silly addNameRange '2.0.0', -93 silly addNameRange '2.1.0', -93 silly addNameRange '2.1.1', -93 silly addNameRange '2.1.2', -93 silly addNameRange '2.2.0', -93 silly addNameRange '2.3.0', -93 silly addNameRange '3.0.0', -93 silly addNameRange '3.1.0', -93 silly addNameRange '3.2.0', -93 silly addNameRange '3.3.0', -93 silly addNameRange '3.4.0', -93 silly addNameRange '3.4.1', -93 silly addNameRange '3.5.0', -93 silly addNameRange '4.0.0-canary.1', -93 silly addNameRange '4.0.0-canary.2', -93 silly addNameRange '4.0.0', -93 silly addNameRange '4.0.1', -93 silly addNameRange '4.0.2', -93 silly addNameRange '4.1.0', -93 silly addNameRange '4.1.1', -93 silly addNameRange '4.1.2' ] ] -94 silly addNamed chai@3.5.0 -95 verbose addNamed "3.5.0" is a plain semver version for chai -96 silly cache afterAdd chai@3.5.0 -97 verbose afterAdd /Users/zhiyuan/.npm/chai/3.5.0/package/package.json not in flight; writing -98 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -99 verbose afterAdd /Users/zhiyuan/.npm/chai/3.5.0/package/package.json written -100 silly fetchNamedPackageData deep-eql -101 silly mapToRegistry name deep-eql -102 silly mapToRegistry using default registry -103 silly mapToRegistry registry https://registry.npmjs.org/ -104 silly mapToRegistry data Result { -104 silly mapToRegistry raw: 'deep-eql', -104 silly mapToRegistry scope: null, -104 silly mapToRegistry escapedName: 'deep-eql', -104 silly mapToRegistry name: 'deep-eql', -104 silly mapToRegistry rawSpec: '', -104 silly mapToRegistry spec: 'latest', -104 silly mapToRegistry type: 'tag' } -105 silly mapToRegistry uri https://registry.npmjs.org/deep-eql -106 silly fetchNamedPackageData type-detect -107 silly mapToRegistry name type-detect -108 silly mapToRegistry using default registry -109 silly mapToRegistry registry https://registry.npmjs.org/ -110 silly mapToRegistry data Result { -110 silly mapToRegistry raw: 'type-detect', -110 silly mapToRegistry scope: null, -110 silly mapToRegistry escapedName: 'type-detect', -110 silly mapToRegistry name: 'type-detect', -110 silly mapToRegistry rawSpec: '', -110 silly mapToRegistry spec: 'latest', -110 silly mapToRegistry type: 'tag' } -111 silly mapToRegistry uri https://registry.npmjs.org/type-detect -112 verbose request uri https://registry.npmjs.org/deep-eql -113 verbose request no auth needed -114 info attempt registry request try #1 at 18:56:18 -115 verbose etag "5aaf3dfa-8ad2" -116 verbose lastModified Mon, 19 Mar 2018 4:35:06 GMT -117 http request GET https://registry.npmjs.org/deep-eql -118 verbose request uri https://registry.npmjs.org/type-detect -119 verbose request no auth needed -120 info attempt registry request try #1 at 18:56:18 -121 verbose etag "5aa7fe02-c438" -122 verbose lastModified Tue, 13 Mar 2018 16:36:18 GMT -123 http request GET https://registry.npmjs.org/type-detect -124 http 304 https://registry.npmjs.org/deep-eql -125 verbose headers { date: 'Thu, 26 Apr 2018 10:56:18 GMT', -125 verbose headers via: '1.1 varnish', -125 verbose headers 'cache-control': 'max-age=300', -125 verbose headers etag: '"5aaf3dfa-8ad2"', -125 verbose headers age: '3926', -125 verbose headers connection: 'keep-alive', -125 verbose headers 'x-served-by': 'cache-itm18829-ITM', -125 verbose headers 'x-cache': 'HIT', -125 verbose headers 'x-cache-hits': '1', -125 verbose headers 'x-timer': 'S1524740179.691568,VS0,VE1', -125 verbose headers vary: 'Accept-Encoding, Accept' } -126 silly get cb [ 304, -126 silly get { date: 'Thu, 26 Apr 2018 10:56:18 GMT', -126 silly get via: '1.1 varnish', -126 silly get 'cache-control': 'max-age=300', -126 silly get etag: '"5aaf3dfa-8ad2"', -126 silly get age: '3926', -126 silly get connection: 'keep-alive', -126 silly get 'x-served-by': 'cache-itm18829-ITM', -126 silly get 'x-cache': 'HIT', -126 silly get 'x-cache-hits': '1', -126 silly get 'x-timer': 'S1524740179.691568,VS0,VE1', -126 silly get vary: 'Accept-Encoding, Accept' } ] -127 verbose etag https://registry.npmjs.org/deep-eql from cache -128 verbose get saving deep-eql to /Users/zhiyuan/.npm/registry.npmjs.org/deep-eql/.cache.json -129 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -130 silly resolveWithNewModule deep-eql@0.1.3 checking installable status -131 silly cache add args [ 'deep-eql@^0.1.3', null ] -132 verbose cache add spec deep-eql@^0.1.3 -133 silly cache add parsed spec Result { -133 silly cache add raw: 'deep-eql@^0.1.3', -133 silly cache add scope: null, -133 silly cache add escapedName: 'deep-eql', -133 silly cache add name: 'deep-eql', -133 silly cache add rawSpec: '^0.1.3', -133 silly cache add spec: '>=0.1.3 <0.2.0', -133 silly cache add type: 'range' } -134 silly addNamed deep-eql@>=0.1.3 <0.2.0 -135 verbose addNamed ">=0.1.3 <0.2.0" is a valid semver range for deep-eql -136 silly addNameRange { name: 'deep-eql', range: '>=0.1.3 <0.2.0', hasData: false } -137 silly mapToRegistry name deep-eql -138 silly mapToRegistry using default registry -139 silly mapToRegistry registry https://registry.npmjs.org/ -140 silly mapToRegistry data Result { -140 silly mapToRegistry raw: 'deep-eql', -140 silly mapToRegistry scope: null, -140 silly mapToRegistry escapedName: 'deep-eql', -140 silly mapToRegistry name: 'deep-eql', -140 silly mapToRegistry rawSpec: '', -140 silly mapToRegistry spec: 'latest', -140 silly mapToRegistry type: 'tag' } -141 silly mapToRegistry uri https://registry.npmjs.org/deep-eql -142 verbose addNameRange registry:https://registry.npmjs.org/deep-eql not in flight; fetching -143 verbose get https://registry.npmjs.org/deep-eql not expired, no request -144 silly addNameRange number 2 { name: 'deep-eql', range: '>=0.1.3 <0.2.0', hasData: true } -145 silly addNameRange versions [ 'deep-eql', -145 silly addNameRange [ '0.1.0', -145 silly addNameRange '0.1.1', -145 silly addNameRange '0.1.2', -145 silly addNameRange '0.1.3', -145 silly addNameRange '1.0.0', -145 silly addNameRange '1.0.1', -145 silly addNameRange '1.0.2', -145 silly addNameRange '1.0.3', -145 silly addNameRange '2.0.0', -145 silly addNameRange '2.0.1', -145 silly addNameRange '2.0.2', -145 silly addNameRange '3.0.0', -145 silly addNameRange '3.0.1' ] ] -146 silly addNamed deep-eql@0.1.3 -147 verbose addNamed "0.1.3" is a plain semver version for deep-eql -148 silly cache afterAdd deep-eql@0.1.3 -149 verbose afterAdd /Users/zhiyuan/.npm/deep-eql/0.1.3/package/package.json not in flight; writing -150 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -151 verbose afterAdd /Users/zhiyuan/.npm/deep-eql/0.1.3/package/package.json written -152 http 304 https://registry.npmjs.org/type-detect -153 verbose headers { date: 'Thu, 26 Apr 2018 10:56:18 GMT', -153 verbose headers via: '1.1 varnish', -153 verbose headers 'cache-control': 'max-age=300', -153 verbose headers etag: '"5aa7fe02-c438"', -153 verbose headers age: '9570', -153 verbose headers connection: 'keep-alive', -153 verbose headers 'x-served-by': 'cache-itm18831-ITM', -153 verbose headers 'x-cache': 'HIT', -153 verbose headers 'x-cache-hits': '8', -153 verbose headers 'x-timer': 'S1524740179.771934,VS0,VE0', -153 verbose headers vary: 'Accept-Encoding, Accept' } -154 silly get cb [ 304, -154 silly get { date: 'Thu, 26 Apr 2018 10:56:18 GMT', -154 silly get via: '1.1 varnish', -154 silly get 'cache-control': 'max-age=300', -154 silly get etag: '"5aa7fe02-c438"', -154 silly get age: '9570', -154 silly get connection: 'keep-alive', -154 silly get 'x-served-by': 'cache-itm18831-ITM', -154 silly get 'x-cache': 'HIT', -154 silly get 'x-cache-hits': '8', -154 silly get 'x-timer': 'S1524740179.771934,VS0,VE0', -154 silly get vary: 'Accept-Encoding, Accept' } ] -155 verbose etag https://registry.npmjs.org/type-detect from cache -156 verbose get saving type-detect to /Users/zhiyuan/.npm/registry.npmjs.org/type-detect/.cache.json -157 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -158 silly resolveWithNewModule type-detect@1.0.0 checking installable status -159 silly cache add args [ 'type-detect@^1.0.0', null ] -160 verbose cache add spec type-detect@^1.0.0 -161 silly cache add parsed spec Result { -161 silly cache add raw: 'type-detect@^1.0.0', -161 silly cache add scope: null, -161 silly cache add escapedName: 'type-detect', -161 silly cache add name: 'type-detect', -161 silly cache add rawSpec: '^1.0.0', -161 silly cache add spec: '>=1.0.0 <2.0.0', -161 silly cache add type: 'range' } -162 silly addNamed type-detect@>=1.0.0 <2.0.0 -163 verbose addNamed ">=1.0.0 <2.0.0" is a valid semver range for type-detect -164 silly addNameRange { name: 'type-detect', range: '>=1.0.0 <2.0.0', hasData: false } -165 silly mapToRegistry name type-detect -166 silly mapToRegistry using default registry -167 silly mapToRegistry registry https://registry.npmjs.org/ -168 silly mapToRegistry data Result { -168 silly mapToRegistry raw: 'type-detect', -168 silly mapToRegistry scope: null, -168 silly mapToRegistry escapedName: 'type-detect', -168 silly mapToRegistry name: 'type-detect', -168 silly mapToRegistry rawSpec: '', -168 silly mapToRegistry spec: 'latest', -168 silly mapToRegistry type: 'tag' } -169 silly mapToRegistry uri https://registry.npmjs.org/type-detect -170 verbose addNameRange registry:https://registry.npmjs.org/type-detect not in flight; fetching -171 verbose get https://registry.npmjs.org/type-detect not expired, no request -172 silly addNameRange number 2 { name: 'type-detect', range: '>=1.0.0 <2.0.0', hasData: true } -173 silly addNameRange versions [ 'type-detect', -173 silly addNameRange [ '0.1.0', -173 silly addNameRange '0.1.1', -173 silly addNameRange '0.1.2', -173 silly addNameRange '1.0.0', -173 silly addNameRange '2.0.0', -173 silly addNameRange '2.0.1', -173 silly addNameRange '2.0.2', -173 silly addNameRange '3.0.0', -173 silly addNameRange '4.0.0', -173 silly addNameRange '4.0.1', -173 silly addNameRange '4.0.2', -173 silly addNameRange '4.0.3', -173 silly addNameRange '4.0.5', -173 silly addNameRange '4.0.6', -173 silly addNameRange '4.0.7', -173 silly addNameRange '4.0.8' ] ] -174 silly addNamed type-detect@1.0.0 -175 verbose addNamed "1.0.0" is a plain semver version for type-detect -176 silly cache afterAdd type-detect@1.0.0 -177 verbose afterAdd /Users/zhiyuan/.npm/type-detect/1.0.0/package/package.json not in flight; writing -178 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -179 verbose afterAdd /Users/zhiyuan/.npm/type-detect/1.0.0/package/package.json written -180 silly fetchNamedPackageData type-detect -181 silly mapToRegistry name type-detect -182 silly mapToRegistry using default registry -183 silly mapToRegistry registry https://registry.npmjs.org/ -184 silly mapToRegistry data Result { -184 silly mapToRegistry raw: 'type-detect', -184 silly mapToRegistry scope: null, -184 silly mapToRegistry escapedName: 'type-detect', -184 silly mapToRegistry name: 'type-detect', -184 silly mapToRegistry rawSpec: '', -184 silly mapToRegistry spec: 'latest', -184 silly mapToRegistry type: 'tag' } -185 silly mapToRegistry uri https://registry.npmjs.org/type-detect -186 silly resolveWithNewModule type-detect@0.1.1 checking installable status -187 silly cache add args [ 'type-detect@0.1.1', null ] -188 verbose cache add spec type-detect@0.1.1 -189 silly cache add parsed spec Result { -189 silly cache add raw: 'type-detect@0.1.1', -189 silly cache add scope: null, -189 silly cache add escapedName: 'type-detect', -189 silly cache add name: 'type-detect', -189 silly cache add rawSpec: '0.1.1', -189 silly cache add spec: '0.1.1', -189 silly cache add type: 'version' } -190 silly addNamed type-detect@0.1.1 -191 verbose addNamed "0.1.1" is a plain semver version for type-detect -192 silly mapToRegistry name type-detect -193 silly mapToRegistry using default registry -194 silly mapToRegistry registry https://registry.npmjs.org/ -195 silly mapToRegistry data Result { -195 silly mapToRegistry raw: 'type-detect', -195 silly mapToRegistry scope: null, -195 silly mapToRegistry escapedName: 'type-detect', -195 silly mapToRegistry name: 'type-detect', -195 silly mapToRegistry rawSpec: '', -195 silly mapToRegistry spec: 'latest', -195 silly mapToRegistry type: 'tag' } -196 silly mapToRegistry uri https://registry.npmjs.org/type-detect -197 verbose addNameVersion registry:https://registry.npmjs.org/type-detect not in flight; fetching -198 verbose get https://registry.npmjs.org/type-detect not expired, no request -199 silly cache afterAdd type-detect@0.1.1 -200 verbose afterAdd /Users/zhiyuan/.npm/type-detect/0.1.1/package/package.json not in flight; writing -201 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -202 verbose afterAdd /Users/zhiyuan/.npm/type-detect/0.1.1/package/package.json written -203 silly fetchNamedPackageData babelify -204 silly mapToRegistry name babelify -205 silly mapToRegistry using default registry -206 silly mapToRegistry registry https://registry.npmjs.org/ -207 silly mapToRegistry data Result { -207 silly mapToRegistry raw: 'babelify', -207 silly mapToRegistry scope: null, -207 silly mapToRegistry escapedName: 'babelify', -207 silly mapToRegistry name: 'babelify', -207 silly mapToRegistry rawSpec: '', -207 silly mapToRegistry spec: 'latest', -207 silly mapToRegistry type: 'tag' } -208 silly mapToRegistry uri https://registry.npmjs.org/babelify -209 verbose request uri https://registry.npmjs.org/babelify -210 verbose request no auth needed -211 info attempt registry request try #1 at 18:56:21 -212 verbose etag "5aa00885-7e14" -213 verbose lastModified Wed, 7 Mar 2018 15:43:01 GMT -214 http request GET https://registry.npmjs.org/babelify -215 http 304 https://registry.npmjs.org/babelify -216 verbose headers { date: 'Thu, 26 Apr 2018 10:56:21 GMT', -216 verbose headers via: '1.1 varnish', -216 verbose headers 'cache-control': 'max-age=300', -216 verbose headers etag: '"5aa00885-7e14"', -216 verbose headers age: '10141', -216 verbose headers connection: 'keep-alive', -216 verbose headers 'x-served-by': 'cache-itm18829-ITM', -216 verbose headers 'x-cache': 'HIT', -216 verbose headers 'x-cache-hits': '5', -216 verbose headers 'x-timer': 'S1524740182.895851,VS0,VE0', -216 verbose headers vary: 'Accept-Encoding, Accept' } -217 silly get cb [ 304, -217 silly get { date: 'Thu, 26 Apr 2018 10:56:21 GMT', -217 silly get via: '1.1 varnish', -217 silly get 'cache-control': 'max-age=300', -217 silly get etag: '"5aa00885-7e14"', -217 silly get age: '10141', -217 silly get connection: 'keep-alive', -217 silly get 'x-served-by': 'cache-itm18829-ITM', -217 silly get 'x-cache': 'HIT', -217 silly get 'x-cache-hits': '5', -217 silly get 'x-timer': 'S1524740182.895851,VS0,VE0', -217 silly get vary: 'Accept-Encoding, Accept' } ] -218 verbose etag https://registry.npmjs.org/babelify from cache -219 verbose get saving babelify to /Users/zhiyuan/.npm/registry.npmjs.org/babelify/.cache.json -220 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -221 silly resolveWithNewModule babelify@7.3.0 checking installable status -222 silly cache add args [ 'babelify@^7.3.0', null ] -223 verbose cache add spec babelify@^7.3.0 -224 silly cache add parsed spec Result { -224 silly cache add raw: 'babelify@^7.3.0', -224 silly cache add scope: null, -224 silly cache add escapedName: 'babelify', -224 silly cache add name: 'babelify', -224 silly cache add rawSpec: '^7.3.0', -224 silly cache add spec: '>=7.3.0 <8.0.0', -224 silly cache add type: 'range' } -225 silly addNamed babelify@>=7.3.0 <8.0.0 -226 verbose addNamed ">=7.3.0 <8.0.0" is a valid semver range for babelify -227 silly addNameRange { name: 'babelify', range: '>=7.3.0 <8.0.0', hasData: false } -228 silly mapToRegistry name babelify -229 silly mapToRegistry using default registry -230 silly mapToRegistry registry https://registry.npmjs.org/ -231 silly mapToRegistry data Result { -231 silly mapToRegistry raw: 'babelify', -231 silly mapToRegistry scope: null, -231 silly mapToRegistry escapedName: 'babelify', -231 silly mapToRegistry name: 'babelify', -231 silly mapToRegistry rawSpec: '', -231 silly mapToRegistry spec: 'latest', -231 silly mapToRegistry type: 'tag' } -232 silly mapToRegistry uri https://registry.npmjs.org/babelify -233 verbose addNameRange registry:https://registry.npmjs.org/babelify not in flight; fetching -234 verbose get https://registry.npmjs.org/babelify not expired, no request -235 silly addNameRange number 2 { name: 'babelify', range: '>=7.3.0 <8.0.0', hasData: true } -236 silly addNameRange versions [ 'babelify', -236 silly addNameRange [ '5.0.1', -236 silly addNameRange '5.0.2', -236 silly addNameRange '5.0.3', -236 silly addNameRange '5.0.4', -236 silly addNameRange '6.0.0', -236 silly addNameRange '5.0.5', -236 silly addNameRange '6.0.1', -236 silly addNameRange '6.0.2', -236 silly addNameRange '6.1.0', -236 silly addNameRange '6.1.1', -236 silly addNameRange '6.1.2', -236 silly addNameRange '6.1.3', -236 silly addNameRange '6.2.0', -236 silly addNameRange '6.3.0', -236 silly addNameRange '6.4.0', -236 silly addNameRange '7.0.0', -236 silly addNameRange '7.0.1', -236 silly addNameRange '7.0.2', -236 silly addNameRange '7.1.0', -236 silly addNameRange '7.2.0', -236 silly addNameRange '7.3.0', -236 silly addNameRange '8.0.0' ] ] -237 silly addNamed babelify@7.3.0 -238 verbose addNamed "7.3.0" is a plain semver version for babelify -239 silly cache afterAdd babelify@7.3.0 -240 verbose afterAdd /Users/zhiyuan/.npm/babelify/7.3.0/package/package.json not in flight; writing -241 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -242 verbose afterAdd /Users/zhiyuan/.npm/babelify/7.3.0/package/package.json written -243 silly fetchNamedPackageData babelify -244 silly mapToRegistry name babelify -245 silly mapToRegistry using default registry -246 silly mapToRegistry registry https://registry.npmjs.org/ -247 silly mapToRegistry data Result { -247 silly mapToRegistry raw: 'babelify', -247 silly mapToRegistry scope: null, -247 silly mapToRegistry escapedName: 'babelify', -247 silly mapToRegistry name: 'babelify', -247 silly mapToRegistry rawSpec: '', -247 silly mapToRegistry spec: 'latest', -247 silly mapToRegistry type: 'tag' } -248 silly mapToRegistry uri https://registry.npmjs.org/babelify -249 silly resolveWithNewModule babelify@7.3.0 checking installable status -250 silly fetchNamedPackageData babelify -251 silly mapToRegistry name babelify -252 silly mapToRegistry using default registry -253 silly mapToRegistry registry https://registry.npmjs.org/ -254 silly mapToRegistry data Result { -254 silly mapToRegistry raw: 'babelify', -254 silly mapToRegistry scope: null, -254 silly mapToRegistry escapedName: 'babelify', -254 silly mapToRegistry name: 'babelify', -254 silly mapToRegistry rawSpec: '', -254 silly mapToRegistry spec: 'latest', -254 silly mapToRegistry type: 'tag' } -255 silly mapToRegistry uri https://registry.npmjs.org/babelify -256 silly resolveWithNewModule babelify@7.3.0 checking installable status -257 silly fetchNamedPackageData chai -258 silly mapToRegistry name chai -259 silly mapToRegistry using default registry -260 silly mapToRegistry registry https://registry.npmjs.org/ -261 silly mapToRegistry data Result { -261 silly mapToRegistry raw: 'chai', -261 silly mapToRegistry scope: null, -261 silly mapToRegistry escapedName: 'chai', -261 silly mapToRegistry name: 'chai', -261 silly mapToRegistry rawSpec: '', -261 silly mapToRegistry spec: 'latest', -261 silly mapToRegistry type: 'tag' } -262 silly mapToRegistry uri https://registry.npmjs.org/chai -263 silly resolveWithNewModule chai@3.5.0 checking installable status -264 silly fetchNamedPackageData mocha -265 silly mapToRegistry name mocha -266 silly mapToRegistry using default registry -267 silly mapToRegistry registry https://registry.npmjs.org/ -268 silly mapToRegistry data Result { -268 silly mapToRegistry raw: 'mocha', -268 silly mapToRegistry scope: null, -268 silly mapToRegistry escapedName: 'mocha', -268 silly mapToRegistry name: 'mocha', -268 silly mapToRegistry rawSpec: '', -268 silly mapToRegistry spec: 'latest', -268 silly mapToRegistry type: 'tag' } -269 silly mapToRegistry uri https://registry.npmjs.org/mocha -270 verbose request uri https://registry.npmjs.org/mocha -271 verbose request no auth needed -272 info attempt registry request try #1 at 18:56:22 -273 verbose etag "5ae024a2-101a5b" -274 verbose lastModified Wed, 25 Apr 2018 6:48:02 GMT -275 http request GET https://registry.npmjs.org/mocha -276 http 304 https://registry.npmjs.org/mocha -277 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -277 verbose headers via: '1.1 varnish', -277 verbose headers 'cache-control': 'max-age=300', -277 verbose headers etag: '"5ae024a2-101a5b"', -277 verbose headers age: '9545', -277 verbose headers connection: 'keep-alive', -277 verbose headers 'x-served-by': 'cache-itm18831-ITM', -277 verbose headers 'x-cache': 'HIT', -277 verbose headers 'x-cache-hits': '19', -277 verbose headers 'x-timer': 'S1524740183.281515,VS0,VE0', -277 verbose headers vary: 'Accept-Encoding, Accept' } -278 silly get cb [ 304, -278 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -278 silly get via: '1.1 varnish', -278 silly get 'cache-control': 'max-age=300', -278 silly get etag: '"5ae024a2-101a5b"', -278 silly get age: '9545', -278 silly get connection: 'keep-alive', -278 silly get 'x-served-by': 'cache-itm18831-ITM', -278 silly get 'x-cache': 'HIT', -278 silly get 'x-cache-hits': '19', -278 silly get 'x-timer': 'S1524740183.281515,VS0,VE0', -278 silly get vary: 'Accept-Encoding, Accept' } ] -279 verbose etag https://registry.npmjs.org/mocha from cache -280 verbose get saving mocha to /Users/zhiyuan/.npm/registry.npmjs.org/mocha/.cache.json -281 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -282 silly resolveWithNewModule mocha@3.3.0 checking installable status -283 silly cache add args [ 'mocha@~3.3.0', null ] -284 verbose cache add spec mocha@~3.3.0 -285 silly cache add parsed spec Result { -285 silly cache add raw: 'mocha@~3.3.0', -285 silly cache add scope: null, -285 silly cache add escapedName: 'mocha', -285 silly cache add name: 'mocha', -285 silly cache add rawSpec: '~3.3.0', -285 silly cache add spec: '>=3.3.0 <3.4.0', -285 silly cache add type: 'range' } -286 silly addNamed mocha@>=3.3.0 <3.4.0 -287 verbose addNamed ">=3.3.0 <3.4.0" is a valid semver range for mocha -288 silly addNameRange { name: 'mocha', range: '>=3.3.0 <3.4.0', hasData: false } -289 silly mapToRegistry name mocha -290 silly mapToRegistry using default registry -291 silly mapToRegistry registry https://registry.npmjs.org/ -292 silly mapToRegistry data Result { -292 silly mapToRegistry raw: 'mocha', -292 silly mapToRegistry scope: null, -292 silly mapToRegistry escapedName: 'mocha', -292 silly mapToRegistry name: 'mocha', -292 silly mapToRegistry rawSpec: '', -292 silly mapToRegistry spec: 'latest', -292 silly mapToRegistry type: 'tag' } -293 silly mapToRegistry uri https://registry.npmjs.org/mocha -294 verbose addNameRange registry:https://registry.npmjs.org/mocha not in flight; fetching -295 verbose get https://registry.npmjs.org/mocha not expired, no request -296 silly addNameRange number 2 { name: 'mocha', range: '>=3.3.0 <3.4.0', hasData: true } -297 silly addNameRange versions [ 'mocha', -297 silly addNameRange [ '0.0.1-alpha1', -297 silly addNameRange '0.0.1-alpha2', -297 silly addNameRange '0.0.1-alpha3', -297 silly addNameRange '0.0.1-alpha4', -297 silly addNameRange '0.0.1-alpha5', -297 silly addNameRange '0.0.1-alpha6', -297 silly addNameRange '0.0.1', -297 silly addNameRange '0.0.2', -297 silly addNameRange '0.0.3', -297 silly addNameRange '0.0.4', -297 silly addNameRange '0.0.5', -297 silly addNameRange '0.0.6', -297 silly addNameRange '0.0.7', -297 silly addNameRange '0.0.8', -297 silly addNameRange '0.1.0', -297 silly addNameRange '0.2.0', -297 silly addNameRange '0.3.0', -297 silly addNameRange '0.3.1', -297 silly addNameRange '0.3.2', -297 silly addNameRange '0.3.3', -297 silly addNameRange '0.3.4', -297 silly addNameRange '0.3.6', -297 silly addNameRange '0.4.0', -297 silly addNameRange '0.5.0', -297 silly addNameRange '0.6.0', -297 silly addNameRange '0.7.0', -297 silly addNameRange '0.7.1', -297 silly addNameRange '0.8.0', -297 silly addNameRange '0.8.1', -297 silly addNameRange '0.9.0', -297 silly addNameRange '0.10.0', -297 silly addNameRange '0.10.1', -297 silly addNameRange '0.10.2', -297 silly addNameRange '0.11.0', -297 silly addNameRange '0.12.0', -297 silly addNameRange '0.12.1', -297 silly addNameRange '0.13.0', -297 silly addNameRange '0.14.0', -297 silly addNameRange '0.14.1', -297 silly addNameRange '1.0.0', -297 silly addNameRange '1.0.1', -297 silly addNameRange '1.0.2', -297 silly addNameRange '1.0.3', -297 silly addNameRange '1.1.0', -297 silly addNameRange '1.2.0', -297 silly addNameRange '1.2.1', -297 silly addNameRange '1.2.2', -297 silly addNameRange '1.3.0', -297 silly addNameRange '1.3.1', -297 silly addNameRange '1.3.2', -297 silly addNameRange '1.4.0', -297 silly addNameRange '1.4.1', -297 silly addNameRange '1.4.2', -297 silly addNameRange '1.4.3', -297 silly addNameRange '1.5.0', -297 silly addNameRange '1.6.0', -297 silly addNameRange '1.7.0', -297 silly addNameRange '1.7.1', -297 silly addNameRange '1.7.2', -297 silly addNameRange '1.7.3', -297 silly addNameRange '1.7.4', -297 silly addNameRange '1.8.0', -297 silly addNameRange '1.8.1', -297 silly addNameRange '1.8.2', -297 silly addNameRange '1.9.0', -297 silly addNameRange '1.10.0', -297 silly addNameRange '1.11.0', -297 silly addNameRange '1.12.0', -297 silly addNameRange '1.12.1', -297 silly addNameRange '1.13.0', -297 silly addNameRange '1.14.0', -297 silly addNameRange '1.15.0', -297 silly addNameRange '1.15.1', -297 silly addNameRange '1.16.0', -297 silly addNameRange '1.16.1', -297 silly addNameRange '1.16.2', -297 silly addNameRange '1.17.0', -297 silly addNameRange '1.17.1', -297 silly addNameRange '1.18.0', -297 silly addNameRange '1.18.1', -297 silly addNameRange '1.18.2', -297 silly addNameRange '1.19.0', -297 silly addNameRange '1.20.0', -297 silly addNameRange '1.20.1', -297 silly addNameRange '1.21.0', -297 silly addNameRange '1.21.1', -297 silly addNameRange '1.21.2', -297 silly addNameRange '1.21.3', -297 silly addNameRange '1.21.4', -297 silly addNameRange '1.21.5', -297 silly addNameRange '2.0.0', -297 silly addNameRange '2.0.1', -297 silly addNameRange '2.1.0', -297 silly addNameRange '2.2.0', -297 silly addNameRange '2.2.1', -297 silly addNameRange '2.2.3', -297 silly addNameRange '2.2.4', -297 silly addNameRange '2.2.5', -297 silly addNameRange '2.3.0', -297 silly addNameRange '2.3.1', -297 silly addNameRange ... 40 more items ] ] -298 silly addNamed mocha@3.3.0 -299 verbose addNamed "3.3.0" is a plain semver version for mocha -300 silly cache afterAdd mocha@3.3.0 -301 verbose afterAdd /Users/zhiyuan/.npm/mocha/3.3.0/package/package.json not in flight; writing -302 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -303 verbose afterAdd /Users/zhiyuan/.npm/mocha/3.3.0/package/package.json written -304 silly fetchNamedPackageData deep-eql -305 silly mapToRegistry name deep-eql -306 silly mapToRegistry using default registry -307 silly mapToRegistry registry https://registry.npmjs.org/ -308 silly mapToRegistry data Result { -308 silly mapToRegistry raw: 'deep-eql', -308 silly mapToRegistry scope: null, -308 silly mapToRegistry escapedName: 'deep-eql', -308 silly mapToRegistry name: 'deep-eql', -308 silly mapToRegistry rawSpec: '', -308 silly mapToRegistry spec: 'latest', -308 silly mapToRegistry type: 'tag' } -309 silly mapToRegistry uri https://registry.npmjs.org/deep-eql -310 silly resolveWithNewModule deep-eql@0.1.3 checking installable status -311 silly fetchNamedPackageData type-detect -312 silly mapToRegistry name type-detect -313 silly mapToRegistry using default registry -314 silly mapToRegistry registry https://registry.npmjs.org/ -315 silly mapToRegistry data Result { -315 silly mapToRegistry raw: 'type-detect', -315 silly mapToRegistry scope: null, -315 silly mapToRegistry escapedName: 'type-detect', -315 silly mapToRegistry name: 'type-detect', -315 silly mapToRegistry rawSpec: '', -315 silly mapToRegistry spec: 'latest', -315 silly mapToRegistry type: 'tag' } -316 silly mapToRegistry uri https://registry.npmjs.org/type-detect -317 silly resolveWithNewModule type-detect@1.0.0 checking installable status -318 silly fetchNamedPackageData type-detect -319 silly mapToRegistry name type-detect -320 silly mapToRegistry using default registry -321 silly mapToRegistry registry https://registry.npmjs.org/ -322 silly mapToRegistry data Result { -322 silly mapToRegistry raw: 'type-detect', -322 silly mapToRegistry scope: null, -322 silly mapToRegistry escapedName: 'type-detect', -322 silly mapToRegistry name: 'type-detect', -322 silly mapToRegistry rawSpec: '', -322 silly mapToRegistry spec: 'latest', -322 silly mapToRegistry type: 'tag' } -323 silly mapToRegistry uri https://registry.npmjs.org/type-detect -324 silly resolveWithNewModule type-detect@0.1.1 checking installable status -325 silly cache add args [ 'type-detect@0.1.1', null ] -326 verbose cache add spec type-detect@0.1.1 -327 silly cache add parsed spec Result { -327 silly cache add raw: 'type-detect@0.1.1', -327 silly cache add scope: null, -327 silly cache add escapedName: 'type-detect', -327 silly cache add name: 'type-detect', -327 silly cache add rawSpec: '0.1.1', -327 silly cache add spec: '0.1.1', -327 silly cache add type: 'version' } -328 silly addNamed type-detect@0.1.1 -329 verbose addNamed "0.1.1" is a plain semver version for type-detect -330 silly mapToRegistry name type-detect -331 silly mapToRegistry using default registry -332 silly mapToRegistry registry https://registry.npmjs.org/ -333 silly mapToRegistry data Result { -333 silly mapToRegistry raw: 'type-detect', -333 silly mapToRegistry scope: null, -333 silly mapToRegistry escapedName: 'type-detect', -333 silly mapToRegistry name: 'type-detect', -333 silly mapToRegistry rawSpec: '', -333 silly mapToRegistry spec: 'latest', -333 silly mapToRegistry type: 'tag' } -334 silly mapToRegistry uri https://registry.npmjs.org/type-detect -335 verbose addNameVersion registry:https://registry.npmjs.org/type-detect not in flight; fetching -336 verbose get https://registry.npmjs.org/type-detect not expired, no request -337 silly cache afterAdd type-detect@0.1.1 -338 verbose afterAdd /Users/zhiyuan/.npm/type-detect/0.1.1/package/package.json not in flight; writing -339 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -340 verbose afterAdd /Users/zhiyuan/.npm/type-detect/0.1.1/package/package.json written -341 silly fetchNamedPackageData browser-stdout -342 silly mapToRegistry name browser-stdout -343 silly mapToRegistry using default registry -344 silly mapToRegistry registry https://registry.npmjs.org/ -345 silly mapToRegistry data Result { -345 silly mapToRegistry raw: 'browser-stdout', -345 silly mapToRegistry scope: null, -345 silly mapToRegistry escapedName: 'browser-stdout', -345 silly mapToRegistry name: 'browser-stdout', -345 silly mapToRegistry rawSpec: '', -345 silly mapToRegistry spec: 'latest', -345 silly mapToRegistry type: 'tag' } -346 silly mapToRegistry uri https://registry.npmjs.org/browser-stdout -347 silly fetchNamedPackageData debug -348 silly mapToRegistry name debug -349 silly mapToRegistry using default registry -350 silly mapToRegistry registry https://registry.npmjs.org/ -351 silly mapToRegistry data Result { -351 silly mapToRegistry raw: 'debug', -351 silly mapToRegistry scope: null, -351 silly mapToRegistry escapedName: 'debug', -351 silly mapToRegistry name: 'debug', -351 silly mapToRegistry rawSpec: '', -351 silly mapToRegistry spec: 'latest', -351 silly mapToRegistry type: 'tag' } -352 silly mapToRegistry uri https://registry.npmjs.org/debug -353 silly fetchNamedPackageData diff -354 silly mapToRegistry name diff -355 silly mapToRegistry using default registry -356 silly mapToRegistry registry https://registry.npmjs.org/ -357 silly mapToRegistry data Result { -357 silly mapToRegistry raw: 'diff', -357 silly mapToRegistry scope: null, -357 silly mapToRegistry escapedName: 'diff', -357 silly mapToRegistry name: 'diff', -357 silly mapToRegistry rawSpec: '', -357 silly mapToRegistry spec: 'latest', -357 silly mapToRegistry type: 'tag' } -358 silly mapToRegistry uri https://registry.npmjs.org/diff -359 silly fetchNamedPackageData glob -360 silly mapToRegistry name glob -361 silly mapToRegistry using default registry -362 silly mapToRegistry registry https://registry.npmjs.org/ -363 silly mapToRegistry data Result { -363 silly mapToRegistry raw: 'glob', -363 silly mapToRegistry scope: null, -363 silly mapToRegistry escapedName: 'glob', -363 silly mapToRegistry name: 'glob', -363 silly mapToRegistry rawSpec: '', -363 silly mapToRegistry spec: 'latest', -363 silly mapToRegistry type: 'tag' } -364 silly mapToRegistry uri https://registry.npmjs.org/glob -365 silly fetchNamedPackageData growl -366 silly mapToRegistry name growl -367 silly mapToRegistry using default registry -368 silly mapToRegistry registry https://registry.npmjs.org/ -369 silly mapToRegistry data Result { -369 silly mapToRegistry raw: 'growl', -369 silly mapToRegistry scope: null, -369 silly mapToRegistry escapedName: 'growl', -369 silly mapToRegistry name: 'growl', -369 silly mapToRegistry rawSpec: '', -369 silly mapToRegistry spec: 'latest', -369 silly mapToRegistry type: 'tag' } -370 silly mapToRegistry uri https://registry.npmjs.org/growl -371 silly fetchNamedPackageData json3 -372 silly mapToRegistry name json3 -373 silly mapToRegistry using default registry -374 silly mapToRegistry registry https://registry.npmjs.org/ -375 silly mapToRegistry data Result { -375 silly mapToRegistry raw: 'json3', -375 silly mapToRegistry scope: null, -375 silly mapToRegistry escapedName: 'json3', -375 silly mapToRegistry name: 'json3', -375 silly mapToRegistry rawSpec: '', -375 silly mapToRegistry spec: 'latest', -375 silly mapToRegistry type: 'tag' } -376 silly mapToRegistry uri https://registry.npmjs.org/json3 -377 silly fetchNamedPackageData lodash.create -378 silly mapToRegistry name lodash.create -379 silly mapToRegistry using default registry -380 silly mapToRegistry registry https://registry.npmjs.org/ -381 silly mapToRegistry data Result { -381 silly mapToRegistry raw: 'lodash.create', -381 silly mapToRegistry scope: null, -381 silly mapToRegistry escapedName: 'lodash.create', -381 silly mapToRegistry name: 'lodash.create', -381 silly mapToRegistry rawSpec: '', -381 silly mapToRegistry spec: 'latest', -381 silly mapToRegistry type: 'tag' } -382 silly mapToRegistry uri https://registry.npmjs.org/lodash.create -383 silly fetchNamedPackageData supports-color -384 silly mapToRegistry name supports-color -385 silly mapToRegistry using default registry -386 silly mapToRegistry registry https://registry.npmjs.org/ -387 silly mapToRegistry data Result { -387 silly mapToRegistry raw: 'supports-color', -387 silly mapToRegistry scope: null, -387 silly mapToRegistry escapedName: 'supports-color', -387 silly mapToRegistry name: 'supports-color', -387 silly mapToRegistry rawSpec: '', -387 silly mapToRegistry spec: 'latest', -387 silly mapToRegistry type: 'tag' } -388 silly mapToRegistry uri https://registry.npmjs.org/supports-color -389 verbose request uri https://registry.npmjs.org/diff -390 verbose request no auth needed -391 info attempt registry request try #1 at 18:56:23 -392 verbose etag "5ab116ee-fcf1" -393 verbose lastModified Tue, 20 Mar 2018 14:13:02 GMT -394 http request GET https://registry.npmjs.org/diff -395 verbose request uri https://registry.npmjs.org/browser-stdout -396 verbose request no auth needed -397 info attempt registry request try #1 at 18:56:23 -398 verbose etag "5a95956a-1ece" -399 verbose lastModified Tue, 27 Feb 2018 17:29:14 GMT -400 http request GET https://registry.npmjs.org/browser-stdout -401 verbose request uri https://registry.npmjs.org/debug -402 verbose request no auth needed -403 info attempt registry request try #1 at 18:56:23 -404 verbose etag "5ae04225-1954d" -405 verbose lastModified Wed, 25 Apr 2018 8:53:57 GMT -406 http request GET https://registry.npmjs.org/debug -407 verbose request uri https://registry.npmjs.org/glob -408 verbose request no auth needed -409 info attempt registry request try #1 at 18:56:23 -410 verbose etag "5ad07458-20247" -411 verbose lastModified Fri, 13 Apr 2018 9:11:52 GMT -412 http request GET https://registry.npmjs.org/glob -413 verbose request uri https://registry.npmjs.org/growl -414 verbose request no auth needed -415 info attempt registry request try #1 at 18:56:23 -416 verbose etag "5ac4f2eb-64f9" -417 verbose lastModified Wed, 4 Apr 2018 15:44:43 GMT -418 http request GET https://registry.npmjs.org/growl -419 verbose request uri https://registry.npmjs.org/supports-color -420 verbose request no auth needed -421 info attempt registry request try #1 at 18:56:23 -422 verbose etag "5ad570bb-beb1" -423 verbose lastModified Tue, 17 Apr 2018 3:57:47 GMT -424 http request GET https://registry.npmjs.org/supports-color -425 verbose request uri https://registry.npmjs.org/json3 -426 verbose request no auth needed -427 info attempt registry request try #1 at 18:56:23 -428 verbose etag "5a5f46ca-5e53" -429 verbose lastModified Wed, 17 Jan 2018 12:51:22 GMT -430 http request GET https://registry.npmjs.org/json3 -431 verbose request uri https://registry.npmjs.org/lodash.create -432 verbose request no auth needed -433 info attempt registry request try #1 at 18:56:23 -434 verbose etag "57f67fb1-58a8" -435 verbose lastModified Thu, 6 Oct 2016 16:45:37 GMT -436 http request GET https://registry.npmjs.org/lodash.create -437 http 304 https://registry.npmjs.org/browser-stdout -438 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -438 verbose headers via: '1.1 varnish', -438 verbose headers 'cache-control': 'max-age=300', -438 verbose headers etag: '"5a95956a-1ece"', -438 verbose headers age: '4091', -438 verbose headers connection: 'keep-alive', -438 verbose headers 'x-served-by': 'cache-itm18831-ITM', -438 verbose headers 'x-cache': 'HIT', -438 verbose headers 'x-cache-hits': '3', -438 verbose headers 'x-timer': 'S1524740184.801872,VS0,VE0', -438 verbose headers vary: 'Accept-Encoding, Accept' } -439 silly get cb [ 304, -439 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -439 silly get via: '1.1 varnish', -439 silly get 'cache-control': 'max-age=300', -439 silly get etag: '"5a95956a-1ece"', -439 silly get age: '4091', -439 silly get connection: 'keep-alive', -439 silly get 'x-served-by': 'cache-itm18831-ITM', -439 silly get 'x-cache': 'HIT', -439 silly get 'x-cache-hits': '3', -439 silly get 'x-timer': 'S1524740184.801872,VS0,VE0', -439 silly get vary: 'Accept-Encoding, Accept' } ] -440 verbose etag https://registry.npmjs.org/browser-stdout from cache -441 verbose get saving browser-stdout to /Users/zhiyuan/.npm/registry.npmjs.org/browser-stdout/.cache.json -442 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -443 http 304 https://registry.npmjs.org/diff -444 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -444 verbose headers via: '1.1 varnish', -444 verbose headers 'cache-control': 'max-age=300', -444 verbose headers etag: '"5ab116ee-fcf1"', -444 verbose headers age: '10752', -444 verbose headers connection: 'keep-alive', -444 verbose headers 'x-served-by': 'cache-itm18829-ITM', -444 verbose headers 'x-cache': 'HIT', -444 verbose headers 'x-cache-hits': '20', -444 verbose headers 'x-timer': 'S1524740184.808632,VS0,VE0', -444 verbose headers vary: 'Accept-Encoding, Accept' } -445 silly get cb [ 304, -445 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -445 silly get via: '1.1 varnish', -445 silly get 'cache-control': 'max-age=300', -445 silly get etag: '"5ab116ee-fcf1"', -445 silly get age: '10752', -445 silly get connection: 'keep-alive', -445 silly get 'x-served-by': 'cache-itm18829-ITM', -445 silly get 'x-cache': 'HIT', -445 silly get 'x-cache-hits': '20', -445 silly get 'x-timer': 'S1524740184.808632,VS0,VE0', -445 silly get vary: 'Accept-Encoding, Accept' } ] -446 verbose etag https://registry.npmjs.org/diff from cache -447 verbose get saving diff to /Users/zhiyuan/.npm/registry.npmjs.org/diff/.cache.json -448 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -449 silly resolveWithNewModule browser-stdout@1.3.0 checking installable status -450 silly cache add args [ 'browser-stdout@1.3.0', null ] -451 verbose cache add spec browser-stdout@1.3.0 -452 silly cache add parsed spec Result { -452 silly cache add raw: 'browser-stdout@1.3.0', -452 silly cache add scope: null, -452 silly cache add escapedName: 'browser-stdout', -452 silly cache add name: 'browser-stdout', -452 silly cache add rawSpec: '1.3.0', -452 silly cache add spec: '1.3.0', -452 silly cache add type: 'version' } -453 silly addNamed browser-stdout@1.3.0 -454 verbose addNamed "1.3.0" is a plain semver version for browser-stdout -455 silly mapToRegistry name browser-stdout -456 silly mapToRegistry using default registry -457 silly mapToRegistry registry https://registry.npmjs.org/ -458 silly mapToRegistry data Result { -458 silly mapToRegistry raw: 'browser-stdout', -458 silly mapToRegistry scope: null, -458 silly mapToRegistry escapedName: 'browser-stdout', -458 silly mapToRegistry name: 'browser-stdout', -458 silly mapToRegistry rawSpec: '', -458 silly mapToRegistry spec: 'latest', -458 silly mapToRegistry type: 'tag' } -459 silly mapToRegistry uri https://registry.npmjs.org/browser-stdout -460 verbose addNameVersion registry:https://registry.npmjs.org/browser-stdout not in flight; fetching -461 verbose get https://registry.npmjs.org/browser-stdout not expired, no request -462 silly cache afterAdd browser-stdout@1.3.0 -463 verbose afterAdd /Users/zhiyuan/.npm/browser-stdout/1.3.0/package/package.json not in flight; writing -464 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -465 silly resolveWithNewModule diff@3.2.0 checking installable status -466 silly cache add args [ 'diff@3.2.0', null ] -467 verbose cache add spec diff@3.2.0 -468 silly cache add parsed spec Result { -468 silly cache add raw: 'diff@3.2.0', -468 silly cache add scope: null, -468 silly cache add escapedName: 'diff', -468 silly cache add name: 'diff', -468 silly cache add rawSpec: '3.2.0', -468 silly cache add spec: '3.2.0', -468 silly cache add type: 'version' } -469 silly addNamed diff@3.2.0 -470 verbose addNamed "3.2.0" is a plain semver version for diff -471 silly mapToRegistry name diff -472 silly mapToRegistry using default registry -473 silly mapToRegistry registry https://registry.npmjs.org/ -474 silly mapToRegistry data Result { -474 silly mapToRegistry raw: 'diff', -474 silly mapToRegistry scope: null, -474 silly mapToRegistry escapedName: 'diff', -474 silly mapToRegistry name: 'diff', -474 silly mapToRegistry rawSpec: '', -474 silly mapToRegistry spec: 'latest', -474 silly mapToRegistry type: 'tag' } -475 silly mapToRegistry uri https://registry.npmjs.org/diff -476 verbose addNameVersion registry:https://registry.npmjs.org/diff not in flight; fetching -477 verbose get https://registry.npmjs.org/diff not expired, no request -478 verbose afterAdd /Users/zhiyuan/.npm/browser-stdout/1.3.0/package/package.json written -479 silly cache afterAdd diff@3.2.0 -480 verbose afterAdd /Users/zhiyuan/.npm/diff/3.2.0/package/package.json not in flight; writing -481 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -482 verbose afterAdd /Users/zhiyuan/.npm/diff/3.2.0/package/package.json written -483 http 304 https://registry.npmjs.org/growl -484 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -484 verbose headers via: '1.1 varnish', -484 verbose headers 'cache-control': 'max-age=300', -484 verbose headers etag: '"5ac4f2eb-64f9"', -484 verbose headers age: '5622', -484 verbose headers connection: 'keep-alive', -484 verbose headers 'x-served-by': 'cache-itm18833-ITM', -484 verbose headers 'x-cache': 'HIT', -484 verbose headers 'x-cache-hits': '3', -484 verbose headers 'x-timer': 'S1524740184.886983,VS0,VE0', -484 verbose headers vary: 'Accept-Encoding, Accept' } -485 silly get cb [ 304, -485 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -485 silly get via: '1.1 varnish', -485 silly get 'cache-control': 'max-age=300', -485 silly get etag: '"5ac4f2eb-64f9"', -485 silly get age: '5622', -485 silly get connection: 'keep-alive', -485 silly get 'x-served-by': 'cache-itm18833-ITM', -485 silly get 'x-cache': 'HIT', -485 silly get 'x-cache-hits': '3', -485 silly get 'x-timer': 'S1524740184.886983,VS0,VE0', -485 silly get vary: 'Accept-Encoding, Accept' } ] -486 verbose etag https://registry.npmjs.org/growl from cache -487 verbose get saving growl to /Users/zhiyuan/.npm/registry.npmjs.org/growl/.cache.json -488 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -489 silly resolveWithNewModule growl@1.9.2 checking installable status -490 silly cache add args [ 'growl@1.9.2', null ] -491 verbose cache add spec growl@1.9.2 -492 silly cache add parsed spec Result { -492 silly cache add raw: 'growl@1.9.2', -492 silly cache add scope: null, -492 silly cache add escapedName: 'growl', -492 silly cache add name: 'growl', -492 silly cache add rawSpec: '1.9.2', -492 silly cache add spec: '1.9.2', -492 silly cache add type: 'version' } -493 silly addNamed growl@1.9.2 -494 verbose addNamed "1.9.2" is a plain semver version for growl -495 silly mapToRegistry name growl -496 silly mapToRegistry using default registry -497 silly mapToRegistry registry https://registry.npmjs.org/ -498 silly mapToRegistry data Result { -498 silly mapToRegistry raw: 'growl', -498 silly mapToRegistry scope: null, -498 silly mapToRegistry escapedName: 'growl', -498 silly mapToRegistry name: 'growl', -498 silly mapToRegistry rawSpec: '', -498 silly mapToRegistry spec: 'latest', -498 silly mapToRegistry type: 'tag' } -499 silly mapToRegistry uri https://registry.npmjs.org/growl -500 verbose addNameVersion registry:https://registry.npmjs.org/growl not in flight; fetching -501 verbose get https://registry.npmjs.org/growl not expired, no request -502 silly cache afterAdd growl@1.9.2 -503 verbose afterAdd /Users/zhiyuan/.npm/growl/1.9.2/package/package.json not in flight; writing -504 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -505 http 304 https://registry.npmjs.org/lodash.create -506 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -506 verbose headers via: '1.1 varnish', -506 verbose headers 'cache-control': 'max-age=300', -506 verbose headers etag: '"57f67fb1-58a8"', -506 verbose headers age: '4091', -506 verbose headers connection: 'keep-alive', -506 verbose headers 'x-served-by': 'cache-itm18822-ITM', -506 verbose headers 'x-cache': 'HIT', -506 verbose headers 'x-cache-hits': '1', -506 verbose headers 'x-timer': 'S1524740184.892490,VS0,VE0', -506 verbose headers vary: 'Accept-Encoding, Accept' } -507 silly get cb [ 304, -507 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -507 silly get via: '1.1 varnish', -507 silly get 'cache-control': 'max-age=300', -507 silly get etag: '"57f67fb1-58a8"', -507 silly get age: '4091', -507 silly get connection: 'keep-alive', -507 silly get 'x-served-by': 'cache-itm18822-ITM', -507 silly get 'x-cache': 'HIT', -507 silly get 'x-cache-hits': '1', -507 silly get 'x-timer': 'S1524740184.892490,VS0,VE0', -507 silly get vary: 'Accept-Encoding, Accept' } ] -508 verbose etag https://registry.npmjs.org/lodash.create from cache -509 verbose get saving lodash.create to /Users/zhiyuan/.npm/registry.npmjs.org/lodash.create/.cache.json -510 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -511 verbose afterAdd /Users/zhiyuan/.npm/growl/1.9.2/package/package.json written -512 http 304 https://registry.npmjs.org/glob -513 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -513 verbose headers via: '1.1 varnish', -513 verbose headers 'cache-control': 'max-age=300', -513 verbose headers etag: '"5ad07458-20247"', -513 verbose headers age: '4319', -513 verbose headers connection: 'keep-alive', -513 verbose headers 'x-served-by': 'cache-itm18826-ITM', -513 verbose headers 'x-cache': 'HIT', -513 verbose headers 'x-cache-hits': '39', -513 verbose headers 'x-timer': 'S1524740184.893438,VS0,VE0', -513 verbose headers vary: 'Accept-Encoding, Accept' } -514 silly get cb [ 304, -514 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -514 silly get via: '1.1 varnish', -514 silly get 'cache-control': 'max-age=300', -514 silly get etag: '"5ad07458-20247"', -514 silly get age: '4319', -514 silly get connection: 'keep-alive', -514 silly get 'x-served-by': 'cache-itm18826-ITM', -514 silly get 'x-cache': 'HIT', -514 silly get 'x-cache-hits': '39', -514 silly get 'x-timer': 'S1524740184.893438,VS0,VE0', -514 silly get vary: 'Accept-Encoding, Accept' } ] -515 verbose etag https://registry.npmjs.org/glob from cache -516 verbose get saving glob to /Users/zhiyuan/.npm/registry.npmjs.org/glob/.cache.json -517 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -518 http 304 https://registry.npmjs.org/debug -519 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -519 verbose headers via: '1.1 varnish', -519 verbose headers 'cache-control': 'max-age=300', -519 verbose headers etag: '"5ae04225-1954d"', -519 verbose headers age: '7181', -519 verbose headers connection: 'keep-alive', -519 verbose headers 'x-served-by': 'cache-itm18820-ITM', -519 verbose headers 'x-cache': 'HIT', -519 verbose headers 'x-cache-hits': '54', -519 verbose headers 'x-timer': 'S1524740184.901937,VS0,VE0', -519 verbose headers vary: 'Accept-Encoding, Accept' } -520 silly get cb [ 304, -520 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -520 silly get via: '1.1 varnish', -520 silly get 'cache-control': 'max-age=300', -520 silly get etag: '"5ae04225-1954d"', -520 silly get age: '7181', -520 silly get connection: 'keep-alive', -520 silly get 'x-served-by': 'cache-itm18820-ITM', -520 silly get 'x-cache': 'HIT', -520 silly get 'x-cache-hits': '54', -520 silly get 'x-timer': 'S1524740184.901937,VS0,VE0', -520 silly get vary: 'Accept-Encoding, Accept' } ] -521 verbose etag https://registry.npmjs.org/debug from cache -522 verbose get saving debug to /Users/zhiyuan/.npm/registry.npmjs.org/debug/.cache.json -523 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -524 silly resolveWithNewModule lodash.create@3.1.1 checking installable status -525 silly cache add args [ 'lodash.create@3.1.1', null ] -526 verbose cache add spec lodash.create@3.1.1 -527 silly cache add parsed spec Result { -527 silly cache add raw: 'lodash.create@3.1.1', -527 silly cache add scope: null, -527 silly cache add escapedName: 'lodash.create', -527 silly cache add name: 'lodash.create', -527 silly cache add rawSpec: '3.1.1', -527 silly cache add spec: '3.1.1', -527 silly cache add type: 'version' } -528 silly addNamed lodash.create@3.1.1 -529 verbose addNamed "3.1.1" is a plain semver version for lodash.create -530 silly mapToRegistry name lodash.create -531 silly mapToRegistry using default registry -532 silly mapToRegistry registry https://registry.npmjs.org/ -533 silly mapToRegistry data Result { -533 silly mapToRegistry raw: 'lodash.create', -533 silly mapToRegistry scope: null, -533 silly mapToRegistry escapedName: 'lodash.create', -533 silly mapToRegistry name: 'lodash.create', -533 silly mapToRegistry rawSpec: '', -533 silly mapToRegistry spec: 'latest', -533 silly mapToRegistry type: 'tag' } -534 silly mapToRegistry uri https://registry.npmjs.org/lodash.create -535 verbose addNameVersion registry:https://registry.npmjs.org/lodash.create not in flight; fetching -536 verbose get https://registry.npmjs.org/lodash.create not expired, no request -537 http 304 https://registry.npmjs.org/supports-color -538 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -538 verbose headers via: '1.1 varnish', -538 verbose headers 'cache-control': 'max-age=300', -538 verbose headers etag: '"5ad570bb-beb1"', -538 verbose headers age: '1271', -538 verbose headers connection: 'keep-alive', -538 verbose headers 'x-served-by': 'cache-itm18831-ITM', -538 verbose headers 'x-cache': 'HIT', -538 verbose headers 'x-cache-hits': '12', -538 verbose headers 'x-timer': 'S1524740184.910672,VS0,VE0', -538 verbose headers vary: 'Accept-Encoding, Accept' } -539 silly get cb [ 304, -539 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -539 silly get via: '1.1 varnish', -539 silly get 'cache-control': 'max-age=300', -539 silly get etag: '"5ad570bb-beb1"', -539 silly get age: '1271', -539 silly get connection: 'keep-alive', -539 silly get 'x-served-by': 'cache-itm18831-ITM', -539 silly get 'x-cache': 'HIT', -539 silly get 'x-cache-hits': '12', -539 silly get 'x-timer': 'S1524740184.910672,VS0,VE0', -539 silly get vary: 'Accept-Encoding, Accept' } ] -540 verbose etag https://registry.npmjs.org/supports-color from cache -541 verbose get saving supports-color to /Users/zhiyuan/.npm/registry.npmjs.org/supports-color/.cache.json -542 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -543 silly cache afterAdd lodash.create@3.1.1 -544 verbose afterAdd /Users/zhiyuan/.npm/lodash.create/3.1.1/package/package.json not in flight; writing -545 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -546 silly resolveWithNewModule debug@2.6.0 checking installable status -547 silly cache add args [ 'debug@2.6.0', null ] -548 verbose cache add spec debug@2.6.0 -549 silly cache add parsed spec Result { -549 silly cache add raw: 'debug@2.6.0', -549 silly cache add scope: null, -549 silly cache add escapedName: 'debug', -549 silly cache add name: 'debug', -549 silly cache add rawSpec: '2.6.0', -549 silly cache add spec: '2.6.0', -549 silly cache add type: 'version' } -550 silly addNamed debug@2.6.0 -551 verbose addNamed "2.6.0" is a plain semver version for debug -552 silly mapToRegistry name debug -553 silly mapToRegistry using default registry -554 silly mapToRegistry registry https://registry.npmjs.org/ -555 silly mapToRegistry data Result { -555 silly mapToRegistry raw: 'debug', -555 silly mapToRegistry scope: null, -555 silly mapToRegistry escapedName: 'debug', -555 silly mapToRegistry name: 'debug', -555 silly mapToRegistry rawSpec: '', -555 silly mapToRegistry spec: 'latest', -555 silly mapToRegistry type: 'tag' } -556 silly mapToRegistry uri https://registry.npmjs.org/debug -557 verbose addNameVersion registry:https://registry.npmjs.org/debug not in flight; fetching -558 silly resolveWithNewModule glob@7.1.1 checking installable status -559 silly cache add args [ 'glob@7.1.1', null ] -560 verbose cache add spec glob@7.1.1 -561 silly cache add parsed spec Result { -561 silly cache add raw: 'glob@7.1.1', -561 silly cache add scope: null, -561 silly cache add escapedName: 'glob', -561 silly cache add name: 'glob', -561 silly cache add rawSpec: '7.1.1', -561 silly cache add spec: '7.1.1', -561 silly cache add type: 'version' } -562 silly addNamed glob@7.1.1 -563 verbose addNamed "7.1.1" is a plain semver version for glob -564 silly mapToRegistry name glob -565 silly mapToRegistry using default registry -566 silly mapToRegistry registry https://registry.npmjs.org/ -567 silly mapToRegistry data Result { -567 silly mapToRegistry raw: 'glob', -567 silly mapToRegistry scope: null, -567 silly mapToRegistry escapedName: 'glob', -567 silly mapToRegistry name: 'glob', -567 silly mapToRegistry rawSpec: '', -567 silly mapToRegistry spec: 'latest', -567 silly mapToRegistry type: 'tag' } -568 silly mapToRegistry uri https://registry.npmjs.org/glob -569 verbose addNameVersion registry:https://registry.npmjs.org/glob not in flight; fetching -570 verbose get https://registry.npmjs.org/debug not expired, no request -571 verbose get https://registry.npmjs.org/glob not expired, no request -572 http 304 https://registry.npmjs.org/json3 -573 verbose headers { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -573 verbose headers via: '1.1 varnish', -573 verbose headers 'cache-control': 'max-age=300', -573 verbose headers etag: '"5a5f46ca-5e53"', -573 verbose headers age: '4986', -573 verbose headers connection: 'keep-alive', -573 verbose headers 'x-served-by': 'cache-itm18824-ITM', -573 verbose headers 'x-cache': 'HIT', -573 verbose headers 'x-cache-hits': '5', -573 verbose headers 'x-timer': 'S1524740184.916670,VS0,VE0', -573 verbose headers vary: 'Accept-Encoding, Accept' } -574 silly get cb [ 304, -574 silly get { date: 'Thu, 26 Apr 2018 10:56:23 GMT', -574 silly get via: '1.1 varnish', -574 silly get 'cache-control': 'max-age=300', -574 silly get etag: '"5a5f46ca-5e53"', -574 silly get age: '4986', -574 silly get connection: 'keep-alive', -574 silly get 'x-served-by': 'cache-itm18824-ITM', -574 silly get 'x-cache': 'HIT', -574 silly get 'x-cache-hits': '5', -574 silly get 'x-timer': 'S1524740184.916670,VS0,VE0', -574 silly get vary: 'Accept-Encoding, Accept' } ] -575 verbose etag https://registry.npmjs.org/json3 from cache -576 verbose get saving json3 to /Users/zhiyuan/.npm/registry.npmjs.org/json3/.cache.json -577 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -578 verbose afterAdd /Users/zhiyuan/.npm/lodash.create/3.1.1/package/package.json written -579 silly cache afterAdd debug@2.6.0 -580 verbose afterAdd /Users/zhiyuan/.npm/debug/2.6.0/package/package.json not in flight; writing -581 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -582 silly cache afterAdd glob@7.1.1 -583 verbose afterAdd /Users/zhiyuan/.npm/glob/7.1.1/package/package.json not in flight; writing -584 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -585 silly resolveWithNewModule supports-color@3.1.2 checking installable status -586 silly cache add args [ 'supports-color@3.1.2', null ] -587 verbose cache add spec supports-color@3.1.2 -588 silly cache add parsed spec Result { -588 silly cache add raw: 'supports-color@3.1.2', -588 silly cache add scope: null, -588 silly cache add escapedName: 'supports-color', -588 silly cache add name: 'supports-color', -588 silly cache add rawSpec: '3.1.2', -588 silly cache add spec: '3.1.2', -588 silly cache add type: 'version' } -589 silly addNamed supports-color@3.1.2 -590 verbose addNamed "3.1.2" is a plain semver version for supports-color -591 silly mapToRegistry name supports-color -592 silly mapToRegistry using default registry -593 silly mapToRegistry registry https://registry.npmjs.org/ -594 silly mapToRegistry data Result { -594 silly mapToRegistry raw: 'supports-color', -594 silly mapToRegistry scope: null, -594 silly mapToRegistry escapedName: 'supports-color', -594 silly mapToRegistry name: 'supports-color', -594 silly mapToRegistry rawSpec: '', -594 silly mapToRegistry spec: 'latest', -594 silly mapToRegistry type: 'tag' } -595 silly mapToRegistry uri https://registry.npmjs.org/supports-color -596 verbose addNameVersion registry:https://registry.npmjs.org/supports-color not in flight; fetching -597 verbose get https://registry.npmjs.org/supports-color not expired, no request -598 verbose afterAdd /Users/zhiyuan/.npm/glob/7.1.1/package/package.json written -599 verbose afterAdd /Users/zhiyuan/.npm/debug/2.6.0/package/package.json written -600 silly resolveWithNewModule json3@3.3.2 checking installable status -601 silly cache add args [ 'json3@3.3.2', null ] -602 verbose cache add spec json3@3.3.2 -603 silly cache add parsed spec Result { -603 silly cache add raw: 'json3@3.3.2', -603 silly cache add scope: null, -603 silly cache add escapedName: 'json3', -603 silly cache add name: 'json3', -603 silly cache add rawSpec: '3.3.2', -603 silly cache add spec: '3.3.2', -603 silly cache add type: 'version' } -604 silly addNamed json3@3.3.2 -605 verbose addNamed "3.3.2" is a plain semver version for json3 -606 silly mapToRegistry name json3 -607 silly mapToRegistry using default registry -608 silly mapToRegistry registry https://registry.npmjs.org/ -609 silly mapToRegistry data Result { -609 silly mapToRegistry raw: 'json3', -609 silly mapToRegistry scope: null, -609 silly mapToRegistry escapedName: 'json3', -609 silly mapToRegistry name: 'json3', -609 silly mapToRegistry rawSpec: '', -609 silly mapToRegistry spec: 'latest', -609 silly mapToRegistry type: 'tag' } -610 silly mapToRegistry uri https://registry.npmjs.org/json3 -611 verbose addNameVersion registry:https://registry.npmjs.org/json3 not in flight; fetching -612 silly cache afterAdd supports-color@3.1.2 -613 verbose afterAdd /Users/zhiyuan/.npm/supports-color/3.1.2/package/package.json not in flight; writing -614 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -615 verbose get https://registry.npmjs.org/json3 not expired, no request -616 verbose afterAdd /Users/zhiyuan/.npm/supports-color/3.1.2/package/package.json written -617 silly cache afterAdd json3@3.3.2 -618 verbose afterAdd /Users/zhiyuan/.npm/json3/3.3.2/package/package.json not in flight; writing -619 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -620 verbose afterAdd /Users/zhiyuan/.npm/json3/3.3.2/package/package.json written -621 silly fetchNamedPackageData ms -622 silly mapToRegistry name ms -623 silly mapToRegistry using default registry -624 silly mapToRegistry registry https://registry.npmjs.org/ -625 silly mapToRegistry data Result { -625 silly mapToRegistry raw: 'ms', -625 silly mapToRegistry scope: null, -625 silly mapToRegistry escapedName: 'ms', -625 silly mapToRegistry name: 'ms', -625 silly mapToRegistry rawSpec: '', -625 silly mapToRegistry spec: 'latest', -625 silly mapToRegistry type: 'tag' } -626 silly mapToRegistry uri https://registry.npmjs.org/ms -627 verbose request uri https://registry.npmjs.org/ms -628 verbose request no auth needed -629 info attempt registry request try #1 at 18:56:23 -630 verbose etag "5aa9402e-498a" -631 verbose lastModified Wed, 14 Mar 2018 15:30:54 GMT -632 http request GET https://registry.npmjs.org/ms -633 http 304 https://registry.npmjs.org/ms -634 verbose headers { date: 'Thu, 26 Apr 2018 10:56:24 GMT', -634 verbose headers via: '1.1 varnish', -634 verbose headers 'cache-control': 'max-age=300', -634 verbose headers etag: '"5aa9402e-498a"', -634 verbose headers age: '12605', -634 verbose headers connection: 'keep-alive', -634 verbose headers 'x-served-by': 'cache-itm18831-ITM', -634 verbose headers 'x-cache': 'HIT', -634 verbose headers 'x-cache-hits': '61', -634 verbose headers 'x-timer': 'S1524740184.022726,VS0,VE0', -634 verbose headers vary: 'Accept-Encoding, Accept' } -635 silly get cb [ 304, -635 silly get { date: 'Thu, 26 Apr 2018 10:56:24 GMT', -635 silly get via: '1.1 varnish', -635 silly get 'cache-control': 'max-age=300', -635 silly get etag: '"5aa9402e-498a"', -635 silly get age: '12605', -635 silly get connection: 'keep-alive', -635 silly get 'x-served-by': 'cache-itm18831-ITM', -635 silly get 'x-cache': 'HIT', -635 silly get 'x-cache-hits': '61', -635 silly get 'x-timer': 'S1524740184.022726,VS0,VE0', -635 silly get vary: 'Accept-Encoding, Accept' } ] -636 verbose etag https://registry.npmjs.org/ms from cache -637 verbose get saving ms to /Users/zhiyuan/.npm/registry.npmjs.org/ms/.cache.json -638 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -639 silly resolveWithNewModule ms@0.7.2 checking installable status -640 silly cache add args [ 'ms@0.7.2', null ] -641 verbose cache add spec ms@0.7.2 -642 silly cache add parsed spec Result { -642 silly cache add raw: 'ms@0.7.2', -642 silly cache add scope: null, -642 silly cache add escapedName: 'ms', -642 silly cache add name: 'ms', -642 silly cache add rawSpec: '0.7.2', -642 silly cache add spec: '0.7.2', -642 silly cache add type: 'version' } -643 silly addNamed ms@0.7.2 -644 verbose addNamed "0.7.2" is a plain semver version for ms -645 silly mapToRegistry name ms -646 silly mapToRegistry using default registry -647 silly mapToRegistry registry https://registry.npmjs.org/ -648 silly mapToRegistry data Result { -648 silly mapToRegistry raw: 'ms', -648 silly mapToRegistry scope: null, -648 silly mapToRegistry escapedName: 'ms', -648 silly mapToRegistry name: 'ms', -648 silly mapToRegistry rawSpec: '', -648 silly mapToRegistry spec: 'latest', -648 silly mapToRegistry type: 'tag' } -649 silly mapToRegistry uri https://registry.npmjs.org/ms -650 verbose addNameVersion registry:https://registry.npmjs.org/ms not in flight; fetching -651 verbose get https://registry.npmjs.org/ms not expired, no request -652 silly cache afterAdd ms@0.7.2 -653 verbose afterAdd /Users/zhiyuan/.npm/ms/0.7.2/package/package.json not in flight; writing -654 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -655 verbose afterAdd /Users/zhiyuan/.npm/ms/0.7.2/package/package.json written -656 silly fetchNamedPackageData lodash._basecreate -657 silly mapToRegistry name lodash._basecreate -658 silly mapToRegistry using default registry -659 silly mapToRegistry registry https://registry.npmjs.org/ -660 silly mapToRegistry data Result { -660 silly mapToRegistry raw: 'lodash._basecreate', -660 silly mapToRegistry scope: null, -660 silly mapToRegistry escapedName: 'lodash._basecreate', -660 silly mapToRegistry name: 'lodash._basecreate', -660 silly mapToRegistry rawSpec: '', -660 silly mapToRegistry spec: 'latest', -660 silly mapToRegistry type: 'tag' } -661 silly mapToRegistry uri https://registry.npmjs.org/lodash._basecreate -662 verbose request uri https://registry.npmjs.org/lodash._basecreate -663 verbose request no auth needed -664 info attempt registry request try #1 at 18:56:23 -665 verbose etag "57f681c8-329b" -666 verbose lastModified Thu, 6 Oct 2016 16:54:32 GMT -667 http request GET https://registry.npmjs.org/lodash._basecreate -668 http 304 https://registry.npmjs.org/lodash._basecreate -669 verbose headers { date: 'Thu, 26 Apr 2018 10:56:24 GMT', -669 verbose headers via: '1.1 varnish', -669 verbose headers 'cache-control': 'max-age=300', -669 verbose headers etag: '"57f681c8-329b"', -669 verbose headers age: '4090', -669 verbose headers connection: 'keep-alive', -669 verbose headers 'x-served-by': 'cache-itm18829-ITM', -669 verbose headers 'x-cache': 'HIT', -669 verbose headers 'x-cache-hits': '1', -669 verbose headers 'x-timer': 'S1524740184.150124,VS0,VE0', -669 verbose headers vary: 'Accept-Encoding, Accept' } -670 silly get cb [ 304, -670 silly get { date: 'Thu, 26 Apr 2018 10:56:24 GMT', -670 silly get via: '1.1 varnish', -670 silly get 'cache-control': 'max-age=300', -670 silly get etag: '"57f681c8-329b"', -670 silly get age: '4090', -670 silly get connection: 'keep-alive', -670 silly get 'x-served-by': 'cache-itm18829-ITM', -670 silly get 'x-cache': 'HIT', -670 silly get 'x-cache-hits': '1', -670 silly get 'x-timer': 'S1524740184.150124,VS0,VE0', -670 silly get vary: 'Accept-Encoding, Accept' } ] -671 verbose etag https://registry.npmjs.org/lodash._basecreate from cache -672 verbose get saving lodash._basecreate to /Users/zhiyuan/.npm/registry.npmjs.org/lodash._basecreate/.cache.json -673 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -674 silly resolveWithNewModule lodash._basecreate@3.0.3 checking installable status -675 silly cache add args [ 'lodash._basecreate@^3.0.0', null ] -676 verbose cache add spec lodash._basecreate@^3.0.0 -677 silly cache add parsed spec Result { -677 silly cache add raw: 'lodash._basecreate@^3.0.0', -677 silly cache add scope: null, -677 silly cache add escapedName: 'lodash._basecreate', -677 silly cache add name: 'lodash._basecreate', -677 silly cache add rawSpec: '^3.0.0', -677 silly cache add spec: '>=3.0.0 <4.0.0', -677 silly cache add type: 'range' } -678 silly addNamed lodash._basecreate@>=3.0.0 <4.0.0 -679 verbose addNamed ">=3.0.0 <4.0.0" is a valid semver range for lodash._basecreate -680 silly addNameRange { name: 'lodash._basecreate', -680 silly addNameRange range: '>=3.0.0 <4.0.0', -680 silly addNameRange hasData: false } -681 silly mapToRegistry name lodash._basecreate -682 silly mapToRegistry using default registry -683 silly mapToRegistry registry https://registry.npmjs.org/ -684 silly mapToRegistry data Result { -684 silly mapToRegistry raw: 'lodash._basecreate', -684 silly mapToRegistry scope: null, -684 silly mapToRegistry escapedName: 'lodash._basecreate', -684 silly mapToRegistry name: 'lodash._basecreate', -684 silly mapToRegistry rawSpec: '', -684 silly mapToRegistry spec: 'latest', -684 silly mapToRegistry type: 'tag' } -685 silly mapToRegistry uri https://registry.npmjs.org/lodash._basecreate -686 verbose addNameRange registry:https://registry.npmjs.org/lodash._basecreate not in flight; fetching -687 verbose get https://registry.npmjs.org/lodash._basecreate not expired, no request -688 silly addNameRange number 2 { name: 'lodash._basecreate', -688 silly addNameRange range: '>=3.0.0 <4.0.0', -688 silly addNameRange hasData: true } -689 silly addNameRange versions [ 'lodash._basecreate', -689 silly addNameRange [ '2.3.0', '2.4.0', '2.4.1', '3.0.0', '3.0.1', '3.0.2', '3.0.3' ] ] -690 silly addNamed lodash._basecreate@3.0.3 -691 verbose addNamed "3.0.3" is a plain semver version for lodash._basecreate -692 silly cache afterAdd lodash._basecreate@3.0.3 -693 verbose afterAdd /Users/zhiyuan/.npm/lodash._basecreate/3.0.3/package/package.json not in flight; writing -694 verbose correctMkdir /Users/zhiyuan/.npm correctMkdir not in flight; initializing -695 verbose afterAdd /Users/zhiyuan/.npm/lodash._basecreate/3.0.3/package/package.json written -696 silly fetchNamedPackageData del -697 silly mapToRegistry name del -698 silly mapToRegistry using default registry -699 silly mapToRegistry registry https://registry.npmjs.org/ -700 silly mapToRegistry data Result { -700 silly mapToRegistry raw: 'del', -700 silly mapToRegistry scope: null, -700 silly mapToRegistry escapedName: 'del', -700 silly mapToRegistry name: 'del', -700 silly mapToRegistry rawSpec: '', -700 silly mapToRegistry spec: 'latest', -700 silly mapToRegistry type: 'tag' } -701 silly mapToRegistry uri https://registry.npmjs.org/del -702 verbose stack Error: write EIO -702 verbose stack at _errnoException (util.js:1024:11) -702 verbose stack at WriteWrap.afterWrite [as oncomplete] (net.js:867:14) -703 verbose cwd /Users/zhiyuan/Desktop/www/portalnetwork-project/metamask-extension -704 error Darwin 16.7.0 -705 error argv "/Users/zhiyuan/.nvm/versions/node/v8.9.1/bin/node" "/usr/local/bin/npm" "i" -706 error node v8.9.1 -707 error npm v3.10.10 -708 error code EIO -709 error errno EIO -710 error syscall write -711 error write EIO -712 error If you need help, you may report this error at: -712 error -713 verbose exit [ 1, true ] From 384cb126dd3cdf0d1dcf67525d7a390436ec6ea2 Mon Sep 17 00:00:00 2001 From: Yung chieh Tsai Date: Tue, 29 May 2018 19:29:12 +0800 Subject: [PATCH 06/64] Update lib --- app/404.html | 26 +++++++++++++- app/scripts/lib/ipfsContent.js | 2 +- app/scripts/lib/resolver.js | 66 +++++++++++++++++++++++----------- 3 files changed, 71 insertions(+), 23 deletions(-) diff --git a/app/404.html b/app/404.html index 0dbab69a7..f66723ad6 100644 --- a/app/404.html +++ b/app/404.html @@ -17,12 +17,36 @@ width: 100%; height: 100%; } + .app{ + position: relative; + width: 100%; + height: auto; + overflow: hidden; + } img{ display: block; + width: 100%; + height: auto; + } + h2{ + display: block; + width: 100%; + overflow: hidden; + position: absolute; + bottom: 20%; + left: 0; + color: #1b243d; + text-align: center; + } + h2 > a{ + color: #1b243d; } - +
+ +

Powered by Portal Network

+
\ No newline at end of file diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js index 4d66745e9..bf04c854b 100644 --- a/app/scripts/lib/ipfsContent.js +++ b/app/scripts/lib/ipfsContent.js @@ -16,7 +16,7 @@ module.exports = function (provider) { clearTimeout(clearTime) let url = 'https://gateway.ipfs.io/ipfs/' + ipfsHash return fetch(url, { method: 'HEAD' }).then(response => response.status).then(statusCode => { - if (statusCode !== 200) return 'Local' + if (statusCode !== 200) return extension.tabs.update(tab.id, { url: '404.html' }) extension.tabs.update(tab.id, { url: url }) }) .catch(err => { diff --git a/app/scripts/lib/resolver.js b/app/scripts/lib/resolver.js index dec43c481..2bf9dac50 100644 --- a/app/scripts/lib/resolver.js +++ b/app/scripts/lib/resolver.js @@ -1,6 +1,5 @@ const namehash = require('eth-ens-namehash') const multihash = require('multihashes') -const REGISTRAR_ENS_MAIN_NET = '0x314159265dd8dbb310642f98f50c066173c1259b' const HttpProvider = require('ethjs-provider-http') const Eth = require('ethjs-query') const EthContract = require('ethjs-contract') @@ -8,32 +7,57 @@ const registrarAbi = require('./contracts/registrar') const resolverAbi = require('./contracts/resolver') function ens (name, provider) { - const eth = new Eth(new HttpProvider(provider.rpcTarget)) + const eth = new Eth(new HttpProvider(getProvider(provider.type))) const hash = namehash.hash(name) const contract = new EthContract(eth) - const Registrar = contract(registrarAbi).at(REGISTRAR_ENS_MAIN_NET) + const Registrar = contract(registrarAbi).at(getRegistrar(provider.type)) return new Promise((resolve, reject) => { - if (provider.type !== 'mainnet') reject('unsupport') - Registrar.resolver(hash).then((address) => { - if (address === '0x0000000000000000000000000000000000000000') { - reject(null) - } else { - const Resolver = contract(resolverAbi).at(address['0']) - return Resolver.content(hash) - } - }).then((contentHash) => { - if (contentHash['0'] === '0x0000000000000000000000000000000000000000000000000000000000000000') reject(null) - if (contentHash.ret !== '0x') { - const hex = contentHash['0'].substring(2) - const buf = multihash.fromHexString(hex) - resolve(multihash.toB58String(buf)) - } else { - reject(null) - } - }) + if (provider.type === 'mainnet' || provider.type === 'ropsten') { + Registrar.resolver(hash).then((address) => { + if (address === '0x0000000000000000000000000000000000000000') { + reject(null) + } else { + const Resolver = contract(resolverAbi).at(address['0']) + return Resolver.content(hash) + } + }).then((contentHash) => { + if (contentHash['0'] === '0x0000000000000000000000000000000000000000000000000000000000000000') reject(null) + if (contentHash.ret !== '0x') { + const hex = contentHash['0'].substring(2) + const buf = multihash.fromHexString(hex) + resolve(multihash.toB58String(multihash.encode(buf, 'sha2-256'))) + } else { + reject(null) + } + }) + } else { + return reject('unsupport') + } }) } +function getProvider (type) { + switch (type) { + case 'mainnet': + return 'https://mainnet.infura.io/' + case 'ropsten': + return 'https://ropsten.infura.io/' + default: + return 'http://localhost:3000/' + } +} + +function getRegistrar (type) { + switch (type) { + case 'mainnet': + return '0x314159265dd8dbb310642f98f50c066173c1259b' + case 'ropsten': + return '0x112234455c3a32fd11230c42e7bccd4a84e02010' + default: + return '0x0000000000000000000000000000000000000000' + } +} + module.exports.resolve = function (name, provider) { const path = name.split('.') const tld = path[path.length - 1] From 181a11eae2c4059a7c3f0f15bb96630c0761ae7b Mon Sep 17 00:00:00 2001 From: Yung chieh Tsai Date: Wed, 30 May 2018 09:57:31 +0800 Subject: [PATCH 07/64] Update default provider --- app/scripts/lib/resolver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/lib/resolver.js b/app/scripts/lib/resolver.js index 2bf9dac50..6786929d8 100644 --- a/app/scripts/lib/resolver.js +++ b/app/scripts/lib/resolver.js @@ -43,7 +43,7 @@ function getProvider (type) { case 'ropsten': return 'https://ropsten.infura.io/' default: - return 'http://localhost:3000/' + return 'http://localhost:8545/' } } From 68d119ce3fb25e421c93f44c4bfffe51d38bf34b Mon Sep 17 00:00:00 2001 From: Yung chieh Tsai Date: Wed, 30 May 2018 11:52:28 +0800 Subject: [PATCH 08/64] Update app --- old-ui/app/app.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/old-ui/app/app.js b/old-ui/app/app.js index cd6292e79..00ed2b8f6 100644 --- a/old-ui/app/app.js +++ b/old-ui/app/app.js @@ -184,13 +184,6 @@ App.prototype.renderAppBar = function () { }, }), - // mike test img - h('img', { - height: 24, - width: 24, - src: './images/pw-48x48.png', - }), - ]), props.isUnlocked && h('div', { From 4e14313ba8a72648be810f3e78d6e5849b363d11 Mon Sep 17 00:00:00 2001 From: Yung chieh Tsai Date: Fri, 1 Jun 2018 11:26:44 +0800 Subject: [PATCH 09/64] Update manifest.json --- app/manifest.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/manifest.json b/app/manifest.json index 0f5a2566f..1a4114a1b 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_appName__", "short_name": "__MSG_appName__", - "version": "4.6.2", + "version": "4.6.0", "manifest_version": 2, "author": "https://metamask.io", "description": "__MSG_appDescription__", @@ -65,13 +65,12 @@ "*://*.eth/" ], "web_accessible_resources": [ - "inpage.js", - "*" + "inpage.js" ], "externally_connectable": { "matches": [ "https://metamask.io/*" ] }, - "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" + "content_security_policy": "script-src 'self'; object-src 'self'" } From 77d17f2d55a3e3ed704324020f6ec4b42cc4dde2 Mon Sep 17 00:00:00 2001 From: Yung chieh Tsai Date: Fri, 1 Jun 2018 11:27:05 +0800 Subject: [PATCH 10/64] Update ipfs to infura --- app/scripts/lib/ipfsContent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js index bf04c854b..46131b266 100644 --- a/app/scripts/lib/ipfsContent.js +++ b/app/scripts/lib/ipfsContent.js @@ -14,13 +14,13 @@ module.exports = function (provider) { resolver.resolve(name, provider).then(ipfsHash => { clearTimeout(clearTime) - let url = 'https://gateway.ipfs.io/ipfs/' + ipfsHash + let url = 'https://ipfs.infura.io/ipfs/' + ipfsHash return fetch(url, { method: 'HEAD' }).then(response => response.status).then(statusCode => { if (statusCode !== 200) return extension.tabs.update(tab.id, { url: '404.html' }) extension.tabs.update(tab.id, { url: url }) }) .catch(err => { - url = 'https://gateway.ipfs.io/ipfs/' + ipfsHash + url = 'https://ipfs.infura.io/ipfs/' + ipfsHash extension.tabs.update(tab.id, {url: url}) return err }) From cc5bdadbf1f12f3f8d7f24f9bcf7ea81fe93f012 Mon Sep 17 00:00:00 2001 From: Yung chieh Tsai Date: Fri, 1 Jun 2018 15:30:57 +0800 Subject: [PATCH 11/64] Update 404 --- app/404.html | 1 - 1 file changed, 1 deletion(-) diff --git a/app/404.html b/app/404.html index f66723ad6..5a1585318 100644 --- a/app/404.html +++ b/app/404.html @@ -46,7 +46,6 @@
-

Powered by Portal Network

\ No newline at end of file From 8a571ece367f089e9cfef45fed925736c5858e82 Mon Sep 17 00:00:00 2001 From: PhyrexTsai Date: Sat, 2 Jun 2018 00:00:11 +0800 Subject: [PATCH 12/64] Update 404.html --- app/404.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/404.html b/app/404.html index 5a1585318..8a6df9d7a 100644 --- a/app/404.html +++ b/app/404.html @@ -46,6 +46,7 @@
+

Powered by Portal Network

- \ No newline at end of file + From bbd1b8360ae652da49d583e15b65ad34f27ce039 Mon Sep 17 00:00:00 2001 From: trejgun Date: Wed, 20 Jun 2018 12:51:21 +0800 Subject: [PATCH 13/64] fix white spaces in signature --- ui/app/css/itcss/components/request-signature.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/app/css/itcss/components/request-signature.scss b/ui/app/css/itcss/components/request-signature.scss index 4707ff60e..b607aded3 100644 --- a/ui/app/css/itcss/components/request-signature.scss +++ b/ui/app/css/itcss/components/request-signature.scss @@ -181,6 +181,7 @@ overflow-wrap: break-word; border-bottom: 1px solid #d2d8dd; padding: 6px 18px 15px; + white-space: pre-line; } &__help-link { From de01a6f112716cad8ebc1fd56dd304f1818704f4 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 28 Jun 2018 13:17:44 -0230 Subject: [PATCH 14/64] Use background gas price estimation method in new ui. --- app/scripts/metamask-controller.js | 1 + ui/app/actions.js | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index d40a351a5..2055a2dc2 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -338,6 +338,7 @@ module.exports = class MetamaskController extends EventEmitter { markAccountsFound: this.markAccountsFound.bind(this), markPasswordForgotten: this.markPasswordForgotten.bind(this), unMarkPasswordForgotten: this.unMarkPasswordForgotten.bind(this), + getGasPrice: (cb) => cb(null, this.getGasPrice()), // coinbase buyEth: this.buyEth.bind(this), diff --git a/ui/app/actions.js b/ui/app/actions.js index 41fc3c504..f118251eb 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -746,20 +746,26 @@ function updateGasData ({ }) { return (dispatch) => { dispatch(actions.gasLoadingStarted()) - const estimatedGasPrice = estimateGasPriceFromRecentBlocks(recentBlocks) - return Promise.all([ - Promise.resolve(estimatedGasPrice), - estimateGas({ + let gasPrice + return (() => new Promise((resolve, reject) => { + background.getGasPrice((err, data) => { + if(err !== null) return reject(err); + return resolve(data); + }) + }))() + .then(estimateGasPrice => { + gasPrice = estimateGasPrice + return estimateGas({ estimateGasMethod: background.estimateGas, blockGasLimit, selectedAddress, selectedToken, to, value, - gasPrice: estimatedGasPrice, - }), - ]) - .then(([gasPrice, gas]) => { + gasPrice, + }) + }) + .then(gas => { dispatch(actions.setGasPrice(gasPrice)) dispatch(actions.setGasLimit(gas)) return calcGasTotal(gas, gasPrice) From 11736e6318182ab5b43430410a46059e5f46ad52 Mon Sep 17 00:00:00 2001 From: PhyrexTsai Date: Fri, 29 Jun 2018 13:57:41 +0800 Subject: [PATCH 15/64] Update to support pathnames on IPFS hash As @Georgi87 mentioned about pathnames on the domain like `http://phyrextsai.eth/home` will pass to IPFS hash and append `/home` on redirection url. You can try the example below: http://phyrextsai.eth/index.html http://phyrextsai.eth/images/phyrex.jpg --- app/scripts/lib/ipfsContent.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js index 46131b266..2ddbe5558 100644 --- a/app/scripts/lib/ipfsContent.js +++ b/app/scripts/lib/ipfsContent.js @@ -3,8 +3,12 @@ const resolver = require('./resolver.js') module.exports = function (provider) { extension.webRequest.onBeforeRequest.addListener(details => { - const name = details.url.substring(7, details.url.length - 1) + const urlhttpreplace = details.url.replace(/\w+?:\/\//, "") + const url = urlhttpreplace.replace(/[\\\/].*/g, "") + let domainhtml = urlhttpreplace.match(/[\\\/].*/g) let clearTime = null + let name = url.replace(/\/$/g, "") + if (domainhtml === null) domainhtml = [""] extension.tabs.getSelected(null, tab => { extension.tabs.update(tab.id, { url: 'loading.html' }) @@ -14,13 +18,13 @@ module.exports = function (provider) { resolver.resolve(name, provider).then(ipfsHash => { clearTimeout(clearTime) - let url = 'https://ipfs.infura.io/ipfs/' + ipfsHash + let url = 'https://ipfs.infura.io/ipfs/' + ipfsHash + domainhtml[0] return fetch(url, { method: 'HEAD' }).then(response => response.status).then(statusCode => { if (statusCode !== 200) return extension.tabs.update(tab.id, { url: '404.html' }) extension.tabs.update(tab.id, { url: url }) }) .catch(err => { - url = 'https://ipfs.infura.io/ipfs/' + ipfsHash + url = 'https://ipfs.infura.io/ipfs/' + ipfsHash + domainhtml[0] extension.tabs.update(tab.id, {url: url}) return err }) @@ -32,5 +36,5 @@ module.exports = function (provider) { }) }) return { cancel: true } - }, {urls: ['*://*.eth/']}) + }, {urls: ['*://*.eth/', '*://*.eth/*']}) } From 13b03ec090df70512d43e0d6acbe6bf60040a892 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Tue, 3 Jul 2018 14:29:36 -0400 Subject: [PATCH 16/64] fix lint errors --- app/scripts/background.js | 1 - app/scripts/lib/contracts/registrar.js | 2 +- app/scripts/lib/contracts/resolver.js | 2 +- app/scripts/lib/ipfsContent.js | 10 +-- package-lock.json | 91 +++++++++++++++++++++----- 5 files changed, 81 insertions(+), 25 deletions(-) diff --git a/app/scripts/background.js b/app/scripts/background.js index f751867cc..1479d9f72 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -69,7 +69,6 @@ initialize().catch(log.error) setupMetamaskMeshMetrics() - /** * An object representing a transaction, in whatever state it is in. * @typedef TransactionMeta diff --git a/app/scripts/lib/contracts/registrar.js b/app/scripts/lib/contracts/registrar.js index 980a64d7f..99ca24458 100644 --- a/app/scripts/lib/contracts/registrar.js +++ b/app/scripts/lib/contracts/registrar.js @@ -1 +1 @@ -module.exports = [{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"label","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"name":"","type":"uint64"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"label","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"}] \ No newline at end of file +module.exports = [{'constant': true, 'inputs': [{'name': 'node', 'type': 'bytes32'}], 'name': 'resolver', 'outputs': [{'name': '', 'type': 'address'}], 'payable': false, 'type': 'function'}, {'constant': true, 'inputs': [{'name': 'node', 'type': 'bytes32'}], 'name': 'owner', 'outputs': [{'name': '', 'type': 'address'}], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'label', 'type': 'bytes32'}, {'name': 'owner', 'type': 'address'}], 'name': 'setSubnodeOwner', 'outputs': [], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'ttl', 'type': 'uint64'}], 'name': 'setTTL', 'outputs': [], 'payable': false, 'type': 'function'}, {'constant': true, 'inputs': [{'name': 'node', 'type': 'bytes32'}], 'name': 'ttl', 'outputs': [{'name': '', 'type': 'uint64'}], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'resolver', 'type': 'address'}], 'name': 'setResolver', 'outputs': [], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'owner', 'type': 'address'}], 'name': 'setOwner', 'outputs': [], 'payable': false, 'type': 'function'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': false, 'name': 'owner', 'type': 'address'}], 'name': 'Transfer', 'type': 'event'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': true, 'name': 'label', 'type': 'bytes32'}, {'indexed': false, 'name': 'owner', 'type': 'address'}], 'name': 'NewOwner', 'type': 'event'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': false, 'name': 'resolver', 'type': 'address'}], 'name': 'NewResolver', 'type': 'event'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': false, 'name': 'ttl', 'type': 'uint64'}], 'name': 'NewTTL', 'type': 'event'}] diff --git a/app/scripts/lib/contracts/resolver.js b/app/scripts/lib/contracts/resolver.js index f42777cc7..1bf3f90ce 100644 --- a/app/scripts/lib/contracts/resolver.js +++ b/app/scripts/lib/contracts/resolver.js @@ -1,2 +1,2 @@ module.exports = -[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"},{"name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"name":"contentType","type":"uint256"},{"name":"data","type":"bytes"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"x","type":"bytes32"},{"name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"content","outputs":[{"name":"ret","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"addr","outputs":[{"name":"ret","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"contentType","type":"uint256"},{"name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"name","outputs":[{"name":"ret","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"hash","type":"bytes32"}],"name":"setContent","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"name":"x","type":"bytes32"},{"name":"y","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"addr","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"ensAddr","type":"address"}],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"hash","type":"bytes32"}],"name":"ContentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"x","type":"bytes32"},{"indexed":false,"name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"}] \ No newline at end of file +[{'constant': true, 'inputs': [{'name': 'interfaceID', 'type': 'bytes4'}], 'name': 'supportsInterface', 'outputs': [{'name': '', 'type': 'bool'}], 'payable': false, 'type': 'function'}, {'constant': true, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'contentTypes', 'type': 'uint256'}], 'name': 'ABI', 'outputs': [{'name': 'contentType', 'type': 'uint256'}, {'name': 'data', 'type': 'bytes'}], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'x', 'type': 'bytes32'}, {'name': 'y', 'type': 'bytes32'}], 'name': 'setPubkey', 'outputs': [], 'payable': false, 'type': 'function'}, {'constant': true, 'inputs': [{'name': 'node', 'type': 'bytes32'}], 'name': 'content', 'outputs': [{'name': 'ret', 'type': 'bytes32'}], 'payable': false, 'type': 'function'}, {'constant': true, 'inputs': [{'name': 'node', 'type': 'bytes32'}], 'name': 'addr', 'outputs': [{'name': 'ret', 'type': 'address'}], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'contentType', 'type': 'uint256'}, {'name': 'data', 'type': 'bytes'}], 'name': 'setABI', 'outputs': [], 'payable': false, 'type': 'function'}, {'constant': true, 'inputs': [{'name': 'node', 'type': 'bytes32'}], 'name': 'name', 'outputs': [{'name': 'ret', 'type': 'string'}], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'name', 'type': 'string'}], 'name': 'setName', 'outputs': [], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'hash', 'type': 'bytes32'}], 'name': 'setContent', 'outputs': [], 'payable': false, 'type': 'function'}, {'constant': true, 'inputs': [{'name': 'node', 'type': 'bytes32'}], 'name': 'pubkey', 'outputs': [{'name': 'x', 'type': 'bytes32'}, {'name': 'y', 'type': 'bytes32'}], 'payable': false, 'type': 'function'}, {'constant': false, 'inputs': [{'name': 'node', 'type': 'bytes32'}, {'name': 'addr', 'type': 'address'}], 'name': 'setAddr', 'outputs': [], 'payable': false, 'type': 'function'}, {'inputs': [{'name': 'ensAddr', 'type': 'address'}], 'payable': false, 'type': 'constructor'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': false, 'name': 'a', 'type': 'address'}], 'name': 'AddrChanged', 'type': 'event'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': false, 'name': 'hash', 'type': 'bytes32'}], 'name': 'ContentChanged', 'type': 'event'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': false, 'name': 'name', 'type': 'string'}], 'name': 'NameChanged', 'type': 'event'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': true, 'name': 'contentType', 'type': 'uint256'}], 'name': 'ABIChanged', 'type': 'event'}, {'anonymous': false, 'inputs': [{'indexed': true, 'name': 'node', 'type': 'bytes32'}, {'indexed': false, 'name': 'x', 'type': 'bytes32'}, {'indexed': false, 'name': 'y', 'type': 'bytes32'}], 'name': 'PubkeyChanged', 'type': 'event'}] diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js index 2ddbe5558..a6b99b2f9 100644 --- a/app/scripts/lib/ipfsContent.js +++ b/app/scripts/lib/ipfsContent.js @@ -3,12 +3,12 @@ const resolver = require('./resolver.js') module.exports = function (provider) { extension.webRequest.onBeforeRequest.addListener(details => { - const urlhttpreplace = details.url.replace(/\w+?:\/\//, "") - const url = urlhttpreplace.replace(/[\\\/].*/g, "") - let domainhtml = urlhttpreplace.match(/[\\\/].*/g) + const urlhttpreplace = details.url.replace(/\w+?:\/\//, '') + const url = urlhttpreplace.replace(/[\\/].*/g, '') // eslint-disable-line no-useless-escape + let domainhtml = urlhttpreplace.match(/[\\/].*/g) // eslint-disable-line no-useless-escape let clearTime = null - let name = url.replace(/\/$/g, "") - if (domainhtml === null) domainhtml = [""] + const name = url.replace(/\/$/g, '') + if (domainhtml === null) domainhtml = [''] extension.tabs.getSelected(null, tab => { extension.tabs.update(tab.id, { url: 'loading.html' }) diff --git a/package-lock.json b/package-lock.json index 5c05bad5e..d2852f29a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8352,11 +8352,11 @@ "from": "github:MetaMask/eth-contract-metadata#master" }, "eth-ens-namehash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-1.0.2.tgz", - "integrity": "sha1-Bezda6wtf9e8XKhKmTxrrZ2k7bk=", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", "requires": { - "idna-uts46": "^1.0.1", + "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" }, "dependencies": { @@ -8548,13 +8548,12 @@ "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", "requires": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#4ea2fdfed09e8f99117d9362d17c6b01b64a2bcf", "ethereumjs-util": "^5.1.1" }, "dependencies": { "ethereumjs-abi": { "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#4ea2fdfed09e8f99117d9362d17c6b01b64a2bcf", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git#4ea2fdfed09e8f99117d9362d17c6b01b64a2bcf", "requires": { "bn.js": "^4.10.0", "ethereumjs-util": "^5.0.0" @@ -9244,6 +9243,22 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, + "eth-ens-namehash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-1.0.2.tgz", + "integrity": "sha1-Bezda6wtf9e8XKhKmTxrrZ2k7bk=", + "requires": { + "idna-uts46": "^1.0.1", + "js-sha3": "^0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + } + } + }, "ethjs-contract": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/ethjs-contract/-/ethjs-contract-0.1.9.tgz", @@ -15100,6 +15115,21 @@ "requires": { "punycode": "^2.1.0" }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "requires": { + "punycode": "2.1.0" + }, "dependencies": { "punycode": { "version": "2.1.0", @@ -20048,6 +20078,38 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multihashes": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.13.tgz", + "integrity": "sha512-HwJGEKPCpLlNlgGQA56CYh/Wsqa+c4JAq8+mheIgw7OK5T4QvNJqgp6TH8gZ4q4l1aiWeNat/H/MrFXmTuoFfQ==", + "requires": { + "bs58": "^4.0.1", + "varint": "^5.0.0" + }, + "dependencies": { + "base-x": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", + "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "varint": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", + "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" + } + } + }, "multimatch": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", @@ -20200,7 +20262,7 @@ "requires": { "async": "^1.3.0", "flat-arguments": "^1.0.0", - "lodash": "^4.17.5", + "lodash": "^3.10.0", "minimist": "^1.1.0" }, "dependencies": { @@ -20210,7 +20272,7 @@ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "lodash": { - "version": "4.17.5", + "version": "3.10.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" } @@ -30585,7 +30647,6 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "requires": { "is-typedarray": "^1.0.0" } @@ -31609,7 +31670,6 @@ "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.3.tgz", "integrity": "sha1-yqRDc9yIFayHZ73ba6cwc5ZMqos=", "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", "crypto-js": "^3.1.4", "utf8": "^2.1.1", "xhr2": "*", @@ -31618,7 +31678,7 @@ "dependencies": { "bignumber.js": { "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git" + "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" } } }, @@ -32117,8 +32177,7 @@ "dev": true, "requires": { "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.34", - "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" + "web3-core-helpers": "1.0.0-beta.34" }, "dependencies": { "underscore": { @@ -32129,8 +32188,7 @@ }, "websocket": { "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", - "dev": true, + "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", "requires": { "debug": "^2.2.0", "nan": "^2.3.3", @@ -33486,8 +33544,7 @@ "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", - "dev": true + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" }, "yallist": { "version": "2.1.2", From 7babacf062cd77235ecfba3ca352a65f3a702728 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 28 Jun 2018 21:40:06 -0230 Subject: [PATCH 17/64] Remove unnecessary anonymous function call in actions.js gas estimation. --- ui/app/actions.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ui/app/actions.js b/ui/app/actions.js index f118251eb..408bc700b 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -6,7 +6,6 @@ const { calcGasTotal, calcTokenBalance, estimateGas, - estimateGasPriceFromRecentBlocks, } = require('./components/send_/send.utils') const ethUtil = require('ethereumjs-util') const { fetchLocale } = require('../i18n-helper') @@ -747,12 +746,12 @@ function updateGasData ({ return (dispatch) => { dispatch(actions.gasLoadingStarted()) let gasPrice - return (() => new Promise((resolve, reject) => { - background.getGasPrice((err, data) => { - if(err !== null) return reject(err); - return resolve(data); - }) - }))() + return new Promise((resolve, reject) => { + background.getGasPrice((err, data) => { + if (err !== null) return reject(err) + return resolve(data) + }) + }) .then(estimateGasPrice => { gasPrice = estimateGasPrice return estimateGas({ From d3c64358c5e24c21839f828954512e4939ddcad4 Mon Sep 17 00:00:00 2001 From: Sara Reynolds Date: Thu, 28 Jun 2018 16:32:49 -0700 Subject: [PATCH 18/64] :qw :wq q --- ui/app/selectors.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ui/app/selectors.js b/ui/app/selectors.js index cf0affe9c..3e2253550 100644 --- a/ui/app/selectors.js +++ b/ui/app/selectors.js @@ -17,8 +17,6 @@ const selectors = { accountsWithSendEtherInfoSelector, getCurrentAccountWithSendEtherInfo, getGasIsLoading, - getGasPrice, - getGasLimit, getForceGasMin, getAddressBook, getSendFrom, @@ -122,14 +120,6 @@ function getGasIsLoading (state) { return state.appState.gasIsLoading } -function getGasPrice (state) { - return state.metamask.send.gasPrice -} - -function getGasLimit (state) { - return state.metamask.send.gasLimit -} - function getForceGasMin (state) { return state.metamask.send.forceGasMin } From 6bc7647c05930b6683308ffde35afbde29cbe258 Mon Sep 17 00:00:00 2001 From: Sara Reynolds Date: Tue, 3 Jul 2018 16:04:31 -0700 Subject: [PATCH 19/64] fixes 4666 --- ui/app/components/customize-gas-modal/index.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ui/app/components/customize-gas-modal/index.js b/ui/app/components/customize-gas-modal/index.js index cd8f76ed5..cefa428b9 100644 --- a/ui/app/components/customize-gas-modal/index.js +++ b/ui/app/components/customize-gas-modal/index.js @@ -31,8 +31,6 @@ const { } = require('../../conversion-util') const { - getGasPrice, - getGasLimit, getGasIsLoading, getForceGasMin, conversionRateSelector, @@ -44,6 +42,11 @@ const { getSendMaxModeState, } = require('../../selectors') +const { + getGasPrice, + getGasLimit, +} = require('../send_/send.selectors') + function mapStateToProps (state) { const selectedToken = getSelectedToken(state) const currentAccount = getSendFrom(state) || getCurrentAccountWithSendEtherInfo(state) From 0796fc58e4638df9e448654b199b661cb2a492aa Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 29 Jun 2018 14:49:40 -0230 Subject: [PATCH 20/64] Improve send token error ux. --- .../send-amount-row.component.js | 15 ++++ .../send-amount-row.container.js | 5 +- .../tests/send-amount-row-component.test.js | 29 +++++++ .../tests/send-amount-row-container.test.js | 18 ++++- .../send-gas-row/send-gas-row.component.js | 8 +- .../send-gas-row/send-gas-row.container.js | 5 +- .../send-gas-row/send-gas-row.selectors.js | 9 ++- .../tests/send-gas-row-component.test.js | 5 ++ .../tests/send-gas-row-container.test.js | 6 +- .../tests/send-gas-row-selectors.test.js | 33 +++++++- ui/app/components/send_/send.component.js | 19 ++++- ui/app/components/send_/send.container.js | 2 + ui/app/components/send_/send.utils.js | 33 +++++++- .../send_/tests/send-component.test.js | 75 ++++++++++++++++++- .../send_/tests/send-container.test.js | 12 +++ .../components/send_/tests/send-utils.test.js | 46 +++++++++++- ui/app/ducks/send.duck.js | 7 ++ ui/app/ducks/tests/send-duck.test.js | 10 +++ 18 files changed, 320 insertions(+), 17 deletions(-) diff --git a/ui/app/components/send_/send-content/send-amount-row/send-amount-row.component.js b/ui/app/components/send_/send-content/send-amount-row/send-amount-row.component.js index 196538c11..e13b95555 100644 --- a/ui/app/components/send_/send-content/send-amount-row/send-amount-row.component.js +++ b/ui/app/components/send_/send-content/send-amount-row/send-amount-row.component.js @@ -21,6 +21,7 @@ export default class SendAmountRow extends Component { selectedToken: PropTypes.object, setMaxModeTo: PropTypes.func, tokenBalance: PropTypes.string, + updateGasFeeError: PropTypes.func, updateSendAmount: PropTypes.func, updateSendAmountError: PropTypes.func, updateGas: PropTypes.func, @@ -35,6 +36,7 @@ export default class SendAmountRow extends Component { primaryCurrency, selectedToken, tokenBalance, + updateGasFeeError, updateSendAmountError, } = this.props @@ -48,6 +50,19 @@ export default class SendAmountRow extends Component { selectedToken, tokenBalance, }) + + if (selectedToken) { + updateGasFeeError({ + amount, + amountConversionRate, + balance, + conversionRate, + gasTotal, + primaryCurrency, + selectedToken, + tokenBalance, + }) + } } updateAmount (amount) { diff --git a/ui/app/components/send_/send-content/send-amount-row/send-amount-row.container.js b/ui/app/components/send_/send-content/send-amount-row/send-amount-row.container.js index b816d948f..3504d1b73 100644 --- a/ui/app/components/send_/send-content/send-amount-row/send-amount-row.container.js +++ b/ui/app/components/send_/send-content/send-amount-row/send-amount-row.container.js @@ -13,7 +13,7 @@ import { import { sendAmountIsInError, } from './send-amount-row.selectors' -import { getAmountErrorObject } from '../../send.utils' +import { getAmountErrorObject, getGasFeeErrorObject } from '../../send.utils' import { setMaxModeTo, updateSendAmount, @@ -44,6 +44,9 @@ function mapDispatchToProps (dispatch) { return { setMaxModeTo: bool => dispatch(setMaxModeTo(bool)), updateSendAmount: newAmount => dispatch(updateSendAmount(newAmount)), + updateGasFeeError: (amountDataObject) => { + dispatch(updateSendErrors(getGasFeeErrorObject(amountDataObject))) + }, updateSendAmountError: (amountDataObject) => { dispatch(updateSendErrors(getAmountErrorObject(amountDataObject))) }, diff --git a/ui/app/components/send_/send-content/send-amount-row/tests/send-amount-row-component.test.js b/ui/app/components/send_/send-content/send-amount-row/tests/send-amount-row-component.test.js index 579e18585..95c000a34 100644 --- a/ui/app/components/send_/send-content/send-amount-row/tests/send-amount-row-component.test.js +++ b/ui/app/components/send_/send-content/send-amount-row/tests/send-amount-row-component.test.js @@ -13,6 +13,7 @@ const propsMethodSpies = { updateSendAmount: sinon.spy(), updateSendAmountError: sinon.spy(), updateGas: sinon.spy(), + updateGasFeeError: sinon.spy(), } sinon.spy(SendAmountRow.prototype, 'updateAmount') @@ -36,6 +37,7 @@ describe('SendAmountRow Component', function () { selectedToken={ { address: 'mockTokenAddress' } } setMaxModeTo={propsMethodSpies.setMaxModeTo} tokenBalance={'mockTokenBalance'} + updateGasFeeError={propsMethodSpies.updateGasFeeError} updateSendAmount={propsMethodSpies.updateSendAmount} updateSendAmountError={propsMethodSpies.updateSendAmountError} updateGas={propsMethodSpies.updateGas} @@ -47,6 +49,7 @@ describe('SendAmountRow Component', function () { propsMethodSpies.setMaxModeTo.resetHistory() propsMethodSpies.updateSendAmount.resetHistory() propsMethodSpies.updateSendAmountError.resetHistory() + propsMethodSpies.updateGasFeeError.resetHistory() SendAmountRow.prototype.validateAmount.resetHistory() SendAmountRow.prototype.updateAmount.resetHistory() }) @@ -72,6 +75,32 @@ describe('SendAmountRow Component', function () { ) }) + it('should call updateGasFeeError if selectedToken is truthy', () => { + assert.equal(propsMethodSpies.updateGasFeeError.callCount, 0) + instance.validateAmount('someAmount') + assert.equal(propsMethodSpies.updateGasFeeError.callCount, 1) + assert.deepEqual( + propsMethodSpies.updateGasFeeError.getCall(0).args, + [{ + amount: 'someAmount', + amountConversionRate: 'mockAmountConversionRate', + balance: 'mockBalance', + conversionRate: 7, + gasTotal: 'mockGasTotal', + primaryCurrency: 'mockPrimaryCurrency', + selectedToken: { address: 'mockTokenAddress' }, + tokenBalance: 'mockTokenBalance', + }] + ) + }) + + it('should call not updateGasFeeError if selectedToken is falsey', () => { + wrapper.setProps({ selectedToken: null }) + assert.equal(propsMethodSpies.updateGasFeeError.callCount, 0) + instance.validateAmount('someAmount') + assert.equal(propsMethodSpies.updateGasFeeError.callCount, 0) + }) + }) describe('updateAmount', () => { diff --git a/ui/app/components/send_/send-content/send-amount-row/tests/send-amount-row-container.test.js b/ui/app/components/send_/send-content/send-amount-row/tests/send-amount-row-container.test.js index 94d9918a7..52e351aee 100644 --- a/ui/app/components/send_/send-content/send-amount-row/tests/send-amount-row-container.test.js +++ b/ui/app/components/send_/send-content/send-amount-row/tests/send-amount-row-container.test.js @@ -33,7 +33,10 @@ proxyquire('../send-amount-row.container.js', { getTokenBalance: (s) => `mockTokenBalance:${s}`, }, './send-amount-row.selectors': { sendAmountIsInError: (s) => `mockInError:${s}` }, - '../../send.utils': { getAmountErrorObject: (mockDataObject) => ({ ...mockDataObject, mockChange: true }) }, + '../../send.utils': { + getAmountErrorObject: (mockDataObject) => ({ ...mockDataObject, mockChange: true }), + getGasFeeErrorObject: (mockDataObject) => ({ ...mockDataObject, mockGasFeeErrorChange: true }), + }, '../../../../actions': actionSpies, '../../../../ducks/send.duck': duckActionSpies, }) @@ -66,6 +69,7 @@ describe('send-amount-row container', () => { beforeEach(() => { dispatchSpy = sinon.spy() mapDispatchToPropsObject = mapDispatchToProps(dispatchSpy) + duckActionSpies.updateSendErrors.resetHistory() }) describe('setMaxModeTo()', () => { @@ -92,6 +96,18 @@ describe('send-amount-row container', () => { }) }) + describe('updateGasFeeError()', () => { + it('should dispatch an action', () => { + mapDispatchToPropsObject.updateGasFeeError({ some: 'data' }) + assert(dispatchSpy.calledOnce) + assert(duckActionSpies.updateSendErrors.calledOnce) + assert.deepEqual( + duckActionSpies.updateSendErrors.getCall(0).args[0], + { some: 'data', mockGasFeeErrorChange: true } + ) + }) + }) + describe('updateSendAmountError()', () => { it('should dispatch an action', () => { mapDispatchToPropsObject.updateSendAmountError({ some: 'data' }) diff --git a/ui/app/components/send_/send-content/send-gas-row/send-gas-row.component.js b/ui/app/components/send_/send-content/send-gas-row/send-gas-row.component.js index 17cea3d4e..ba5c22a47 100644 --- a/ui/app/components/send_/send-content/send-gas-row/send-gas-row.component.js +++ b/ui/app/components/send_/send-content/send-gas-row/send-gas-row.component.js @@ -8,6 +8,7 @@ export default class SendGasRow extends Component { static propTypes = { conversionRate: PropTypes.number, convertedCurrency: PropTypes.string, + gasFeeError: PropTypes.bool, gasLoadingError: PropTypes.bool, gasTotal: PropTypes.string, showCustomizeGasModal: PropTypes.func, @@ -19,11 +20,16 @@ export default class SendGasRow extends Component { convertedCurrency, gasLoadingError, gasTotal, + gasFeeError, showCustomizeGasModal, } = this.props return ( - + { const { label, + showError, + errorType, } = wrapper.find(SendRowWrapper).props() assert.equal(label, 'gasFee_t:') + assert.equal(showError, 'mockGasFeeError') + assert.equal(errorType, 'gasFee') }) it('should render a GasFeeDisplay as a child of the SendRowWrapper', () => { diff --git a/ui/app/components/send_/send-content/send-gas-row/tests/send-gas-row-container.test.js b/ui/app/components/send_/send-content/send-gas-row/tests/send-gas-row-container.test.js index e928c8aba..2ce062505 100644 --- a/ui/app/components/send_/send-content/send-gas-row/tests/send-gas-row-container.test.js +++ b/ui/app/components/send_/send-content/send-gas-row/tests/send-gas-row-container.test.js @@ -22,7 +22,10 @@ proxyquire('../send-gas-row.container.js', { getCurrentCurrency: (s) => `mockConvertedCurrency:${s}`, getGasTotal: (s) => `mockGasTotal:${s}`, }, - './send-gas-row.selectors.js': { sendGasIsInError: (s) => `mockGasLoadingError:${s}` }, + './send-gas-row.selectors.js': { + getGasLoadingError: (s) => `mockGasLoadingError:${s}`, + gasFeeIsInError: (s) => `mockGasFeeError:${s}`, + }, '../../../../actions': actionSpies, }) @@ -35,6 +38,7 @@ describe('send-gas-row container', () => { conversionRate: 'mockConversionRate:mockState', convertedCurrency: 'mockConvertedCurrency:mockState', gasTotal: 'mockGasTotal:mockState', + gasFeeError: 'mockGasFeeError:mockState', gasLoadingError: 'mockGasLoadingError:mockState', }) }) diff --git a/ui/app/components/send_/send-content/send-gas-row/tests/send-gas-row-selectors.test.js b/ui/app/components/send_/send-content/send-gas-row/tests/send-gas-row-selectors.test.js index a5196334e..d46dd9d8b 100644 --- a/ui/app/components/send_/send-content/send-gas-row/tests/send-gas-row-selectors.test.js +++ b/ui/app/components/send_/send-content/send-gas-row/tests/send-gas-row-selectors.test.js @@ -1,11 +1,12 @@ import assert from 'assert' import { - sendGasIsInError, + gasFeeIsInError, + getGasLoadingError, } from '../send-gas-row.selectors.js' describe('send-gas-row selectors', () => { - describe('sendGasIsInError()', () => { + describe('getGasLoadingError()', () => { it('should return send.errors.gasLoading', () => { const state = { send: { @@ -15,7 +16,33 @@ describe('send-gas-row selectors', () => { }, } - assert.equal(sendGasIsInError(state), 'abc') + assert.equal(getGasLoadingError(state), 'abc') + }) + }) + + describe('gasFeeIsInError()', () => { + it('should return true if send.errors.gasFee is truthy', () => { + const state = { + send: { + errors: { + gasFee: 'def', + }, + }, + } + + assert.equal(gasFeeIsInError(state), true) + }) + + it('should return false send.errors.gasFee is falsely', () => { + const state = { + send: { + errors: { + gasFee: null, + }, + }, + } + + assert.equal(gasFeeIsInError(state), false) }) }) diff --git a/ui/app/components/send_/send.component.js b/ui/app/components/send_/send.component.js index 219b362f2..b1ab57a2e 100644 --- a/ui/app/components/send_/send.component.js +++ b/ui/app/components/send_/send.component.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types' import PersistentForm from '../../../lib/persistent-form' import { getAmountErrorObject, + getGasFeeErrorObject, getToAddressForGasUpdate, doesAmountErrorRequireUpdate, } from './send.utils' @@ -112,7 +113,19 @@ export default class SendTransactionScreen extends PersistentForm { selectedToken, tokenBalance, }) - updateSendErrors(amountErrorObject) + const gasFeeErrorObject = selectedToken + ? getGasFeeErrorObject({ + amount, + amountConversionRate, + balance, + conversionRate, + gasTotal, + primaryCurrency, + selectedToken, + tokenBalance, + }) + : { gasFee: null } + updateSendErrors(Object.assign(amountErrorObject, gasFeeErrorObject)) } if (!uninitialized) { @@ -143,6 +156,10 @@ export default class SendTransactionScreen extends PersistentForm { this.updateGas() } + componentWillUnmount () { + this.props.resetSendState() + } + render () { const { history } = this.props diff --git a/ui/app/components/send_/send.container.js b/ui/app/components/send_/send.container.js index 185653c5f..44ebd2792 100644 --- a/ui/app/components/send_/send.container.js +++ b/ui/app/components/send_/send.container.js @@ -28,6 +28,7 @@ import { setGasTotal, } from '../../actions' import { + resetSendState, updateSendErrors, } from '../../ducks/send.duck' import { @@ -87,5 +88,6 @@ function mapDispatchToProps (dispatch) { })) }, updateSendErrors: newError => dispatch(updateSendErrors(newError)), + resetSendState: () => dispatch(resetSendState()), } } diff --git a/ui/app/components/send_/send.utils.js b/ui/app/components/send_/send.utils.js index 34275248f..c4537f335 100644 --- a/ui/app/components/send_/send.utils.js +++ b/ui/app/components/send_/send.utils.js @@ -30,6 +30,7 @@ module.exports = { estimateGasPriceFromRecentBlocks, generateTokenTransferData, getAmountErrorObject, + getGasFeeErrorObject, getToAddressForGasUpdate, isBalanceSufficient, isTokenBalanceSufficient, @@ -110,9 +111,9 @@ function getAmountErrorObject ({ tokenBalance, }) { let insufficientFunds = false - if (gasTotal && conversionRate) { + if (gasTotal && conversionRate && !selectedToken) { insufficientFunds = !isBalanceSufficient({ - amount: selectedToken ? '0x0' : amount, + amount, amountConversionRate, balance, conversionRate, @@ -149,6 +150,34 @@ function getAmountErrorObject ({ return { amount: amountError } } +function getGasFeeErrorObject ({ + amount, + amountConversionRate, + balance, + conversionRate, + gasTotal, + primaryCurrency, +}) { + let gasFeeError = null + + if (gasTotal && conversionRate) { + const insufficientFunds = !isBalanceSufficient({ + amount: '0x0', + amountConversionRate, + balance, + conversionRate, + gasTotal, + primaryCurrency, + }) + + if (insufficientFunds) { + gasFeeError = INSUFFICIENT_FUNDS_ERROR + } + } + + return { gasFee: gasFeeError } +} + function calcTokenBalance ({ selectedToken, usersToken }) { const { decimals } = selectedToken || {} return calcTokenAmount(usersToken.balance.toString(), decimals) + '' diff --git a/ui/app/components/send_/tests/send-component.test.js b/ui/app/components/send_/tests/send-component.test.js index 4ba9b226d..6194ec508 100644 --- a/ui/app/components/send_/tests/send-component.test.js +++ b/ui/app/components/send_/tests/send-component.test.js @@ -12,9 +12,11 @@ const propsMethodSpies = { updateAndSetGasTotal: sinon.spy(), updateSendErrors: sinon.spy(), updateSendTokenBalance: sinon.spy(), + resetSendState: sinon.spy(), } const utilsMethodStubs = { getAmountErrorObject: sinon.stub().returns({ amount: 'mockAmountError' }), + getGasFeeErrorObject: sinon.stub().returns({ gasFee: 'mockGasFeeError' }), doesAmountErrorRequireUpdate: sinon.stub().callsFake(obj => obj.balance !== obj.prevBalance), } @@ -50,6 +52,7 @@ describe('Send Component', function () { updateAndSetGasTotal={propsMethodSpies.updateAndSetGasTotal} updateSendErrors={propsMethodSpies.updateSendErrors} updateSendTokenBalance={propsMethodSpies.updateSendTokenBalance} + resetSendState={propsMethodSpies.resetSendState} />) }) @@ -58,6 +61,7 @@ describe('Send Component', function () { SendTransactionScreen.prototype.updateGas.resetHistory() utilsMethodStubs.doesAmountErrorRequireUpdate.resetHistory() utilsMethodStubs.getAmountErrorObject.resetHistory() + utilsMethodStubs.getGasFeeErrorObject.resetHistory() propsMethodSpies.updateAndSetGasTotal.resetHistory() propsMethodSpies.updateSendErrors.resetHistory() propsMethodSpies.updateSendTokenBalance.resetHistory() @@ -77,6 +81,15 @@ describe('Send Component', function () { }) }) + describe('componentWillUnmount', () => { + it('should call this.props.resetSendState', () => { + propsMethodSpies.resetSendState.resetHistory() + assert.equal(propsMethodSpies.resetSendState.callCount, 0) + wrapper.instance().componentWillUnmount() + assert.equal(propsMethodSpies.resetSendState.callCount, 1) + }) + }) + describe('componentDidUpdate', () => { it('should call doesAmountErrorRequireUpdate with the expected params', () => { utilsMethodStubs.getAmountErrorObject.resetHistory() @@ -133,8 +146,66 @@ describe('Send Component', function () { ) }) - it('should call updateSendErrors with the expected params', () => { + it('should call getGasFeeErrorObject if doesAmountErrorRequireUpdate returns true and selectedToken is truthy', () => { + utilsMethodStubs.getGasFeeErrorObject.resetHistory() + wrapper.instance().componentDidUpdate({ + from: { + balance: 'balanceChanged', + }, + }) + assert.equal(utilsMethodStubs.getGasFeeErrorObject.callCount, 1) + assert.deepEqual( + utilsMethodStubs.getGasFeeErrorObject.getCall(0).args[0], + { + amount: 'mockAmount', + amountConversionRate: 'mockAmountConversionRate', + balance: 'mockBalance', + conversionRate: 10, + gasTotal: 'mockGasTotal', + primaryCurrency: 'mockPrimaryCurrency', + selectedToken: 'mockSelectedToken', + tokenBalance: 'mockTokenBalance', + } + ) + }) + + it('should not call getGasFeeErrorObject if doesAmountErrorRequireUpdate returns false', () => { + utilsMethodStubs.getGasFeeErrorObject.resetHistory() + wrapper.instance().componentDidUpdate({ + from: { address: 'mockAddress', balance: 'mockBalance' }, + }) + assert.equal(utilsMethodStubs.getGasFeeErrorObject.callCount, 0) + }) + + it('should not call getGasFeeErrorObject if doesAmountErrorRequireUpdate returns true but selectedToken is falsy', () => { + utilsMethodStubs.getGasFeeErrorObject.resetHistory() + wrapper.setProps({ selectedToken: null }) + wrapper.instance().componentDidUpdate({ + from: { + balance: 'balanceChanged', + }, + }) + assert.equal(utilsMethodStubs.getGasFeeErrorObject.callCount, 0) + }) + + it('should call updateSendErrors with the expected params if selectedToken is falsy', () => { + propsMethodSpies.updateSendErrors.resetHistory() + wrapper.setProps({ selectedToken: null }) + wrapper.instance().componentDidUpdate({ + from: { + balance: 'balanceChanged', + }, + }) + assert.equal(propsMethodSpies.updateSendErrors.callCount, 1) + assert.deepEqual( + propsMethodSpies.updateSendErrors.getCall(0).args[0], + { amount: 'mockAmountError', gasFee: null } + ) + }) + + it('should call updateSendErrors with the expected params if selectedToken is truthy', () => { propsMethodSpies.updateSendErrors.resetHistory() + wrapper.setProps({ selectedToken: 'someToken' }) wrapper.instance().componentDidUpdate({ from: { balance: 'balanceChanged', @@ -143,7 +214,7 @@ describe('Send Component', function () { assert.equal(propsMethodSpies.updateSendErrors.callCount, 1) assert.deepEqual( propsMethodSpies.updateSendErrors.getCall(0).args[0], - { amount: 'mockAmountError'} + { amount: 'mockAmountError', gasFee: 'mockGasFeeError' } ) }) diff --git a/ui/app/components/send_/tests/send-container.test.js b/ui/app/components/send_/tests/send-container.test.js index 91484f4d8..7a9120d24 100644 --- a/ui/app/components/send_/tests/send-container.test.js +++ b/ui/app/components/send_/tests/send-container.test.js @@ -12,6 +12,7 @@ const actionSpies = { } const duckActionSpies = { updateSendErrors: sinon.spy(), + resetSendState: sinon.spy(), } proxyquire('../send.container.js', { @@ -152,6 +153,17 @@ describe('send container', () => { }) }) + describe('resetSendState()', () => { + it('should dispatch an action', () => { + mapDispatchToPropsObject.resetSendState() + assert(dispatchSpy.calledOnce) + assert.equal( + duckActionSpies.resetSendState.getCall(0).args.length, + 0 + ) + }) + }) + }) }) diff --git a/ui/app/components/send_/tests/send-utils.test.js b/ui/app/components/send_/tests/send-utils.test.js index a518a64e9..b8579e0e4 100644 --- a/ui/app/components/send_/tests/send-utils.test.js +++ b/ui/app/components/send_/tests/send-utils.test.js @@ -17,7 +17,11 @@ const { } = require('../send.constants') const stubs = { - addCurrencies: sinon.stub().callsFake((a, b, obj) => a + b), + addCurrencies: sinon.stub().callsFake((a, b, obj) => { + if (String(a).match(/^0x.+/)) a = Number(String(a).slice(2)) + if (String(b).match(/^0x.+/)) b = Number(String(b).slice(2)) + return a + b + }), conversionUtil: sinon.stub().callsFake((val, obj) => parseInt(val, 16)), conversionGTE: sinon.stub().callsFake((obj1, obj2) => obj1.value >= obj2.value), multiplyCurrencies: sinon.stub().callsFake((a, b) => `${a}x${b}`), @@ -49,6 +53,7 @@ const { estimateGasPriceFromRecentBlocks, generateTokenTransferData, getAmountErrorObject, + getGasFeeErrorObject, getToAddressForGasUpdate, calcTokenBalance, isBalanceSufficient, @@ -143,6 +148,18 @@ describe('send utils', () => { primaryCurrency: 'ABC', expectedResult: { amount: INSUFFICIENT_FUNDS_ERROR }, }, + 'should not return insufficientFunds error if selectedToken is truthy': { + amount: '0x0', + amountConversionRate: 2, + balance: 1, + conversionRate: 3, + gasTotal: 17, + primaryCurrency: 'ABC', + selectedToken: { symbole: 'DEF', decimals: 0 }, + decimals: 0, + tokenBalance: 'sometokenbalance', + expectedResult: { amount: null }, + }, 'should return insufficientTokens error if token is selected and isTokenBalanceSufficient returns false': { amount: '0x10', amountConversionRate: 2, @@ -163,6 +180,32 @@ describe('send utils', () => { }) }) + describe('getGasFeeErrorObject()', () => { + const config = { + 'should return insufficientFunds error if isBalanceSufficient returns false': { + amountConversionRate: 2, + balance: 16, + conversionRate: 3, + gasTotal: 17, + primaryCurrency: 'ABC', + expectedResult: { gasFee: INSUFFICIENT_FUNDS_ERROR }, + }, + 'should return null error if isBalanceSufficient returns true': { + amountConversionRate: 2, + balance: 16, + conversionRate: 3, + gasTotal: 15, + primaryCurrency: 'ABC', + expectedResult: { gasFee: null }, + }, + } + Object.entries(config).map(([description, obj]) => { + it(description, () => { + assert.deepEqual(getGasFeeErrorObject(obj), obj.expectedResult) + }) + }) + }) + describe('calcTokenBalance()', () => { it('should return the calculated token blance', () => { assert.equal(calcTokenBalance({ @@ -222,6 +265,7 @@ describe('send utils', () => { describe('isTokenBalanceSufficient()', () => { it('should correctly call conversionUtil and return the result of calling conversionGTE', () => { stubs.conversionGTE.resetHistory() + stubs.conversionUtil.resetHistory() const result = isTokenBalanceSufficient({ amount: '0x10', tokenBalance: 123, diff --git a/ui/app/ducks/send.duck.js b/ui/app/ducks/send.duck.js index 055cc05c1..db01bbaa9 100644 --- a/ui/app/ducks/send.duck.js +++ b/ui/app/ducks/send.duck.js @@ -6,6 +6,7 @@ const CLOSE_FROM_DROPDOWN = 'metamask/send/CLOSE_FROM_DROPDOWN' const OPEN_TO_DROPDOWN = 'metamask/send/OPEN_TO_DROPDOWN' const CLOSE_TO_DROPDOWN = 'metamask/send/CLOSE_TO_DROPDOWN' const UPDATE_SEND_ERRORS = 'metamask/send/UPDATE_SEND_ERRORS' +const RESET_SEND_STATE = 'metamask/send/RESET_SEND_STATE' // TODO: determine if this approach to initState is consistent with conventional ducks pattern const initState = { @@ -42,6 +43,8 @@ export default function reducer ({ send: sendState = initState }, action = {}) { ...action.value, }, }) + case RESET_SEND_STATE: + return extend({}, initState) default: return newState } @@ -70,3 +73,7 @@ export function updateSendErrors (errorObject) { value: errorObject, } } + +export function resetSendState () { + return { type: RESET_SEND_STATE } +} diff --git a/ui/app/ducks/tests/send-duck.test.js b/ui/app/ducks/tests/send-duck.test.js index c06cf55d2..c101132d9 100644 --- a/ui/app/ducks/tests/send-duck.test.js +++ b/ui/app/ducks/tests/send-duck.test.js @@ -24,6 +24,7 @@ describe('Send Duck', () => { const OPEN_TO_DROPDOWN = 'metamask/send/OPEN_TO_DROPDOWN' const CLOSE_TO_DROPDOWN = 'metamask/send/CLOSE_TO_DROPDOWN' const UPDATE_SEND_ERRORS = 'metamask/send/UPDATE_SEND_ERRORS' + const RESET_SEND_STATE = 'metamask/send/RESET_SEND_STATE' describe('SendReducer()', () => { it('should initialize state', () => { @@ -105,6 +106,15 @@ describe('Send Duck', () => { }) ) }) + + it('should return the initial state in response to a RESET_SEND_STATE action', () => { + assert.deepEqual( + SendReducer(mockState, { + type: RESET_SEND_STATE, + }), + Object.assign({}, initState) + ) + }) }) describe('openFromDropdown', () => { From c47a4ce2c93d50425f580c2a166c1698cf1c508f Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 4 Jul 2018 16:44:56 -0230 Subject: [PATCH 21/64] Update new-ui-send integration tests to always explicitly set gas price. (e2e tests handle auto-setting and defaults) --- test/integration/lib/send-new-ui.js | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/test/integration/lib/send-new-ui.js b/test/integration/lib/send-new-ui.js index 72e4a8cb1..85885f118 100644 --- a/test/integration/lib/send-new-ui.js +++ b/test/integration/lib/send-new-ui.js @@ -114,19 +114,8 @@ async function runSendFlowTest(assert, done) { errorMessage = $('.send-v2__error') assert.equal(errorMessage.length, 0, 'send should stop rendering amount error message after amount is corrected') - const sendGasField = await queryAsync($, '.send-v2__gas-fee-display') - assert.equal( - sendGasField.find('.currency-display__input-wrapper > input').val(), - '0.000021', - 'send gas field should show estimated gas total' - ) - assert.equal( - sendGasField.find('.currency-display__converted-value')[0].textContent, - '$0.03 USD', - 'send gas field should show estimated gas total converted to USD' - ) - await customizeGas(assert, 0, 21000, '0', '$0.00 USD') + await customizeGas(assert, 1, 21000, '0.000021', '$0.03 USD') await customizeGas(assert, 500, 60000, '0.03', '$36.03 USD') const sendButton = await queryAsync($, 'button.btn-primary.btn--large.page-container__footer-button') From f262f0ea64e1e803d8dcd9a31f92cffe81d27b3d Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 22 Jun 2018 14:41:18 -0230 Subject: [PATCH 22/64] Update import from seed screen on new ui. --- app/_locales/en/messages.json | 9 + test/e2e/beta/metamask-beta-ui.spec.js | 9 +- ui/app/app.js | 2 +- .../pages/keychains/restore-vault-new.js | 189 ++++++++++++++++++ .../css/itcss/components/newui-sections.scss | 9 + 5 files changed, 214 insertions(+), 4 deletions(-) create mode 100644 ui/app/components/pages/keychains/restore-vault-new.js diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 46fbdc1a7..621775592 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -664,6 +664,9 @@ "restoreVault": { "message": "Restore Vault" }, + "restoreAccountWithSeed": { + "message": "Restore your Account with Seed Phrase" + }, "required": { "message": "Required" }, @@ -673,6 +676,9 @@ "walletSeed": { "message": "Wallet Seed" }, + "restore": { + "message": "Restore" + }, "revealSeedWords": { "message": "Reveal Seed Words" }, @@ -777,6 +783,9 @@ "sendTokens": { "message": "Send Tokens" }, + "separateEachWord": { + "message": "Separate each word with a single space" + }, "onlySendToEtherAddress": { "message": "Only send ETH to an Ethereum address." }, diff --git a/test/e2e/beta/metamask-beta-ui.spec.js b/test/e2e/beta/metamask-beta-ui.spec.js index 5f270b52b..b07b1ecd7 100644 --- a/test/e2e/beta/metamask-beta-ui.spec.js +++ b/test/e2e/beta/metamask-beta-ui.spec.js @@ -355,9 +355,12 @@ describe('MetaMask', function () { await seedTextArea.sendKeys(testSeedPhrase) await delay(regularDelayMs) - await driver.findElement(By.id('password-box')).sendKeys('correct horse battery staple') - await driver.findElement(By.id('password-box-confirm')).sendKeys('correct horse battery staple') - await driver.findElement(By.css('button:nth-child(2)')).click() + const passwordInputs = await driver.findElements(By.css('input')) + await delay(regularDelayMs) + + passwordInputs[0].sendKeys('correct horse battery staple') + passwordInputs[1].sendKeys('correct horse battery staple') + await driver.findElement(By.css('.first-time-flow__button')).click() await delay(regularDelayMs) }) diff --git a/ui/app/app.js b/ui/app/app.js index d0e48a368..3ca18d4ca 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -23,7 +23,7 @@ const Authenticated = require('./components/pages/authenticated') const Initialized = require('./components/pages/initialized') const Settings = require('./components/pages/settings') const UnlockPage = require('./components/pages/unlock-page') -const RestoreVaultPage = require('./components/pages/keychains/restore-vault') +const RestoreVaultPage = require('./components/pages/keychains/restore-vault-new').default const RevealSeedConfirmation = require('./components/pages/keychains/reveal-seed') const AddTokenPage = require('./components/pages/add-token') const ConfirmAddTokenPage = require('./components/pages/confirm-add-token') diff --git a/ui/app/components/pages/keychains/restore-vault-new.js b/ui/app/components/pages/keychains/restore-vault-new.js new file mode 100644 index 000000000..ef38faf1e --- /dev/null +++ b/ui/app/components/pages/keychains/restore-vault-new.js @@ -0,0 +1,189 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import {connect} from 'react-redux' +import { + createNewVaultAndRestore, + unMarkPasswordForgotten, +} from '../../../actions' +import { DEFAULT_ROUTE } from '../../../routes' +import TextField from '../../text-field' + +class RestoreVaultPageNew extends Component { + static contextTypes = { + t: PropTypes.func, + } + + static propTypes = { + warning: PropTypes.string, + createNewVaultAndRestore: PropTypes.func.isRequired, + leaveImportSeedScreenState: PropTypes.func, + history: PropTypes.object, + isLoading: PropTypes.bool, + }; + + state = { + seedPhrase: '', + password: '', + confirmPassword: '', + seedPhraseError: null, + passwordError: null, + confirmPasswordError: null, + } + + parseSeedPhrase = (seedPhrase) => { + return seedPhrase + .match(/\w+/g) + .join(' ') + } + + handleSeedPhraseChange (seedPhrase) { + let seedPhraseError = null + + if (seedPhrase && this.parseSeedPhrase(seedPhrase).split(' ').length !== 12) { + seedPhraseError = this.context.t('seedPhraseReq') + } + + this.setState({ seedPhrase, seedPhraseError }) + } + + handlePasswordChange (password) { + const { confirmPassword } = this.state + let confirmPasswordError = null + let passwordError = null + + if (password && password.length < 8) { + passwordError = this.context.t('passwordNotLongEnough') + } + + if (confirmPassword && password !== confirmPassword) { + confirmPasswordError = this.context.t('passwordsDontMatch') + } + + this.setState({ password, passwordError, confirmPasswordError }) + } + + handleConfirmPasswordChange (confirmPassword) { + const { password } = this.state + let confirmPasswordError = null + + if (password !== confirmPassword) { + confirmPasswordError = this.context.t('passwordsDontMatch') + } + + this.setState({ confirmPassword, confirmPasswordError }) + } + + onClick = () => { + const { password, seedPhrase } = this.state + const { + createNewVaultAndRestore, + leaveImportSeedScreenState, + history, + } = this.props + + leaveImportSeedScreenState() + createNewVaultAndRestore(password, this.parseSeedPhrase(seedPhrase)) + .then(() => history.push(DEFAULT_ROUTE)) + } + + hasError () { + const { passwordError, confirmPasswordError, seedPhraseError } = this.state + return passwordError || confirmPasswordError || seedPhraseError + } + + render () { + const { + seedPhrase, + password, + confirmPassword, + seedPhraseError, + passwordError, + confirmPasswordError, + } = this.state + const { t } = this.context + const { isLoading } = this.props + const disabled = !seedPhrase || !password || !confirmPassword || isLoading || this.hasError() + + return ( +
+
+
+ { + e.preventDefault() + this.props.history.goBack() + }} + href="#" + > + {`< Back`} + +
+ { this.context.t('restoreAccountWithSeed') } +
+
+ { this.context.t('secretPhrase') } +
+
+ +