diff options
76 files changed, 2482 insertions, 2462 deletions
diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..635c47a95 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,151 @@ +{ + "parserOptions": { + "ecmaVersion": 6, + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "impliedStrict": true, + "modules": true, + "blockBindings": true, + "arrowFunctions": true, + "objectLiteralShorthandMethods": true, + "objectLiteralShorthandProperties": true, + "templateStrings": true + }, + }, + + "env": { + "es6": true, + "node": true, + "browser": true + }, + + "plugins": [ + ], + + "globals": { + "chrome": true, + "document": false, + "navigator": false, + "web3": true, + "window": false + }, + + "rules": { + "accessor-pairs": 2, + "arrow-spacing": [2, { "before": true, "after": true }], + "block-spacing": [2, "always"], + "brace-style": [2, "1tbs", { "allowSingleLine": true }], + "camelcase": [2, { "properties": "never" }], + "comma-dangle": [2, "always-multiline"], + "comma-spacing": [2, { "before": false, "after": true }], + "comma-style": [2, "last"], + "constructor-super": 2, + "curly": [2, "multi-line"], + "dot-location": [2, "property"], + "eol-last": 2, + "eqeqeq": [2, "allow-null"], + "generator-star-spacing": [2, { "before": true, "after": true }], + "handle-callback-err": [2, "^(err|error)$" ], + "indent": [2, 2, { "SwitchCase": 1 }], + "jsx-quotes": [2, "prefer-single"], + "key-spacing": [2, { "beforeColon": false, "afterColon": true }], + "keyword-spacing": [2, { "before": true, "after": true }], + "new-cap": [2, { "newIsCap": true, "capIsNew": false }], + "new-parens": 2, + "no-array-constructor": 2, + "no-caller": 2, + "no-class-assign": 2, + "no-cond-assign": 2, + "no-const-assign": 2, + "no-control-regex": 2, + "no-debugger": 2, + "no-delete-var": 2, + "no-dupe-args": 2, + "no-dupe-class-members": 2, + "no-dupe-keys": 2, + "no-duplicate-case": 2, + "no-duplicate-imports": 2, + "no-empty-character-class": 2, + "no-empty-pattern": 2, + "no-eval": 2, + "no-ex-assign": 2, + "no-extend-native": 2, + "no-extra-bind": 2, + "no-extra-boolean-cast": 2, + "no-extra-parens": [2, "functions"], + "no-fallthrough": 2, + "no-floating-decimal": 2, + "no-func-assign": 2, + "no-implied-eval": 2, + "no-inner-declarations": [2, "functions"], + "no-invalid-regexp": 2, + "no-irregular-whitespace": 2, + "no-iterator": 2, + "no-label-var": 2, + "no-labels": [2, { "allowLoop": false, "allowSwitch": false }], + "no-lone-blocks": 2, + "no-mixed-spaces-and-tabs": 2, + "no-multi-spaces": 2, + "no-multi-str": 2, + "no-multiple-empty-lines": [2, { "max": 1 }], + "no-native-reassign": 2, + "no-negated-in-lhs": 2, + "no-new": 2, + "no-new-func": 2, + "no-new-object": 2, + "no-new-require": 2, + "no-new-symbol": 2, + "no-new-wrappers": 2, + "no-obj-calls": 2, + "no-octal": 2, + "no-octal-escape": 2, + "no-path-concat": 2, + "no-proto": 2, + "no-redeclare": 2, + "no-regex-spaces": 2, + "no-return-assign": [2, "except-parens"], + "no-self-assign": 2, + "no-self-compare": 2, + "no-sequences": 2, + "no-shadow-restricted-names": 2, + "no-spaced-func": 2, + "no-sparse-arrays": 2, + "no-this-before-super": 2, + "no-throw-literal": 2, + "no-trailing-spaces": 2, + "no-undef": 2, + "no-undef-init": 2, + "no-unexpected-multiline": 2, + "no-unmodified-loop-condition": 2, + "no-unneeded-ternary": [2, { "defaultAssignment": false }], + "no-unreachable": 2, + "no-unsafe-finally": 2, + "no-unused-vars": [2, { "vars": "all", "args": "none" }], + "no-useless-call": 2, + "no-useless-computed-key": 2, + "no-useless-constructor": 2, + "no-useless-escape": 2, + "no-whitespace-before-property": 2, + "no-with": 2, + "one-var": [2, { "initialized": "never" }], + "operator-linebreak": [2, "after", { "overrides": { "?": "before", ":": "before" } }], + "padded-blocks": [2, "never"], + "quotes": [2, "single", "avoid-escape"], + "semi": [2, "never"], + "semi-spacing": [2, { "before": false, "after": true }], + "space-before-blocks": [1, "always"], + "space-before-function-paren": [1, "always"], + "space-in-parens": [2, "never"], + "space-infix-ops": 2, + "space-unary-ops": [2, { "words": true, "nonwords": false }], + "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] }], + "strict": 0, + "template-curly-spacing": [2, "never"], + "use-isnan": 2, + "valid-typeof": 2, + "wrap-iife": [2, "any"], + "yield-star-spacing": [2, "both"], + "yoda": [2, "never"], + "prefer-const": 1 + } +} @@ -0,0 +1 @@ +6.0 @@ -54,6 +54,8 @@ Then just run `npm test`. You can also test with a continuously watching process, via `npm run watch`. +You can run the linter by itself with `gulp lint`. + ### Deploying the UI You must be authorized already on the Metamask plugin. diff --git a/app/scripts/background.js b/app/scripts/background.js index 66108c251..6934e9d3e 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -1,11 +1,9 @@ const urlUtil = require('url') const Dnode = require('dnode') const eos = require('end-of-stream') -const combineStreams = require('pumpify') const extend = require('xtend') const EthStore = require('eth-store') const MetaMaskProvider = require('web3-provider-engine/zero.js') -const ObjectMultiplex = require('./lib/obj-multiplex') const PortStream = require('./lib/port-stream.js') const IdentityStore = require('./lib/idStore') const createUnlockRequestNotification = require('./lib/notifications.js').createUnlockRequestNotification @@ -22,7 +20,7 @@ const Web3 = require('web3') // chrome.runtime.onConnect.addListener(connectRemote) -function connectRemote(remotePort){ +function connectRemote (remotePort) { var isMetaMaskInternalProcess = (remotePort.name === 'popup') var portStream = new PortStream(remotePort) if (isMetaMaskInternalProcess) { @@ -35,7 +33,7 @@ function connectRemote(remotePort){ } } -function setupUntrustedCommunication(connectionStream, originDomain){ +function setupUntrustedCommunication (connectionStream, originDomain) { // setup multiplexing var mx = setupMultiplex(connectionStream) // connect features @@ -43,7 +41,7 @@ function setupUntrustedCommunication(connectionStream, originDomain){ setupPublicConfig(mx.createStream('publicConfig')) } -function setupTrustedCommunication(connectionStream, originDomain){ +function setupTrustedCommunication (connectionStream, originDomain) { // setup multiplexing var mx = setupMultiplex(connectionStream) // connect features @@ -55,13 +53,12 @@ function setupTrustedCommunication(connectionStream, originDomain){ // state and network // -var providerConfig = configManager.getProvider() var idStore = new IdentityStore() var providerOpts = { rpcUrl: configManager.getCurrentRpcAddress(), // account mgmt - getAccounts: function(cb){ + getAccounts: function (cb) { var selectedAddress = idStore.getSelectedAddress() var result = selectedAddress ? [selectedAddress] : [] cb(null, result) @@ -79,8 +76,8 @@ idStore.web3 = web3 idStore.getNetwork() // log new blocks -provider.on('block', function(block){ - console.log('BLOCK CHANGED:', '#'+block.number.toString('hex'), '0x'+block.hash.toString('hex')) +provider.on('block', function (block) { + console.log('BLOCK CHANGED:', '#' + block.number.toString('hex'), '0x' + block.hash.toString('hex')) // Check network when restoring connectivity: if (idStore._currentState.network === 'loading') { @@ -93,7 +90,7 @@ provider.on('error', idStore.getNetwork.bind(idStore)) var ethStore = new EthStore(provider) idStore.setStore(ethStore) -function getState(){ +function getState () { var state = extend( ethStore.getState(), idStore.getState(), @@ -115,47 +112,46 @@ var initPublicState = extend( var publicConfigStore = new HostStore(initPublicState) // subscribe to changes -configManager.subscribe(function(state){ +configManager.subscribe(function (state) { storeSetFromObj(publicConfigStore, configToPublic(state)) }) -idStore.on('update', function(state){ +idStore.on('update', function (state) { storeSetFromObj(publicConfigStore, idStoreToPublic(state)) }) // idStore substate -function idStoreToPublic(state){ +function idStoreToPublic (state) { return { selectedAddress: state.selectedAddress, } } // config substate -function configToPublic(state){ +function configToPublic (state) { return { provider: state.provider, } } // dump obj into store -function storeSetFromObj(store, obj){ - Object.keys(obj).forEach(function(key){ +function storeSetFromObj (store, obj) { + Object.keys(obj).forEach(function (key) { store.set(key, obj[key]) }) } - // // remote features // -function setupPublicConfig(stream){ +function setupPublicConfig (stream) { var storeStream = publicConfigStore.createStream() stream.pipe(storeStream).pipe(stream) } -function setupProviderConnection(stream, originDomain){ +function setupProviderConnection (stream, originDomain) { // decorate all payloads with origin domain - stream.on('data', function onRpcRequest(request){ + stream.on('data', function onRpcRequest (request) { var payloads = Array.isArray(request) ? request : [request] - payloads.forEach(function(payload){ + payloads.forEach(function (payload) { // Append origin to rpc payload payload.origin = originDomain // Append origin to signature request @@ -166,7 +162,10 @@ function setupProviderConnection(stream, originDomain){ } }) // handle rpc request - provider.sendAsync(request, function onPayloadHandled(err, response){ + provider.sendAsync(request, function onPayloadHandled (err, response) { + if (err) { + return logger(err) + } logger(null, request, response) try { stream.write(response) @@ -176,54 +175,52 @@ function setupProviderConnection(stream, originDomain){ }) }) - function logger(err, request, response){ + function logger (err, request, response) { if (err) return console.error(err.stack) if (!request.isMetamaskInternal) { console.log(`RPC (${originDomain}):`, request, '->', response) - if (response.error) console.error('Error in RPC response:\n'+response.error.message) + if (response.error) console.error('Error in RPC response:\n' + response.error.message) } } } -function setupControllerConnection(stream){ +function setupControllerConnection (stream) { var dnode = Dnode({ - getState: function(cb){ cb(null, getState()) }, - setRpcTarget: setRpcTarget, - setProviderType: setProviderType, + getState: function (cb) { cb(null, getState()) }, + setRpcTarget: setRpcTarget, + setProviderType: setProviderType, useEtherscanProvider: useEtherscanProvider, - agreeToDisclaimer: agreeToDisclaimer, + agreeToDisclaimer: agreeToDisclaimer, // forward directly to idStore - createNewVault: idStore.createNewVault.bind(idStore), - recoverFromSeed: idStore.recoverFromSeed.bind(idStore), - submitPassword: idStore.submitPassword.bind(idStore), + createNewVault: idStore.createNewVault.bind(idStore), + recoverFromSeed: idStore.recoverFromSeed.bind(idStore), + submitPassword: idStore.submitPassword.bind(idStore), setSelectedAddress: idStore.setSelectedAddress.bind(idStore), approveTransaction: idStore.approveTransaction.bind(idStore), - cancelTransaction: idStore.cancelTransaction.bind(idStore), - signMessage: idStore.signMessage.bind(idStore), - cancelMessage: idStore.cancelMessage.bind(idStore), - setLocked: idStore.setLocked.bind(idStore), + cancelTransaction: idStore.cancelTransaction.bind(idStore), + signMessage: idStore.signMessage.bind(idStore), + cancelMessage: idStore.cancelMessage.bind(idStore), + setLocked: idStore.setLocked.bind(idStore), clearSeedWordCache: idStore.clearSeedWordCache.bind(idStore), - exportAccount: idStore.exportAccount.bind(idStore), - revealAccount: idStore.revealAccount.bind(idStore), - saveAccountLabel: idStore.saveAccountLabel.bind(idStore), - tryPassword: idStore.tryPassword.bind(idStore), - recoverSeed: idStore.recoverSeed.bind(idStore), + exportAccount: idStore.exportAccount.bind(idStore), + revealAccount: idStore.revealAccount.bind(idStore), + saveAccountLabel: idStore.saveAccountLabel.bind(idStore), + tryPassword: idStore.tryPassword.bind(idStore), + recoverSeed: idStore.recoverSeed.bind(idStore), }) stream.pipe(dnode).pipe(stream) - dnode.on('remote', function(remote){ - + dnode.on('remote', function (remote) { // push updates to popup ethStore.on('update', sendUpdate) idStore.on('update', sendUpdate) // teardown on disconnect - eos(stream, function unsubscribe(){ + eos(stream, function unsubscribe () { ethStore.removeListener('update', sendUpdate) }) - function sendUpdate(){ + function sendUpdate () { var state = getState() remote.sendUpdate(state) } - }) } @@ -233,7 +230,7 @@ function setupControllerConnection(stream){ idStore.on('update', updateBadge) -function updateBadge(state){ +function updateBadge (state) { var label = '' var unconfTxs = configManager.unconfirmedTxs() var unconfTxLen = Object.keys(unconfTxs).length @@ -251,7 +248,7 @@ function updateBadge(state){ // Add unconfirmed Tx + Msg // -function newUnsignedTransaction(txParams, onTxDoneCb){ +function newUnsignedTransaction (txParams, onTxDoneCb) { var state = idStore.getState() if (!state.isUnlocked) { createUnlockRequestNotification({ @@ -263,20 +260,19 @@ function newUnsignedTransaction(txParams, onTxDoneCb){ } } -function newUnsignedMessage(msgParams, cb){ +function newUnsignedMessage (msgParams, cb) { var state = idStore.getState() if (!state.isUnlocked) { createUnlockRequestNotification({ title: 'Account Unlock Request', }) - var msgId = idStore.addUnconfirmedMessage(msgParams, cb) } else { addUnconfirmedMsg(msgParams, cb) } } -function addUnconfirmedTx(txParams, onTxDoneCb){ - idStore.addUnconfirmedTransaction(txParams, onTxDoneCb, function(err, txData){ +function addUnconfirmedTx (txParams, onTxDoneCb) { + idStore.addUnconfirmedTransaction(txParams, onTxDoneCb, function (err, txData) { if (err) return onTxDoneCb(err) createTxNotification({ title: 'New Unsigned Transaction', @@ -287,7 +283,7 @@ function addUnconfirmedTx(txParams, onTxDoneCb){ }) } -function addUnconfirmedMsg(msgParams, cb){ +function addUnconfirmedMsg (msgParams, cb) { var msgId = idStore.addUnconfirmedMessage(msgParams, cb) createMsgNotification({ title: 'New Unsigned Message', @@ -301,7 +297,7 @@ function addUnconfirmedMsg(msgParams, cb){ // config // -function agreeToDisclaimer(cb) { +function agreeToDisclaimer (cb) { try { configManager.setConfirmed(true) cb() @@ -311,23 +307,23 @@ function agreeToDisclaimer(cb) { } // called from popup -function setRpcTarget(rpcTarget){ +function setRpcTarget (rpcTarget) { configManager.setRpcTarget(rpcTarget) chrome.runtime.reload() idStore.getNetwork() } -function setProviderType(type) { +function setProviderType (type) { configManager.setProviderType(type) chrome.runtime.reload() idStore.getNetwork() } -function useEtherscanProvider() { +function useEtherscanProvider () { configManager.useEtherscanProvider() chrome.runtime.reload() } // util -function noop(){} +function noop () {} diff --git a/app/scripts/chromereload.js b/app/scripts/chromereload.js index 24adc7022..283a131f1 100644 --- a/app/scripts/chromereload.js +++ b/app/scripts/chromereload.js @@ -32,1187 +32,1160 @@ window.LiveReloadOptions = { host: 'localhost' }; - -(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ -(function() { - var Connector, PROTOCOL_6, PROTOCOL_7, Parser, Version, _ref; - - _ref = require('./protocol'), Parser = _ref.Parser, PROTOCOL_6 = _ref.PROTOCOL_6, PROTOCOL_7 = _ref.PROTOCOL_7; - - Version = '2.2.2'; - - exports.Connector = Connector = (function() { - function Connector(options, WebSocket, Timer, handlers) { - this.options = options; - this.WebSocket = WebSocket; - this.Timer = Timer; - this.handlers = handlers; - this._uri = "ws" + (this.options.https ? "s" : "") + "://" + this.options.host + ":" + this.options.port + "/livereload"; - this._nextDelay = this.options.mindelay; - this._connectionDesired = false; - this.protocol = 0; - this.protocolParser = new Parser({ - connected: (function(_this) { - return function(protocol) { - _this.protocol = protocol; - _this._handshakeTimeout.stop(); - _this._nextDelay = _this.options.mindelay; - _this._disconnectionReason = 'broken'; - return _this.handlers.connected(protocol); - }; - })(this), - error: (function(_this) { - return function(e) { - _this.handlers.error(e); - return _this._closeOnError(); - }; - })(this), - message: (function(_this) { - return function(message) { - return _this.handlers.message(message); - }; - })(this) - }); - this._handshakeTimeout = new Timer((function(_this) { - return function() { - if (!_this._isSocketConnected()) { - return; +(function e (t, n, r) { function s (o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require === 'function' && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); var f = new Error("Cannot find module '" + o + "'"); throw f.code = 'MODULE_NOT_FOUND', f } var l = n[o] = {exports: {}}; t[o][0].call(l.exports, function (e) { var n = t[o][1][e]; return s(n ? n : e) }, l, l.exports, e, t, n, r) } return n[o].exports } var i = typeof require === 'function' && require; for (var o = 0; o < r.length; o++)s(r[o]); return s })({1: [function (require, module, exports) { + (function () { + var Connector, PROTOCOL_6, PROTOCOL_7, Parser, Version, _ref + + _ref = require('./protocol'), Parser = _ref.Parser, PROTOCOL_6 = _ref.PROTOCOL_6, PROTOCOL_7 = _ref.PROTOCOL_7 + + Version = '2.2.2' + + exports.Connector = Connector = (function () { + function Connector (options, WebSocket, Timer, handlers) { + this.options = options + this.WebSocket = WebSocket + this.Timer = Timer + this.handlers = handlers + this._uri = 'ws' + (this.options.https ? 's' : '') + '://' + this.options.host + ':' + this.options.port + '/livereload' + this._nextDelay = this.options.mindelay + this._connectionDesired = false + this.protocol = 0 + this.protocolParser = new Parser({ + connected: (function (_this) { + return function (protocol) { + _this.protocol = protocol + _this._handshakeTimeout.stop() + _this._nextDelay = _this.options.mindelay + _this._disconnectionReason = 'broken' + return _this.handlers.connected(protocol) + } + })(this), + error: (function (_this) { + return function (e) { + _this.handlers.error(e) + return _this._closeOnError() + } + })(this), + message: (function (_this) { + return function (message) { + return _this.handlers.message(message) + } + })(this), + }) + this._handshakeTimeout = new Timer((function (_this) { + return function () { + if (!_this._isSocketConnected()) { + return + } + _this._disconnectionReason = 'handshake-timeout' + return _this.socket.close() } - _this._disconnectionReason = 'handshake-timeout'; - return _this.socket.close(); - }; - })(this)); - this._reconnectTimer = new Timer((function(_this) { - return function() { - if (!_this._connectionDesired) { - return; + })(this)) + this._reconnectTimer = new Timer((function (_this) { + return function () { + if (!_this._connectionDesired) { + return + } + return _this.connect() } - return _this.connect(); - }; - })(this)); - this.connect(); - } - - Connector.prototype._isSocketConnected = function() { - return this.socket && this.socket.readyState === this.WebSocket.OPEN; - }; - - Connector.prototype.connect = function() { - this._connectionDesired = true; - if (this._isSocketConnected()) { - return; - } - this._reconnectTimer.stop(); - this._disconnectionReason = 'cannot-connect'; - this.protocolParser.reset(); - this.handlers.connecting(); - this.socket = new this.WebSocket(this._uri); - this.socket.onopen = (function(_this) { - return function(e) { - return _this._onopen(e); - }; - })(this); - this.socket.onclose = (function(_this) { - return function(e) { - return _this._onclose(e); - }; - })(this); - this.socket.onmessage = (function(_this) { - return function(e) { - return _this._onmessage(e); - }; - })(this); - return this.socket.onerror = (function(_this) { - return function(e) { - return _this._onerror(e); - }; - })(this); - }; - - Connector.prototype.disconnect = function() { - this._connectionDesired = false; - this._reconnectTimer.stop(); - if (!this._isSocketConnected()) { - return; + })(this)) + this.connect() } - this._disconnectionReason = 'manual'; - return this.socket.close(); - }; - Connector.prototype._scheduleReconnection = function() { - if (!this._connectionDesired) { - return; + Connector.prototype._isSocketConnected = function () { + return this.socket && this.socket.readyState === this.WebSocket.OPEN } - if (!this._reconnectTimer.running) { - this._reconnectTimer.start(this._nextDelay); - return this._nextDelay = Math.min(this.options.maxdelay, this._nextDelay * 2); - } - }; - Connector.prototype.sendCommand = function(command) { - if (this.protocol == null) { - return; - } - return this._sendCommand(command); - }; - - Connector.prototype._sendCommand = function(command) { - return this.socket.send(JSON.stringify(command)); - }; - - Connector.prototype._closeOnError = function() { - this._handshakeTimeout.stop(); - this._disconnectionReason = 'error'; - return this.socket.close(); - }; - - Connector.prototype._onopen = function(e) { - var hello; - this.handlers.socketConnected(); - this._disconnectionReason = 'handshake-failed'; - hello = { - command: 'hello', - protocols: [PROTOCOL_6, PROTOCOL_7] - }; - hello.ver = Version; - if (this.options.ext) { - hello.ext = this.options.ext; + Connector.prototype.connect = function () { + this._connectionDesired = true + if (this._isSocketConnected()) { + return + } + this._reconnectTimer.stop() + this._disconnectionReason = 'cannot-connect' + this.protocolParser.reset() + this.handlers.connecting() + this.socket = new this.WebSocket(this._uri) + this.socket.onopen = (function (_this) { + return function (e) { + return _this._onopen(e) + } + })(this) + this.socket.onclose = (function (_this) { + return function (e) { + return _this._onclose(e) + } + })(this) + this.socket.onmessage = (function (_this) { + return function (e) { + return _this._onmessage(e) + } + })(this) + return this.socket.onerror = (function (_this) { + return function (e) { + return _this._onerror(e) + } + })(this) } - if (this.options.extver) { - hello.extver = this.options.extver; + + Connector.prototype.disconnect = function () { + this._connectionDesired = false + this._reconnectTimer.stop() + if (!this._isSocketConnected()) { + return + } + this._disconnectionReason = 'manual' + return this.socket.close() } - if (this.options.snipver) { - hello.snipver = this.options.snipver; + + Connector.prototype._scheduleReconnection = function () { + if (!this._connectionDesired) { + return + } + if (!this._reconnectTimer.running) { + this._reconnectTimer.start(this._nextDelay) + return this._nextDelay = Math.min(this.options.maxdelay, this._nextDelay * 2) + } } - this._sendCommand(hello); - return this._handshakeTimeout.start(this.options.handshake_timeout); - }; - Connector.prototype._onclose = function(e) { - this.protocol = 0; - this.handlers.disconnected(this._disconnectionReason, this._nextDelay); - return this._scheduleReconnection(); - }; + Connector.prototype.sendCommand = function (command) { + if (this.protocol == null) { + return + } + return this._sendCommand(command) + } - Connector.prototype._onerror = function(e) {}; + Connector.prototype._sendCommand = function (command) { + return this.socket.send(JSON.stringify(command)) + } - Connector.prototype._onmessage = function(e) { - return this.protocolParser.process(e.data); - }; + Connector.prototype._closeOnError = function () { + this._handshakeTimeout.stop() + this._disconnectionReason = 'error' + return this.socket.close() + } - return Connector; + Connector.prototype._onopen = function (e) { + var hello + this.handlers.socketConnected() + this._disconnectionReason = 'handshake-failed' + hello = { + command: 'hello', + protocols: [PROTOCOL_6, PROTOCOL_7], + } + hello.ver = Version + if (this.options.ext) { + hello.ext = this.options.ext + } + if (this.options.extver) { + hello.extver = this.options.extver + } + if (this.options.snipver) { + hello.snipver = this.options.snipver + } + this._sendCommand(hello) + return this._handshakeTimeout.start(this.options.handshake_timeout) + } - })(); + Connector.prototype._onclose = function (e) { + this.protocol = 0 + this.handlers.disconnected(this._disconnectionReason, this._nextDelay) + return this._scheduleReconnection() + } -}).call(this); + Connector.prototype._onerror = function (e) {} -},{"./protocol":6}],2:[function(require,module,exports){ -(function() { - var CustomEvents; + Connector.prototype._onmessage = function (e) { + return this.protocolParser.process(e.data) + } - CustomEvents = { - bind: function(element, eventName, handler) { - if (element.addEventListener) { - return element.addEventListener(eventName, handler, false); - } else if (element.attachEvent) { - element[eventName] = 1; - return element.attachEvent('onpropertychange', function(event) { - if (event.propertyName === eventName) { - return handler(); + return Connector + })() + }).call(this) +}, {'./protocol': 6}], 2: [function (require, module, exports) { + (function () { + var CustomEvents + + CustomEvents = { + bind: function (element, eventName, handler) { + if (element.addEventListener) { + return element.addEventListener(eventName, handler, false) + } else if (element.attachEvent) { + element[eventName] = 1 + return element.attachEvent('onpropertychange', function (event) { + if (event.propertyName === eventName) { + return handler() + } + }) + } else { + throw new Error('Attempt to attach custom event ' + eventName + " to something which isn't a DOMElement") + } + }, + fire: function (element, eventName) { + var event + if (element.addEventListener) { + event = document.createEvent('HTMLEvents') + event.initEvent(eventName, true, true) + return document.dispatchEvent(event) + } else if (element.attachEvent) { + if (element[eventName]) { + return element[eventName]++ } - }); - } else { - throw new Error("Attempt to attach custom event " + eventName + " to something which isn't a DOMElement"); - } - }, - fire: function(element, eventName) { - var event; - if (element.addEventListener) { - event = document.createEvent('HTMLEvents'); - event.initEvent(eventName, true, true); - return document.dispatchEvent(event); - } else if (element.attachEvent) { - if (element[eventName]) { - return element[eventName]++; + } else { + throw new Error('Attempt to fire custom event ' + eventName + " on something which isn't a DOMElement") } - } else { - throw new Error("Attempt to fire custom event " + eventName + " on something which isn't a DOMElement"); - } + }, } - }; - exports.bind = CustomEvents.bind; + exports.bind = CustomEvents.bind - exports.fire = CustomEvents.fire; + exports.fire = CustomEvents.fire + }).call(this) +}, {}], 3: [function (require, module, exports) { + (function () { + var LessPlugin -}).call(this); + module.exports = LessPlugin = (function () { + LessPlugin.identifier = 'less' -},{}],3:[function(require,module,exports){ -(function() { - var LessPlugin; + LessPlugin.version = '1.0' - module.exports = LessPlugin = (function() { - LessPlugin.identifier = 'less'; - - LessPlugin.version = '1.0'; - - function LessPlugin(window, host) { - this.window = window; - this.host = host; - } + function LessPlugin (window, host) { + this.window = window + this.host = host + } - LessPlugin.prototype.reload = function(path, options) { - if (this.window.less && this.window.less.refresh) { - if (path.match(/\.less$/i)) { - return this.reloadLess(path); - } - if (options.originalPath.match(/\.less$/i)) { - return this.reloadLess(options.originalPath); + LessPlugin.prototype.reload = function (path, options) { + if (this.window.less && this.window.less.refresh) { + if (path.match(/\.less$/i)) { + return this.reloadLess(path) + } + if (options.originalPath.match(/\.less$/i)) { + return this.reloadLess(options.originalPath) + } } + return false } - return false; - }; - - LessPlugin.prototype.reloadLess = function(path) { - var link, links, _i, _len; - links = (function() { - var _i, _len, _ref, _results; - _ref = document.getElementsByTagName('link'); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - if (link.href && link.rel.match(/^stylesheet\/less$/i) || (link.rel.match(/stylesheet/i) && link.type.match(/^text\/(x-)?less$/i))) { - _results.push(link); + + LessPlugin.prototype.reloadLess = function (path) { + var link, links, _i, _len + links = (function () { + var _i, _len, _ref, _results + _ref = document.getElementsByTagName('link') + _results = [] + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i] + if (link.href && link.rel.match(/^stylesheet\/less$/i) || (link.rel.match(/stylesheet/i) && link.type.match(/^text\/(x-)?less$/i))) { + _results.push(link) + } } + return _results + })() + if (links.length === 0) { + return false } - return _results; - })(); - if (links.length === 0) { - return false; - } - for (_i = 0, _len = links.length; _i < _len; _i++) { - link = links[_i]; - link.href = this.host.generateCacheBustUrl(link.href); + for (_i = 0, _len = links.length; _i < _len; _i++) { + link = links[_i] + link.href = this.host.generateCacheBustUrl(link.href) + } + this.host.console.log('LiveReload is asking LESS to recompile all stylesheets') + this.window.less.refresh(true) + return true } - this.host.console.log("LiveReload is asking LESS to recompile all stylesheets"); - this.window.less.refresh(true); - return true; - }; - LessPlugin.prototype.analyze = function() { - return { - disable: !!(this.window.less && this.window.less.refresh) - }; - }; - - return LessPlugin; - - })(); - -}).call(this); - -},{}],4:[function(require,module,exports){ -(function() { - var Connector, LiveReload, Options, Reloader, Timer, - __hasProp = {}.hasOwnProperty; - - Connector = require('./connector').Connector; - - Timer = require('./timer').Timer; - - Options = require('./options').Options; - - Reloader = require('./reloader').Reloader; - - exports.LiveReload = LiveReload = (function() { - function LiveReload(window) { - var k, v, _ref; - this.window = window; - this.listeners = {}; - this.plugins = []; - this.pluginIdentifiers = {}; - this.console = this.window.console && this.window.console.log && this.window.console.error ? this.window.location.href.match(/LR-verbose/) ? this.window.console : { - log: function() {}, - error: this.window.console.error.bind(this.window.console) - } : { - log: function() {}, - error: function() {} - }; - if (!(this.WebSocket = this.window.WebSocket || this.window.MozWebSocket)) { - this.console.error("LiveReload disabled because the browser does not seem to support web sockets"); - return; + LessPlugin.prototype.analyze = function () { + return { + disable: !!(this.window.less && this.window.less.refresh), + } } - if ('LiveReloadOptions' in window) { - this.options = new Options(); - _ref = window['LiveReloadOptions']; - for (k in _ref) { - if (!__hasProp.call(_ref, k)) continue; - v = _ref[k]; - this.options.set(k, v); + + return LessPlugin + })() + }).call(this) +}, {}], 4: [function (require, module, exports) { + (function () { + var Connector, LiveReload, Options, Reloader, Timer, + __hasProp = {}.hasOwnProperty + + Connector = require('./connector').Connector + + Timer = require('./timer').Timer + + Options = require('./options').Options + + Reloader = require('./reloader').Reloader + + exports.LiveReload = LiveReload = (function () { + function LiveReload (window) { + var k, v, _ref + this.window = window + this.listeners = {} + this.plugins = [] + this.pluginIdentifiers = {} + this.console = this.window.console && this.window.console.log && this.window.console.error ? this.window.location.href.match(/LR-verbose/) ? this.window.console : { + log: function () {}, + error: this.window.console.error.bind(this.window.console), + } : { + log: function () {}, + error: function () {}, } - } else { - this.options = Options.extract(this.window.document); - if (!this.options) { - this.console.error("LiveReload disabled because it could not find its own <SCRIPT> tag"); - return; + if (!(this.WebSocket = this.window.WebSocket || this.window.MozWebSocket)) { + this.console.error('LiveReload disabled because the browser does not seem to support web sockets') + return } - } - this.reloader = new Reloader(this.window, this.console, Timer); - this.connector = new Connector(this.options, this.WebSocket, Timer, { - connecting: (function(_this) { - return function() {}; - })(this), - socketConnected: (function(_this) { - return function() {}; - })(this), - connected: (function(_this) { - return function(protocol) { - var _base; - if (typeof (_base = _this.listeners).connect === "function") { - _base.connect(); - } - _this.log("LiveReload is connected to " + _this.options.host + ":" + _this.options.port + " (protocol v" + protocol + ")."); - return _this.analyze(); - }; - })(this), - error: (function(_this) { - return function(e) { - if (e instanceof ProtocolError) { - if (typeof console !== "undefined" && console !== null) { - return console.log("" + e.message + "."); - } - } else { - if (typeof console !== "undefined" && console !== null) { - return console.log("LiveReload internal error: " + e.message); + if ('LiveReloadOptions' in window) { + this.options = new Options() + _ref = window['LiveReloadOptions'] + for (k in _ref) { + if (!__hasProp.call(_ref, k)) continue + v = _ref[k] + this.options.set(k, v) + } + } else { + this.options = Options.extract(this.window.document) + if (!this.options) { + this.console.error('LiveReload disabled because it could not find its own <SCRIPT> tag') + return + } + } + this.reloader = new Reloader(this.window, this.console, Timer) + this.connector = new Connector(this.options, this.WebSocket, Timer, { + connecting: (function (_this) { + return function () {} + })(this), + socketConnected: (function (_this) { + return function () {} + })(this), + connected: (function (_this) { + return function (protocol) { + var _base + if (typeof (_base = _this.listeners).connect === 'function') { + _base.connect() } + _this.log('LiveReload is connected to ' + _this.options.host + ':' + _this.options.port + ' (protocol v' + protocol + ').') + return _this.analyze() } - }; - })(this), - disconnected: (function(_this) { - return function(reason, nextDelay) { - var _base; - if (typeof (_base = _this.listeners).disconnect === "function") { - _base.disconnect(); + })(this), + error: (function (_this) { + return function (e) { + if (e instanceof ProtocolError) { + if (typeof console !== 'undefined' && console !== null) { + return console.log('' + e.message + '.') + } + } else { + if (typeof console !== 'undefined' && console !== null) { + return console.log('LiveReload internal error: ' + e.message) + } + } } - switch (reason) { - case 'cannot-connect': - return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + ", will retry in " + nextDelay + " sec."); - case 'broken': - return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + ", reconnecting in " + nextDelay + " sec."); - case 'handshake-timeout': - return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake timeout), will retry in " + nextDelay + " sec."); - case 'handshake-failed': - return _this.log("LiveReload cannot connect to " + _this.options.host + ":" + _this.options.port + " (handshake failed), will retry in " + nextDelay + " sec."); - case 'manual': - break; - case 'error': - break; - default: - return _this.log("LiveReload disconnected from " + _this.options.host + ":" + _this.options.port + " (" + reason + "), reconnecting in " + nextDelay + " sec."); + })(this), + disconnected: (function (_this) { + return function (reason, nextDelay) { + var _base + if (typeof (_base = _this.listeners).disconnect === 'function') { + _base.disconnect() + } + switch (reason) { + case 'cannot-connect': + return _this.log('LiveReload cannot connect to ' + _this.options.host + ':' + _this.options.port + ', will retry in ' + nextDelay + ' sec.') + case 'broken': + return _this.log('LiveReload disconnected from ' + _this.options.host + ':' + _this.options.port + ', reconnecting in ' + nextDelay + ' sec.') + case 'handshake-timeout': + return _this.log('LiveReload cannot connect to ' + _this.options.host + ':' + _this.options.port + ' (handshake timeout), will retry in ' + nextDelay + ' sec.') + case 'handshake-failed': + return _this.log('LiveReload cannot connect to ' + _this.options.host + ':' + _this.options.port + ' (handshake failed), will retry in ' + nextDelay + ' sec.') + case 'manual': + break + case 'error': + break + default: + return _this.log('LiveReload disconnected from ' + _this.options.host + ':' + _this.options.port + ' (' + reason + '), reconnecting in ' + nextDelay + ' sec.') + } } - }; - })(this), - message: (function(_this) { - return function(message) { - switch (message.command) { - case 'reload': - return _this.performReload(message); - case 'alert': - return _this.performAlert(message); + })(this), + message: (function (_this) { + return function (message) { + switch (message.command) { + case 'reload': + return _this.performReload(message) + case 'alert': + return _this.performAlert(message) + } } - }; - })(this) - }); - this.initialized = true; - } + })(this), + }) + this.initialized = true + } - LiveReload.prototype.on = function(eventName, handler) { - return this.listeners[eventName] = handler; - }; - - LiveReload.prototype.log = function(message) { - return this.console.log("" + message); - }; - - LiveReload.prototype.performReload = function(message) { - var _ref, _ref1; - this.log("LiveReload received reload request: " + (JSON.stringify(message, null, 2))); - return this.reloader.reload(message.path, { - liveCSS: (_ref = message.liveCSS) != null ? _ref : true, - liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true, - originalPath: message.originalPath || '', - overrideURL: message.overrideURL || '', - serverURL: "http://" + this.options.host + ":" + this.options.port - }); - }; - - LiveReload.prototype.performAlert = function(message) { - return alert(message.message); - }; - - LiveReload.prototype.shutDown = function() { - var _base; - if (!this.initialized) { - return; + LiveReload.prototype.on = function (eventName, handler) { + return this.listeners[eventName] = handler } - this.connector.disconnect(); - this.log("LiveReload disconnected."); - return typeof (_base = this.listeners).shutdown === "function" ? _base.shutdown() : void 0; - }; - - LiveReload.prototype.hasPlugin = function(identifier) { - return !!this.pluginIdentifiers[identifier]; - }; - - LiveReload.prototype.addPlugin = function(pluginClass) { - var plugin; - if (!this.initialized) { - return; + + LiveReload.prototype.log = function (message) { + return this.console.log('' + message) } - if (this.hasPlugin(pluginClass.identifier)) { - return; + + LiveReload.prototype.performReload = function (message) { + var _ref, _ref1 + this.log('LiveReload received reload request: ' + (JSON.stringify(message, null, 2))) + return this.reloader.reload(message.path, { + liveCSS: (_ref = message.liveCSS) != null ? _ref : true, + liveImg: (_ref1 = message.liveImg) != null ? _ref1 : true, + originalPath: message.originalPath || '', + overrideURL: message.overrideURL || '', + serverURL: 'http://' + this.options.host + ':' + this.options.port, + }) } - this.pluginIdentifiers[pluginClass.identifier] = true; - plugin = new pluginClass(this.window, { - _livereload: this, - _reloader: this.reloader, - _connector: this.connector, - console: this.console, - Timer: Timer, - generateCacheBustUrl: (function(_this) { - return function(url) { - return _this.reloader.generateCacheBustUrl(url); - }; - })(this) - }); - this.plugins.push(plugin); - this.reloader.addPlugin(plugin); - }; - - LiveReload.prototype.analyze = function() { - var plugin, pluginData, pluginsData, _i, _len, _ref; - if (!this.initialized) { - return; + + LiveReload.prototype.performAlert = function (message) { + return alert(message.message) } - if (!(this.connector.protocol >= 7)) { - return; + + LiveReload.prototype.shutDown = function () { + var _base + if (!this.initialized) { + return + } + this.connector.disconnect() + this.log('LiveReload disconnected.') + return typeof (_base = this.listeners).shutdown === 'function' ? _base.shutdown() : void 0 } - pluginsData = {}; - _ref = this.plugins; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - plugin = _ref[_i]; - pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === "function" ? plugin.analyze() : void 0) || {}; - pluginData.version = plugin.constructor.version; + + LiveReload.prototype.hasPlugin = function (identifier) { + return !!this.pluginIdentifiers[identifier] + } + + LiveReload.prototype.addPlugin = function (pluginClass) { + var plugin + if (!this.initialized) { + return + } + if (this.hasPlugin(pluginClass.identifier)) { + return + } + this.pluginIdentifiers[pluginClass.identifier] = true + plugin = new pluginClass(this.window, { + _livereload: this, + _reloader: this.reloader, + _connector: this.connector, + console: this.console, + Timer: Timer, + generateCacheBustUrl: (function (_this) { + return function (url) { + return _this.reloader.generateCacheBustUrl(url) + } + })(this), + }) + this.plugins.push(plugin) + this.reloader.addPlugin(plugin) } - this.connector.sendCommand({ - command: 'info', - plugins: pluginsData, - url: this.window.location.href - }); - }; - - return LiveReload; - - })(); - -}).call(this); - -},{"./connector":1,"./options":5,"./reloader":7,"./timer":9}],5:[function(require,module,exports){ -(function() { - var Options; - - exports.Options = Options = (function() { - function Options() { - this.https = false; - this.host = null; - this.port = 35729; - this.snipver = null; - this.ext = null; - this.extver = null; - this.mindelay = 1000; - this.maxdelay = 60000; - this.handshake_timeout = 5000; - } - Options.prototype.set = function(name, value) { - if (typeof value === 'undefined') { - return; + LiveReload.prototype.analyze = function () { + var plugin, pluginData, pluginsData, _i, _len, _ref + if (!this.initialized) { + return + } + if (!(this.connector.protocol >= 7)) { + return + } + pluginsData = {} + _ref = this.plugins + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i] + pluginsData[plugin.constructor.identifier] = pluginData = (typeof plugin.analyze === 'function' ? plugin.analyze() : void 0) || {} + pluginData.version = plugin.constructor.version + } + this.connector.sendCommand({ + command: 'info', + plugins: pluginsData, + url: this.window.location.href, + }) } - if (!isNaN(+value)) { - value = +value; + + return LiveReload + })() + }).call(this) +}, {'./connector': 1, './options': 5, './reloader': 7, './timer': 9}], 5: [function (require, module, exports) { + (function () { + var Options + + exports.Options = Options = (function () { + function Options () { + this.https = false + this.host = null + this.port = 35729 + this.snipver = null + this.ext = null + this.extver = null + this.mindelay = 1000 + this.maxdelay = 60000 + this.handshake_timeout = 5000 } - return this[name] = value; - }; - - return Options; - - })(); - - Options.extract = function(document) { - var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1; - _ref = document.getElementsByTagName('script'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - element = _ref[_i]; - if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) { - options = new Options(); - options.https = src.indexOf("https") === 0; - if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) { - options.host = mm[1]; - if (mm[2]) { - options.port = parseInt(mm[2], 10); - } + + Options.prototype.set = function (name, value) { + if (typeof value === 'undefined') { + return + } + if (!isNaN(+value)) { + value = +value } - if (m[2]) { - _ref1 = m[2].split('&'); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - pair = _ref1[_j]; - if ((keyAndValue = pair.split('=')).length > 1) { - options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('=')); + return this[name] = value + } + + return Options + })() + + Options.extract = function (document) { + var element, keyAndValue, m, mm, options, pair, src, _i, _j, _len, _len1, _ref, _ref1 + _ref = document.getElementsByTagName('script') + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + element = _ref[_i] + if ((src = element.src) && (m = src.match(/^[^:]+:\/\/(.*)\/z?livereload\.js(?:\?(.*))?$/))) { + options = new Options() + options.https = src.indexOf('https') === 0 + if (mm = m[1].match(/^([^\/:]+)(?::(\d+))?$/)) { + options.host = mm[1] + if (mm[2]) { + options.port = parseInt(mm[2], 10) + } + } + if (m[2]) { + _ref1 = m[2].split('&') + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + pair = _ref1[_j] + if ((keyAndValue = pair.split('=')).length > 1) { + options.set(keyAndValue[0].replace(/-/g, '_'), keyAndValue.slice(1).join('=')) + } } } + return options } - return options; } + return null } - return null; - }; + }).call(this) +}, {}], 6: [function (require, module, exports) { + (function () { + var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError, + __indexOf = [].indexOf || function (item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i } return -1 } -}).call(this); + exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6' -},{}],6:[function(require,module,exports){ -(function() { - var PROTOCOL_6, PROTOCOL_7, Parser, ProtocolError, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7' - exports.PROTOCOL_6 = PROTOCOL_6 = 'http://livereload.com/protocols/official-6'; - - exports.PROTOCOL_7 = PROTOCOL_7 = 'http://livereload.com/protocols/official-7'; - - exports.ProtocolError = ProtocolError = (function() { - function ProtocolError(reason, data) { - this.message = "LiveReload protocol error (" + reason + ") after receiving data: \"" + data + "\"."; - } - - return ProtocolError; + exports.ProtocolError = ProtocolError = (function () { + function ProtocolError (reason, data) { + this.message = 'LiveReload protocol error (' + reason + ') after receiving data: "' + data + '".' + } - })(); + return ProtocolError + })() - exports.Parser = Parser = (function() { - function Parser(handlers) { - this.handlers = handlers; - this.reset(); - } + exports.Parser = Parser = (function () { + function Parser (handlers) { + this.handlers = handlers + this.reset() + } - Parser.prototype.reset = function() { - return this.protocol = null; - }; + Parser.prototype.reset = function () { + return this.protocol = null + } - Parser.prototype.process = function(data) { - var command, e, message, options, _ref; - try { - if (this.protocol == null) { - if (data.match(/^!!ver:([\d.]+)$/)) { - this.protocol = 6; - } else if (message = this._parseMessage(data, ['hello'])) { - if (!message.protocols.length) { - throw new ProtocolError("no protocols specified in handshake message"); - } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) { - this.protocol = 7; - } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) { - this.protocol = 6; - } else { - throw new ProtocolError("no supported protocols found"); + Parser.prototype.process = function (data) { + var command, e, message, options, _ref + try { + if (this.protocol == null) { + if (data.match(/^!!ver:([\d.]+)$/)) { + this.protocol = 6 + } else if (message = this._parseMessage(data, ['hello'])) { + if (!message.protocols.length) { + throw new ProtocolError('no protocols specified in handshake message') + } else if (__indexOf.call(message.protocols, PROTOCOL_7) >= 0) { + this.protocol = 7 + } else if (__indexOf.call(message.protocols, PROTOCOL_6) >= 0) { + this.protocol = 6 + } else { + throw new ProtocolError('no supported protocols found') + } } + return this.handlers.connected(this.protocol) + } else if (this.protocol === 6) { + message = JSON.parse(data) + if (!message.length) { + throw new ProtocolError('protocol 6 messages must be arrays') + } + command = message[0], options = message[1] + if (command !== 'refresh') { + throw new ProtocolError('unknown protocol 6 command') + } + return this.handlers.message({ + command: 'reload', + path: options.path, + liveCSS: (_ref = options.apply_css_live) != null ? _ref : true, + }) + } else { + message = this._parseMessage(data, ['reload', 'alert']) + return this.handlers.message(message) } - return this.handlers.connected(this.protocol); - } else if (this.protocol === 6) { - message = JSON.parse(data); - if (!message.length) { - throw new ProtocolError("protocol 6 messages must be arrays"); - } - command = message[0], options = message[1]; - if (command !== 'refresh') { - throw new ProtocolError("unknown protocol 6 command"); + } catch (_error) { + e = _error + if (e instanceof ProtocolError) { + return this.handlers.error(e) + } else { + throw e } - return this.handlers.message({ - command: 'reload', - path: options.path, - liveCSS: (_ref = options.apply_css_live) != null ? _ref : true - }); - } else { - message = this._parseMessage(data, ['reload', 'alert']); - return this.handlers.message(message); } - } catch (_error) { - e = _error; - if (e instanceof ProtocolError) { - return this.handlers.error(e); - } else { - throw e; + } + + Parser.prototype._parseMessage = function (data, validCommands) { + var e, message, _ref + try { + message = JSON.parse(data) + } catch (_error) { + e = _error + throw new ProtocolError('unparsable JSON', data) + } + if (!message.command) { + throw new ProtocolError('missing "command" key', data) } + if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) { + throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ')', data) + } + return message } - }; - - Parser.prototype._parseMessage = function(data, validCommands) { - var e, message, _ref; - try { - message = JSON.parse(data); - } catch (_error) { - e = _error; - throw new ProtocolError('unparsable JSON', data); + + return Parser + })() + }).call(this) +}, {}], 7: [function (require, module, exports) { + (function () { + var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl + + splitUrl = function (url) { + var hash, index, params + if ((index = url.indexOf('#')) >= 0) { + hash = url.slice(index) + url = url.slice(0, index) + } else { + hash = '' } - if (!message.command) { - throw new ProtocolError('missing "command" key', data); + if ((index = url.indexOf('?')) >= 0) { + params = url.slice(index) + url = url.slice(0, index) + } else { + params = '' } - if (_ref = message.command, __indexOf.call(validCommands, _ref) < 0) { - throw new ProtocolError("invalid command '" + message.command + "', only valid commands are: " + (validCommands.join(', ')) + ")", data); + return { + url: url, + params: params, + hash: hash, } - return message; - }; - - return Parser; - - })(); - -}).call(this); - -},{}],7:[function(require,module,exports){ -(function() { - var IMAGE_STYLES, Reloader, numberOfMatchingSegments, pathFromUrl, pathsMatch, pickBestMatch, splitUrl; - - splitUrl = function(url) { - var hash, index, params; - if ((index = url.indexOf('#')) >= 0) { - hash = url.slice(index); - url = url.slice(0, index); - } else { - hash = ''; - } - if ((index = url.indexOf('?')) >= 0) { - params = url.slice(index); - url = url.slice(0, index); - } else { - params = ''; } - return { - url: url, - params: params, - hash: hash - }; - }; - - pathFromUrl = function(url) { - var path; - url = splitUrl(url).url; - if (url.indexOf('file://') === 0) { - path = url.replace(/^file:\/\/(localhost)?/, ''); - } else { - path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/'); - } - return decodeURIComponent(path); - }; - - pickBestMatch = function(path, objects, pathFunc) { - var bestMatch, object, score, _i, _len; - bestMatch = { - score: 0 - }; - for (_i = 0, _len = objects.length; _i < _len; _i++) { - object = objects[_i]; - score = numberOfMatchingSegments(path, pathFunc(object)); - if (score > bestMatch.score) { - bestMatch = { - object: object, - score: score - }; + + pathFromUrl = function (url) { + var path + url = splitUrl(url).url + if (url.indexOf('file://') === 0) { + path = url.replace(/^file:\/\/(localhost)?/, '') + } else { + path = url.replace(/^([^:]+:)?\/\/([^:\/]+)(:\d*)?\//, '/') } + return decodeURIComponent(path) } - if (bestMatch.score > 0) { - return bestMatch; - } else { - return null; - } - }; - - numberOfMatchingSegments = function(path1, path2) { - var comps1, comps2, eqCount, len; - path1 = path1.replace(/^\/+/, '').toLowerCase(); - path2 = path2.replace(/^\/+/, '').toLowerCase(); - if (path1 === path2) { - return 10000; - } - comps1 = path1.split('/').reverse(); - comps2 = path2.split('/').reverse(); - len = Math.min(comps1.length, comps2.length); - eqCount = 0; - while (eqCount < len && comps1[eqCount] === comps2[eqCount]) { - ++eqCount; + + pickBestMatch = function (path, objects, pathFunc) { + var bestMatch, object, score, _i, _len + bestMatch = { + score: 0, + } + for (_i = 0, _len = objects.length; _i < _len; _i++) { + object = objects[_i] + score = numberOfMatchingSegments(path, pathFunc(object)) + if (score > bestMatch.score) { + bestMatch = { + object: object, + score: score, + } + } + } + if (bestMatch.score > 0) { + return bestMatch + } else { + return null + } } - return eqCount; - }; - - pathsMatch = function(path1, path2) { - return numberOfMatchingSegments(path1, path2) > 0; - }; - - IMAGE_STYLES = [ - { - selector: 'background', - styleNames: ['backgroundImage'] - }, { - selector: 'border', - styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage'] + + numberOfMatchingSegments = function (path1, path2) { + var comps1, comps2, eqCount, len + path1 = path1.replace(/^\/+/, '').toLowerCase() + path2 = path2.replace(/^\/+/, '').toLowerCase() + if (path1 === path2) { + return 10000 + } + comps1 = path1.split('/').reverse() + comps2 = path2.split('/').reverse() + len = Math.min(comps1.length, comps2.length) + eqCount = 0 + while (eqCount < len && comps1[eqCount] === comps2[eqCount]) { + ++eqCount + } + return eqCount } - ]; - - exports.Reloader = Reloader = (function() { - function Reloader(window, console, Timer) { - this.window = window; - this.console = console; - this.Timer = Timer; - this.document = this.window.document; - this.importCacheWaitPeriod = 200; - this.plugins = []; + + pathsMatch = function (path1, path2) { + return numberOfMatchingSegments(path1, path2) > 0 } - Reloader.prototype.addPlugin = function(plugin) { - return this.plugins.push(plugin); - }; + IMAGE_STYLES = [ + { + selector: 'background', + styleNames: ['backgroundImage'], + }, { + selector: 'border', + styleNames: ['borderImage', 'webkitBorderImage', 'MozBorderImage'], + }, + ] + + exports.Reloader = Reloader = (function () { + function Reloader (window, console, Timer) { + this.window = window + this.console = console + this.Timer = Timer + this.document = this.window.document + this.importCacheWaitPeriod = 200 + this.plugins = [] + } - Reloader.prototype.analyze = function(callback) { - return results; - }; + Reloader.prototype.addPlugin = function (plugin) { + return this.plugins.push(plugin) + } - Reloader.prototype.reload = function(path, options) { - var plugin, _base, _i, _len, _ref; - this.options = options; - if ((_base = this.options).stylesheetReloadTimeout == null) { - _base.stylesheetReloadTimeout = 15000; + Reloader.prototype.analyze = function (callback) { + return results } - _ref = this.plugins; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - plugin = _ref[_i]; - if (plugin.reload && plugin.reload(path, options)) { - return; + + Reloader.prototype.reload = function (path, options) { + var plugin, _base, _i, _len, _ref + this.options = options + if ((_base = this.options).stylesheetReloadTimeout == null) { + _base.stylesheetReloadTimeout = 15000 } - } - if (options.liveCSS) { - if (path.match(/\.css$/i)) { - if (this.reloadStylesheet(path)) { - return; + _ref = this.plugins + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + plugin = _ref[_i] + if (plugin.reload && plugin.reload(path, options)) { + return } } - } - if (options.liveImg) { - if (path.match(/\.(jpe?g|png|gif)$/i)) { - this.reloadImages(path); - return; + if (options.liveCSS) { + if (path.match(/\.css$/i)) { + if (this.reloadStylesheet(path)) { + return + } + } } + if (options.liveImg) { + if (path.match(/\.(jpe?g|png|gif)$/i)) { + this.reloadImages(path) + return + } + } + return this.reloadPage() } - return this.reloadPage(); - }; - Reloader.prototype.reloadPage = function() { - return this.window.document.location.reload(); - }; + Reloader.prototype.reloadPage = function () { + return this.window.document.location.reload() + } - Reloader.prototype.reloadImages = function(path) { - var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results; - expando = this.generateUniqueString(); - _ref = this.document.images; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - img = _ref[_i]; - if (pathsMatch(path, pathFromUrl(img.src))) { - img.src = this.generateCacheBustUrl(img.src, expando); + Reloader.prototype.reloadImages = function (path) { + var expando, img, selector, styleNames, styleSheet, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _results + expando = this.generateUniqueString() + _ref = this.document.images + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + img = _ref[_i] + if (pathsMatch(path, pathFromUrl(img.src))) { + img.src = this.generateCacheBustUrl(img.src, expando) + } } - } - if (this.document.querySelectorAll) { - for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { - _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames; - _ref2 = this.document.querySelectorAll("[style*=" + selector + "]"); - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - img = _ref2[_k]; - this.reloadStyleImages(img.style, styleNames, path, expando); + if (this.document.querySelectorAll) { + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + _ref1 = IMAGE_STYLES[_j], selector = _ref1.selector, styleNames = _ref1.styleNames + _ref2 = this.document.querySelectorAll('[style*=' + selector + ']') + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + img = _ref2[_k] + this.reloadStyleImages(img.style, styleNames, path, expando) + } } } - } - if (this.document.styleSheets) { - _ref3 = this.document.styleSheets; - _results = []; - for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { - styleSheet = _ref3[_l]; - _results.push(this.reloadStylesheetImages(styleSheet, path, expando)); + if (this.document.styleSheets) { + _ref3 = this.document.styleSheets + _results = [] + for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { + styleSheet = _ref3[_l] + _results.push(this.reloadStylesheetImages(styleSheet, path, expando)) + } + return _results } - return _results; - } - }; - - Reloader.prototype.reloadStylesheetImages = function(styleSheet, path, expando) { - var e, rule, rules, styleNames, _i, _j, _len, _len1; - try { - rules = styleSheet != null ? styleSheet.cssRules : void 0; - } catch (_error) { - e = _error; } - if (!rules) { - return; - } - for (_i = 0, _len = rules.length; _i < _len; _i++) { - rule = rules[_i]; - switch (rule.type) { - case CSSRule.IMPORT_RULE: - this.reloadStylesheetImages(rule.styleSheet, path, expando); - break; - case CSSRule.STYLE_RULE: - for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { - styleNames = IMAGE_STYLES[_j].styleNames; - this.reloadStyleImages(rule.style, styleNames, path, expando); - } - break; - case CSSRule.MEDIA_RULE: - this.reloadStylesheetImages(rule, path, expando); + + Reloader.prototype.reloadStylesheetImages = function (styleSheet, path, expando) { + var e, rule, rules, styleNames, _i, _j, _len, _len1 + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0 + } catch (_error) { + e = _error + } + if (!rules) { + return + } + for (_i = 0, _len = rules.length; _i < _len; _i++) { + rule = rules[_i] + switch (rule.type) { + case CSSRule.IMPORT_RULE: + this.reloadStylesheetImages(rule.styleSheet, path, expando) + break + case CSSRule.STYLE_RULE: + for (_j = 0, _len1 = IMAGE_STYLES.length; _j < _len1; _j++) { + styleNames = IMAGE_STYLES[_j].styleNames + this.reloadStyleImages(rule.style, styleNames, path, expando) + } + break + case CSSRule.MEDIA_RULE: + this.reloadStylesheetImages(rule, path, expando) + } } } - }; - - Reloader.prototype.reloadStyleImages = function(style, styleNames, path, expando) { - var newValue, styleName, value, _i, _len; - for (_i = 0, _len = styleNames.length; _i < _len; _i++) { - styleName = styleNames[_i]; - value = style[styleName]; - if (typeof value === 'string') { - newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function(_this) { - return function(match, src) { - if (pathsMatch(path, pathFromUrl(src))) { - return "url(" + (_this.generateCacheBustUrl(src, expando)) + ")"; - } else { - return match; + + Reloader.prototype.reloadStyleImages = function (style, styleNames, path, expando) { + var newValue, styleName, value, _i, _len + for (_i = 0, _len = styleNames.length; _i < _len; _i++) { + styleName = styleNames[_i] + value = style[styleName] + if (typeof value === 'string') { + newValue = value.replace(/\burl\s*\(([^)]*)\)/, (function (_this) { + return function (match, src) { + if (pathsMatch(path, pathFromUrl(src))) { + return 'url(' + (_this.generateCacheBustUrl(src, expando)) + ')' + } else { + return match + } } - }; - })(this)); - if (newValue !== value) { - style[styleName] = newValue; + })(this)) + if (newValue !== value) { + style[styleName] = newValue + } } } } - }; - - Reloader.prototype.reloadStylesheet = function(path) { - var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1; - links = (function() { - var _i, _len, _ref, _results; - _ref = this.document.getElementsByTagName('link'); - _results = []; + + Reloader.prototype.reloadStylesheet = function (path) { + var imported, link, links, match, style, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1 + links = (function () { + var _i, _len, _ref, _results + _ref = this.document.getElementsByTagName('link') + _results = [] + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + link = _ref[_i] + if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) { + _results.push(link) + } + } + return _results + }).call(this) + imported = [] + _ref = this.document.getElementsByTagName('style') for (_i = 0, _len = _ref.length; _i < _len; _i++) { - link = _ref[_i]; - if (link.rel.match(/^stylesheet$/i) && !link.__LiveReload_pendingRemoval) { - _results.push(link); + style = _ref[_i] + if (style.sheet) { + this.collectImportedStylesheets(style, style.sheet, imported) } } - return _results; - }).call(this); - imported = []; - _ref = this.document.getElementsByTagName('style'); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - style = _ref[_i]; - if (style.sheet) { - this.collectImportedStylesheets(style, style.sheet, imported); + for (_j = 0, _len1 = links.length; _j < _len1; _j++) { + link = links[_j] + this.collectImportedStylesheets(link, link.sheet, imported) } - } - for (_j = 0, _len1 = links.length; _j < _len1; _j++) { - link = links[_j]; - this.collectImportedStylesheets(link, link.sheet, imported); - } - if (this.window.StyleFix && this.document.querySelectorAll) { - _ref1 = this.document.querySelectorAll('style[data-href]'); - for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { - style = _ref1[_k]; - links.push(style); + if (this.window.StyleFix && this.document.querySelectorAll) { + _ref1 = this.document.querySelectorAll('style[data-href]') + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) { + style = _ref1[_k] + links.push(style) + } } - } - this.console.log("LiveReload found " + links.length + " LINKed stylesheets, " + imported.length + " @imported stylesheets"); - match = pickBestMatch(path, links.concat(imported), (function(_this) { - return function(l) { - return pathFromUrl(_this.linkHref(l)); - }; - })(this)); - if (match) { - if (match.object.rule) { - this.console.log("LiveReload is reloading imported stylesheet: " + match.object.href); - this.reattachImportedRule(match.object); + this.console.log('LiveReload found ' + links.length + ' LINKed stylesheets, ' + imported.length + ' @imported stylesheets') + match = pickBestMatch(path, links.concat(imported), (function (_this) { + return function (l) { + return pathFromUrl(_this.linkHref(l)) + } + })(this)) + if (match) { + if (match.object.rule) { + this.console.log('LiveReload is reloading imported stylesheet: ' + match.object.href) + this.reattachImportedRule(match.object) + } else { + this.console.log('LiveReload is reloading stylesheet: ' + (this.linkHref(match.object))) + this.reattachStylesheetLink(match.object) + } } else { - this.console.log("LiveReload is reloading stylesheet: " + (this.linkHref(match.object))); - this.reattachStylesheetLink(match.object); - } - } else { - this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one"); - for (_l = 0, _len3 = links.length; _l < _len3; _l++) { - link = links[_l]; - this.reattachStylesheetLink(link); - } - } - return true; - }; - - Reloader.prototype.collectImportedStylesheets = function(link, styleSheet, result) { - var e, index, rule, rules, _i, _len; - try { - rules = styleSheet != null ? styleSheet.cssRules : void 0; - } catch (_error) { - e = _error; - } - if (rules && rules.length) { - for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) { - rule = rules[index]; - switch (rule.type) { - case CSSRule.CHARSET_RULE: - continue; - case CSSRule.IMPORT_RULE: - result.push({ - link: link, - rule: rule, - index: index, - href: rule.href - }); - this.collectImportedStylesheets(link, rule.styleSheet, result); - break; - default: - break; + this.console.log("LiveReload will reload all stylesheets because path '" + path + "' did not match any specific one") + for (_l = 0, _len3 = links.length; _l < _len3; _l++) { + link = links[_l] + this.reattachStylesheetLink(link) } } + return true } - }; - - Reloader.prototype.waitUntilCssLoads = function(clone, func) { - var callbackExecuted, executeCallback, poll; - callbackExecuted = false; - executeCallback = (function(_this) { - return function() { - if (callbackExecuted) { - return; - } - callbackExecuted = true; - return func(); - }; - })(this); - clone.onload = (function(_this) { - return function() { - _this.console.log("LiveReload: the new stylesheet has finished loading"); - _this.knownToSupportCssOnLoad = true; - return executeCallback(); - }; - })(this); - if (!this.knownToSupportCssOnLoad) { - (poll = (function(_this) { - return function() { - if (clone.sheet) { - _this.console.log("LiveReload is polling until the new CSS finishes loading..."); - return executeCallback(); - } else { - return _this.Timer.start(50, poll); + + Reloader.prototype.collectImportedStylesheets = function (link, styleSheet, result) { + var e, index, rule, rules, _i, _len + try { + rules = styleSheet != null ? styleSheet.cssRules : void 0 + } catch (_error) { + e = _error + } + if (rules && rules.length) { + for (index = _i = 0, _len = rules.length; _i < _len; index = ++_i) { + rule = rules[index] + switch (rule.type) { + case CSSRule.CHARSET_RULE: + continue + case CSSRule.IMPORT_RULE: + result.push({ + link: link, + rule: rule, + index: index, + href: rule.href, + }) + this.collectImportedStylesheets(link, rule.styleSheet, result) + break + default: + break } - }; - })(this))(); + } + } } - return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback); - }; - Reloader.prototype.linkHref = function(link) { - return link.href || link.getAttribute('data-href'); - }; - - Reloader.prototype.reattachStylesheetLink = function(link) { - var clone, parent; - if (link.__LiveReload_pendingRemoval) { - return; - } - link.__LiveReload_pendingRemoval = true; - if (link.tagName === 'STYLE') { - clone = this.document.createElement('link'); - clone.rel = 'stylesheet'; - clone.media = link.media; - clone.disabled = link.disabled; - } else { - clone = link.cloneNode(false); - } - clone.href = this.generateCacheBustUrl(this.linkHref(link)); - parent = link.parentNode; - if (parent.lastChild === link) { - parent.appendChild(clone); - } else { - parent.insertBefore(clone, link.nextSibling); - } - return this.waitUntilCssLoads(clone, (function(_this) { - return function() { - var additionalWaitingTime; - if (/AppleWebKit/.test(navigator.userAgent)) { - additionalWaitingTime = 5; - } else { - additionalWaitingTime = 200; - } - return _this.Timer.start(additionalWaitingTime, function() { - var _ref; - if (!link.parentNode) { - return; + Reloader.prototype.waitUntilCssLoads = function (clone, func) { + var callbackExecuted, executeCallback, poll + callbackExecuted = false + executeCallback = (function (_this) { + return function () { + if (callbackExecuted) { + return } - link.parentNode.removeChild(link); - clone.onreadystatechange = null; - return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0; - }); - }; - })(this)); - }; - - Reloader.prototype.reattachImportedRule = function(_arg) { - var href, index, link, media, newRule, parent, rule, tempLink; - rule = _arg.rule, index = _arg.index, link = _arg.link; - parent = rule.parentStyleSheet; - href = this.generateCacheBustUrl(rule.href); - media = rule.media.length ? [].join.call(rule.media, ', ') : ''; - newRule = "@import url(\"" + href + "\") " + media + ";"; - rule.__LiveReload_newHref = href; - tempLink = this.document.createElement("link"); - tempLink.rel = 'stylesheet'; - tempLink.href = href; - tempLink.__LiveReload_pendingRemoval = true; - if (link.parentNode) { - link.parentNode.insertBefore(tempLink, link); - } - return this.Timer.start(this.importCacheWaitPeriod, (function(_this) { - return function() { - if (tempLink.parentNode) { - tempLink.parentNode.removeChild(tempLink); + callbackExecuted = true + return func() } - if (rule.__LiveReload_newHref !== href) { - return; + })(this) + clone.onload = (function (_this) { + return function () { + _this.console.log('LiveReload: the new stylesheet has finished loading') + _this.knownToSupportCssOnLoad = true + return executeCallback() } - parent.insertRule(newRule, index); - parent.deleteRule(index + 1); - rule = parent.cssRules[index]; - rule.__LiveReload_newHref = href; - return _this.Timer.start(_this.importCacheWaitPeriod, function() { - if (rule.__LiveReload_newHref !== href) { - return; + })(this) + if (!this.knownToSupportCssOnLoad) { + (poll = (function (_this) { + return function () { + if (clone.sheet) { + _this.console.log('LiveReload is polling until the new CSS finishes loading...') + return executeCallback() + } else { + return _this.Timer.start(50, poll) + } } - parent.insertRule(newRule, index); - return parent.deleteRule(index + 1); - }); - }; - })(this)); - }; - - Reloader.prototype.generateUniqueString = function() { - return 'livereload=' + Date.now(); - }; - - Reloader.prototype.generateCacheBustUrl = function(url, expando) { - var hash, oldParams, originalUrl, params, _ref; - if (expando == null) { - expando = this.generateUniqueString(); - } - _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params; - if (this.options.overrideURL) { - if (url.indexOf(this.options.serverURL) < 0) { - originalUrl = url; - url = this.options.serverURL + this.options.overrideURL + "?url=" + encodeURIComponent(url); - this.console.log("LiveReload is overriding source URL " + originalUrl + " with " + url); + })(this))() } + return this.Timer.start(this.options.stylesheetReloadTimeout, executeCallback) + } + + Reloader.prototype.linkHref = function (link) { + return link.href || link.getAttribute('data-href') } - params = oldParams.replace(/(\?|&)livereload=(\d+)/, function(match, sep) { - return "" + sep + expando; - }); - if (params === oldParams) { - if (oldParams.length === 0) { - params = "?" + expando; + + Reloader.prototype.reattachStylesheetLink = function (link) { + var clone, parent + if (link.__LiveReload_pendingRemoval) { + return + } + link.__LiveReload_pendingRemoval = true + if (link.tagName === 'STYLE') { + clone = this.document.createElement('link') + clone.rel = 'stylesheet' + clone.media = link.media + clone.disabled = link.disabled + } else { + clone = link.cloneNode(false) + } + clone.href = this.generateCacheBustUrl(this.linkHref(link)) + parent = link.parentNode + if (parent.lastChild === link) { + parent.appendChild(clone) } else { - params = "" + oldParams + "&" + expando; + parent.insertBefore(clone, link.nextSibling) } + return this.waitUntilCssLoads(clone, (function (_this) { + return function () { + var additionalWaitingTime + if (/AppleWebKit/.test(navigator.userAgent)) { + additionalWaitingTime = 5 + } else { + additionalWaitingTime = 200 + } + return _this.Timer.start(additionalWaitingTime, function () { + var _ref + if (!link.parentNode) { + return + } + link.parentNode.removeChild(link) + clone.onreadystatechange = null + return (_ref = _this.window.StyleFix) != null ? _ref.link(clone) : void 0 + }) + } + })(this)) } - return url + params + hash; - }; - return Reloader; + Reloader.prototype.reattachImportedRule = function (_arg) { + var href, index, link, media, newRule, parent, rule, tempLink + rule = _arg.rule, index = _arg.index, link = _arg.link + parent = rule.parentStyleSheet + href = this.generateCacheBustUrl(rule.href) + media = rule.media.length ? [].join.call(rule.media, ', ') : '' + newRule = '@import url("' + href + '") ' + media + ';' + rule.__LiveReload_newHref = href + tempLink = this.document.createElement('link') + tempLink.rel = 'stylesheet' + tempLink.href = href + tempLink.__LiveReload_pendingRemoval = true + if (link.parentNode) { + link.parentNode.insertBefore(tempLink, link) + } + return this.Timer.start(this.importCacheWaitPeriod, (function (_this) { + return function () { + if (tempLink.parentNode) { + tempLink.parentNode.removeChild(tempLink) + } + if (rule.__LiveReload_newHref !== href) { + return + } + parent.insertRule(newRule, index) + parent.deleteRule(index + 1) + rule = parent.cssRules[index] + rule.__LiveReload_newHref = href + return _this.Timer.start(_this.importCacheWaitPeriod, function () { + if (rule.__LiveReload_newHref !== href) { + return + } + parent.insertRule(newRule, index) + return parent.deleteRule(index + 1) + }) + } + })(this)) + } - })(); + Reloader.prototype.generateUniqueString = function () { + return 'livereload=' + Date.now() + } -}).call(this); + Reloader.prototype.generateCacheBustUrl = function (url, expando) { + var hash, oldParams, originalUrl, params, _ref + if (expando == null) { + expando = this.generateUniqueString() + } + _ref = splitUrl(url), url = _ref.url, hash = _ref.hash, oldParams = _ref.params + if (this.options.overrideURL) { + if (url.indexOf(this.options.serverURL) < 0) { + originalUrl = url + url = this.options.serverURL + this.options.overrideURL + '?url=' + encodeURIComponent(url) + this.console.log('LiveReload is overriding source URL ' + originalUrl + ' with ' + url) + } + } + params = oldParams.replace(/(\?|&)livereload=(\d+)/, function (match, sep) { + return '' + sep + expando + }) + if (params === oldParams) { + if (oldParams.length === 0) { + params = '?' + expando + } else { + params = '' + oldParams + '&' + expando + } + } + return url + params + hash + } -},{}],8:[function(require,module,exports){ -(function() { - var CustomEvents, LiveReload, k; + return Reloader + })() + }).call(this) +}, {}], 8: [function (require, module, exports) { + (function () { + var CustomEvents, LiveReload, k - CustomEvents = require('./customevents'); + CustomEvents = require('./customevents') - LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window); + LiveReload = window.LiveReload = new (require('./livereload').LiveReload)(window) - for (k in window) { - if (k.match(/^LiveReloadPlugin/)) { - LiveReload.addPlugin(window[k]); - } - } - - LiveReload.addPlugin(require('./less')); - - LiveReload.on('shutdown', function() { - return delete window.LiveReload; - }); - - LiveReload.on('connect', function() { - return CustomEvents.fire(document, 'LiveReloadConnect'); - }); - - LiveReload.on('disconnect', function() { - return CustomEvents.fire(document, 'LiveReloadDisconnect'); - }); - - CustomEvents.bind(document, 'LiveReloadShutDown', function() { - return LiveReload.shutDown(); - }); - -}).call(this); - -},{"./customevents":2,"./less":3,"./livereload":4}],9:[function(require,module,exports){ -(function() { - var Timer; - - exports.Timer = Timer = (function() { - function Timer(func) { - this.func = func; - this.running = false; - this.id = null; - this._handler = (function(_this) { - return function() { - _this.running = false; - _this.id = null; - return _this.func(); - }; - })(this); + for (k in window) { + if (k.match(/^LiveReloadPlugin/)) { + LiveReload.addPlugin(window[k]) + } } - Timer.prototype.start = function(timeout) { - if (this.running) { - clearTimeout(this.id); - } - this.id = setTimeout(this._handler, timeout); - return this.running = true; - }; - - Timer.prototype.stop = function() { - if (this.running) { - clearTimeout(this.id); - this.running = false; - return this.id = null; + LiveReload.addPlugin(require('./less')) + + LiveReload.on('shutdown', function () { + return delete window.LiveReload + }) + + LiveReload.on('connect', function () { + return CustomEvents.fire(document, 'LiveReloadConnect') + }) + + LiveReload.on('disconnect', function () { + return CustomEvents.fire(document, 'LiveReloadDisconnect') + }) + + CustomEvents.bind(document, 'LiveReloadShutDown', function () { + return LiveReload.shutDown() + }) + }).call(this) +}, {'./customevents': 2, './less': 3, './livereload': 4}], 9: [function (require, module, exports) { + (function () { + var Timer + + exports.Timer = Timer = (function () { + function Timer (func) { + this.func = func + this.running = false + this.id = null + this._handler = (function (_this) { + return function () { + _this.running = false + _this.id = null + return _this.func() + } + })(this) } - }; - return Timer; - - })(); + Timer.prototype.start = function (timeout) { + if (this.running) { + clearTimeout(this.id) + } + this.id = setTimeout(this._handler, timeout) + return this.running = true + } - Timer.start = function(timeout, func) { - return setTimeout(func, timeout); - }; + Timer.prototype.stop = function () { + if (this.running) { + clearTimeout(this.id) + this.running = false + return this.id = null + } + } -}).call(this); + return Timer + })() -},{}]},{},[8]);
\ No newline at end of file + Timer.start = function (timeout, func) { + return setTimeout(func, timeout) + } + }).call(this) +}, {}]}, {}, [8]) diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 43ae5bc98..ad90059b7 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -2,12 +2,10 @@ const LocalMessageDuplexStream = require('./lib/local-message-stream.js') const PortStream = require('./lib/port-stream.js') const ObjectMultiplex = require('./lib/obj-multiplex') - - // inject in-page script var scriptTag = document.createElement('script') scriptTag.src = chrome.extension.getURL('scripts/inpage.js') -scriptTag.onload = function() { this.parentNode.removeChild(this) } +scriptTag.onload = function () { this.parentNode.removeChild(this) } var container = document.head || document.documentElement // append as first child container.insertBefore(scriptTag, container.children[0]) @@ -32,7 +30,7 @@ mx.pipe(pageStream) var reloadStream = mx.createStream('reload') reloadStream.on('error', console.error.bind(console)) -// if we lose connection with the plugin, trigger tab refresh -pluginStream.on('close', function(){ +// if we lose connection with the plugin, trigger tab refresh +pluginStream.on('close', function () { reloadStream.write({ method: 'reset' }) -})
\ No newline at end of file +}) diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index b8532747e..e6f4078c8 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -8,7 +8,6 @@ restoreContextAfterImports() // remove from window delete window.Web3 - // // setup plugin communication // @@ -27,7 +26,7 @@ var inpageProvider = new MetamaskInpageProvider(metamaskStream) // var web3 = new Web3(inpageProvider) -web3.setProvider = function(){ +web3.setProvider = function () { console.log('MetaMask - overrode web3.setProvider') } console.log('MetaMask - injected web3') @@ -40,7 +39,7 @@ var reloadStream = inpageProvider.multiStream.createStream('reload') setupDappAutoReload(web3, reloadStream) // set web3 defaultAcount -inpageProvider.publicConfigStore.subscribe(function(state){ +inpageProvider.publicConfigStore.subscribe(function (state) { web3.eth.defaultAccount = state.selectedAddress }) @@ -51,13 +50,13 @@ inpageProvider.publicConfigStore.subscribe(function(state){ // need to make sure we aren't affected by overlapping namespaces // and that we dont affect the app with our namespace // mostly a fix for web3's BigNumber if AMD's "define" is defined... -var __define = undefined +var __define -function cleanContextForImports(){ +function cleanContextForImports () { __define = global.define delete global.define } -function restoreContextAfterImports(){ +function restoreContextAfterImports () { global.define = __define } diff --git a/app/scripts/lib/auto-faucet.js b/app/scripts/lib/auto-faucet.js index b347add44..59cf0ec20 100644 --- a/app/scripts/lib/auto-faucet.js +++ b/app/scripts/lib/auto-faucet.js @@ -1,11 +1,9 @@ var uri = 'https://faucet.metamask.io/' -module.exports = function(address) { - +module.exports = function (address) { var http = new XMLHttpRequest() var data = address http.open('POST', uri, true) http.setRequestHeader('Content-type', 'application/rawdata') http.send(data) - } diff --git a/app/scripts/lib/auto-reload.js b/app/scripts/lib/auto-reload.js index 95a744b2c..b45f02009 100644 --- a/app/scripts/lib/auto-reload.js +++ b/app/scripts/lib/auto-reload.js @@ -3,13 +3,11 @@ const ensnare = require('./ensnare.js') module.exports = setupDappAutoReload - -function setupDappAutoReload(web3, controlStream){ - +function setupDappAutoReload (web3, controlStream) { // export web3 as a global, checking for usage var pageIsUsingWeb3 = false var resetWasRequested = false - global.web3 = ensnare(web3, once(function(){ + global.web3 = ensnare(web3, once(function () { // if web3 usage happened after a reset request, trigger reset late if (resetWasRequested) return triggerReset() // mark web3 as used @@ -19,7 +17,7 @@ function setupDappAutoReload(web3, controlStream){ })) // listen for reset requests from metamask - controlStream.once('data', function(){ + controlStream.once('data', function () { resetWasRequested = true // ignore if web3 was not used if (!pageIsUsingWeb3) return @@ -28,10 +26,9 @@ function setupDappAutoReload(web3, controlStream){ }) // reload the page - function triggerReset(){ - setTimeout(function(){ + function triggerReset () { + setTimeout(function () { global.location.reload() }, 500) } - -}
\ No newline at end of file +} diff --git a/app/scripts/lib/config-manager.js b/app/scripts/lib/config-manager.js index 24571748f..a3ff0bdfb 100644 --- a/app/scripts/lib/config-manager.js +++ b/app/scripts/lib/config-manager.js @@ -7,7 +7,6 @@ const STORAGE_KEY = 'metamask-config' const TESTNET_RPC = MetamaskConfig.network.testnet const MAINNET_RPC = MetamaskConfig.network.mainnet - /* The config-manager is a convenience object * wrapping a pojo-migrator. * @@ -16,7 +15,7 @@ const MAINNET_RPC = MetamaskConfig.network.mainnet * particular portions of the state. */ module.exports = ConfigManager -function ConfigManager() { +function ConfigManager () { // ConfigManager is observable and will emit updates this._subs = [] @@ -26,7 +25,7 @@ function ConfigManager() { * getData(), which returns the app-consumable data object * saveData(), which persists the app-consumable data object. */ - this.migrator = new Migrator({ + this.migrator = new Migrator({ // Migrations must start at version 1 or later. // They are objects with a `version` number @@ -41,20 +40,20 @@ function ConfigManager() { loadData: loadData, // How to persist migrated config. - setData: function(data) { + setData: function (data) { window.localStorage[STORAGE_KEY] = JSON.stringify(data) }, }) } -ConfigManager.prototype.setConfig = function(config) { +ConfigManager.prototype.setConfig = function (config) { var data = this.migrator.getData() data.config = config this.setData(data) this._emitUpdates(config) } -ConfigManager.prototype.getConfig = function() { +ConfigManager.prototype.getConfig = function () { var data = this.migrator.getData() if ('config' in data) { return data.config @@ -62,12 +61,12 @@ ConfigManager.prototype.getConfig = function() { return { provider: { type: 'testnet', - } + }, } } } -ConfigManager.prototype.setRpcTarget = function(rpcUrl) { +ConfigManager.prototype.setRpcTarget = function (rpcUrl) { var config = this.getConfig() config.provider = { type: 'rpc', @@ -76,7 +75,7 @@ ConfigManager.prototype.setRpcTarget = function(rpcUrl) { this.setConfig(config) } -ConfigManager.prototype.setProviderType = function(type) { +ConfigManager.prototype.setProviderType = function (type) { var config = this.getConfig() config.provider = { type: type, @@ -84,7 +83,7 @@ ConfigManager.prototype.setProviderType = function(type) { this.setConfig(config) } -ConfigManager.prototype.useEtherscanProvider = function() { +ConfigManager.prototype.useEtherscanProvider = function () { var config = this.getConfig() config.provider = { type: 'etherscan', @@ -92,75 +91,75 @@ ConfigManager.prototype.useEtherscanProvider = function() { this.setConfig(config) } -ConfigManager.prototype.getProvider = function() { +ConfigManager.prototype.getProvider = function () { var config = this.getConfig() return config.provider } -ConfigManager.prototype.setData = function(data) { +ConfigManager.prototype.setData = function (data) { this.migrator.saveData(data) } -ConfigManager.prototype.getData = function() { +ConfigManager.prototype.getData = function () { return this.migrator.getData() } -ConfigManager.prototype.setWallet = function(wallet) { +ConfigManager.prototype.setWallet = function (wallet) { var data = this.migrator.getData() data.wallet = wallet this.setData(data) } -ConfigManager.prototype.getSelectedAccount = function() { +ConfigManager.prototype.getSelectedAccount = function () { var config = this.getConfig() return config.selectedAccount } -ConfigManager.prototype.setSelectedAccount = function(address) { +ConfigManager.prototype.setSelectedAccount = function (address) { var config = this.getConfig() config.selectedAccount = address this.setConfig(config) } -ConfigManager.prototype.getWallet = function() { +ConfigManager.prototype.getWallet = function () { return this.migrator.getData().wallet } // Takes a boolean -ConfigManager.prototype.setShowSeedWords = function(should) { +ConfigManager.prototype.setShowSeedWords = function (should) { var data = this.migrator.getData() data.showSeedWords = should this.setData(data) } -ConfigManager.prototype.getShouldShowSeedWords = function() { +ConfigManager.prototype.getShouldShowSeedWords = function () { var data = this.migrator.getData() return data.showSeedWords } -ConfigManager.prototype.getCurrentRpcAddress = function() { +ConfigManager.prototype.getCurrentRpcAddress = function () { var provider = this.getProvider() if (!provider) return null - switch (provider.type) { + switch (provider.type) { - case 'mainnet': - return MAINNET_RPC + case 'mainnet': + return MAINNET_RPC - case 'testnet': - return TESTNET_RPC + case 'testnet': + return TESTNET_RPC - default: - return provider && provider.rpcTarget ? provider.rpcTarget : TESTNET_RPC - } + default: + return provider && provider.rpcTarget ? provider.rpcTarget : TESTNET_RPC + } } -ConfigManager.prototype.clearWallet = function() { +ConfigManager.prototype.clearWallet = function () { var data = this.getConfig() delete data.wallet this.setData(data) } -ConfigManager.prototype.setData = function(data) { +ConfigManager.prototype.setData = function (data) { this.migrator.saveData(data) } @@ -168,7 +167,7 @@ ConfigManager.prototype.setData = function(data) { // Tx // -ConfigManager.prototype.getTxList = function() { +ConfigManager.prototype.getTxList = function () { var data = this.migrator.getData() if (data.transactions !== undefined) { return data.transactions @@ -177,45 +176,45 @@ ConfigManager.prototype.getTxList = function() { } } -ConfigManager.prototype.unconfirmedTxs = function() { +ConfigManager.prototype.unconfirmedTxs = function () { var transactions = this.getTxList() return transactions.filter(tx => tx.status === 'unconfirmed') .reduce((result, tx) => { result[tx.id] = tx; return result }, {}) } -ConfigManager.prototype._saveTxList = function(txList) { +ConfigManager.prototype._saveTxList = function (txList) { var data = this.migrator.getData() data.transactions = txList this.setData(data) } -ConfigManager.prototype.addTx = function(tx) { +ConfigManager.prototype.addTx = function (tx) { var transactions = this.getTxList() transactions.push(tx) this._saveTxList(transactions) } -ConfigManager.prototype.getTx = function(txId) { +ConfigManager.prototype.getTx = function (txId) { var transactions = this.getTxList() var matching = transactions.filter(tx => tx.id === txId) return matching.length > 0 ? matching[0] : null } -ConfigManager.prototype.confirmTx = function(txId) { +ConfigManager.prototype.confirmTx = function (txId) { this._setTxStatus(txId, 'confirmed') } -ConfigManager.prototype.rejectTx = function(txId) { +ConfigManager.prototype.rejectTx = function (txId) { this._setTxStatus(txId, 'rejected') } -ConfigManager.prototype._setTxStatus = function(txId, status) { +ConfigManager.prototype._setTxStatus = function (txId, status) { var tx = this.getTx(txId) tx.status = status this.updateTx(tx) } -ConfigManager.prototype.updateTx = function(tx) { +ConfigManager.prototype.updateTx = function (tx) { var transactions = this.getTxList() var found, index transactions.forEach((otherTx, i) => { @@ -232,19 +231,19 @@ ConfigManager.prototype.updateTx = function(tx) { // wallet nickname methods -ConfigManager.prototype.getWalletNicknames = function() { +ConfigManager.prototype.getWalletNicknames = function () { var data = this.getData() - let nicknames = ('walletNicknames' in data) ? data.walletNicknames : {} + const nicknames = ('walletNicknames' in data) ? data.walletNicknames : {} return nicknames } -ConfigManager.prototype.nicknameForWallet = function(account) { - let nicknames = this.getWalletNicknames() +ConfigManager.prototype.nicknameForWallet = function (account) { + const nicknames = this.getWalletNicknames() return nicknames[account] } -ConfigManager.prototype.setNicknameForWallet = function(account, nickname) { - let nicknames = this.getWalletNicknames() +ConfigManager.prototype.setNicknameForWallet = function (account, nickname) { + const nicknames = this.getWalletNicknames() nicknames[account] = nickname var data = this.getData() data.walletNicknames = nicknames @@ -253,37 +252,35 @@ ConfigManager.prototype.setNicknameForWallet = function(account, nickname) { // observable -ConfigManager.prototype.subscribe = function(fn){ +ConfigManager.prototype.subscribe = function (fn) { this._subs.push(fn) var unsubscribe = this.unsubscribe.bind(this, fn) return unsubscribe } -ConfigManager.prototype.unsubscribe = function(fn){ +ConfigManager.prototype.unsubscribe = function (fn) { var index = this._subs.indexOf(fn) if (index !== -1) this._subs.splice(index, 1) } -ConfigManager.prototype._emitUpdates = function(state){ - this._subs.forEach(function(handler){ +ConfigManager.prototype._emitUpdates = function (state) { + this._subs.forEach(function (handler) { handler(state) }) } -ConfigManager.prototype.setConfirmed = function(confirmed) { +ConfigManager.prototype.setConfirmed = function (confirmed) { var data = this.getData() data.isConfirmed = confirmed this.setData(data) } -ConfigManager.prototype.getConfirmed = function() { +ConfigManager.prototype.getConfirmed = function () { var data = this.getData() return ('isConfirmed' in data) && data.isConfirmed } - -function loadData() { - +function loadData () { var oldData = getOldStyleData() var newData try { @@ -298,14 +295,14 @@ function loadData() { config: { provider: { type: 'testnet', - } - } - } - }, oldData ? oldData : null, newData ? newData : null) + }, + }, + }, + }, oldData || null, newData || null) return data } -function getOldStyleData() { +function getOldStyleData () { var config, wallet, seedWords var result = { diff --git a/app/scripts/lib/ensnare.js b/app/scripts/lib/ensnare.js index b70330a5a..6100f7c79 100644 --- a/app/scripts/lib/ensnare.js +++ b/app/scripts/lib/ensnare.js @@ -1,21 +1,21 @@ module.exports = ensnare // creates a proxy object that calls cb everytime the obj's properties/fns are accessed -function ensnare(obj, cb){ +function ensnare (obj, cb) { var proxy = {} - Object.keys(obj).forEach(function(key){ + Object.keys(obj).forEach(function (key) { var val = obj[key] switch (typeof val) { case 'function': - proxy[key] = function(){ + proxy[key] = function () { cb() val.apply(obj, arguments) } return default: Object.defineProperty(proxy, key, { - get: function(){ cb(); return obj[key] }, - set: function(val){ cb(); return obj[key] = val }, + get: function () { cb(); return obj[key] }, + set: function (val) { cb(); obj[key] = val; return val }, }) return } diff --git a/app/scripts/lib/id-management.js b/app/scripts/lib/id-management.js index 5de1f438f..30ea866f4 100644 --- a/app/scripts/lib/id-management.js +++ b/app/scripts/lib/id-management.js @@ -4,19 +4,18 @@ const configManager = require('./config-manager-singleton') module.exports = IdManagement - -function IdManagement(opts) { +function IdManagement (opts) { if (!opts) opts = {} this.keyStore = opts.keyStore this.derivedKey = opts.derivedKey this.hdPathString = "m/44'/60'/0'/0" - this.getAddresses = function(){ - return keyStore.getAddresses(this.hdPathString).map(function(address){ return '0x'+address }) + this.getAddresses = function () { + return this.keyStore.getAddresses(this.hdPathString).map(function (address) { return '0x' + address }) } - this.signTx = function(txParams){ + this.signTx = function (txParams) { // normalize values txParams.to = ethUtil.addHexPrefix(txParams.to) txParams.from = ethUtil.addHexPrefix(txParams.from) @@ -44,34 +43,34 @@ function IdManagement(opts) { this.signMsg = function (address, message) { // sign message - var privKeyHex = this.exportPrivateKey(address); - var privKey = ethUtil.toBuffer(privKeyHex); - var msgSig = ethUtil.ecsign(new Buffer(message.replace('0x',''), 'hex'), privKey); - var rawMsgSig = ethUtil.bufferToHex(concatSig(msgSig.v, msgSig.r, msgSig.s)); - return rawMsgSig; - }; + var privKeyHex = this.exportPrivateKey(address) + var privKey = ethUtil.toBuffer(privKeyHex) + var msgSig = ethUtil.ecsign(new Buffer(message.replace('0x', ''), 'hex'), privKey) + var rawMsgSig = ethUtil.bufferToHex(concatSig(msgSig.v, msgSig.r, msgSig.s)) + return rawMsgSig + } - this.getSeed = function(){ + this.getSeed = function () { return this.keyStore.getSeed(this.derivedKey) } - this.exportPrivateKey = function(address) { + this.exportPrivateKey = function (address) { var privKeyHex = ethUtil.addHexPrefix(this.keyStore.exportPrivateKey(address, this.derivedKey, this.hdPathString)) return privKeyHex } } -function pad_with_zeroes(number, length){ - var my_string = '' + number; - while (my_string.length < length) { - my_string = '0' + my_string; +function padWithZeroes (number, length) { + var myString = '' + number + while (myString.length < length) { + myString = '0' + myString } - return my_string; + return myString } -function concatSig(v, r, s) { - r = pad_with_zeroes(ethUtil.fromSigned(r), 64) - s = pad_with_zeroes(ethUtil.fromSigned(s), 64) +function concatSig (v, r, s) { + r = padWithZeroes(ethUtil.fromSigned(r), 64) + s = padWithZeroes(ethUtil.fromSigned(s), 64) r = ethUtil.stripHexPrefix(r.toString('hex')) s = ethUtil.stripHexPrefix(s.toString('hex')) v = ethUtil.stripHexPrefix(ethUtil.intToHex(v)) diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index 8c736eac9..d9657dacf 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -1,10 +1,7 @@ const EventEmitter = require('events').EventEmitter const inherits = require('util').inherits -const Transaction = require('ethereumjs-tx') const ethUtil = require('ethereumjs-util') const LightwalletKeyStore = require('eth-lightwallet').keystore -const LightwalletSigner = require('eth-lightwallet').signing -const async = require('async') const clone = require('clone') const extend = require('xtend') const createId = require('web3-provider-engine/util/random-id') @@ -15,12 +12,10 @@ const messageManager = require('./message-manager') const DEFAULT_RPC = 'https://testrpc.metamask.io/' const IdManagement = require('./id-management') - module.exports = IdentityStore - inherits(IdentityStore, EventEmitter) -function IdentityStore(opts = {}) { +function IdentityStore (opts = {}) { EventEmitter.call(this) // we just use the ethStore to auto-add accounts @@ -46,7 +41,7 @@ function IdentityStore(opts = {}) { // public // -IdentityStore.prototype.createNewVault = function(password, entropy, cb){ +IdentityStore.prototype.createNewVault = function (password, entropy, cb) { delete this._keyStore configManager.clearWallet() this._createIdmgmt(password, null, entropy, (err) => { @@ -62,14 +57,14 @@ IdentityStore.prototype.createNewVault = function(password, entropy, cb){ }) } -IdentityStore.prototype.recoverSeed = function(cb){ +IdentityStore.prototype.recoverSeed = function (cb) { configManager.setShowSeedWords(true) if (!this._idmgmt) return cb(new Error('Unauthenticated. Please sign in.')) var seedWords = this._idmgmt.getSeed() cb(null, seedWords) } -IdentityStore.prototype.recoverFromSeed = function(password, seed, cb){ +IdentityStore.prototype.recoverFromSeed = function (password, seed, cb) { this._createIdmgmt(password, seed, null, (err) => { if (err) return cb(err) @@ -79,18 +74,17 @@ IdentityStore.prototype.recoverFromSeed = function(password, seed, cb){ }) } -IdentityStore.prototype.setStore = function(store){ +IdentityStore.prototype.setStore = function (store) { this._ethStore = store } -IdentityStore.prototype.clearSeedWordCache = function(cb) { +IdentityStore.prototype.clearSeedWordCache = function (cb) { configManager.setShowSeedWords(false) cb(null, configManager.getSelectedAccount()) } -IdentityStore.prototype.getState = function(){ +IdentityStore.prototype.getState = function () { var seedWords = this.getSeedIfUnlocked() - var wallet = configManager.getWallet() return clone(extend(this._currentState, { isInitialized: !!configManager.getWallet() && !seedWords, isUnlocked: this._isUnlocked(), @@ -104,7 +98,7 @@ IdentityStore.prototype.getState = function(){ })) } -IdentityStore.prototype.getSeedIfUnlocked = function() { +IdentityStore.prototype.getSeedIfUnlocked = function () { var showSeed = configManager.getShouldShowSeedWords() var idmgmt = this._idmgmt var shouldShow = showSeed && !!idmgmt @@ -112,11 +106,11 @@ IdentityStore.prototype.getSeedIfUnlocked = function() { return seedWords } -IdentityStore.prototype.getSelectedAddress = function(){ +IdentityStore.prototype.getSelectedAddress = function () { return configManager.getSelectedAccount() } -IdentityStore.prototype.setSelectedAddress = function(address, cb){ +IdentityStore.prototype.setSelectedAddress = function (address, cb) { if (!address) { var addresses = this._getAddresses() address = addresses[0] @@ -126,8 +120,7 @@ IdentityStore.prototype.setSelectedAddress = function(address, cb){ if (cb) return cb(null, address) } -IdentityStore.prototype.revealAccount = function(cb) { - let addresses = this._getAddresses() +IdentityStore.prototype.revealAccount = function (cb) { const derivedKey = this._idmgmt.derivedKey const keyStore = this._keyStore @@ -135,14 +128,12 @@ IdentityStore.prototype.revealAccount = function(cb) { keyStore.generateNewAddress(derivedKey, 1) configManager.setWallet(keyStore.serialize()) - addresses = this._getAddresses() this._loadIdentities() this._didUpdate() cb(null) } -IdentityStore.prototype.getNetwork = function(err) { - +IdentityStore.prototype.getNetwork = function (err) { if (err) { this._currentState.network = 'loading' this._didUpdate() @@ -160,13 +151,13 @@ IdentityStore.prototype.getNetwork = function(err) { }) } -IdentityStore.prototype.setLocked = function(cb){ +IdentityStore.prototype.setLocked = function (cb) { delete this._keyStore delete this._idmgmt cb() } -IdentityStore.prototype.submitPassword = function(password, cb){ +IdentityStore.prototype.submitPassword = function (password, cb) { this.tryPassword(password, (err) => { if (err) return cb(err) // load identities before returning... @@ -175,7 +166,7 @@ IdentityStore.prototype.submitPassword = function(password, cb){ }) } -IdentityStore.prototype.exportAccount = function(address, cb) { +IdentityStore.prototype.exportAccount = function (address, cb) { var privateKey = this._idmgmt.exportPrivateKey(address) cb(null, privateKey) } @@ -185,7 +176,7 @@ IdentityStore.prototype.exportAccount = function(address, cb) { // // comes from dapp via zero-client hooked-wallet provider -IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, onTxDoneCb, cb){ +IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDoneCb, cb) { var self = this // create txData obj with parameters and meta data var time = (new Date()).getTime() @@ -208,13 +199,13 @@ IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, onTxDoneC // perform static analyis on the target contract code var provider = self._ethStore._query.currentProvider if (txParams.to) { - provider.sendAsync({ id: 1, method: 'eth_getCode', params: [txParams.to, 'latest'] }, function(err, res){ + provider.sendAsync({ id: 1, method: 'eth_getCode', params: [txParams.to, 'latest'] }, function (err, res) { if (err) return didComplete(err) if (res.error) return didComplete(res.error) var code = ethUtil.toBuffer(res.result) if (code !== '0x') { var ops = ethBinToOps(code) - var containsDelegateCall = ops.some((op)=>op.name === 'DELEGATECALL') + var containsDelegateCall = ops.some((op) => op.name === 'DELEGATECALL') txData.containsDelegateCall = containsDelegateCall didComplete() } else { @@ -225,19 +216,17 @@ IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, onTxDoneC didComplete() } - function didComplete(err){ + function didComplete (err) { if (err) return cb(err) // signal update self._didUpdate() // signal completion of add tx cb(null, txData) } - } // comes from metamask ui -IdentityStore.prototype.approveTransaction = function(txId, cb){ - var txData = configManager.getTx(txId) +IdentityStore.prototype.approveTransaction = function (txId, cb) { var approvalCb = this._unconfTxCbs[txId] || noop // accept tx @@ -250,8 +239,7 @@ IdentityStore.prototype.approveTransaction = function(txId, cb){ } // comes from metamask ui -IdentityStore.prototype.cancelTransaction = function(txId){ - var txData = configManager.getTx(txId) +IdentityStore.prototype.cancelTransaction = function (txId) { var approvalCb = this._unconfTxCbs[txId] || noop // reject tx @@ -263,7 +251,7 @@ IdentityStore.prototype.cancelTransaction = function(txId){ } // performs the actual signing, no autofill of params -IdentityStore.prototype.signTransaction = function(txParams, cb){ +IdentityStore.prototype.signTransaction = function (txParams, cb) { try { console.log('signing tx...', txParams) var rawTx = this._idmgmt.signTx(txParams) @@ -278,8 +266,7 @@ IdentityStore.prototype.signTransaction = function(txParams, cb){ // // comes from dapp via zero-client hooked-wallet provider -IdentityStore.prototype.addUnconfirmedMessage = function(msgParams, cb){ - +IdentityStore.prototype.addUnconfirmedMessage = function (msgParams, cb) { // create txData obj with parameters and meta data var time = (new Date()).getTime() var msgId = createId() @@ -303,8 +290,7 @@ IdentityStore.prototype.addUnconfirmedMessage = function(msgParams, cb){ } // comes from metamask ui -IdentityStore.prototype.approveMessage = function(msgId, cb){ - var msgData = messageManager.getMsg(msgId) +IdentityStore.prototype.approveMessage = function (msgId, cb) { var approvalCb = this._unconfMsgCbs[msgId] || noop // accept msg @@ -317,8 +303,7 @@ IdentityStore.prototype.approveMessage = function(msgId, cb){ } // comes from metamask ui -IdentityStore.prototype.cancelMessage = function(msgId){ - var txData = messageManager.getMsg(msgId) +IdentityStore.prototype.cancelMessage = function (msgId) { var approvalCb = this._unconfMsgCbs[msgId] || noop // reject tx @@ -330,7 +315,7 @@ IdentityStore.prototype.cancelMessage = function(msgId){ } // performs the actual signing, no autofill of params -IdentityStore.prototype.signMessage = function(msgParams, cb){ +IdentityStore.prototype.signMessage = function (msgParams, cb) { try { console.log('signing msg...', msgParams.data) var rawMsg = this._idmgmt.signMsg(msgParams.from, msgParams.data) @@ -351,17 +336,17 @@ IdentityStore.prototype.signMessage = function(msgParams, cb){ // private // -IdentityStore.prototype._didUpdate = function(){ +IdentityStore.prototype._didUpdate = function () { this.emit('update', this.getState()) } -IdentityStore.prototype._isUnlocked = function(){ +IdentityStore.prototype._isUnlocked = function () { var result = Boolean(this._keyStore) && Boolean(this._idmgmt) return result } // load identities from keyStoreet -IdentityStore.prototype._loadIdentities = function(){ +IdentityStore.prototype._loadIdentities = function () { if (!this._isUnlocked()) throw new Error('not unlocked') var addresses = this._getAddresses() @@ -369,7 +354,7 @@ IdentityStore.prototype._loadIdentities = function(){ // // add to ethStore this._ethStore.addAccount(address) // add to identities - const defaultLabel = 'Wallet ' + (i+1) + const defaultLabel = 'Wallet ' + (i + 1) const nickname = configManager.nicknameForWallet(address) var identity = { name: nickname || defaultLabel, @@ -381,7 +366,7 @@ IdentityStore.prototype._loadIdentities = function(){ this._didUpdate() } -IdentityStore.prototype.saveAccountLabel = function(account, label, cb) { +IdentityStore.prototype.saveAccountLabel = function (account, label, cb) { configManager.setNicknameForWallet(account, label) this._loadIdentities() cb(null, label) @@ -393,7 +378,7 @@ IdentityStore.prototype.saveAccountLabel = function(account, label, cb) { // The UI will have to check the balance to know. // If there is no balance and it mayBeFauceting, // then it is in fact fauceting. -IdentityStore.prototype._mayBeFauceting = function(i) { +IdentityStore.prototype._mayBeFauceting = function (i) { var config = configManager.getProvider() if (i === 0 && config.type === 'rpc' && @@ -407,11 +392,11 @@ IdentityStore.prototype._mayBeFauceting = function(i) { // keyStore managment - unlocking + deserialization // -IdentityStore.prototype.tryPassword = function(password, cb){ +IdentityStore.prototype.tryPassword = function (password, cb) { this._createIdmgmt(password, null, null, cb) } -IdentityStore.prototype._createIdmgmt = function(password, seed, entropy, cb){ +IdentityStore.prototype._createIdmgmt = function (password, seed, entropy, cb) { var keyStore = null LightwalletKeyStore.deriveKeyFromPassword(password, (err, derivedKey) => { if (err) return cb(err) @@ -446,9 +431,9 @@ IdentityStore.prototype._createIdmgmt = function(password, seed, entropy, cb){ }) } -IdentityStore.prototype._restoreFromSeed = function(password, seed, derivedKey) { +IdentityStore.prototype._restoreFromSeed = function (password, seed, derivedKey) { var keyStore = new LightwalletKeyStore(seed, derivedKey, this.hdPathString) - keyStore.addHdDerivationPath(this.hdPathString, derivedKey, {curve: 'secp256k1', purpose: 'sign'}); + keyStore.addHdDerivationPath(this.hdPathString, derivedKey, {curve: 'secp256k1', purpose: 'sign'}) keyStore.setDefaultHdDerivationPath(this.hdPathString) keyStore.generateNewAddress(derivedKey, 3) @@ -457,10 +442,10 @@ IdentityStore.prototype._restoreFromSeed = function(password, seed, derivedKey) return keyStore } -IdentityStore.prototype._createFirstWallet = function(entropy, derivedKey) { +IdentityStore.prototype._createFirstWallet = function (entropy, derivedKey) { var secretSeed = LightwalletKeyStore.generateRandomSeed(entropy) var keyStore = new LightwalletKeyStore(secretSeed, derivedKey, this.hdPathString) - keyStore.addHdDerivationPath(this.hdPathString, derivedKey, {curve: 'secp256k1', purpose: 'sign'}); + keyStore.addHdDerivationPath(this.hdPathString, derivedKey, {curve: 'secp256k1', purpose: 'sign'}) keyStore.setDefaultHdDerivationPath(this.hdPathString) keyStore.generateNewAddress(derivedKey, 3) @@ -470,15 +455,15 @@ IdentityStore.prototype._createFirstWallet = function(entropy, derivedKey) { } // get addresses and normalize address hexString -IdentityStore.prototype._getAddresses = function() { - return this._keyStore.getAddresses(this.hdPathString).map((address) => { return '0x'+address }) +IdentityStore.prototype._getAddresses = function () { + return this._keyStore.getAddresses(this.hdPathString).map((address) => { return '0x' + address }) } -IdentityStore.prototype._autoFaucet = function() { +IdentityStore.prototype._autoFaucet = function () { var addresses = this._getAddresses() autoFaucet(addresses[0]) } // util -function noop(){} +function noop () {} diff --git a/app/scripts/lib/inpage-provider.js b/app/scripts/lib/inpage-provider.js index 70b0d80dd..3b6ec154f 100644 --- a/app/scripts/lib/inpage-provider.js +++ b/app/scripts/lib/inpage-provider.js @@ -7,13 +7,12 @@ const MetamaskConfig = require('../config.js') module.exports = MetamaskInpageProvider - -function MetamaskInpageProvider(connectionStream){ +function MetamaskInpageProvider (connectionStream) { const self = this - // setup connectionStream multiplexing + // setup connectionStream multiplexing var multiStream = ObjectMultiplex() - Streams.pipe(connectionStream, multiStream, connectionStream, function(err){ + Streams.pipe(connectionStream, multiStream, connectionStream, function (err) { console.warn('MetamaskInpageProvider - lost connection to MetaMask') if (err) throw err }) @@ -22,7 +21,7 @@ function MetamaskInpageProvider(connectionStream){ // subscribe to metamask public config var publicConfigStore = remoteStoreWithLocalStorageCache('MetaMask-Config') var storeStream = publicConfigStore.createStream() - Streams.pipe(storeStream, multiStream.createStream('publicConfig'), storeStream, function(err){ + Streams.pipe(storeStream, multiStream.createStream('publicConfig'), storeStream, function (err) { console.warn('MetamaskInpageProvider - lost connection to MetaMask publicConfig') if (err) throw err }) @@ -31,13 +30,13 @@ function MetamaskInpageProvider(connectionStream){ // connect to sync provider self.syncProvider = createSyncProvider(publicConfigStore.get('provider')) // subscribe to publicConfig to update the syncProvider on change - publicConfigStore.subscribe(function(state){ + publicConfigStore.subscribe(function (state) { self.syncProvider = createSyncProvider(state.provider) }) // connect to async provider var asyncProvider = new StreamProvider() - Streams.pipe(asyncProvider, multiStream.createStream('provider'), asyncProvider, function(err){ + Streams.pipe(asyncProvider, multiStream.createStream('provider'), asyncProvider, function (err) { console.warn('MetamaskInpageProvider - lost connection to MetaMask provider') if (err) throw err }) @@ -47,21 +46,22 @@ function MetamaskInpageProvider(connectionStream){ self.sendAsync = asyncProvider.sendAsync.bind(asyncProvider) } -MetamaskInpageProvider.prototype.send = function(payload){ +MetamaskInpageProvider.prototype.send = function (payload) { const self = this + let selectedAddress var result = null switch (payload.method) { case 'eth_accounts': // read from localStorage - var selectedAddress = self.publicConfigStore.get('selectedAddress') + selectedAddress = self.publicConfigStore.get('selectedAddress') result = selectedAddress ? [selectedAddress] : [] break case 'eth_coinbase': // read from localStorage - var selectedAddress = self.publicConfigStore.get('selectedAddress') + selectedAddress = self.publicConfigStore.get('selectedAddress') result = selectedAddress || '0x0000000000000000000000000000000000000000' break @@ -79,24 +79,24 @@ MetamaskInpageProvider.prototype.send = function(payload){ } } -MetamaskInpageProvider.prototype.sendAsync = function(){ +MetamaskInpageProvider.prototype.sendAsync = function () { throw new Error('MetamaskInpageProvider - sendAsync not overwritten') } -MetamaskInpageProvider.prototype.isConnected = function(){ +MetamaskInpageProvider.prototype.isConnected = function () { return true } // util -function createSyncProvider(providerConfig){ +function createSyncProvider (providerConfig) { providerConfig = providerConfig || {} - var syncProviderUrl = undefined + let syncProviderUrl if (providerConfig.rpcTarget) { syncProviderUrl = providerConfig.rpcTarget } else { - switch(providerConfig.type) { + switch (providerConfig.type) { case 'testnet': syncProviderUrl = MetamaskConfig.network.testnet break @@ -110,14 +110,14 @@ function createSyncProvider(providerConfig){ return new HttpProvider(syncProviderUrl) } -function remoteStoreWithLocalStorageCache(storageKey){ +function remoteStoreWithLocalStorageCache (storageKey) { // read local cache var initState = JSON.parse(localStorage[storageKey] || '{}') var store = new RemoteStore(initState) // cache the latest state locally - store.subscribe(function(state){ + store.subscribe(function (state) { localStorage[storageKey] = JSON.stringify(state) }) return store -}
\ No newline at end of file +} diff --git a/app/scripts/lib/local-message-stream.js b/app/scripts/lib/local-message-stream.js index 76fedd9df..821e51046 100644 --- a/app/scripts/lib/local-message-stream.js +++ b/app/scripts/lib/local-message-stream.js @@ -3,10 +3,9 @@ const inherits = require('util').inherits module.exports = LocalMessageDuplexStream - inherits(LocalMessageDuplexStream, Duplex) -function LocalMessageDuplexStream(opts){ +function LocalMessageDuplexStream (opts) { Duplex.call(this, { objectMode: true, }) @@ -21,19 +20,19 @@ function LocalMessageDuplexStream(opts){ // private -LocalMessageDuplexStream.prototype._onMessage = function(event){ +LocalMessageDuplexStream.prototype._onMessage = function (event) { var msg = event.data // console.log('LocalMessageDuplexStream ('+this._name+') - heard message...', event) // validate message - if (event.origin !== location.origin) return //console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (event.origin !== location.origin) ') - if (typeof msg !== 'object') return //console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (typeof msg !== "object") ') - if (msg.target !== this._name) return //console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (msg.target !== this._name) ', msg.target, this._name) - if (!msg.data) return //console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (!msg.data) ') + if (event.origin !== location.origin) return // console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (event.origin !== location.origin) ') + if (typeof msg !== 'object') return // console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (typeof msg !== "object") ') + if (msg.target !== this._name) return // console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (msg.target !== this._name) ', msg.target, this._name) + if (!msg.data) return // console.log('LocalMessageDuplexStream ('+this._name+') - rejected - (!msg.data) ') // console.log('LocalMessageDuplexStream ('+this._name+') - accepted', msg.data) // forward message try { this.push(msg.data) - } catch(err) { + } catch (err) { this.emit('error', err) } } @@ -42,7 +41,7 @@ LocalMessageDuplexStream.prototype._onMessage = function(event){ LocalMessageDuplexStream.prototype._read = noop -LocalMessageDuplexStream.prototype._write = function(data, encoding, cb){ +LocalMessageDuplexStream.prototype._write = function (data, encoding, cb) { // console.log('LocalMessageDuplexStream ('+this._name+') - sending message...') var message = { target: this._target, @@ -54,4 +53,4 @@ LocalMessageDuplexStream.prototype._write = function(data, encoding, cb){ // util -function noop(){}
\ No newline at end of file +function noop () {} diff --git a/app/scripts/lib/message-manager.js b/app/scripts/lib/message-manager.js index 91edb7759..b609b820e 100644 --- a/app/scripts/lib/message-manager.js +++ b/app/scripts/lib/message-manager.js @@ -1,50 +1,50 @@ module.exports = new MessageManager() -function MessageManager(opts) { +function MessageManager (opts) { this.messages = [] } -MessageManager.prototype.getMsgList = function() { +MessageManager.prototype.getMsgList = function () { return this.messages } -MessageManager.prototype.unconfirmedMsgs = function() { +MessageManager.prototype.unconfirmedMsgs = function () { var messages = this.getMsgList() return messages.filter(msg => msg.status === 'unconfirmed') .reduce((result, msg) => { result[msg.id] = msg; return result }, {}) } -MessageManager.prototype._saveMsgList = function(msgList) { +MessageManager.prototype._saveMsgList = function (msgList) { this.messages = msgList } -MessageManager.prototype.addMsg = function(msg) { +MessageManager.prototype.addMsg = function (msg) { var messages = this.getMsgList() messages.push(msg) this._saveMsgList(messages) } -MessageManager.prototype.getMsg = function(msgId) { +MessageManager.prototype.getMsg = function (msgId) { var messages = this.getMsgList() var matching = messages.filter(msg => msg.id === msgId) return matching.length > 0 ? matching[0] : null } -MessageManager.prototype.confirmMsg = function(msgId) { +MessageManager.prototype.confirmMsg = function (msgId) { this._setMsgStatus(msgId, 'confirmed') } -MessageManager.prototype.rejectMsg = function(msgId) { +MessageManager.prototype.rejectMsg = function (msgId) { this._setMsgStatus(msgId, 'rejected') } -MessageManager.prototype._setMsgStatus = function(msgId, status) { +MessageManager.prototype._setMsgStatus = function (msgId, status) { var msg = this.getMsg(msgId) if (msg) msg.status = status this.updateMsg(msg) } -MessageManager.prototype.updateMsg = function(msg) { +MessageManager.prototype.updateMsg = function (msg) { var messages = this.getMsgList() var found, index messages.forEach((otherMsg, i) => { diff --git a/app/scripts/lib/notifications.js b/app/scripts/lib/notifications.js index 90edaea12..af2dc2054 100644 --- a/app/scripts/lib/notifications.js +++ b/app/scripts/lib/notifications.js @@ -10,13 +10,12 @@ module.exports = { setupListeners() -function setupListeners(){ - +function setupListeners () { // guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236 if (!chrome.notifications) return console.error('Chrome notifications API missing...') // notification button press - chrome.notifications.onButtonClicked.addListener(function(notificationId, buttonIndex){ + chrome.notifications.onButtonClicked.addListener(function (notificationId, buttonIndex) { var handlers = notificationHandlers[notificationId] if (buttonIndex === 0) { handlers.confirm() @@ -27,14 +26,13 @@ function setupListeners(){ }) // notification teardown - chrome.notifications.onClosed.addListener(function(notificationId){ + chrome.notifications.onClosed.addListener(function (notificationId) { delete notificationHandlers[notificationId] }) - } // creation helper -function createUnlockRequestNotification(opts){ +function createUnlockRequestNotification (opts) { // guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236 if (!chrome.notifications) return console.error('Chrome notifications API missing...') var message = 'An Ethereum app has requested a signature. Please unlock your account.' @@ -46,18 +44,17 @@ function createUnlockRequestNotification(opts){ title: opts.title, message: message, }) - } -function createTxNotification(opts){ +function createTxNotification (opts) { // guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236 if (!chrome.notifications) return console.error('Chrome notifications API missing...') var message = [ - 'Submitted by '+opts.txParams.origin, - 'to: '+uiUtils.addressSummary(opts.txParams.to), - 'from: '+uiUtils.addressSummary(opts.txParams.from), - 'value: '+uiUtils.formatBalance(opts.txParams.value), - 'data: '+uiUtils.dataSize(opts.txParams.data), + 'Submitted by ' + opts.txParams.origin, + 'to: ' + uiUtils.addressSummary(opts.txParams.to), + 'from: ' + uiUtils.addressSummary(opts.txParams.from), + 'value: ' + uiUtils.formatBalance(opts.txParams.value), + 'data: ' + uiUtils.dataSize(opts.txParams.data), ].join('\n') var id = createId() @@ -69,9 +66,9 @@ function createTxNotification(opts){ message: message, buttons: [{ title: 'confirm', - },{ + }, { title: 'cancel', - }] + }], }) notificationHandlers[id] = { confirm: opts.confirm, @@ -79,13 +76,13 @@ function createTxNotification(opts){ } } -function createMsgNotification(opts){ +function createMsgNotification (opts) { // guard for chrome bug https://github.com/MetaMask/metamask-plugin/issues/236 if (!chrome.notifications) return console.error('Chrome notifications API missing...') var message = [ - 'Submitted by '+opts.msgParams.origin, - 'to be signed by: '+uiUtils.addressSummary(opts.msgParams.from), - 'message:\n'+opts.msgParams.data, + 'Submitted by ' + opts.msgParams.origin, + 'to be signed by: ' + uiUtils.addressSummary(opts.msgParams.from), + 'message:\n' + opts.msgParams.data, ].join('\n') var id = createId() @@ -97,12 +94,12 @@ function createMsgNotification(opts){ message: message, buttons: [{ title: 'confirm', - },{ + }, { title: 'cancel', - }] + }], }) notificationHandlers[id] = { confirm: opts.confirm, cancel: opts.cancel, } -}
\ No newline at end of file +} diff --git a/app/scripts/lib/obj-multiplex.js b/app/scripts/lib/obj-multiplex.js index ad1d914f8..f54ff7653 100644 --- a/app/scripts/lib/obj-multiplex.js +++ b/app/scripts/lib/obj-multiplex.js @@ -2,11 +2,10 @@ const through = require('through2') module.exports = ObjectMultiplex - -function ObjectMultiplex(opts){ +function ObjectMultiplex (opts) { opts = opts || {} // create multiplexer - var mx = through.obj(function(chunk, enc, cb) { + var mx = through.obj(function (chunk, enc, cb) { var name = chunk.name var data = chunk.data var substream = mx.streams[name] @@ -19,19 +18,19 @@ function ObjectMultiplex(opts){ }) mx.streams = {} // create substreams - mx.createStream = function(name) { - var substream = mx.streams[name] = through.obj(function(chunk, enc, cb) { + mx.createStream = function (name) { + var substream = mx.streams[name] = through.obj(function (chunk, enc, cb) { mx.push({ name: name, data: chunk, }) return cb() }) - mx.on('end', function() { + mx.on('end', function () { return substream.emit('end') }) if (opts.error) { - mx.on('error', function() { + mx.on('error', function () { return substream.emit('error') }) } diff --git a/app/scripts/lib/port-stream.js b/app/scripts/lib/port-stream.js index 2644741fc..1889e3c04 100644 --- a/app/scripts/lib/port-stream.js +++ b/app/scripts/lib/port-stream.js @@ -3,10 +3,9 @@ const inherits = require('util').inherits module.exports = PortDuplexStream - inherits(PortDuplexStream, Duplex) -function PortDuplexStream(port){ +function PortDuplexStream (port) { Duplex.call(this, { objectMode: true, }) @@ -17,7 +16,7 @@ function PortDuplexStream(port){ // private -PortDuplexStream.prototype._onMessage = function(msg){ +PortDuplexStream.prototype._onMessage = function (msg) { if (Buffer.isBuffer(msg)) { delete msg._isBuffer var data = new Buffer(msg) @@ -29,11 +28,11 @@ PortDuplexStream.prototype._onMessage = function(msg){ } } -PortDuplexStream.prototype._onDisconnect = function(){ +PortDuplexStream.prototype._onDisconnect = function () { try { // this.end() this.emit('close') - } catch(err){ + } catch (err) { this.emit('error', err) } } @@ -42,7 +41,7 @@ PortDuplexStream.prototype._onDisconnect = function(){ PortDuplexStream.prototype._read = noop -PortDuplexStream.prototype._write = function(msg, encoding, cb){ +PortDuplexStream.prototype._write = function (msg, encoding, cb) { try { if (Buffer.isBuffer(msg)) { var data = msg.toJSON() @@ -54,7 +53,7 @@ PortDuplexStream.prototype._write = function(msg, encoding, cb){ this._port.postMessage(msg) } cb() - } catch(err){ + } catch (err) { console.error(err) // this.emit('error', err) cb(new Error('PortDuplexStream - disconnected')) @@ -63,4 +62,4 @@ PortDuplexStream.prototype._write = function(msg, encoding, cb){ // util -function noop(){}
\ No newline at end of file +function noop () {} diff --git a/app/scripts/lib/remote-store.js b/app/scripts/lib/remote-store.js index 2dbdde811..fbfab7bad 100644 --- a/app/scripts/lib/remote-store.js +++ b/app/scripts/lib/remote-store.js @@ -6,32 +6,32 @@ module.exports = { RemoteStore: RemoteStore, } -function BaseStore(initState){ +function BaseStore (initState) { this._state = initState || {} this._subs = [] } -BaseStore.prototype.set = function(key, value){ +BaseStore.prototype.set = function (key, value) { throw Error('Not implemented.') } -BaseStore.prototype.get = function(key){ +BaseStore.prototype.get = function (key) { return this._state[key] } -BaseStore.prototype.subscribe = function(fn){ +BaseStore.prototype.subscribe = function (fn) { this._subs.push(fn) var unsubscribe = this.unsubscribe.bind(this, fn) return unsubscribe } -BaseStore.prototype.unsubscribe = function(fn){ +BaseStore.prototype.unsubscribe = function (fn) { var index = this._subs.indexOf(fn) if (index !== -1) this._subs.splice(index, 1) } -BaseStore.prototype._emitUpdates = function(state){ - this._subs.forEach(function(handler){ +BaseStore.prototype._emitUpdates = function (state) { + this._subs.forEach(function (handler) { handler(state) }) } @@ -41,16 +41,16 @@ BaseStore.prototype._emitUpdates = function(state){ // inherits(HostStore, BaseStore) -function HostStore(initState, opts){ +function HostStore (initState, opts) { BaseStore.call(this, initState) } -HostStore.prototype.set = function(key, value){ +HostStore.prototype.set = function (key, value) { this._state[key] = value process.nextTick(this._emitUpdates.bind(this, this._state)) } -HostStore.prototype.createStream = function(){ +HostStore.prototype.createStream = function () { var dnode = Dnode({ // update: this._didUpdate.bind(this), }) @@ -58,8 +58,8 @@ HostStore.prototype.createStream = function(){ return dnode } -HostStore.prototype._didConnect = function(remote){ - this.subscribe(function(state){ +HostStore.prototype._didConnect = function (remote) { + this.subscribe(function (state) { remote.update(state) }) remote.update(this._state) @@ -70,16 +70,16 @@ HostStore.prototype._didConnect = function(remote){ // inherits(RemoteStore, BaseStore) -function RemoteStore(initState, opts){ +function RemoteStore (initState, opts) { BaseStore.call(this, initState) this._remote = null } -RemoteStore.prototype.set = function(key, value){ +RemoteStore.prototype.set = function (key, value) { this._remote.set(key, value) } -RemoteStore.prototype.createStream = function(){ +RemoteStore.prototype.createStream = function () { var dnode = Dnode({ update: this._didUpdate.bind(this), }) @@ -87,11 +87,11 @@ RemoteStore.prototype.createStream = function(){ return dnode } -RemoteStore.prototype._didConnect = function(remote){ +RemoteStore.prototype._didConnect = function (remote) { this._remote = remote } -RemoteStore.prototype._didUpdate = function(state){ +RemoteStore.prototype._didUpdate = function (state) { this._state = state this._emitUpdates(state) } diff --git a/app/scripts/lib/stream-utils.js b/app/scripts/lib/stream-utils.js index ca245ca9a..1b7b89d14 100644 --- a/app/scripts/lib/stream-utils.js +++ b/app/scripts/lib/stream-utils.js @@ -1,36 +1,35 @@ const Through = require('through2') const ObjectMultiplex = require('./obj-multiplex') - module.exports = { jsonParseStream: jsonParseStream, jsonStringifyStream: jsonStringifyStream, setupMultiplex: setupMultiplex, } -function jsonParseStream(){ - return Through.obj(function(serialized, encoding, cb){ +function jsonParseStream () { + return Through.obj(function (serialized, encoding, cb) { this.push(JSON.parse(serialized)) cb() }) } -function jsonStringifyStream(){ - return Through.obj(function(obj, encoding, cb){ +function jsonStringifyStream () { + return Through.obj(function (obj, encoding, cb) { this.push(JSON.stringify(obj)) cb() }) } -function setupMultiplex(connectionStream){ +function setupMultiplex (connectionStream) { var mx = ObjectMultiplex() connectionStream.pipe(mx).pipe(connectionStream) - mx.on('error', function(err) { + mx.on('error', function (err) { console.error(err) }) - connectionStream.on('error', function(err) { + connectionStream.on('error', function (err) { console.error(err) mx.destroy() }) return mx -}
\ No newline at end of file +} diff --git a/app/scripts/migrations/002.js b/app/scripts/migrations/002.js index ab6a256ab..0b654f825 100644 --- a/app/scripts/migrations/002.js +++ b/app/scripts/migrations/002.js @@ -1,7 +1,7 @@ module.exports = { version: 2, - migrate: function(data) { + migrate: function (data) { try { if (data.config.provider.type === 'etherscan') { data.config.provider.type = 'rpc' @@ -9,5 +9,5 @@ module.exports = { } } catch (e) {} return data - } + }, } diff --git a/app/scripts/migrations/003.js b/app/scripts/migrations/003.js index 087f8bcd9..617c55c09 100644 --- a/app/scripts/migrations/003.js +++ b/app/scripts/migrations/003.js @@ -4,12 +4,12 @@ var newTestRpc = 'https://testrpc.metamask.io/' module.exports = { version: 3, - migrate: function(data) { + migrate: function (data) { try { if (data.config.provider.rpcTarget === oldTestRpc) { data.config.provider.rpcTarget = newTestRpc } } catch (e) {} return data - } + }, } diff --git a/app/scripts/migrations/004.js b/app/scripts/migrations/004.js index 2e3164baf..1329a1eed 100644 --- a/app/scripts/migrations/004.js +++ b/app/scripts/migrations/004.js @@ -1,22 +1,22 @@ module.exports = { version: 4, - migrate: function(data) { + migrate: function (data) { try { if (data.config.provider.type !== 'rpc') return data switch (data.config.provider.rpcTarget) { case 'https://testrpc.metamask.io/': - data.config.provider = { - type: 'testnet' - } + data.config.provider = { + type: 'testnet', + } break case 'https://rpc.metamask.io/': - data.config.provider = { - type: 'mainnet' - } + data.config.provider = { + type: 'mainnet', + } break } } catch (_) {} return data - } + }, } diff --git a/app/scripts/popup.js b/app/scripts/popup.js index 4fa6e1127..5173507fa 100644 --- a/app/scripts/popup.js +++ b/app/scripts/popup.js @@ -19,7 +19,7 @@ async.parallel({ accountManager: connectToAccountManager, }, setupApp) -function connectToAccountManager(cb){ +function connectToAccountManager (cb) { // setup communication with background var pluginPort = chrome.runtime.connect({name: 'popup'}) var portStream = new PortStream(pluginPort) @@ -30,7 +30,7 @@ function connectToAccountManager(cb){ setupWeb3Connection(mx.createStream('provider')) } -function setupWeb3Connection(stream){ +function setupWeb3Connection (stream) { var remoteProvider = new StreamProvider() remoteProvider.pipe(stream).pipe(remoteProvider) stream.on('error', console.error.bind(console)) @@ -38,23 +38,23 @@ function setupWeb3Connection(stream){ global.web3 = new Web3(remoteProvider) } -function setupControllerConnection(stream, cb){ +function setupControllerConnection (stream, cb) { var eventEmitter = new EventEmitter() var background = Dnode({ - sendUpdate: function(state){ + sendUpdate: function (state) { eventEmitter.emit('update', state) }, }) stream.pipe(background).pipe(stream) - background.once('remote', function(accountManager){ + background.once('remote', function (accountManager) { // setup push events accountManager.on = eventEmitter.on.bind(eventEmitter) cb(null, accountManager) }) } -function getCurrentDomain(cb){ - chrome.tabs.query({active: true, currentWindow: true}, function(results){ +function getCurrentDomain (cb) { + chrome.tabs.query({active: true, currentWindow: true}, function (results) { var activeTab = results[0] var currentUrl = activeTab && activeTab.url var currentDomain = url.parse(currentUrl).host @@ -65,16 +65,15 @@ function getCurrentDomain(cb){ }) } -function setupApp(err, opts){ +function setupApp (err, opts) { if (err) { alert(err.stack) throw err - return } var container = document.getElementById('app-content') - var app = MetaMaskUi({ + MetaMaskUi({ container: container, accountManager: opts.accountManager, currentDomain: opts.currentDomain, diff --git a/circle.yml b/circle.yml new file mode 100644 index 000000000..1db357f91 --- /dev/null +++ b/circle.yml @@ -0,0 +1,3 @@ +machine: + node: + version: 6.0.0 diff --git a/gulpfile.js b/gulpfile.js index 63eb22a2c..941155ff4 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -9,6 +9,9 @@ var sourcemaps = require('gulp-sourcemaps') var assign = require('lodash.assign') var livereload = require('gulp-livereload') var del = require('del') +var eslint = require('gulp-eslint') +var fs = require('fs') +var path = require('path') // browser reload @@ -49,6 +52,25 @@ gulp.task('copy:watch', function(){ gulp.watch(['./app/{_locales,images}/*', './app/scripts/chromereload.js', './app/*.{html,json}'], gulp.series('copy')) }) +// lint js + +gulp.task('lint', function () { + // Ignoring node_modules, dist, and docs folders: + return gulp.src(['app/**/*.js', 'ui/**/*.js', '!node_modules/**', '!dist/**', '!docs/**', '!app/scripts/chromereload.js']) + .pipe(eslint(fs.readFileSync(path.join(__dirname, '.eslintrc')))) + // eslint.format() outputs the lint results to the console. + // Alternatively use eslint.formatEach() (see Docs). + .pipe(eslint.format()) + // To have the process exit with an error code (1) on + // lint error, return the stream and pipe to failAfterError last. + .pipe(eslint.failAfterError()) +}); + +/* +gulp.task('default', ['lint'], function () { + // This will only run if the lint task is successful... +}); +*/ // build js diff --git a/package.json b/package.json index a82738c67..31ae0db95 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "eth-store": "^1.1.0", "ethereumjs-tx": "^1.0.0", "ethereumjs-util": "^4.4.0", + "gulp-eslint": "^2.0.0", "hat": "0.0.3", "identicon.js": "^1.2.1", "inject-css": "^0.1.1", @@ -68,6 +69,7 @@ "xtend": "^4.0.1" }, "devDependencies": { + "babel-eslint": "^6.0.5", "babel-preset-es2015": "^6.6.0", "babel-register": "^6.7.2", "babelify": "^7.2.0", @@ -87,6 +89,7 @@ "jshint-stylish": "~0.1.5", "lodash.assign": "^4.0.6", "mocha": "^2.4.5", + "mocha-eslint": "^2.1.1", "mocha-jsdom": "^1.1.0", "mocha-sinon": "^1.1.5", "sinon": "^1.17.3", diff --git a/test/unit/linting_test.js b/test/unit/linting_test.js new file mode 100644 index 000000000..27b4b2b1e --- /dev/null +++ b/test/unit/linting_test.js @@ -0,0 +1,9 @@ +// LINTING: +const lint = require('mocha-eslint'); +const lintPaths = ['app/**/*.js', 'ui/**/*.js', '!node_modules/**', '!dist/**', '!docs/**', '!app/scripts/chromereload.js'] + +const lintOptions = { + strict: true, +} + +lint(lintPaths, lintOptions)
\ No newline at end of file diff --git a/ui/app/account-detail.js b/ui/app/account-detail.js index 663ba234b..93702f77d 100644 --- a/ui/app/account-detail.js +++ b/ui/app/account-detail.js @@ -17,7 +17,7 @@ const EditableLabel = require('./components/editable-label') module.exports = connect(mapStateToProps)(AccountDetailScreen) -function mapStateToProps(state) { +function mapStateToProps (state) { return { identities: state.metamask.identities, accounts: state.metamask.accounts, @@ -31,17 +31,15 @@ function mapStateToProps(state) { } inherits(AccountDetailScreen, Component) -function AccountDetailScreen() { +function AccountDetailScreen () { Component.call(this) } -AccountDetailScreen.prototype.render = function() { +AccountDetailScreen.prototype.render = function () { var props = this.props var selected = props.address || Object.keys(props.accounts)[0] var identity = props.identities[selected] var account = props.accounts[selected] - var accountDetail = props.accountDetail - var transactions = props.transactions return ( @@ -88,7 +86,7 @@ AccountDetailScreen.prototype.render = function() { style: { height: '62px', paddingTop: '8px', - } + }, }, [ h(EditableLabel, { textValue: identity ? identity.name : '', @@ -101,7 +99,7 @@ AccountDetailScreen.prototype.render = function() { }, [ // What is shown when not editing + edit text: - h('label.editing-label',[h('.edit-text','edit')]), + h('label.editing-label', [h('.edit-text', 'edit')]), h('h2.font-medium.color-forest', {name: 'edit'}, identity && identity.name), ]), ]), @@ -124,7 +122,7 @@ AccountDetailScreen.prototype.render = function() { h('img.cursor-pointer.color-orange', { src: 'images/copy.svg', onClick: () => copyToClipboard(ethUtil.toChecksumAddress(selected)), - style:{ + style: { margin: '0px 5px', }, }), @@ -132,7 +130,7 @@ AccountDetailScreen.prototype.render = function() { h('img.cursor-pointer.color-orange', { src: 'images/download.svg', onClick: () => this.requestAccountExport(selected), - style:{ + style: { margin: '0px 5px', }, }), @@ -174,7 +172,7 @@ AccountDetailScreen.prototype.render = function() { ) } -AccountDetailScreen.prototype.subview = function() { +AccountDetailScreen.prototype.subview = function () { var subview try { subview = this.props.accountDetail.subview @@ -193,7 +191,7 @@ AccountDetailScreen.prototype.subview = function() { } } -AccountDetailScreen.prototype.transactionList = function() { +AccountDetailScreen.prototype.transactionList = function () { const { transactions, unconfTxs, unconfMsgs, address, network } = this.props var txsToRender = transactions @@ -209,18 +207,18 @@ AccountDetailScreen.prototype.transactionList = function() { network, unconfTxs, unconfMsgs, - viewPendingTx:(txId) => { + viewPendingTx: (txId) => { this.props.dispatch(actions.viewPendingTx(txId)) - } + }, }) } -AccountDetailScreen.prototype.navigateToAccounts = function(event){ +AccountDetailScreen.prototype.navigateToAccounts = function (event) { event.stopPropagation() this.props.dispatch(actions.showAccountsPage()) } -AccountDetailScreen.prototype.requestAccountExport = function() { +AccountDetailScreen.prototype.requestAccountExport = function () { this.props.dispatch(actions.requestExportAccount()) } diff --git a/ui/app/accounts/account-panel.js b/ui/app/accounts/account-panel.js index b49f4c098..53ccf7d2c 100644 --- a/ui/app/accounts/account-panel.js +++ b/ui/app/accounts/account-panel.js @@ -9,18 +9,15 @@ const Identicon = require('../components/identicon') module.exports = NewComponent - inherits(NewComponent, Component) -function NewComponent() { +function NewComponent () { Component.call(this) } -NewComponent.prototype.render = function() { +NewComponent.prototype.render = function () { const identity = this.props.identity - var mayBeFauceting = identity.mayBeFauceting var isSelected = this.props.selectedAddress === identity.address var account = this.props.accounts[identity.address] - var isFauceting = mayBeFauceting && account.balance === '0x0' const selectedClass = isSelected ? '.selected' : '' return ( @@ -35,7 +32,7 @@ NewComponent.prototype.render = function() { h('.identicon-wrapper.flex-column.flex-center.select-none', [ this.pendingOrNot(), h(Identicon, { - address: identity.address + address: identity.address, }), ]), @@ -68,14 +65,14 @@ NewComponent.prototype.render = function() { event.stopPropagation() event.preventDefault() copyToClipboard(ethUtil.toChecksumAddress(identity.address)) - } + }, }), ]), ]) ) } -NewComponent.prototype.pendingOrNot = function() { +NewComponent.prototype.pendingOrNot = function () { const pending = this.props.pending if (pending.length === 0) return null return h('.pending-dot', pending.length) diff --git a/ui/app/accounts/index.js b/ui/app/accounts/index.js index 8215a559a..775df400b 100644 --- a/ui/app/accounts/index.js +++ b/ui/app/accounts/index.js @@ -2,7 +2,6 @@ const inherits = require('util').inherits const Component = require('react').Component const h = require('react-hyperscript') const connect = require('react-redux').connect -const extend = require('xtend') const actions = require('../actions') const valuesFor = require('../util').valuesFor const findDOMNode = require('react-dom').findDOMNode @@ -10,8 +9,7 @@ const AccountPanel = require('./account-panel') module.exports = connect(mapStateToProps)(AccountsScreen) - -function mapStateToProps(state) { +function mapStateToProps (state) { const pendingTxs = valuesFor(state.metamask.unconfTxs) const pendingMsgs = valuesFor(state.metamask.unconfMsgs) const pending = pendingTxs.concat(pendingMsgs) @@ -28,12 +26,11 @@ function mapStateToProps(state) { } inherits(AccountsScreen, Component) -function AccountsScreen() { +function AccountsScreen () { Component.call(this) } - -AccountsScreen.prototype.render = function() { +AccountsScreen.prototype.render = function () { var state = this.props var identityList = valuesFor(state.identities) var unconfTxList = valuesFor(state.unconfTxs) @@ -63,48 +60,48 @@ AccountsScreen.prototype.render = function() { height: '418px', overflowY: 'auto', overflowX: 'hidden', - } + }, }, - [ - identityList.map((identity) => { - const pending = this.props.pending.filter((txOrMsg) => { - if ('txParams' in txOrMsg) { - return txOrMsg.txParams.from === identity.address - } else if ('msgParams' in txOrMsg) { - return txOrMsg.msgParams.from === identity.address - } else { - return false - } - }) - - return h(AccountPanel, { - key: `acct-panel-${identity.address}`, - identity, - selectedAddress: this.props.selectedAddress, - accounts: this.props.accounts, - onShowDetail: this.onShowDetail.bind(this), - pending, - }) - }), - - h('hr.horizontal-line', {key: 'horizontal-line1'}), - h('div.footer.hover-white.pointer', { - key: 'reveal-account-bar', - onClick:() => { - actions.revealAccount() - }, - style: { - display: 'flex', - flex: '1 0 auto', - height: '40px', - paddint: '10px', - justifyContent: 'center', - alignItems: 'center', - } - }, [ - h('i.fa.fa-plus.fa-lg', {key: ''}), + [ + identityList.map((identity) => { + const pending = this.props.pending.filter((txOrMsg) => { + if ('txParams' in txOrMsg) { + return txOrMsg.txParams.from === identity.address + } else if ('msgParams' in txOrMsg) { + return txOrMsg.msgParams.from === identity.address + } else { + return false + } + }) + + return h(AccountPanel, { + key: `acct-panel-${identity.address}`, + identity, + selectedAddress: this.props.selectedAddress, + accounts: this.props.accounts, + onShowDetail: this.onShowDetail.bind(this), + pending, + }) + }), + + h('hr.horizontal-line', {key: 'horizontal-line1'}), + h('div.footer.hover-white.pointer', { + key: 'reveal-account-bar', + onClick: () => { + actions.revealAccount() + }, + style: { + display: 'flex', + flex: '1 0 auto', + height: '40px', + paddint: '10px', + justifyContent: 'center', + alignItems: 'center', + }, + }, [ + h('i.fa.fa-plus.fa-lg', {key: ''}), + ]), ]), - ]), unconfTxList.length ? ( @@ -123,7 +120,7 @@ AccountsScreen.prototype.render = function() { } // If a new account was revealed, scroll to the bottom -AccountsScreen.prototype.componentDidUpdate = function(){ +AccountsScreen.prototype.componentDidUpdate = function () { const scrollToBottom = this.props.scrollToBottom if (scrollToBottom) { @@ -133,27 +130,27 @@ AccountsScreen.prototype.componentDidUpdate = function(){ } } -AccountsScreen.prototype.navigateToConfTx = function(){ +AccountsScreen.prototype.navigateToConfTx = function () { event.stopPropagation() this.props.dispatch(actions.showConfTxPage()) } -AccountsScreen.prototype.onSelect = function(address, event){ +AccountsScreen.prototype.onSelect = function (address, event) { event.stopPropagation() // if already selected, deselect if (this.props.selectedAddress === address) address = null this.props.dispatch(actions.setSelectedAddress(address)) } -AccountsScreen.prototype.onShowDetail = function(address, event){ +AccountsScreen.prototype.onShowDetail = function (address, event) { event.stopPropagation() this.props.dispatch(actions.showAccountDetail(address)) } -AccountsScreen.prototype.onRevealAccount = function() { +AccountsScreen.prototype.onRevealAccount = function () { this.props.dispatch(actions.revealAccount()) } -AccountsScreen.prototype.goHome = function() { +AccountsScreen.prototype.goHome = function () { this.props.dispatch(actions.goHome()) } diff --git a/ui/app/actions.js b/ui/app/actions.js index e178d2340..0cbc3b9e6 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -114,11 +114,11 @@ var actions = { module.exports = actions var _accountManager = null -function _setAccountManager(accountManager){ +function _setAccountManager (accountManager) { _accountManager = accountManager } -function goHome() { +function goHome () { return { type: actions.GO_HOME, } @@ -126,28 +126,22 @@ function goHome() { // menu state -function toggleMenu() { +function toggleMenu () { return { type: actions.TOGGLE_MENU, } } -function closeMenu() { +function closeMenu () { return { type: actions.SET_MENU_STATE, value: false, } } -function getNetworkStatus(){ - return { - type: actions.getNetworkStatus, - } -} - // async actions -function tryUnlockMetamask(password) { +function tryUnlockMetamask (password) { return (dispatch) => { dispatch(actions.unlockInProgress()) _accountManager.submitPassword(password, (err, selectedAccount) => { @@ -160,22 +154,25 @@ function tryUnlockMetamask(password) { } } -function createNewVault(password, entropy) { +function createNewVault (password, entropy) { return (dispatch) => { dispatch(actions.createNewVaultInProgress()) _accountManager.createNewVault(password, entropy, (err, result) => { + if (err) { + return dispatch(actions.showWarning(err.message)) + } dispatch(actions.showNewVaultSeed(result)) }) } } -function revealSeedConfirmation() { +function revealSeedConfirmation () { return { type: this.REVEAL_SEED_CONFIRMATION, } } -function requestRevealSeed(password) { +function requestRevealSeed (password) { return (dispatch) => { dispatch(actions.showLoadingIndication()) _accountManager.tryPassword(password, (err, seed) => { @@ -189,7 +186,7 @@ function requestRevealSeed(password) { } } -function recoverFromSeed(password, seed) { +function recoverFromSeed (password, seed) { return (dispatch) => { // dispatch(actions.createNewVaultInProgress()) dispatch(actions.showLoadingIndication()) @@ -199,23 +196,23 @@ function recoverFromSeed(password, seed) { var account = Object.keys(metamaskState.identities)[0] dispatch(actions.unlockMetamask(account)) - }) + }) } } -function showInfoPage() { +function showInfoPage () { return { type: actions.SHOW_INFO_PAGE, } } -function setSelectedAddress(address) { +function setSelectedAddress (address) { return (dispatch) => { _accountManager.setSelectedAddress(address) } } -function revealAccount() { +function revealAccount () { return (dispatch) => { dispatch(actions.showLoadingIndication()) _accountManager.revealAccount((err) => { @@ -228,7 +225,7 @@ function revealAccount() { } } -function signMsg(msgData) { +function signMsg (msgData) { return (dispatch) => { dispatch(actions.showLoadingIndication()) @@ -241,7 +238,7 @@ function signMsg(msgData) { } } -function signTx(txData) { +function signTx (txData) { return (dispatch) => { dispatch(actions.showLoadingIndication()) @@ -255,7 +252,7 @@ function signTx(txData) { } } -function sendTx(txData) { +function sendTx (txData) { return (dispatch) => { _accountManager.approveTransaction(txData.id, (err) => { if (err) { @@ -268,26 +265,26 @@ function sendTx(txData) { } } -function completedTx(id) { +function completedTx (id) { return { type: actions.COMPLETED_TX, id, } } -function txError(err) { +function txError (err) { return { type: actions.TRANSACTION_ERROR, message: err.message, } } -function cancelMsg(msgData){ +function cancelMsg (msgData) { _accountManager.cancelMessage(msgData.id) return actions.completedTx(msgData.id) } -function cancelTx(txData){ +function cancelTx (txData) { _accountManager.cancelTransaction(txData.id) return actions.completedTx(txData.id) } @@ -296,29 +293,32 @@ function cancelTx(txData){ // initialize screen // - -function showCreateVault() { +function showCreateVault () { return { type: actions.SHOW_CREATE_VAULT, } } -function showRestoreVault() { +function showRestoreVault () { return { type: actions.SHOW_RESTORE_VAULT, } } -function showInitializeMenu() { +function showInitializeMenu () { return { type: actions.SHOW_INIT_MENU, } } -function agreeToDisclaimer() { +function agreeToDisclaimer () { return (dispatch) => { dispatch(this.showLoadingIndication()) _accountManager.agreeToDisclaimer((err) => { + if (err) { + return dispatch(actions.showWarning(err.message)) + } + dispatch(this.hideLoadingIndication()) dispatch({ type: this.AGREE_TO_DISCLAIMER, @@ -327,13 +327,13 @@ function agreeToDisclaimer() { } } -function createNewVaultInProgress() { +function createNewVaultInProgress () { return { type: actions.CREATE_NEW_VAULT_IN_PROGRESS, } } -function showNewVaultSeed(seed) { +function showNewVaultSeed (seed) { return { type: actions.SHOW_NEW_VAULT_SEED, value: seed, @@ -344,48 +344,56 @@ function showNewVaultSeed(seed) { // unlock screen // -function unlockInProgress() { +function unlockInProgress () { return { type: actions.UNLOCK_IN_PROGRESS, } } -function unlockFailed() { +function unlockFailed () { return { type: actions.UNLOCK_FAILED, } } -function unlockMetamask(account) { +function unlockMetamask (account) { return { type: actions.UNLOCK_METAMASK, value: account, } } -function updateMetamaskState(newState) { +function updateMetamaskState (newState) { return { type: actions.UPDATE_METAMASK_STATE, value: newState, } } -function lockMetamask() { +function lockMetamask () { return (dispatch) => { _accountManager.setLocked((err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.showWarning(err.message)) + } + dispatch({ type: actions.LOCK_METAMASK, }) - dispatch(actions.hideLoadingIndication()) }) } } -function showAccountDetail(address) { +function showAccountDetail (address) { return (dispatch) => { dispatch(actions.showLoadingIndication()) _accountManager.setSelectedAddress(address, (err, address) => { dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.showWarning(err.message)) + } + dispatch({ type: actions.SHOW_ACCOUNT_DETAIL, value: address, @@ -394,61 +402,66 @@ function showAccountDetail(address) { } } -function backToAccountDetail(address) { +function backToAccountDetail (address) { return { type: actions.BACK_TO_ACCOUNT_DETAIL, value: address, } } -function clearSeedWordCache(account) { +function clearSeedWordCache (account) { return { type: actions.CLEAR_SEED_WORD_CACHE, value: account, } } -function confirmSeedWords() { +function confirmSeedWords () { return (dispatch) => { dispatch(actions.showLoadingIndication()) _accountManager.clearSeedWordCache((err, account) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.showWarning(err.message)) + } + console.log('Seed word cache cleared. ' + account) dispatch(actions.showAccountDetail(account)) }) } } -function showAccountsPage() { +function showAccountsPage () { return { type: actions.SHOW_ACCOUNTS_PAGE, } } -function showConfTxPage() { +function showConfTxPage () { return { type: actions.SHOW_CONF_TX_PAGE, } } -function nextTx() { +function nextTx () { return { type: actions.NEXT_TX, } } -function viewPendingTx(txId) { +function viewPendingTx (txId) { return { type: actions.VIEW_PENDING_TX, value: txId, } } -function previousTx() { +function previousTx () { return { type: actions.PREVIOUS_TX, } } -function showConfigPage(transitionForward = true) { +function showConfigPage (transitionForward = true) { return { type: actions.SHOW_CONFIG_PAGE, value: transitionForward, @@ -459,7 +472,7 @@ function showConfigPage(transitionForward = true) { // config // -function setRpcTarget(newRpc) { +function setRpcTarget (newRpc) { _accountManager.setRpcTarget(newRpc) return { type: actions.SET_RPC_TARGET, @@ -467,7 +480,7 @@ function setRpcTarget(newRpc) { } } -function setProviderType(type) { +function setProviderType (type) { _accountManager.setProviderType(type) return { type: actions.SET_PROVIDER_TYPE, @@ -475,51 +488,51 @@ function setProviderType(type) { } } -function useEtherscanProvider() { +function useEtherscanProvider () { _accountManager.useEtherscanProvider() return { type: actions.USE_ETHERSCAN_PROVIDER, } } -function showLoadingIndication() { +function showLoadingIndication () { return { type: actions.SHOW_LOADING, } } -function hideLoadingIndication() { +function hideLoadingIndication () { return { type: actions.HIDE_LOADING, } } -function displayWarning(text) { +function displayWarning (text) { return { type: actions.DISPLAY_WARNING, value: text, } } -function hideWarning() { +function hideWarning () { return { type: actions.HIDE_WARNING, } } -function requestExportAccount() { +function requestExportAccount () { return { type: actions.REQUEST_ACCOUNT_EXPORT, } } -function exportAccount(address) { +function exportAccount (address) { var self = this - return function(dispatch) { + return function (dispatch) { dispatch(self.showLoadingIndication()) - _accountManager.exportAccount(address, function(err, result) { + _accountManager.exportAccount(address, function (err, result) { dispatch(self.hideLoadingIndication()) if (err) { @@ -532,14 +545,14 @@ function exportAccount(address) { } } -function showPrivateKey(key) { +function showPrivateKey (key) { return { type: actions.SHOW_PRIVATE_KEY, value: key, } } -function saveAccountLabel(account, label) { +function saveAccountLabel (account, label) { return (dispatch) => { dispatch(actions.showLoadingIndication()) _accountManager.saveAccountLabel(account, label, (err) => { @@ -555,7 +568,7 @@ function saveAccountLabel(account, label) { } } -function showSendPage() { +function showSendPage () { return { type: actions.SHOW_SEND_PAGE, } diff --git a/ui/app/app.js b/ui/app/app.js index 6088d17e4..7204fb098 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -1,10 +1,7 @@ const inherits = require('util').inherits -const React = require('react') const Component = require('react').Component -const PropTypes = require('react').PropTypes const connect = require('react-redux').connect const h = require('react-hyperscript') -const extend = require('xtend') const actions = require('./actions') const ReactCSSTransitionGroup = require('react-addons-css-transition-group') // init @@ -25,7 +22,6 @@ const ConfigScreen = require('./config') const RevealSeedConfirmation = require('./recover-seed/confirmation') const InfoScreen = require('./info') const LoadingIndicator = require('./loading') -const txHelper = require('../lib/tx-helper') const SandwichExpando = require('sandwich-expando') const MenuDroppo = require('menu-droppo') const DropMenuItem = require('./components/drop-menu-item') @@ -33,11 +29,10 @@ const NetworkIndicator = require('./components/network') module.exports = connect(mapStateToProps)(App) - inherits(App, Component) -function App() { Component.call(this) } +function App () { Component.call(this) } -function mapStateToProps(state) { +function mapStateToProps (state) { return { // state from plugin isConfirmed: state.metamask.isConfirmed, @@ -54,9 +49,8 @@ function mapStateToProps(state) { } } -App.prototype.render = function() { +App.prototype.render = function () { var props = this.props - var view = props.currentView.name var transForward = props.transForward return ( @@ -65,7 +59,7 @@ App.prototype.render = function() { style: { // Windows was showing a vertical scroll bar: overflow: 'hidden', - } + }, }, [ h(LoadingIndicator), @@ -80,7 +74,7 @@ App.prototype.render = function() { style: { height: '380px', width: '360px', - } + }, }, [ h(ReactCSSTransitionGroup, { className: 'css-transition-group', @@ -95,7 +89,7 @@ App.prototype.render = function() { ) } -App.prototype.renderAppBar = function(){ +App.prototype.renderAppBar = function () { const props = this.props const state = this.state || {} const isNetworkMenuOpen = state.isNetworkMenuOpen || false @@ -117,11 +111,11 @@ App.prototype.renderAppBar = function(){ h(NetworkIndicator, { network: this.props.network, - onClick:(event) => { + onClick: (event) => { event.preventDefault() event.stopPropagation() this.setState({ isNetworkMenuOpen: !isNetworkMenuOpen }) - } + }, }), // metamask name @@ -144,16 +138,14 @@ App.prototype.renderAppBar = function(){ ) } -App.prototype.renderNetworkDropdown = function() { +App.prototype.renderNetworkDropdown = function () { const props = this.props const state = this.state || {} const isOpen = state.isNetworkMenuOpen - const checked = h('i.fa.fa-check.fa-lg', { ariaHidden: true }) - return h(MenuDroppo, { isOpen, - onClickOutside:(event) => { + onClickOutside: (event) => { this.setState({ isNetworkMenuOpen: !isOpen }) }, style: { @@ -173,28 +165,28 @@ App.prototype.renderNetworkDropdown = function() { h(DropMenuItem, { label: 'Main Ethereum Network', - closeMenu:() => this.setState({ isNetworkMenuOpen: false }), - action:() => props.dispatch(actions.setProviderType('mainnet')), + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => props.dispatch(actions.setProviderType('mainnet')), icon: h('.menu-icon.ether-icon'), }), h(DropMenuItem, { label: 'Morden Test Network', - closeMenu:() => this.setState({ isNetworkMenuOpen: false }), - action:() => props.dispatch(actions.setProviderType('testnet')), + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => props.dispatch(actions.setProviderType('testnet')), icon: h('.menu-icon.morden-icon'), }), h(DropMenuItem, { label: 'Localhost 8545', - closeMenu:() => this.setState({ isNetworkMenuOpen: false }), - action:() => props.dispatch(actions.setRpcTarget('http://localhost:8545')), + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => props.dispatch(actions.setRpcTarget('http://localhost:8545')), icon: h('i.fa.fa-question-circle.fa-lg', { ariaHidden: true }), }), ]) } -App.prototype.renderDropdown = function() { +App.prototype.renderDropdown = function () { const props = this.props return h(MenuDroppo, { isOpen: props.menuOpen, @@ -218,28 +210,28 @@ App.prototype.renderDropdown = function() { h(DropMenuItem, { label: 'Settings', - closeMenu:() => this.props.dispatch(actions.closeMenu()), - action:() => this.props.dispatch(actions.showConfigPage()), + closeMenu: () => this.props.dispatch(actions.closeMenu()), + action: () => this.props.dispatch(actions.showConfigPage()), icon: h('i.fa.fa-gear.fa-lg', { ariaHidden: true }), }), h(DropMenuItem, { label: 'Lock', - closeMenu:() => this.props.dispatch(actions.closeMenu()), - action:() => this.props.dispatch(actions.lockMetamask()), + closeMenu: () => this.props.dispatch(actions.closeMenu()), + action: () => this.props.dispatch(actions.lockMetamask()), icon: h('i.fa.fa-lock.fa-lg', { ariaHidden: true }), }), h(DropMenuItem, { label: 'Help', - closeMenu:() => this.props.dispatch(actions.closeMenu()), - action:() => this.props.dispatch(actions.showInfoPage()), + closeMenu: () => this.props.dispatch(actions.closeMenu()), + action: () => this.props.dispatch(actions.showInfoPage()), icon: h('i.fa.fa-question.fa-lg', { ariaHidden: true }), }), ]) } -App.prototype.renderPrimary = function(){ +App.prototype.renderPrimary = function () { var props = this.props if (!props.isConfirmed) { @@ -252,7 +244,6 @@ App.prototype.renderPrimary = function(){ // show initialize screen if (!props.isInitialized) { - // show current view switch (props.currentView.name) { @@ -305,10 +296,10 @@ App.prototype.renderPrimary = function(){ default: return h(AccountDetailScreen, {key: 'account-detail'}) - } + } } -App.prototype.toggleMetamaskActive = function(){ +App.prototype.toggleMetamaskActive = function () { if (!this.props.isUnlocked) { // currently inactive: redirect to password box var passwordBox = document.querySelector('input[type=password]') diff --git a/ui/app/components/account-export.js b/ui/app/components/account-export.js index e31951a7d..f36b9faeb 100644 --- a/ui/app/components/account-export.js +++ b/ui/app/components/account-export.js @@ -6,14 +6,13 @@ const actions = require('../actions') module.exports = ExportAccountView - inherits(ExportAccountView, Component) -function ExportAccountView() { +function ExportAccountView () { Component.call(this) } -ExportAccountView.prototype.render = function() { - console.log("EXPORT VIEW") +ExportAccountView.prototype.render = function () { + console.log('EXPORT VIEW') console.dir(this.props) var state = this.props var accountDetail = state.accountDetail @@ -47,13 +46,13 @@ ExportAccountView.prototype.render = function() { style: { position: 'relative', top: '1.5px', - } + }, }), h('button', { onClick: () => this.onExportKeyPress({ key: 'Enter', preventDefault: () => {} }), }, 'Submit'), h('button', { - onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)) + onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)), }, 'Cancel'), ]) @@ -72,18 +71,18 @@ ExportAccountView.prototype.render = function() { webkitUserSelect: 'text', width: '100%', }, - onClick: function(event) { + onClick: function (event) { copyToClipboard(accountDetail.privateKey) - } + }, }, accountDetail.privateKey), h('button', { - onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)) + onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)), }, 'Done'), ]) } } -ExportAccountView.prototype.onExportKeyPress = function(event) { +ExportAccountView.prototype.onExportKeyPress = function (event) { if (event.key !== 'Enter') return event.preventDefault() @@ -96,6 +95,6 @@ ExportAccountView.prototype.onExportKeyPress = function(event) { } } -ExportAccountView.prototype.exportAccount = function(address) { +ExportAccountView.prototype.exportAccount = function (address) { this.props.dispatch(actions.exportAccount(address)) } diff --git a/ui/app/components/account-panel.js b/ui/app/components/account-panel.js index 5583d06ae..112b897d5 100644 --- a/ui/app/components/account-panel.js +++ b/ui/app/components/account-panel.js @@ -1,30 +1,24 @@ const inherits = require('util').inherits -const ethUtil = require('ethereumjs-util') const Component = require('react').Component const h = require('react-hyperscript') const formatBalance = require('../util').formatBalance -const Identicon = require('./identicon') const addressSummary = require('../util').addressSummary const Panel = require('./panel') module.exports = AccountPanel - inherits(AccountPanel, Component) -function AccountPanel() { +function AccountPanel () { Component.call(this) } -AccountPanel.prototype.render = function() { +AccountPanel.prototype.render = function () { var state = this.props var identity = state.identity || {} var account = state.account || {} var isFauceting = state.isFauceting - var identicon = new Identicon(identity.address, 46).toString() - var identiconSrc = `data:image/png;base64,${identicon}` - var panelOpts = { key: `accountPanel${identity.address}`, onClick: (event) => { @@ -40,21 +34,19 @@ AccountPanel.prototype.render = function() { value: addressSummary(identity.address), }, balanceOrFaucetingIndication(account, isFauceting), - ] + ], } return h(Panel, panelOpts, !state.onShowDetail ? null : h('.arrow-right.cursor-pointer', [ h('i.fa.fa-chevron-right.fa-lg'), ])) - } -function balanceOrFaucetingIndication(account, isFauceting) { - +function balanceOrFaucetingIndication (account, isFauceting) { // Temporarily deactivating isFauceting indication // because it shows fauceting for empty restored accounts. - if (/*isFauceting*/ false) { + if (/* isFauceting*/ false) { return { key: 'Account is auto-funding.', value: 'Please wait.', @@ -62,7 +54,7 @@ function balanceOrFaucetingIndication(account, isFauceting) { } else { return { key: 'BALANCE', - value: formatBalance(account.balance) + value: formatBalance(account.balance), } } } diff --git a/ui/app/components/drop-menu-item.js b/ui/app/components/drop-menu-item.js index c8e61278c..d9fde72ac 100644 --- a/ui/app/components/drop-menu-item.js +++ b/ui/app/components/drop-menu-item.js @@ -4,16 +4,14 @@ const inherits = require('util').inherits module.exports = DropMenuItem - inherits(DropMenuItem, Component) -function DropMenuItem() { +function DropMenuItem () { Component.call(this) } -DropMenuItem.prototype.render = function() { - +DropMenuItem.prototype.render = function () { return h('li.drop-menu-item', { - onClick:() => { + onClick: () => { this.props.closeMenu() this.props.action() }, diff --git a/ui/app/components/editable-label.js b/ui/app/components/editable-label.js index 41c129d4e..3d7ca17d4 100644 --- a/ui/app/components/editable-label.js +++ b/ui/app/components/editable-label.js @@ -5,46 +5,43 @@ const findDOMNode = require('react-dom').findDOMNode module.exports = EditableLabel - inherits(EditableLabel, Component) -function EditableLabel() { +function EditableLabel () { Component.call(this) } -EditableLabel.prototype.render = function() { +EditableLabel.prototype.render = function () { const props = this.props - let state = this.state + const state = this.state if (state && state.isEditingLabel) { - return h('div.editable-label', [ h('input.sizing-input', { defaultValue: props.textValue, - onKeyPress:(event) => { + onKeyPress: (event) => { this.saveIfEnter(event) }, }), h('button.editable-button', { - onClick:() => this.saveText(), - }, 'Save') + onClick: () => this.saveText(), + }, 'Save'), ]) - } else { return h('div.name-label', { - onClick:(event) => { + onClick: (event) => { this.setState({ isEditingLabel: true }) }, }, this.props.children) } } -EditableLabel.prototype.saveIfEnter = function(event) { +EditableLabel.prototype.saveIfEnter = function (event) { if (event.key === 'Enter') { this.saveText() } } -EditableLabel.prototype.saveText = function() { +EditableLabel.prototype.saveText = function () { var container = findDOMNode(this) var text = container.querySelector('.editable-label input').value this.props.saveText(text) diff --git a/ui/app/components/eth-balance.js b/ui/app/components/eth-balance.js index 76b75d4c8..710d4fc8b 100644 --- a/ui/app/components/eth-balance.js +++ b/ui/app/components/eth-balance.js @@ -1,17 +1,16 @@ const Component = require('react').Component const h = require('react-hyperscript') const inherits = require('util').inherits -const parseBalance = require('../util').parseBalance const formatBalance = require('../util').formatBalance module.exports = EthBalanceComponent inherits(EthBalanceComponent, Component) -function EthBalanceComponent() { +function EthBalanceComponent () { Component.call(this) } -EthBalanceComponent.prototype.render = function() { +EthBalanceComponent.prototype.render = function () { var state = this.props var style = state.style var value = formatBalance(state.value) diff --git a/ui/app/components/identicon.js b/ui/app/components/identicon.js index fd61b3125..5fe07ce7a 100644 --- a/ui/app/components/identicon.js +++ b/ui/app/components/identicon.js @@ -9,13 +9,13 @@ const iconFactory = iconFactoryGen(jazzicon) module.exports = IdenticonComponent inherits(IdenticonComponent, Component) -function IdenticonComponent() { +function IdenticonComponent () { Component.call(this) this.defaultDiameter = 46 } -IdenticonComponent.prototype.render = function() { +IdenticonComponent.prototype.render = function () { var state = this.props var diameter = state.diameter || this.defaultDiameter return ( @@ -32,7 +32,7 @@ IdenticonComponent.prototype.render = function() { ) } -IdenticonComponent.prototype.componentDidMount = function(){ +IdenticonComponent.prototype.componentDidMount = function () { var state = this.props var address = state.address diff --git a/ui/app/components/mascot.js b/ui/app/components/mascot.js index e043caca1..ddd51f8ba 100644 --- a/ui/app/components/mascot.js +++ b/ui/app/components/mascot.js @@ -2,14 +2,12 @@ const inherits = require('util').inherits const Component = require('react').Component const h = require('react-hyperscript') const metamaskLogo = require('metamask-logo') -const getCaretCoordinates = require('textarea-caret') const debounce = require('debounce') module.exports = Mascot - inherits(Mascot, Component) -function Mascot() { +function Mascot () { Component.call(this) this.logo = metamaskLogo({ followMouse: true, @@ -22,8 +20,7 @@ function Mascot() { this.unfollowMouse = this.logo.setFollowMouse.bind(this.logo, false) } - -Mascot.prototype.render = function() { +Mascot.prototype.render = function () { // this is a bit hacky // the event emitter is on `this.props` // and we dont get that until render @@ -36,19 +33,19 @@ Mascot.prototype.render = function() { ) } -Mascot.prototype.componentDidMount = function() { +Mascot.prototype.componentDidMount = function () { if (!this.logo) return var targetDivId = 'metamask-mascot-container' var container = document.getElementById(targetDivId) container.appendChild(this.logo.canvas) } -Mascot.prototype.componentWillUnmount = function() { +Mascot.prototype.componentWillUnmount = function () { if (!this.logo) return this.logo.canvas.remove() } -Mascot.prototype.handleAnimationEvents = function(){ +Mascot.prototype.handleAnimationEvents = function () { if (!this.logo) return // only setup listeners once if (this.animations) return @@ -57,7 +54,7 @@ Mascot.prototype.handleAnimationEvents = function(){ this.animations.on('setFollowMouse', this.logo.setFollowMouse.bind(this.logo)) } -Mascot.prototype.lookAt = function(target){ +Mascot.prototype.lookAt = function (target) { if (!this.logo) return this.unfollowMouse() this.logo.lookAt(target) diff --git a/ui/app/components/network.js b/ui/app/components/network.js index b226a6db6..771be5f32 100644 --- a/ui/app/components/network.js +++ b/ui/app/components/network.js @@ -6,34 +6,33 @@ module.exports = Network inherits(Network, Component) -function Network() { +function Network () { Component.call(this) } -Network.prototype.render = function() { +Network.prototype.render = function () { const state = this.props const networkNumber = state.network let iconName, hoverText - const imagePath = "/images/" - if (networkNumber == 'loading') { + if (networkNumber === 'loading') { return h('img', { title: 'Attempting to connect to blockchain.', - onClick:(event) => this.props.onClick(event), + onClick: (event) => this.props.onClick(event), style: { width: '27px', - marginRight: '-27px' + marginRight: '-27px', }, src: 'images/loading.svg', }) - } else if (parseInt(networkNumber) == 1) { + } else if (parseInt(networkNumber) === 1) { hoverText = 'Main Ethereum Network' iconName = 'ethereum-network' - }else if (parseInt(networkNumber) == 2) { - hoverText = "Morden Test Network" + } else if (parseInt(networkNumber) === 2) { + hoverText = 'Morden Test Network' iconName = 'morden-test-network' - }else { - hoverText = "Unknown Private Network" + } else { + hoverText = 'Unknown Private Network' iconName = 'unknown-private-network' } return ( @@ -43,24 +42,24 @@ Network.prototype.render = function() { marginLeft: '-3px', }, title: hoverText, - onClick:(event) => this.props.onClick(event), - },[ - function() { - switch (iconName) { - case 'ethereum-network': - return h('.menu-icon.ether-icon') - case 'morden-test-network': - return h('.menu-icon.morden-icon') - default: - return h('i.fa.fa-question-circle.fa-lg', { - ariaHidden: true, - style: { - margin: '10px', - color: 'rgb(125, 128, 130)', - }, - }) - } - }() + onClick: (event) => this.props.onClick(event), + }, [ + (function () { + switch (iconName) { + case 'ethereum-network': + return h('.menu-icon.ether-icon') + case 'morden-test-network': + return h('.menu-icon.morden-icon') + default: + return h('i.fa.fa-question-circle.fa-lg', { + ariaHidden: true, + style: { + margin: '10px', + color: 'rgb(125, 128, 130)', + }, + }) + } + })(), ]) ) } diff --git a/ui/app/components/panel.js b/ui/app/components/panel.js index 5d72d6068..cbdc82982 100644 --- a/ui/app/components/panel.js +++ b/ui/app/components/panel.js @@ -1,23 +1,18 @@ const inherits = require('util').inherits -const ethUtil = require('ethereumjs-util') const Component = require('react').Component const h = require('react-hyperscript') const Identicon = require('./identicon') module.exports = Panel - inherits(Panel, Component) -function Panel() { +function Panel () { Component.call(this) } -Panel.prototype.render = function() { +Panel.prototype.render = function () { var state = this.props - var identity = state.identity || {} - var account = state.account || {} - var isFauceting = state.isFauceting var style = { flex: '1 0 auto', } diff --git a/ui/app/components/pending-msg.js b/ui/app/components/pending-msg.js index b0a6bb87d..7f3914d56 100644 --- a/ui/app/components/pending-msg.js +++ b/ui/app/components/pending-msg.js @@ -3,25 +3,21 @@ const h = require('react-hyperscript') const inherits = require('util').inherits const AccountPanel = require('./account-panel') -const addressSummary = require('../util').addressSummary const readableDate = require('../util').readableDate -const formatBalance = require('../util').formatBalance -const dataSize = require('../util').dataSize module.exports = PendingMsg - inherits(PendingMsg, Component) -function PendingMsg() { +function PendingMsg () { Component.call(this) } -PendingMsg.prototype.render = function() { +PendingMsg.prototype.render = function () { var state = this.props var msgData = state.txData var msgParams = msgData.msgParams || {} - var address = msgParams.from || state.selectedAddress + var address = msgParams.from || state.selectedAddress var identity = state.identities[address] || { address: address } var account = state.accounts[address] || { address: address } @@ -34,7 +30,7 @@ PendingMsg.prototype.render = function() { style: { fontWeight: 'bold', textAlign: 'center', - } + }, }, 'Sign Message'), // account that will sign diff --git a/ui/app/components/pending-tx.js b/ui/app/components/pending-tx.js index 2bfb89705..1835239e5 100644 --- a/ui/app/components/pending-tx.js +++ b/ui/app/components/pending-tx.js @@ -6,22 +6,20 @@ const AccountPanel = require('./account-panel') const addressSummary = require('../util').addressSummary const readableDate = require('../util').readableDate const formatBalance = require('../util').formatBalance -const dataSize = require('../util').dataSize module.exports = PendingTx - inherits(PendingTx, Component) -function PendingTx() { +function PendingTx () { Component.call(this) } -PendingTx.prototype.render = function() { +PendingTx.prototype.render = function () { var state = this.props var txData = state.txData var txParams = txData.txParams || {} - var address = txParams.from || state.selectedAddress + var address = txParams.from || state.selectedAddress var identity = state.identities[address] || { address: address } var account = state.accounts[address] || { address: address } @@ -34,7 +32,7 @@ PendingTx.prototype.render = function() { style: { fontWeight: 'bold', textAlign: 'center', - } + }, }, 'Submit Transaction'), // account that will sign diff --git a/ui/app/components/template.js b/ui/app/components/template.js index 9e4eca20f..b6ed8eaa0 100644 --- a/ui/app/components/template.js +++ b/ui/app/components/template.js @@ -4,16 +4,15 @@ const inherits = require('util').inherits module.exports = NewComponent - inherits(NewComponent, Component) -function NewComponent() { +function NewComponent () { Component.call(this) } -NewComponent.prototype.render = function() { - var state = this.props +NewComponent.prototype.render = function () { + const props = this.props return ( - h('span', 'Placeholder component') + h('span', props.message) ) } diff --git a/ui/app/components/transaction-list-item-icon.js b/ui/app/components/transaction-list-item-icon.js index fbee4b218..c640de551 100644 --- a/ui/app/components/transaction-list-item-icon.js +++ b/ui/app/components/transaction-list-item-icon.js @@ -6,20 +6,19 @@ const Identicon = require('./identicon') module.exports = TransactionIcon - inherits(TransactionIcon, Component) -function TransactionIcon() { +function TransactionIcon () { Component.call(this) } -TransactionIcon.prototype.render = function() { - const { transaction, txParams, isTx, isMsg } = this.props +TransactionIcon.prototype.render = function () { + const { transaction, txParams, isMsg } = this.props if (transaction.status === 'rejected') { return h('i.fa.fa-exclamation-triangle.fa-lg.error', { style: { width: '24px', - } + }, }) } @@ -27,7 +26,7 @@ TransactionIcon.prototype.render = function() { return h('i.fa.fa-certificate.fa-lg', { style: { width: '24px', - } + }, }) } @@ -40,7 +39,7 @@ TransactionIcon.prototype.render = function() { return h('i.fa.fa-file-text-o.fa-lg', { style: { width: '24px', - } + }, }) } } diff --git a/ui/app/components/transaction-list-item.js b/ui/app/components/transaction-list-item.js index fc1c3c630..56f2103f3 100644 --- a/ui/app/components/transaction-list-item.js +++ b/ui/app/components/transaction-list-item.js @@ -5,20 +5,18 @@ const inherits = require('util').inherits const EtherBalance = require('./eth-balance') const addressSummary = require('../util').addressSummary const explorerLink = require('../../lib/explorer-link') -const formatBalance = require('../util').formatBalance const vreme = new (require('vreme')) const TransactionIcon = require('./transaction-list-item-icon') module.exports = TransactionListItem - inherits(TransactionListItem, Component) -function TransactionListItem() { +function TransactionListItem () { Component.call(this) } -TransactionListItem.prototype.render = function() { +TransactionListItem.prototype.render = function () { const { transaction, i, network } = this.props var date = formatDate(transaction.time) @@ -59,8 +57,8 @@ TransactionListItem.prototype.render = function() { // large identicon h('.identicon-wrapper.flex-column.flex-center.select-none', [ - transaction.status === 'unconfirmed' ? h('.red-dot', ' ') : - h(TransactionIcon, { txParams, transaction, isTx, isMsg }), + transaction.status === 'unconfirmed' ? h('.red-dot', ' ') + : h(TransactionIcon, { txParams, transaction, isTx, isMsg }), ]), h('.flex-column', [ @@ -76,24 +74,24 @@ TransactionListItem.prototype.render = function() { ) } -function domainField(txParams) { +function domainField (txParams) { return h('div', { style: { fontSize: 'small', color: '#ABA9AA', }, - },[ + }, [ txParams.origin, ]) } -function recipientField(txParams, transaction, isTx, isMsg) { +function recipientField (txParams, transaction, isTx, isMsg) { let message if (isMsg) { message = 'Signature Requested' } else if (txParams.to) { - message = addressSummary(txParams.to) + message = addressSummary(txParams.to) } else { message = 'Contract Published' } @@ -103,23 +101,17 @@ function recipientField(txParams, transaction, isTx, isMsg) { fontSize: 'small', color: '#ABA9AA', }, - },[ + }, [ message, failIfFailed(transaction), ]) - -} - -TransactionListItem.prototype.renderMessage = function() { - const { transaction, i, network } = this.props - return h('div', 'wowie, thats a message') } -function formatDate(date){ +function formatDate (date) { return vreme.format(new Date(date), 'March 16 2014 14:30') } -function failIfFailed(transaction) { +function failIfFailed (transaction) { if (transaction.status === 'rejected') { return h('span.error', ' (Rejected)') } diff --git a/ui/app/components/transaction-list.js b/ui/app/components/transaction-list.js index ed2e1ee0a..a1a5db475 100644 --- a/ui/app/components/transaction-list.js +++ b/ui/app/components/transaction-list.js @@ -8,12 +8,12 @@ module.exports = TransactionList inherits(TransactionList, Component) -function TransactionList() { +function TransactionList () { Component.call(this) } -TransactionList.prototype.render = function() { - const { txsToRender, network, unconfTxs, unconfMsgs } = this.props +TransactionList.prototype.render = function () { + const { txsToRender, network, unconfMsgs } = this.props const transactions = txsToRender.concat(unconfMsgs) .sort((a, b) => b.time - a.time) @@ -49,22 +49,21 @@ TransactionList.prototype.render = function() { }, }, ( - transactions.length ? - transactions.map((transaction, i) => { + transactions.length + ? transactions.map((transaction, i) => { return h(TransactionListItem, { transaction, i, network, - showTx:(txId) => { + showTx: (txId) => { this.props.viewPendingTx(txId) }, }) }) - : - [h('.flex-center', { - style: { - height: '100%', - }, - }, 'No transaction history...')] - )) + : [h('.flex-center', { + style: { + height: '100%', + }, + }, 'No transaction history...')] + )), ]) ) } diff --git a/ui/app/conf-tx.js b/ui/app/conf-tx.js index 9092c85c9..5c80939b9 100644 --- a/ui/app/conf-tx.js +++ b/ui/app/conf-tx.js @@ -3,10 +3,7 @@ const Component = require('react').Component const ReactCSSTransitionGroup = require('react-addons-css-transition-group') const h = require('react-hyperscript') const connect = require('react-redux').connect -const copyToClipboard = require('copy-to-clipboard') const actions = require('./actions') -const AccountPanel = require('./components/account-panel') -const valuesFor = require('./util').valuesFor const txHelper = require('../lib/tx-helper') const ConfirmTx = require('./components/pending-tx') @@ -14,7 +11,7 @@ const PendingMsg = require('./components/pending-msg') module.exports = connect(mapStateToProps)(ConfirmTxScreen) -function mapStateToProps(state) { +function mapStateToProps (state) { return { identities: state.metamask.identities, accounts: state.metamask.accounts, @@ -27,12 +24,11 @@ function mapStateToProps(state) { } inherits(ConfirmTxScreen, Component) -function ConfirmTxScreen() { +function ConfirmTxScreen () { Component.call(this) } - -ConfirmTxScreen.prototype.render = function() { +ConfirmTxScreen.prototype.render = function () { var state = this.props var unconfTxs = state.unconfTxs @@ -103,7 +99,6 @@ ConfirmTxScreen.prototype.render = function() { } function currentTxView (opts) { - if ('txParams' in opts.txData) { // This is a pending transaction return h(ConfirmTx, opts) @@ -113,34 +108,34 @@ function currentTxView (opts) { } } -ConfirmTxScreen.prototype.sendTransaction = function(txData, event){ +ConfirmTxScreen.prototype.sendTransaction = function (txData, event) { event.stopPropagation() this.props.dispatch(actions.sendTx(txData)) } -ConfirmTxScreen.prototype.cancelTransaction = function(txData, event){ +ConfirmTxScreen.prototype.cancelTransaction = function (txData, event) { event.stopPropagation() this.props.dispatch(actions.cancelTx(txData)) } -ConfirmTxScreen.prototype.signMessage = function(msgData, event){ +ConfirmTxScreen.prototype.signMessage = function (msgData, event) { var params = msgData.msgParams params.metamaskId = msgData.id event.stopPropagation() this.props.dispatch(actions.signMsg(params)) } -ConfirmTxScreen.prototype.cancelMessage = function(msgData, event){ +ConfirmTxScreen.prototype.cancelMessage = function (msgData, event) { event.stopPropagation() this.props.dispatch(actions.cancelMsg(msgData)) } -ConfirmTxScreen.prototype.goHome = function(event){ +ConfirmTxScreen.prototype.goHome = function (event) { event.stopPropagation() this.props.dispatch(actions.goHome()) } -function warningIfExists(warning) { +function warningIfExists (warning) { if (warning) { return h('span.error', { style: { margin: 'auto' } }, warning) } diff --git a/ui/app/config.js b/ui/app/config.js index c4d473b10..4094180dd 100644 --- a/ui/app/config.js +++ b/ui/app/config.js @@ -6,22 +6,19 @@ const actions = require('./actions') module.exports = connect(mapStateToProps)(ConfigScreen) -function mapStateToProps(state) { +function mapStateToProps (state) { return { - rpc: state.metamask.rpcTarget, metamask: state.metamask, } } inherits(ConfigScreen, Component) -function ConfigScreen() { +function ConfigScreen () { Component.call(this) } - -ConfigScreen.prototype.render = function() { +ConfigScreen.prototype.render = function () { var state = this.props - var rpc = state.rpc var metamaskState = state.metamask return ( @@ -32,7 +29,7 @@ ConfigScreen.prototype.render = function() { h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { onClick: (event) => { state.dispatch(actions.goHome()) - } + }, }), h('h2.page-subtitle', 'Configuration'), ]), @@ -42,7 +39,7 @@ ConfigScreen.prototype.render = function() { h('.flex-space-around', { style: { padding: '20px', - } + }, }, [ currentProviderDisplay(metamaskState), @@ -56,25 +53,25 @@ ConfigScreen.prototype.render = function() { height: '30px', margin: '8px', }, - onKeyPress(event) { + onKeyPress (event) { if (event.key === 'Enter') { var element = event.target var newRpc = element.value state.dispatch(actions.setRpcTarget(newRpc)) } - } + }, }), h('button', { style: { alignSelf: 'center', }, - onClick(event) { + onClick (event) { event.preventDefault() var element = document.querySelector('input#new_rpc') var newRpc = element.value state.dispatch(actions.setRpcTarget(newRpc)) - } - }, 'Save') + }, + }, 'Save'), ]), h('div', [ @@ -82,10 +79,10 @@ ConfigScreen.prototype.render = function() { style: { alignSelf: 'center', }, - onClick(event) { + onClick (event) { event.preventDefault() state.dispatch(actions.setProviderType('mainnet')) - } + }, }, 'Use Main Network'), ]), @@ -94,10 +91,10 @@ ConfigScreen.prototype.render = function() { style: { alignSelf: 'center', }, - onClick(event) { + onClick (event) { event.preventDefault() state.dispatch(actions.setProviderType('testnet')) - } + }, }, 'Use Morden Test Network'), ]), @@ -106,10 +103,10 @@ ConfigScreen.prototype.render = function() { style: { alignSelf: 'center', }, - onClick(event) { + onClick (event) { event.preventDefault() state.dispatch(actions.setRpcTarget('http://localhost:8545/')) - } + }, }, 'Use http://localhost:8545'), ]), @@ -118,17 +115,17 @@ ConfigScreen.prototype.render = function() { h('div', { style: { marginTop: '20px', - } + }, }, [ h('button', { style: { alignSelf: 'center', }, - onClick(event) { + onClick (event) { event.preventDefault() state.dispatch(actions.revealSeedConfirmation()) - } - }, 'Reveal Seed Words') + }, + }, 'Reveal Seed Words'), ]), ]), @@ -137,7 +134,7 @@ ConfigScreen.prototype.render = function() { ) } -function currentProviderDisplay(metamaskState) { +function currentProviderDisplay (metamaskState) { var provider = metamaskState.provider var title, value @@ -156,10 +153,10 @@ function currentProviderDisplay(metamaskState) { default: title = 'Current RPC' value = metamaskState.provider.rpcTarget - } + } return h('div', [ h('span', {style: { fontWeight: 'bold', paddingRight: '10px'}}, title), - h('span', value) + h('span', value), ]) } diff --git a/ui/app/first-time/create-vault-complete.js b/ui/app/first-time/create-vault-complete.js index 9eceb4421..0ca0a1b22 100644 --- a/ui/app/first-time/create-vault-complete.js +++ b/ui/app/first-time/create-vault-complete.js @@ -6,20 +6,19 @@ const actions = require('../actions') module.exports = connect(mapStateToProps)(CreateVaultCompleteScreen) - inherits(CreateVaultCompleteScreen, Component) -function CreateVaultCompleteScreen() { +function CreateVaultCompleteScreen () { Component.call(this) } -function mapStateToProps(state) { +function mapStateToProps (state) { return { seed: state.appState.currentView.seedWords, cachedSeed: state.metamask.seedWords, } } -CreateVaultCompleteScreen.prototype.render = function() { +CreateVaultCompleteScreen.prototype.render = function () { var state = this.props var seed = state.seed || state.cachedSeed @@ -50,7 +49,7 @@ CreateVaultCompleteScreen.prototype.render = function() { style: { padding: '12px 20px 0px 20px', textAlign: 'center', - } + }, }, 'These 12 words can restore all of your MetaMask accounts for this vault.\nSave them somewhere safe and secret.'), h('textarea.twelve-word-phrase', { @@ -68,7 +67,7 @@ CreateVaultCompleteScreen.prototype.render = function() { ) } -CreateVaultCompleteScreen.prototype.confirmSeedWords = function() { +CreateVaultCompleteScreen.prototype.confirmSeedWords = function () { this.props.dispatch(actions.confirmSeedWords()) } diff --git a/ui/app/first-time/create-vault.js b/ui/app/first-time/create-vault.js index 1e963aa5a..3dfbf0dbd 100644 --- a/ui/app/first-time/create-vault.js +++ b/ui/app/first-time/create-vault.js @@ -7,19 +7,18 @@ const actions = require('../actions') module.exports = connect(mapStateToProps)(CreateVaultScreen) - inherits(CreateVaultScreen, Component) -function CreateVaultScreen() { +function CreateVaultScreen () { Component.call(this) } -function mapStateToProps(state) { +function mapStateToProps (state) { return { warning: state.appState.warning, } } -CreateVaultScreen.prototype.render = function() { +CreateVaultScreen.prototype.render = function () { var state = this.props return ( @@ -91,24 +90,24 @@ CreateVaultScreen.prototype.render = function() { ) } -CreateVaultScreen.prototype.componentDidMount = function(){ +CreateVaultScreen.prototype.componentDidMount = function () { document.getElementById('password-box').focus() } -CreateVaultScreen.prototype.showInitializeMenu = function() { +CreateVaultScreen.prototype.showInitializeMenu = function () { this.props.dispatch(actions.showInitializeMenu()) } // create vault -CreateVaultScreen.prototype.createVaultOnEnter = function(event) { +CreateVaultScreen.prototype.createVaultOnEnter = function (event) { if (event.key === 'Enter') { event.preventDefault() this.createNewVault() } } -CreateVaultScreen.prototype.createNewVault = function(){ +CreateVaultScreen.prototype.createNewVault = function () { var passwordBox = document.getElementById('password-box') var password = passwordBox.value var passwordConfirmBox = document.getElementById('password-box-confirm') @@ -126,5 +125,5 @@ CreateVaultScreen.prototype.createNewVault = function(){ return } - this.props.dispatch(actions.createNewVault(password, ''/*entropy*/)) + this.props.dispatch(actions.createNewVault(password, ''/* entropy*/)) } diff --git a/ui/app/first-time/disclaimer.js b/ui/app/first-time/disclaimer.js index fe138c93b..bfd6c490d 100644 --- a/ui/app/first-time/disclaimer.js +++ b/ui/app/first-time/disclaimer.js @@ -8,17 +8,16 @@ const path = require('path') const disclaimer = fs.readFileSync(path.join(__dirname, 'disclaimer.txt')).toString() module.exports = connect(mapStateToProps)(DisclaimerScreen) -function mapStateToProps(state) { +function mapStateToProps (state) { return {} } inherits(DisclaimerScreen, Component) -function DisclaimerScreen() { +function DisclaimerScreen () { Component.call(this) } -DisclaimerScreen.prototype.render = function() { - +DisclaimerScreen.prototype.render = function () { return ( h('.flex-column.flex-center.flex-grow', [ @@ -43,13 +42,13 @@ DisclaimerScreen.prototype.render = function() { padding: '6px', width: '80%', overflowY: 'scroll', - } + }, }, disclaimer), h('button', { style: { marginTop: '18px' }, - onClick: () => this.props.dispatch(actions.agreeToDisclaimer()) - }, 'I Agree') + onClick: () => this.props.dispatch(actions.agreeToDisclaimer()), + }, 'I Agree'), ]) ) } diff --git a/ui/app/first-time/init-menu.js b/ui/app/first-time/init-menu.js index 197193063..e63c30fc5 100644 --- a/ui/app/first-time/init-menu.js +++ b/ui/app/first-time/init-menu.js @@ -3,28 +3,25 @@ const EventEmitter = require('events').EventEmitter const Component = require('react').Component const connect = require('react-redux').connect const h = require('react-hyperscript') -const getCaretCoordinates = require('textarea-caret') const Mascot = require('../components/mascot') const actions = require('../actions') -const CreateVaultScreen = require('./create-vault') -const CreateVaultCompleteScreen = require('./create-vault-complete') module.exports = connect(mapStateToProps)(InitializeMenuScreen) inherits(InitializeMenuScreen, Component) -function InitializeMenuScreen() { +function InitializeMenuScreen () { Component.call(this) this.animationEventEmitter = new EventEmitter() } -function mapStateToProps(state) { +function mapStateToProps (state) { return { // state from plugin currentView: state.appState.currentView, } } -InitializeMenuScreen.prototype.render = function() { +InitializeMenuScreen.prototype.render = function () { var state = this.props switch (state.currentView.name) { @@ -33,15 +30,13 @@ InitializeMenuScreen.prototype.render = function() { return this.renderMenu() } - } // InitializeMenuScreen.prototype.componentDidMount = function(){ // document.getElementById('password-box').focus() // } -InitializeMenuScreen.prototype.renderMenu = function() { - var state = this.props +InitializeMenuScreen.prototype.renderMenu = function () { return ( h('.initialize-screen.flex-column.flex-center.flex-grow', [ @@ -88,15 +83,15 @@ InitializeMenuScreen.prototype.renderMenu = function() { // this.props.dispatch(actions.showInitializeMenu()) // } -InitializeMenuScreen.prototype.showInitializeMenu = function() { +InitializeMenuScreen.prototype.showInitializeMenu = function () { this.props.dispatch(actions.showInitializeMenu()) } -InitializeMenuScreen.prototype.showCreateVault = function() { +InitializeMenuScreen.prototype.showCreateVault = function () { this.props.dispatch(actions.showCreateVault()) } -InitializeMenuScreen.prototype.showRestoreVault = function() { +InitializeMenuScreen.prototype.showRestoreVault = function () { this.props.dispatch(actions.showRestoreVault()) } diff --git a/ui/app/first-time/restore-vault.js b/ui/app/first-time/restore-vault.js index ff3b308c4..684781e50 100644 --- a/ui/app/first-time/restore-vault.js +++ b/ui/app/first-time/restore-vault.js @@ -6,20 +6,18 @@ const actions = require('../actions') module.exports = connect(mapStateToProps)(RestoreVaultScreen) - inherits(RestoreVaultScreen, Component) -function RestoreVaultScreen() { +function RestoreVaultScreen () { Component.call(this) } -function mapStateToProps(state) { +function mapStateToProps (state) { return { warning: state.appState.warning, } } - -RestoreVaultScreen.prototype.render = function() { +RestoreVaultScreen.prototype.render = function () { var state = this.props return ( @@ -41,7 +39,7 @@ RestoreVaultScreen.prototype.render = function() { // wallet seed entry h('h3', 'Wallet Seed'), h('textarea.twelve-word-phrase.letter-spacey', { - placeholder: 'Enter your secret twelve word phrase here to restore your vault.' + placeholder: 'Enter your secret twelve word phrase here to restore your vault.', }), // password @@ -97,17 +95,17 @@ RestoreVaultScreen.prototype.render = function() { ) } -RestoreVaultScreen.prototype.showInitializeMenu = function() { +RestoreVaultScreen.prototype.showInitializeMenu = function () { this.props.dispatch(actions.showInitializeMenu()) } -RestoreVaultScreen.prototype.onMaybeCreate = function(event) { +RestoreVaultScreen.prototype.onMaybeCreate = function (event) { if (event.key === 'Enter') { this.restoreVault() } } -RestoreVaultScreen.prototype.restoreVault = function(){ +RestoreVaultScreen.prototype.restoreVault = function () { // check password var passwordBox = document.getElementById('password-box') var password = passwordBox.value diff --git a/ui/app/info.js b/ui/app/info.js index b69e006d5..e3b68fed5 100644 --- a/ui/app/info.js +++ b/ui/app/info.js @@ -6,19 +6,18 @@ const actions = require('./actions') module.exports = connect(mapStateToProps)(InfoScreen) -function mapStateToProps(state) { +function mapStateToProps (state) { return {} } inherits(InfoScreen, Component) -function InfoScreen() { +function InfoScreen () { Component.call(this) } -InfoScreen.prototype.render = function() { +InfoScreen.prototype.render = function () { var state = this.props - var rpc = state.rpc - var manifest = chrome.runtime.getManifest(); + var manifest = chrome.runtime.getManifest() return ( h('.flex-column.flex-grow', [ @@ -27,7 +26,7 @@ InfoScreen.prototype.render = function() { h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { onClick: (event) => { state.dispatch(actions.goHome()) - } + }, }), h('h2.page-subtitle', 'Info'), ]), @@ -37,96 +36,93 @@ InfoScreen.prototype.render = function() { h('.flex-space-around', { style: { padding: '20px', - } + }, }, [ - //current version number + // current version number - h('.info.info-gray',[ - h('div','Metamask'), + h('.info.info-gray', [ + h('div', 'Metamask'), h('div', { style: { - marginBottom: '10px', - } - },`Version: ${manifest.version}`), + marginBottom: '10px', + }, + }, `Version: ${manifest.version}`), ]), - h('hr',{ + h('hr', { style: { - margin:'20px 0 ', + margin: '20px 0 ', width: '7em', - } + }, }), - - h('.info',{ - style: { - marginBottom: '20px', - }}, + h('.info', { + style: { + marginBottom: '20px', + }}, `For more information on MetaMask you can visit our web site. If you want to contact us with questions or just say 'Hi', you can find us on theise platforms:`), - h('div',{ + h('div', { style: { paddingLeft: '30px', }}, - [ - h('div', [ - h('a', { - href: 'https://metamask.io/', - target: '_blank', - onClick(event) { this.navigateTo(event.target.href) }, - },[ - h('img.icon-size', { - src: manifest.icons[128] - }), - h('div.info',{ - style: { - fontWeight: 800, - } - },'Visit our web site') - ]) - ]), - h('div.fa.fa-slack', [ - h('a.info', { - href: 'http://slack.metamask.io', - target: '_blank', - onClick(event) { this.navigateTo(event.target.href) }, - }, 'Join the conversation on Slack'), - ]), - - - h('div.fa.fa-twitter', [ - h('a.info', { - href: 'https://twitter.com/metamask_io', - target: '_blank', - onClick(event) { this.navigateTo(event.target.href) }, - }, 'Follow us on Twitter'), - ]), - - h('div.fa.fa-envelope', [ - h('a.info', { - href: 'mailto:hello@metamask.io?subject=Feedback', - target: '_blank', - }, 'Email us any questions or comments!'), + [ + h('div', [ + h('a', { + href: 'https://metamask.io/', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, [ + h('img.icon-size', { + src: manifest.icons[128], + }), + h('div.info', { + style: { + fontWeight: 800, + }, + }, 'Visit our web site'), + ]), + ]), + h('div.fa.fa-slack', [ + h('a.info', { + href: 'http://slack.metamask.io', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, 'Join the conversation on Slack'), + ]), + + h('div.fa.fa-twitter', [ + h('a.info', { + href: 'https://twitter.com/metamask_io', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, 'Follow us on Twitter'), + ]), + + h('div.fa.fa-envelope', [ + h('a.info', { + href: 'mailto:hello@metamask.io?subject=Feedback', + target: '_blank', + }, 'Email us any questions or comments!'), + ]), + + h('div.fa.fa-github', [ + h('a.info', { + href: 'https://github.com/metamask/talk/issues', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, 'Start a thread on Github'), + ]), ]), - - h('div.fa.fa-github', [ - h('a.info', { - href: 'https://github.com/metamask/talk/issues', - target: '_blank', - onClick(event) { this.navigateTo(event.target.href) }, - }, 'Start a thread on Github'), - ]), - ]), ]), ]), ]) ) - } -InfoScreen.prototype.navigateTo = function(url) { - chrome.tabs.create({ url }); +InfoScreen.prototype.navigateTo = function (url) { + chrome.tabs.create({ url }) } diff --git a/ui/app/loading.js b/ui/app/loading.js index f6279d5cf..606b53dde 100644 --- a/ui/app/loading.js +++ b/ui/app/loading.js @@ -2,23 +2,22 @@ const inherits = require('util').inherits const Component = require('react').Component const h = require('react-hyperscript') const connect = require('react-redux').connect -const actions = require('./actions') const ReactCSSTransitionGroup = require('react-addons-css-transition-group') module.exports = connect(mapStateToProps)(LoadingIndicator) -function mapStateToProps(state) { +function mapStateToProps (state) { return { isLoading: state.appState.isLoading, } } inherits(LoadingIndicator, Component) -function LoadingIndicator() { +function LoadingIndicator () { Component.call(this) } -LoadingIndicator.prototype.render = function() { +LoadingIndicator.prototype.render = function () { var isLoading = this.props.isLoading return ( @@ -38,7 +37,7 @@ LoadingIndicator.prototype.render = function() { height: '100%', width: '100%', background: 'rgba(255, 255, 255, 0.5)', - } + }, }, [ h('img', { src: 'images/loading.svg', diff --git a/ui/app/recover-seed/confirmation.js b/ui/app/recover-seed/confirmation.js index 0276d547d..55b18025f 100644 --- a/ui/app/recover-seed/confirmation.js +++ b/ui/app/recover-seed/confirmation.js @@ -7,13 +7,12 @@ const actions = require('../actions') module.exports = connect(mapStateToProps)(RevealSeedConfirmatoin) - inherits(RevealSeedConfirmatoin, Component) -function RevealSeedConfirmatoin() { +function RevealSeedConfirmatoin () { Component.call(this) } -function mapStateToProps(state) { +function mapStateToProps (state) { return { warning: state.appState.warning, } @@ -21,7 +20,7 @@ function mapStateToProps(state) { RevealSeedConfirmatoin.prototype.confirmationPhrase = 'I understand' -RevealSeedConfirmatoin.prototype.render = function() { +RevealSeedConfirmatoin.prototype.render = function () { const props = this.props const state = this.state @@ -48,7 +47,7 @@ RevealSeedConfirmatoin.prototype.render = function() { flexDirection: 'column', padding: '20px', justifyContent: 'center', - } + }, }, [ h('h4', 'Do not recover your seed words in a public place! These words can be used to steal all your accounts.'), @@ -68,8 +67,8 @@ RevealSeedConfirmatoin.prototype.render = function() { h(`h4${state && state.confirmationWrong ? '.error' : ''}`, { style: { marginTop: '12px', - } - }, `Enter the phrase "I understand" to proceed.`), + }, + }, 'Enter the phrase "I understand" to proceed.'), // confirm confirmation h('input.large-input.letter-spacey', { @@ -105,7 +104,7 @@ RevealSeedConfirmatoin.prototype.render = function() { h('span.error', { style: { margin: '20px', - } + }, }, props.warning.split('-')) ), @@ -117,24 +116,24 @@ RevealSeedConfirmatoin.prototype.render = function() { ) } -RevealSeedConfirmatoin.prototype.componentDidMount = function(){ +RevealSeedConfirmatoin.prototype.componentDidMount = function () { document.getElementById('password-box').focus() } -RevealSeedConfirmatoin.prototype.goHome = function() { +RevealSeedConfirmatoin.prototype.goHome = function () { this.props.dispatch(actions.showConfigPage(false)) } // create vault -RevealSeedConfirmatoin.prototype.checkConfirmation = function(event) { +RevealSeedConfirmatoin.prototype.checkConfirmation = function (event) { if (event.key === 'Enter') { event.preventDefault() this.revealSeedWords() } } -RevealSeedConfirmatoin.prototype.revealSeedWords = function(){ +RevealSeedConfirmatoin.prototype.revealSeedWords = function () { this.setState({ confirmationWrong: false }) const confirmBox = document.getElementById('confirm-box') diff --git a/ui/app/reducers.js b/ui/app/reducers.js index 0f2ad4c21..17f94f230 100644 --- a/ui/app/reducers.js +++ b/ui/app/reducers.js @@ -1,5 +1,3 @@ -const combineReducers = require('redux').combineReducers -const actions = require('./actions') const extend = require('xtend') // @@ -11,8 +9,7 @@ const reduceApp = require('./reducers/app') module.exports = rootReducer -function rootReducer(state, action) { - +function rootReducer (state, action) { // clone state = extend(state) @@ -34,8 +31,6 @@ function rootReducer(state, action) { state.appState = reduceApp(state, action) - return state - } diff --git a/ui/app/reducers/app.js b/ui/app/reducers/app.js index 3ee9a61fe..f45be0433 100644 --- a/ui/app/reducers/app.js +++ b/ui/app/reducers/app.js @@ -1,12 +1,10 @@ const extend = require('xtend') const actions = require('../actions') -const valuesFor = require('../util').valuesFor const txHelper = require('../../lib/tx-helper') module.exports = reduceApp -function reduceApp(state, action) { - +function reduceApp (state, action) { // clone and defaults const selectedAccount = state.metamask.selectedAccount const pendingTxs = hasPendingTxs(state) @@ -45,343 +43,341 @@ function reduceApp(state, action) { switch (action.type) { - case actions.TOGGLE_MENU: - return extend(appState, { - menuOpen: !appState.menuOpen, - }) + case actions.TOGGLE_MENU: + return extend(appState, { + menuOpen: !appState.menuOpen, + }) - case actions.SET_MENU_STATE: - return extend(appState, { - menuOpen: action.value, - }) + case actions.SET_MENU_STATE: + return extend(appState, { + menuOpen: action.value, + }) // intialize - case actions.SHOW_CREATE_VAULT: - return extend(appState, { - currentView: { - name: 'createVault', - }, - transForward: true, - warning: null, - }) - - case actions.SHOW_RESTORE_VAULT: - return extend(appState, { - currentView: { - name: 'restoreVault', - }, - transForward: true, - }) - - case actions.SHOW_INIT_MENU: - return extend(appState, { - currentView: defaultView, - transForward: false, - }) - - case actions.SHOW_CONFIG_PAGE: - return extend(appState, { - currentView: { - name: 'config', - context: appState.currentView.context, - }, - transForward: action.value, - }) - - case actions.SHOW_INFO_PAGE: - return extend(appState, { - currentView: { - name: 'info', - context: appState.currentView.context, - }, - transForward: true, - }) - - case actions.CREATE_NEW_VAULT_IN_PROGRESS: - return extend(appState, { - currentView: { - name: 'createVault', - inProgress: true, - }, - transForward: true, - isLoading: true, - }) - - case actions.SHOW_NEW_VAULT_SEED: - return extend(appState, { - currentView: { - name: 'createVaultComplete', - seedWords: action.value, - }, - transForward: true, - isLoading: false, - }) - - case actions.SHOW_SEND_PAGE: - return extend(appState, { - currentView: { - name: 'sendTransaction', - context: appState.currentView.context, - }, - transForward: true, - warning: null, - }) + case actions.SHOW_CREATE_VAULT: + return extend(appState, { + currentView: { + name: 'createVault', + }, + transForward: true, + warning: null, + }) - // unlock + case actions.SHOW_RESTORE_VAULT: + return extend(appState, { + currentView: { + name: 'restoreVault', + }, + transForward: true, + }) - case actions.UNLOCK_METAMASK: - return extend(appState, { - detailView: {}, - transForward: true, - isLoading: false, - warning: null, - }) - - case actions.LOCK_METAMASK: - return extend(appState, { - currentView: defaultView, - transForward: false, - warning: null, - }) + case actions.SHOW_INIT_MENU: + return extend(appState, { + currentView: defaultView, + transForward: false, + }) - // reveal seed words + case actions.SHOW_CONFIG_PAGE: + return extend(appState, { + currentView: { + name: 'config', + context: appState.currentView.context, + }, + transForward: action.value, + }) - case actions.REVEAL_SEED_CONFIRMATION: - return extend(appState, { - currentView: { - name: 'reveal-seed-conf', - }, - transForward: true, - warning: null, - }) + case actions.SHOW_INFO_PAGE: + return extend(appState, { + currentView: { + name: 'info', + context: appState.currentView.context, + }, + transForward: true, + }) + case actions.CREATE_NEW_VAULT_IN_PROGRESS: + return extend(appState, { + currentView: { + name: 'createVault', + inProgress: true, + }, + transForward: true, + isLoading: true, + }) - // accounts + case actions.SHOW_NEW_VAULT_SEED: + return extend(appState, { + currentView: { + name: 'createVaultComplete', + seedWords: action.value, + }, + transForward: true, + isLoading: false, + }) - case actions.SET_SELECTED_ACCOUNT: - return extend(appState, { - activeAddress: action.value, - }) - - case actions.GO_HOME: - return extend(appState, { - currentView: extend(appState.currentView, { - name: 'accountDetail', - }), - accountDetail: { - subview: 'transactions', - accountExport: 'none', - privateKey: '', - }, - transForward: false, - warning: null, - }) - - case actions.SHOW_ACCOUNT_DETAIL: - return extend(appState, { - currentView: { - name: 'accountDetail', - context: action.value || account, - }, - accountDetail: { - subview: 'transactions', - accountExport: 'none', - privateKey: '', - }, - transForward: false, - }) - - case actions.BACK_TO_ACCOUNT_DETAIL: - return extend(appState, { - currentView: { - name: 'accountDetail', - context: action.value, - }, - accountDetail: { - subview: 'transactions', - accountExport: 'none', - privateKey: '', - }, - transForward: false, - }) - - case actions.SHOW_ACCOUNTS_PAGE: - var seedWords = state.metamask.seedWords - return extend(appState, { - currentView: { - name: seedWords ? 'createVaultComplete' : 'accounts', - seedWords, - }, - transForward: true, - isLoading: false, - warning: null, - scrollToBottom: false, - }) - - case actions.REVEAL_ACCOUNT: - return extend(appState, { - scrollToBottom: true, - }) - - case actions.SHOW_CONF_TX_PAGE: - return extend(appState, { - currentView: { - name: 'confTx', - context: 0, - }, - transForward: true, - warning: null, - }) - - case actions.SHOW_CONF_MSG_PAGE: - return extend(appState, { - currentView: { - name: 'confTx', - context: 0, - }, - transForward: true, - warning: null, - }) - - case actions.COMPLETED_TX: - var unconfTxs = state.metamask.unconfTxs - var unconfMsgs = state.metamask.unconfMsgs - - var unconfTxList = txHelper(unconfTxs, unconfMsgs) - .filter(tx => tx !== tx.id) + case actions.SHOW_SEND_PAGE: + return extend(appState, { + currentView: { + name: 'sendTransaction', + context: appState.currentView.context, + }, + transForward: true, + warning: null, + }) + + // unlock - if (unconfTxList && unconfTxList.length > 0) { + case actions.UNLOCK_METAMASK: return extend(appState, { + detailView: {}, + transForward: true, + isLoading: false, + warning: null, + }) + + case actions.LOCK_METAMASK: + return extend(appState, { + currentView: defaultView, transForward: false, + warning: null, + }) + + // reveal seed words + + case actions.REVEAL_SEED_CONFIRMATION: + return extend(appState, { currentView: { - name: 'confTx', - context: 0, + name: 'reveal-seed-conf', }, + transForward: true, warning: null, }) - } else { + + // accounts + + case actions.SET_SELECTED_ACCOUNT: return extend(appState, { + activeAddress: action.value, + }) + + case actions.GO_HOME: + return extend(appState, { + currentView: extend(appState.currentView, { + name: 'accountDetail', + }), + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, transForward: false, warning: null, + }) + + case actions.SHOW_ACCOUNT_DETAIL: + return extend(appState, { currentView: { name: 'accountDetail', - context: state.metamask.selectedAddress, + context: action.value, }, accountDetail: { subview: 'transactions', + accountExport: 'none', + privateKey: '', }, + transForward: false, }) - } - case actions.NEXT_TX: - return extend(appState, { - transForward: true, - currentView: { - name: 'confTx', - context: ++appState.currentView.context, + case actions.BACK_TO_ACCOUNT_DETAIL: + return extend(appState, { + currentView: { + name: 'accountDetail', + context: action.value, + }, + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + transForward: false, + }) + + case actions.SHOW_ACCOUNTS_PAGE: + return extend(appState, { + currentView: { + name: seedWords ? 'createVaultComplete' : 'accounts', + seedWords, + }, + transForward: true, + isLoading: false, warning: null, - } - }) - - case actions.VIEW_PENDING_TX: - const context = indexForPending(state, action.value) - return extend(appState, { - transForward: true, - currentView: { - name: 'confTx', - context, + scrollToBottom: false, + }) + + case actions.REVEAL_ACCOUNT: + return extend(appState, { + scrollToBottom: true, + }) + + case actions.SHOW_CONF_TX_PAGE: + return extend(appState, { + currentView: { + name: 'confTx', + context: 0, + }, + transForward: true, warning: null, - } - }) - - case actions.PREVIOUS_TX: - return extend(appState, { - transForward: false, - currentView: { - name: 'confTx', - context: --appState.currentView.context, + }) + + case actions.SHOW_CONF_MSG_PAGE: + return extend(appState, { + currentView: { + name: 'confTx', + context: 0, + }, + transForward: true, warning: null, + }) + + case actions.COMPLETED_TX: + var unconfTxs = state.metamask.unconfTxs + var unconfMsgs = state.metamask.unconfMsgs + + var unconfTxList = txHelper(unconfTxs, unconfMsgs) + .filter(tx => tx !== tx.id) + + if (unconfTxList && unconfTxList.length > 0) { + return extend(appState, { + transForward: false, + currentView: { + name: 'confTx', + context: 0, + }, + warning: null, + }) + } else { + return extend(appState, { + transForward: false, + warning: null, + currentView: { + name: 'accountDetail', + context: state.metamask.selectedAddress, + }, + accountDetail: { + subview: 'transactions', + }, + }) } - }) - - case actions.TRANSACTION_ERROR: - return extend(appState, { - currentView: { - name: 'confTx', - errorMessage: 'There was a problem submitting this transaction.', - }, - }) - - case actions.UNLOCK_FAILED: - return extend(appState, { - warning: 'Incorrect password. Try again.' - }) - - case actions.SHOW_LOADING: - return extend(appState, { - isLoading: true, - }) - - case actions.HIDE_LOADING: - return extend(appState, { - isLoading: false, - }) - - case actions.CLEAR_SEED_WORD_CACHE: - return extend(appState, { - transForward: true, - currentView: {}, - isLoading: false, - accountDetail: { - subview: 'transactions', - accountExport: 'none', - privateKey: '', - }, - }) - - case actions.DISPLAY_WARNING: - return extend(appState, { - warning: action.value, - }) - - case actions.HIDE_WARNING: - return extend(appState, { - warning: undefined, - }) - - case actions.REQUEST_ACCOUNT_EXPORT: - return extend(appState, { - transForward: true, - currentView: { - name: 'accountDetail', - context: appState.currentView.context, - }, - accountDetail: { - subview: 'export', - accountExport: 'requested', - }, - }) - - case actions.EXPORT_ACCOUNT: - return extend(appState, { - accountDetail: { - subview: 'export', - accountExport: 'completed', - }, - }) - - case actions.SHOW_PRIVATE_KEY: - return extend(appState, { - accountDetail: { - subview: 'export', - accountExport: 'completed', - privateKey: action.value, - }, - }) - - default: - return appState + + case actions.NEXT_TX: + return extend(appState, { + transForward: true, + currentView: { + name: 'confTx', + context: ++appState.currentView.context, + warning: null, + }, + }) + + case actions.VIEW_PENDING_TX: + const context = indexForPending(state, action.value) + return extend(appState, { + transForward: true, + currentView: { + name: 'confTx', + context, + warning: null, + }, + }) + + case actions.PREVIOUS_TX: + return extend(appState, { + transForward: false, + currentView: { + name: 'confTx', + context: --appState.currentView.context, + warning: null, + }, + }) + + case actions.TRANSACTION_ERROR: + return extend(appState, { + currentView: { + name: 'confTx', + errorMessage: 'There was a problem submitting this transaction.', + }, + }) + + case actions.UNLOCK_FAILED: + return extend(appState, { + warning: 'Incorrect password. Try again.', + }) + + case actions.SHOW_LOADING: + return extend(appState, { + isLoading: true, + }) + + case actions.HIDE_LOADING: + return extend(appState, { + isLoading: false, + }) + + case actions.CLEAR_SEED_WORD_CACHE: + return extend(appState, { + transForward: true, + currentView: {}, + isLoading: false, + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + }) + + case actions.DISPLAY_WARNING: + return extend(appState, { + warning: action.value, + }) + + case actions.HIDE_WARNING: + return extend(appState, { + warning: undefined, + }) + + case actions.REQUEST_ACCOUNT_EXPORT: + return extend(appState, { + transForward: true, + currentView: { + name: 'accountDetail', + context: appState.currentView.context, + }, + accountDetail: { + subview: 'export', + accountExport: 'requested', + }, + }) + + case actions.EXPORT_ACCOUNT: + return extend(appState, { + accountDetail: { + subview: 'export', + accountExport: 'completed', + }, + }) + + case actions.SHOW_PRIVATE_KEY: + return extend(appState, { + accountDetail: { + subview: 'export', + accountExport: 'completed', + privateKey: action.value, + }, + }) + + default: + return appState } } @@ -392,7 +388,7 @@ function hasPendingTxs (state) { return unconfTxList.length > 0 } -function indexForPending(state, txId) { +function indexForPending (state, txId) { var unconfTxs = state.metamask.unconfTxs var unconfMsgs = state.metamask.unconfMsgs var unconfTxList = txHelper(unconfTxs, unconfMsgs) diff --git a/ui/app/reducers/identities.js b/ui/app/reducers/identities.js index 95ecd23f9..341a404e7 100644 --- a/ui/app/reducers/identities.js +++ b/ui/app/reducers/identities.js @@ -1,10 +1,8 @@ const extend = require('xtend') -const actions = require('../actions') module.exports = reduceIdentities -function reduceIdentities(state, action) { - +function reduceIdentities (state, action) { // clone + defaults var idState = extend({ @@ -14,5 +12,4 @@ function reduceIdentities(state, action) { default: return idState } - } diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js index 646100120..f3ef8eb11 100644 --- a/ui/app/reducers/metamask.js +++ b/ui/app/reducers/metamask.js @@ -3,7 +3,8 @@ const actions = require('../actions') module.exports = reduceMetamask -function reduceMetamask(state, action) { +function reduceMetamask (state, action) { + let newState // clone + defaults var metamaskState = extend({ @@ -17,99 +18,99 @@ function reduceMetamask(state, action) { switch (action.type) { - case actions.SHOW_ACCOUNTS_PAGE: - var state = extend(metamaskState) - delete state.seedWords - return state - - case actions.UPDATE_METAMASK_STATE: - return extend(metamaskState, action.value) - - case actions.AGREE_TO_DISCLAIMER: - return extend(metamaskState, { - isConfirmed: true, - }) - - case actions.UNLOCK_METAMASK: - return extend(metamaskState, { - isUnlocked: true, - isInitialized: true, - selectedAccount: action.value, - }) - - case actions.LOCK_METAMASK: - return extend(metamaskState, { - isUnlocked: false, - }) - - case actions.SET_RPC_TARGET: - return extend(metamaskState, { - provider: { - type: 'rpc', - rpcTarget: action.value, - }, - }) - - case actions.SET_PROVIDER_TYPE: - return extend(metamaskState, { - provider: { - type: action.value, - }, - }) - - case actions.COMPLETED_TX: - var stringId = String(action.id) - var newState = extend(metamaskState, { - unconfTxs: {}, - unconfMsgs: {}, - }) - for (var id in metamaskState.unconfTxs) { - if (id !== stringId) { - newState.unconfTxs[id] = metamaskState.unconfTxs[id] + case actions.SHOW_ACCOUNTS_PAGE: + newState = extend(metamaskState) + delete newState.seedWords + return newState + + case actions.UPDATE_METAMASK_STATE: + return extend(metamaskState, action.value) + + case actions.AGREE_TO_DISCLAIMER: + return extend(metamaskState, { + isConfirmed: true, + }) + + case actions.UNLOCK_METAMASK: + return extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAccount: action.value, + }) + + case actions.LOCK_METAMASK: + return extend(metamaskState, { + isUnlocked: false, + }) + + case actions.SET_RPC_TARGET: + return extend(metamaskState, { + provider: { + type: 'rpc', + rpcTarget: action.value, + }, + }) + + case actions.SET_PROVIDER_TYPE: + return extend(metamaskState, { + provider: { + type: action.value, + }, + }) + + case actions.COMPLETED_TX: + var stringId = String(action.id) + newState = extend(metamaskState, { + unconfTxs: {}, + unconfMsgs: {}, + }) + for (const id in metamaskState.unconfTxs) { + if (id !== stringId) { + newState.unconfTxs[id] = metamaskState.unconfTxs[id] + } } - } - for (var id in metamaskState.unconfMsgs) { - if (id !== stringId) { - newState.unconfMsgs[id] = metamaskState.unconfMsgs[id] + for (const id in metamaskState.unconfMsgs) { + if (id !== stringId) { + newState.unconfMsgs[id] = metamaskState.unconfMsgs[id] + } } - } - return newState - - case actions.SHOW_NEW_VAULT_SEED: - return extend(metamaskState, { - isUnlocked: true, - isInitialized: false, - }) - - case actions.CLEAR_SEED_WORD_CACHE: - var newState = extend(metamaskState, { - isUnlocked: true, - isInitialized: true, - selectedAccount: action.value, - }) - delete newState.seedWords - return newState - - case actions.SHOW_ACCOUNT_DETAIL: - const newState = extend(metamaskState, { - isUnlocked: true, - isInitialized: true, - selectedAccount: action.value, - selectedAddress: action.value, - }) - delete newState.seedWords - return newState - - case actions.SAVE_ACCOUNT_LABEL: - const account = action.value.account - const name = action.value.label - var id = {} - id[account] = extend(metamaskState.identities[account], { name }) - var identities = extend(metamaskState.identities, id) - return extend(metamaskState, { identities }) - - default: - return metamaskState + return newState + + case actions.SHOW_NEW_VAULT_SEED: + return extend(metamaskState, { + isUnlocked: true, + isInitialized: false, + }) + + case actions.CLEAR_SEED_WORD_CACHE: + newState = extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAccount: action.value, + }) + delete newState.seedWords + return newState + + case actions.SHOW_ACCOUNT_DETAIL: + newState = extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAccount: action.value, + selectedAddress: action.value, + }) + delete newState.seedWords + return newState + + case actions.SAVE_ACCOUNT_LABEL: + const account = action.value.account + const name = action.value.label + var id = {} + id[account] = extend(metamaskState.identities[account], { name }) + var identities = extend(metamaskState.identities, id) + return extend(metamaskState, { identities }) + + default: + return metamaskState } } diff --git a/ui/app/root.js b/ui/app/root.js index 9fedf625f..9e7314b20 100644 --- a/ui/app/root.js +++ b/ui/app/root.js @@ -1,5 +1,4 @@ const inherits = require('util').inherits -const React = require('react') const Component = require('react').Component const Provider = require('react-redux').Provider const h = require('react-hyperscript') @@ -7,17 +6,16 @@ const App = require('./app') module.exports = Root - inherits(Root, Component) -function Root() { Component.call(this) } +function Root () { Component.call(this) } -Root.prototype.render = function() { +Root.prototype.render = function () { return ( - + h(Provider, { store: this.props.store, }, [ - h(App) + h(App), ]) ) diff --git a/ui/app/send.js b/ui/app/send.js index ba4e5bfff..82c378dd2 100644 --- a/ui/app/send.js +++ b/ui/app/send.js @@ -6,14 +6,13 @@ const Identicon = require('./components/identicon') const actions = require('./actions') const util = require('./util') const numericBalance = require('./util').numericBalance -const formatBalance = require('./util').formatBalance const addressSummary = require('./util').addressSummary const EtherBalance = require('./components/eth-balance') const ethUtil = require('ethereumjs-util') module.exports = connect(mapStateToProps)(SendTransactionScreen) -function mapStateToProps(state) { +function mapStateToProps (state) { var result = { address: state.metamask.selectedAccount, accounts: state.metamask.accounts, @@ -31,11 +30,11 @@ function mapStateToProps(state) { } inherits(SendTransactionScreen, Component) -function SendTransactionScreen() { +function SendTransactionScreen () { Component.call(this) } -SendTransactionScreen.prototype.render = function() { +SendTransactionScreen.prototype.render = function () { var state = this.props var address = state.address var account = state.account @@ -111,7 +110,7 @@ SendTransactionScreen.prototype.render = function() { // h('div', formatBalance(account && account.balance)), h(EtherBalance, { value: account && account.balance, - }) + }), ]), @@ -140,7 +139,7 @@ SendTransactionScreen.prototype.render = function() { h('input.large-input', { name: 'address', placeholder: 'Recipient Address', - }) + }), ]), // 'amount' and send button @@ -160,7 +159,7 @@ SendTransactionScreen.prototype.render = function() { style: { textTransform: 'uppercase', }, - }, 'Send') + }, 'Send'), ]), @@ -187,7 +186,7 @@ SendTransactionScreen.prototype.render = function() { style: { width: '100%', resize: 'none', - } + }, }), ]), @@ -196,31 +195,31 @@ SendTransactionScreen.prototype.render = function() { ) } -SendTransactionScreen.prototype.navigateToAccounts = function(event){ +SendTransactionScreen.prototype.navigateToAccounts = function (event) { event.stopPropagation() this.props.dispatch(actions.showAccountsPage()) } -SendTransactionScreen.prototype.back = function() { +SendTransactionScreen.prototype.back = function () { var address = this.props.address this.props.dispatch(actions.backToAccountDetail(address)) } -SendTransactionScreen.prototype.onSubmit = function() { - +SendTransactionScreen.prototype.onSubmit = function () { const recipient = document.querySelector('input[name="address"]').value const input = document.querySelector('input[name="amount"]').value const value = util.normalizeEthStringToWei(input) const txData = document.querySelector('input[name="txData"]').value const balance = this.props.balance + let message if (value.gt(balance)) { - var message = 'Insufficient funds.' + message = 'Insufficient funds.' return this.props.dispatch(actions.displayWarning(message)) } if ((!util.isValidAddress(recipient) && !txData) || (!recipient && !txData)) { - var message = 'Recipient address is invalid.' + message = 'Recipient address is invalid.' return this.props.dispatch(actions.displayWarning(message)) } diff --git a/ui/app/settings.js b/ui/app/settings.js index 9a11ef680..e56f4ee63 100644 --- a/ui/app/settings.js +++ b/ui/app/settings.js @@ -2,28 +2,20 @@ const inherits = require('util').inherits const Component = require('react').Component const h = require('react-hyperscript') const connect = require('react-redux').connect -const copyToClipboard = require('copy-to-clipboard') const actions = require('./actions') -const AccountPanel = require('./components/account-panel') module.exports = connect(mapStateToProps)(AppSettingsPage) -function mapStateToProps(state) { - return { - identities: state.metamask.identities, - address: state.appState.currentView.context, - } +function mapStateToProps (state) { + return {} } inherits(AppSettingsPage, Component) -function AppSettingsPage() { +function AppSettingsPage () { Component.call(this) } - -AppSettingsPage.prototype.render = function() { - var state = this.props - var identity = state.identities[state.address] +AppSettingsPage.prototype.render = function () { return ( h('.account-detail-section.flex-column.flex-grow', [ @@ -47,23 +39,22 @@ AppSettingsPage.prototype.render = function() { }), ]) - + ) } -AppSettingsPage.prototype.componentDidMount = function(){ +AppSettingsPage.prototype.componentDidMount = function () { document.querySelector('input').focus() } -AppSettingsPage.prototype.onKeyPress = function(event) { +AppSettingsPage.prototype.onKeyPress = function (event) { // get submit event if (event.key === 'Enter') { // this.submitPassword(event) } } - -AppSettingsPage.prototype.navigateToAccounts = function(event){ +AppSettingsPage.prototype.navigateToAccounts = function (event) { event.stopPropagation() this.props.dispatch(actions.showAccountsPage()) } diff --git a/ui/app/store.js b/ui/app/store.js index a738f1a12..ab6422e73 100644 --- a/ui/app/store.js +++ b/ui/app/store.js @@ -6,7 +6,6 @@ const rootReducer = require('./reducers') module.exports = configureStore - const loggerMiddleware = createLogger() const createStoreWithMiddleware = applyMiddleware( @@ -14,6 +13,6 @@ const createStoreWithMiddleware = applyMiddleware( loggerMiddleware )(createStore) -function configureStore(initialState) { +function configureStore (initialState) { return createStoreWithMiddleware(rootReducer, initialState) } diff --git a/ui/app/template.js b/ui/app/template.js index f16f3c363..d15b30fd2 100644 --- a/ui/app/template.js +++ b/ui/app/template.js @@ -2,29 +2,28 @@ const inherits = require('util').inherits const Component = require('react').Component const h = require('react-hyperscript') const connect = require('react-redux').connect -const actions = require('./actions') module.exports = connect(mapStateToProps)(COMPONENTNAME) -function mapStateToProps(state) { +function mapStateToProps (state) { return {} } inherits(COMPONENTNAME, Component) -function COMPONENTNAME() { +function COMPONENTNAME () { Component.call(this) } -COMPONENTNAME.prototype.render = function() { +COMPONENTNAME.prototype.render = function () { const props = this.props return ( h('div', { style: { background: 'blue', - } + }, }, [ - 'Hello, world!' + `Hello, ${props.sender}`, ]) ) } diff --git a/ui/app/unlock.js b/ui/app/unlock.js index 687bb5e52..a7896d640 100644 --- a/ui/app/unlock.js +++ b/ui/app/unlock.js @@ -9,20 +9,19 @@ const EventEmitter = require('events').EventEmitter module.exports = connect(mapStateToProps)(UnlockScreen) - inherits(UnlockScreen, Component) -function UnlockScreen() { +function UnlockScreen () { Component.call(this) this.animationEventEmitter = new EventEmitter() } -function mapStateToProps(state) { +function mapStateToProps (state) { return { warning: state.appState.warning, } } -UnlockScreen.prototype.render = function() { +UnlockScreen.prototype.render = function () { const state = this.props const warning = state.warning return ( @@ -55,7 +54,7 @@ UnlockScreen.prototype.render = function() { h('.error', { style: { display: warning ? 'block' : 'none', - } + }, }, warning), h('button.primary.cursor-pointer', { @@ -70,23 +69,23 @@ UnlockScreen.prototype.render = function() { ) } -UnlockScreen.prototype.componentDidMount = function(){ +UnlockScreen.prototype.componentDidMount = function () { document.getElementById('password-box').focus() } -UnlockScreen.prototype.onSubmit = function(event) { +UnlockScreen.prototype.onSubmit = function (event) { const input = document.getElementById('password-box') const password = input.value this.props.dispatch(actions.tryUnlockMetamask(password)) } -UnlockScreen.prototype.onKeyPress = function(event) { +UnlockScreen.prototype.onKeyPress = function (event) { if (event.key === 'Enter') { this.submitPassword(event) } } -UnlockScreen.prototype.submitPassword = function(event){ +UnlockScreen.prototype.submitPassword = function (event) { var element = event.target var password = element.value // reset input @@ -94,7 +93,7 @@ UnlockScreen.prototype.submitPassword = function(event){ this.props.dispatch(actions.tryUnlockMetamask(password)) } -UnlockScreen.prototype.inputChanged = function(event){ +UnlockScreen.prototype.inputChanged = function (event) { // tell mascot to look at page action var element = event.target var boundingRect = element.getBoundingClientRect() @@ -105,6 +104,6 @@ UnlockScreen.prototype.inputChanged = function(event){ }) } -UnlockScreen.prototype.emitAnim = function(name, a, b, c){ +UnlockScreen.prototype.emitAnim = function (name, a, b, c) { this.animationEventEmitter.emit(name, a, b, c) } diff --git a/ui/app/util.js b/ui/app/util.js index 9e08e0bb2..db12a1282 100644 --- a/ui/app/util.js +++ b/ui/app/util.js @@ -1,17 +1,17 @@ const ethUtil = require('ethereumjs-util') var valueTable = { - wei: '1000000000000000000', - kwei: '1000000000000000', - mwei: '1000000000000', - gwei: '1000000000', + wei: '1000000000000000000', + kwei: '1000000000000000', + mwei: '1000000000000', + gwei: '1000000000', szabo: '1000000', - finney:'1000', + finney: '1000', ether: '1', - kether:'0.001', - mether:'0.000001', - gether:'0.000000001', - tether:'0.000000000001', + kether: '0.001', + mether: '0.000001', + gether: '0.000000001', + tether: '0.000000000001', } var bnTable = {} for (var currency in valueTable) { @@ -37,25 +37,24 @@ module.exports = { bnTable: bnTable, } - -function valuesFor(obj) { +function valuesFor (obj) { if (!obj) return [] return Object.keys(obj) - .map(function(key){ return obj[key] }) + .map(function (key) { return obj[key] }) } -function addressSummary(address) { +function addressSummary (address) { if (!address) return '' var checked = ethUtil.toChecksumAddress(address) - return checked ? checked.slice(0,2+8)+'...'+checked.slice(-4) : '...' + return checked ? checked.slice(0, 2 + 8) + '...' + checked.slice(-4) : '...' } -function isValidAddress(address) { +function isValidAddress (address) { var prefixed = ethUtil.addHexPrefix(address) return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed) } -function isAllOneCase(address) { +function isAllOneCase (address) { if (!address) return true var lower = address.toLowerCase() var upper = address.toUpperCase() @@ -63,81 +62,81 @@ function isAllOneCase(address) { } // Takes wei Hex, returns wei BN, even if input is null -function numericBalance(balance) { +function numericBalance (balance) { if (!balance) return new ethUtil.BN(0, 16) var stripped = ethUtil.stripHexPrefix(balance) return new ethUtil.BN(stripped, 16) } // Takes eth BN, returns BN wei -function ethToWei(bn) { +function ethToWei (bn) { var eth = new ethUtil.BN('1000000000000000000') var wei = bn.mul(eth) return wei } // Takes BN in Wei, returns BN in eth -function weiToEth(bn) { +function weiToEth (bn) { var diff = new ethUtil.BN('1000000000000000000') var eth = bn.div(diff) return eth } // Takes hex, returns [beforeDecimal, afterDecimal] -function parseBalance(balance) { - let beforeDecimal, afterDecimal - let wei = numericBalance(balance).toString() - let trailingZeros = /0+$/ - - beforeDecimal = wei.length > 18 ? wei.slice(0, wei.length - 18) : '0' - afterDecimal = ("000000000000000000" + wei).slice(-18).replace(trailingZeros, "") - if(afterDecimal == ""){afterDecimal = "0" } +function parseBalance (balance) { + var beforeDecimal, afterDecimal + const wei = numericBalance(balance).toString() + const trailingZeros = /0+$/ + + beforeDecimal = wei.length > 18 ? wei.slice(0, wei.length - 18) : '0' + afterDecimal = ('000000000000000000' + wei).slice(-18).replace(trailingZeros, '') + if (afterDecimal === '') { afterDecimal = '0' } return [beforeDecimal, afterDecimal] } // Takes wei hex, returns "None" or "${formattedAmount} ETH" -function formatBalance(balance, decimalsToKeep) { +function formatBalance (balance, decimalsToKeep) { var parsed = parseBalance(balance) var beforeDecimal = parsed[0] var afterDecimal = parsed[1] - var formatted = "None" - if(decimalsToKeep === undefined){ - if(beforeDecimal === '0'){ - if(afterDecimal !== '0'){ - var sigFigs = afterDecimal.match(/^0*(.{2})/) //default: grabs 2 most significant digits - if(sigFigs){afterDecimal = sigFigs[0]} + var formatted = 'None' + if (decimalsToKeep === undefined) { + if (beforeDecimal === '0') { + if (afterDecimal !== '0') { + var sigFigs = afterDecimal.match(/^0*(.{2})/) // default: grabs 2 most significant digits + if (sigFigs) { afterDecimal = sigFigs[0] } formatted = '0.' + afterDecimal + ' ETH' } - }else{ - formatted = beforeDecimal + "." + afterDecimal.slice(0,3) + ' ETH' + } else { + formatted = beforeDecimal + '.' + afterDecimal.slice(0, 3) + ' ETH' } - }else{ - afterDecimal += Array(decimalsToKeep).join("0") - formatted = beforeDecimal + "." + afterDecimal.slice(0,decimalsToKeep) + ' ETH' + } else { + afterDecimal += Array(decimalsToKeep).join('0') + formatted = beforeDecimal + '.' + afterDecimal.slice(0, decimalsToKeep) + ' ETH' } return formatted } -function dataSize(data) { +function dataSize (data) { var size = data ? ethUtil.stripHexPrefix(data).length : 0 - return size+' bytes' + return size + ' bytes' } // Takes a BN and an ethereum currency name, // returns a BN in wei -function normalizeToWei(amount, currency) { +function normalizeToWei (amount, currency) { try { return amount.mul(bnTable.wei).div(bnTable[currency]) } catch (e) {} return amount } -function normalizeEthStringToWei(str) { +function normalizeEthStringToWei (str) { const parts = str.split('.') let eth = new ethUtil.BN(parts[0], 10).mul(bnTable.wei) if (parts[1]) { var decimal = parts[1] - while(decimal.length < 18) { + while (decimal.length < 18) { decimal += '0' } const decimalBN = new ethUtil.BN(decimal, 10) @@ -147,22 +146,22 @@ function normalizeEthStringToWei(str) { } var multiple = new ethUtil.BN('10000', 10) -function normalizeNumberToWei(n, currency) { +function normalizeNumberToWei (n, currency) { var enlarged = n * 10000 var amount = new ethUtil.BN(String(enlarged), 10) return normalizeToWei(amount, currency).div(multiple) } -function readableDate(ms) { +function readableDate (ms) { var date = new Date(ms) var month = date.getMonth() var day = date.getDate() var year = date.getFullYear() var hours = date.getHours() - var minutes = "0" + date.getMinutes() - var seconds = "0" + date.getSeconds() + var minutes = '0' + date.getMinutes() + var seconds = '0' + date.getSeconds() - var date = `${month}/${day}/${year}` + var dateStr = `${month}/${day}/${year}` var time = `${hours}:${minutes.substr(-2)}:${seconds.substr(-2)}` - return `${date} ${time}` + return `${dateStr} ${time}` } @@ -1,25 +1,26 @@ const fs = require('fs') +const path = require('path') module.exports = bundleCss var cssFiles = { - 'fonts.css': fs.readFileSync(__dirname+'/app/css/fonts.css', 'utf8'), - 'reset.css': fs.readFileSync(__dirname+'/app/css/reset.css', 'utf8'), - 'lib.css': fs.readFileSync(__dirname+'/app/css/lib.css', 'utf8'), - 'index.css': fs.readFileSync(__dirname+'/app/css/index.css', 'utf8'), - 'transitions.css': fs.readFileSync(__dirname+'/app/css/transitions.css', 'utf8'), + 'fonts.css': fs.readFileSync(path.join(__dirname, '/app/css/fonts.css'), 'utf8'), + 'reset.css': fs.readFileSync(path.join(__dirname, '/app/css/reset.css'), 'utf8'), + 'lib.css': fs.readFileSync(path.join(__dirname, '/app/css/lib.css'), 'utf8'), + 'index.css': fs.readFileSync(path.join(__dirname, '/app/css/index.css'), 'utf8'), + 'transitions.css': fs.readFileSync(path.join(__dirname, '/app/css/transitions.css'), 'utf8'), } -function bundleCss() { - var cssBundle = Object.keys(cssFiles).reduce(function(bundle, fileName){ +function bundleCss () { + var cssBundle = Object.keys(cssFiles).reduce(function (bundle, fileName) { var fileContent = cssFiles[fileName] var output = String() - output += '/*========== '+fileName+' ==========*/\n\n' + output += '/*========== ' + fileName + ' ==========*/\n\n' output += fileContent output += '\n\n' - return bundle+output + return bundle + output }, String()) return cssBundle diff --git a/ui/example.js b/ui/example.js index b32da4be4..f4126438c 100644 --- a/ui/example.js +++ b/ui/example.js @@ -26,7 +26,7 @@ var identities = { address: '0x333462427bcc9133bb46e88bcbe39cd7ef0e7333', balance: 0.000001, txCount: 1, - } + }, } var unconfTxs = {} @@ -42,7 +42,7 @@ addUnconfTx({ data: '0x000462427bcc9133bb46e88bcbe39cd7ef0e7000', }) -function addUnconfTx(txParams){ +function addUnconfTx (txParams) { var time = (new Date()).getTime() var id = createRandomId() unconfTxs[id] = { @@ -55,7 +55,7 @@ function addUnconfTx(txParams){ var isUnlocked = false var selectedAddress = null -function getState(){ +function getState () { return { isUnlocked: isUnlocked, identities: isUnlocked ? identities : {}, @@ -66,16 +66,16 @@ function getState(){ var accountManager = new EventEmitter() -accountManager.getState = function(cb){ +accountManager.getState = function (cb) { cb(null, getState()) } -accountManager.setLocked = function(){ +accountManager.setLocked = function () { isUnlocked = false this._didUpdate() } -accountManager.submitPassword = function(password, cb){ +accountManager.submitPassword = function (password, cb) { if (password === 'test') { isUnlocked = true cb(null, getState()) @@ -85,17 +85,17 @@ accountManager.submitPassword = function(password, cb){ } } -accountManager.setSelectedAddress = function(address, cb){ +accountManager.setSelectedAddress = function (address, cb) { selectedAddress = address cb(null, getState()) this._didUpdate() } -accountManager.signTransaction = function(txParams, cb){ +accountManager.signTransaction = function (txParams, cb) { alert('signing tx....') } -accountManager._didUpdate = function(){ +accountManager._didUpdate = function () { this.emit('update', getState()) } @@ -106,18 +106,18 @@ var container = document.getElementById('app-content') var css = MetaMaskUiCss() injectCss(css) -var app = MetaMaskUi({ +MetaMaskUi({ container: container, - accountManager: accountManager + accountManager: accountManager, }) // util -function createRandomId(){ +function createRandomId () { // 13 time digits - var datePart = new Date().getTime()*Math.pow(10, 3) + var datePart = new Date().getTime() * Math.pow(10, 3) // 3 random digits - var extraPart = Math.floor(Math.random()*Math.pow(10, 3)) + var extraPart = Math.floor(Math.random() * Math.pow(10, 3)) // 16 digits - return datePart+extraPart -}
\ No newline at end of file + return datePart + extraPart +} diff --git a/ui/index.js b/ui/index.js index d67c6f096..8cf74f6ee 100644 --- a/ui/index.js +++ b/ui/index.js @@ -1,28 +1,23 @@ -const React = require('react') const render = require('react-dom').render const h = require('react-hyperscript') -const extend = require('xtend') const Root = require('./app/root') const actions = require('./app/actions') const configureStore = require('./app/store') module.exports = launchApp -function launchApp(opts) { - +function launchApp (opts) { var accountManager = opts.accountManager actions._setAccountManager(accountManager) // check if we are unlocked first - accountManager.getState(function(err, metamaskState){ + accountManager.getState(function (err, metamaskState) { if (err) throw err startApp(metamaskState, accountManager, opts) }) - } -function startApp(metamaskState, accountManager, opts){ - +function startApp (metamaskState, accountManager, opts) { // parse opts var store = configureStore({ @@ -43,12 +38,7 @@ function startApp(metamaskState, accountManager, opts){ store.dispatch(actions.showConfTxPage()) } - // if unconfirmed messages, start on msgConf page - if (Object.keys(metamaskState.unconfMsgs || {}).length) { - store.dispatch(actions.showConfTxPage()) - } - - accountManager.on('update', function(metamaskState){ + accountManager.on('update', function (metamaskState) { store.dispatch(actions.updateMetamaskState(metamaskState)) }) @@ -59,5 +49,4 @@ function startApp(metamaskState, accountManager, opts){ store: store, } ), opts.container) - } diff --git a/ui/lib/explorer-link.js b/ui/lib/explorer-link.js index 92b3376fa..2993d1cf1 100644 --- a/ui/lib/explorer-link.js +++ b/ui/lib/explorer-link.js @@ -1,4 +1,4 @@ -module.exports = function(hash, network) { +module.exports = function (hash, network) { const net = parseInt(network) let prefix switch (net) { diff --git a/ui/lib/icon-factory.js b/ui/lib/icon-factory.js index 1b1df9490..1f7cca859 100644 --- a/ui/lib/icon-factory.js +++ b/ui/lib/icon-factory.js @@ -1,18 +1,18 @@ var iconFactory -module.exports = function(jazzicon) { +module.exports = function (jazzicon) { if (!iconFactory) { iconFactory = new IconFactory(jazzicon) } return iconFactory } -function IconFactory(jazzicon) { +function IconFactory (jazzicon) { this.jazzicon = jazzicon this.cache = {} } -IconFactory.prototype.iconForAddress = function(address, diameter) { +IconFactory.prototype.iconForAddress = function (address, diameter) { if (this.isCached(address, diameter)) { return this.cache[address][diameter] } @@ -22,30 +22,31 @@ IconFactory.prototype.iconForAddress = function(address, diameter) { return dataUri } -IconFactory.prototype.generateNewUri = function(address, diameter) { +IconFactory.prototype.generateNewUri = function (address, diameter) { var numericRepresentation = jsNumberForAddress(address) var identicon = this.jazzicon(diameter, numericRepresentation) var identiconSrc = identicon.innerHTML - var dataUri = 'data:image/svg+xml;charset=utf-8,'+encodeURIComponent(identiconSrc) + var dataUri = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(identiconSrc) return dataUri } -IconFactory.prototype.cacheIcon = function(address, diameter, icon) { +IconFactory.prototype.cacheIcon = function (address, diameter, icon) { if (!(address in this.cache)) { var sizeCache = {} sizeCache[diameter] = icon - return this.cache[address] = sizeCache - + this.cache[address] = sizeCache + return sizeCache } else { - return this.cache[address][diameter] = icon + this.cache[address][diameter] = icon + return icon } } -IconFactory.prototype.isCached = function(address, diameter) { +IconFactory.prototype.isCached = function (address, diameter) { return address in this.cache && diameter in this.cache[address] } -function jsNumberForAddress(address) { +function jsNumberForAddress (address) { var addr = address.slice(2, 10) var seed = parseInt(addr, 16) return seed diff --git a/ui/lib/tx-helper.js b/ui/lib/tx-helper.js index 49845b01a..8f15cd3cc 100644 --- a/ui/lib/tx-helper.js +++ b/ui/lib/tx-helper.js @@ -1,6 +1,6 @@ const valuesFor = require('../app/util').valuesFor -module.exports = function(unconfTxs, unconfMsgs) { +module.exports = function (unconfTxs, unconfMsgs) { var txValues = valuesFor(unconfTxs) var msgValues = valuesFor(unconfMsgs) var allValues = txValues.concat(msgValues) |