diff --git a/.eslintrc.yml b/.eslintrc.yml index b0d68de7d..59576da16 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -7,7 +7,6 @@ settings: import/core-modules: ## don't lint for these missing packages in package.json - electron ## 'electron' is only needed as devDependency / global installation - rules: # "off" or 0 - turn the rule off # "warn" or 1 - turn the rule on as a warning (doesn’t affect exit code) @@ -22,7 +21,13 @@ rules: no-underscore-dangle: off comma-dangle: - error - - only-multiline + - only-multiline ## no comma after last item if one line, though allow comma if multiline + import/no-extraneous-dependencies: ## checks if required modules are missing in packages.json + - error + - devDependencies: ## declares files, whose imports belong to devDependencies + - "**/scripts/build-dist.js" + - "**/tests/_base.js" + - "**/*.test.js" globals: # don't warn about missing declarations i18n: true diff --git a/.mention-bot b/.mention-bot index 829792b61..4e426ab8a 100644 --- a/.mention-bot +++ b/.mention-bot @@ -1,4 +1,5 @@ { + "actions": ["labeled"], "withLabel": "please review", "maxReviewers": 3, "numFilesToCheck": 5, diff --git a/.travis.yml b/.travis.yml index abfda8b8d..9b471516c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,40 +1,89 @@ -sudo: required -dist: trusty - language: node_js -node_js: 6 - -cache: - yarn: true +sudo: required branches: only: - develop + - master + +matrix: + include: + + # WINDOWS cross-built from linux + - os: linux + dist: trusty + node_js: 6 + env: + - GULP_PLATFORM=win + addons: + apt: + packages: + - icnsutils + - graphicsmagick + - xz-utils + - nsis + sources: + - mono + before_install: + - sudo dpkg --add-architecture i386 && sudo add-apt-repository ppa:ubuntu-wine/ppa -y + - sudo apt-get update -q + - sudo apt-get install --no-install-recommends -y mono-devel ca-certificates-mono wine1.8 + after_script: + - makensis -V2 scripts/windows-installer.nsi + -addons: - apt: - packages: - - icnsutils - - graphicsmagick - - xz-utils - - gcc-multilib - - g++-multilib - -before_script: - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start - - curl https://install.meteor.com/ | sh - - npm install -g meteor-build-client + # LINUX + - os: linux + dist: trusty + node_js: 6 + env: + - GULP_PLATFORM=linux + addons: + apt: + packages: + - icnsutils + - graphicsmagick + - xz-utils + - gcc-multilib + - g++-multilib + + # MAC + - os: osx + osx_image: xcode8 # currently xcode8.1+ doesn't support electron-builder macOS code-signing (https://github.com/electron-userland/electron-builder/issues/820#issuecomment-267777060) + node_js: 6 + env: + - GULP_PLATFORM=mac + before_install: + - npm install -g yarn # macOS xcode8 image doesn't natively support yarn yet + + allow_failures: + - os: osx + + fast_finish: true + +cache: + yarn: true + +install: + - PATH=$PATH:$HOME/.meteor && curl -L https://raw.githubusercontent.com/arunoda/travis-ci-meteor-packages/master/configure.sh | /bin/sh + - yarn global add gulp-cli meteor-build-client + - yarn script: - - npm run ci + - if [[ $TRAVIS_BRANCH != "master" ]]; then unset CSC_LINK CSC_KEY_PASSWORD; fi # disable macOS code-signing (production certificate) on develop branch + - travis_wait 60 gulp mist --platform $GULP_PLATFORM + - if [[ $TRAVIS_BRANCH == "master" ]]; then travis_wait 60 gulp wallet --platform $GULP_PLATFORM; fi # also build wallet if on master branch + - if [[ $TRAVIS_OS_NAME == "linux" ]]; then export DISPLAY=:99.0; sh -e /etc/init.d/xvfb start; sleep 3; fi + - if [[ $GULP_PLATFORM != "win" ]]; then gulp test-mist; fi + +after_success: + - gulp mist-checksums --platform $GULP_PLATFORM + - if [[ $TRAVIS_BRANCH == "master" ]]; then gulp wallet-checksums --platform $GULP_PLATFORM; fi notifications: - email: - - EMAIL webhooks: urls: - - YOUR_WEBHOOK_URL - on_success: change # options: [always|never|change] default: always + - https://webhooks.gitter.im/e/33972d9e627a142c57a6 + on_success: change on_failure: always on_start: never diff --git a/README.md b/README.md index 1ca1bb7bc..d7a10ebf3 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ To run mist in development you need [Node.js NPM](https://nodejs.org) and [Meteo $ npm install -g electron@1.3.13 $ npm install -g gulp -And some futher tools to help with downloading and unzipping client nodes: +And some further tools to help with downloading and unzipping client nodes: _Linux:_ @@ -154,7 +154,7 @@ Mist normally. To create a binaries you need to install [`electron-builder` dependencies](https://github.com/electron-userland/electron-builder/wiki/Multi-Platform-Build#macos): // tools for the windows binaries - $ brew install wine --without-x11 mono + $ brew install wine --without-x11 mono makensis // tools for the Linux binaries $ brew install gnu-tar libicns graphicsmagick xz // general dependencies @@ -223,3 +223,11 @@ It expects installer/zip files to be in the generated folders e.g. `dist_mist/re ### Code signing for production **As of [#972](https://github.com/ethereum/mist/pull/972) we've updated the build process and thus need to redo code-signing.** + + +## Testing + +First make sure to build Mist with: +`gulp mist --platform [mac,linux]` or `gulp wallet --platform [mac,linux]`. + +Then run `gulp test-mist` or `gulp test-wallet`, accordingly. diff --git a/customProtocols.js b/customProtocols.js index b0b9fb2af..05fd52ef0 100644 --- a/customProtocols.js +++ b/customProtocols.js @@ -1,6 +1,4 @@ -const electron = require('electron'); -const protocol = electron.protocol; -const path = require('path'); +const { protocol } = require('electron'); protocol.registerHttpProtocol('mist', (request, callback) => { @@ -19,8 +17,9 @@ protocol.registerHttpProtocol('mist', (request, callback) => { callback(call); }, (error) => { - if (error) - { console.error('Failed to register protocol'); } + if (error) { + console.error('Failed to register protocol'); + } }); diff --git a/errorPages/400.html b/errorPages/400.html index 06d5acc2d..e4ceb706d 100644 --- a/errorPages/400.html +++ b/errorPages/400.html @@ -7,7 +7,7 @@ background-color: #f0f0f0; color: #ACACAC; text-shadow: 0 -1px #fff; - font: 20px Helvetica Neue, Arial; + font: 20px Source Sans Pro, Helvetica Neue, Arial; font-weight: 200; text-align: center; padding: 10px; diff --git a/errorPages/404.html b/errorPages/404.html new file mode 100644 index 000000000..c0eafb982 --- /dev/null +++ b/errorPages/404.html @@ -0,0 +1,19 @@ + + + Error 404 + + + + ﴾๏๏﴿

+ URL not found. + + \ No newline at end of file diff --git a/errorPages/500.html b/errorPages/500.html new file mode 100644 index 000000000..57aee2e60 --- /dev/null +++ b/errorPages/500.html @@ -0,0 +1,19 @@ + + + Error 500 + + + + (ノಠ益ಠ)ノ

+ Oops.. Something went wrong! + + \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index fe3b4efd2..5996b0197 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -21,6 +21,8 @@ const mocha = require('gulp-spawn-mocha'); const minimist = require('minimist'); const fs = require('fs'); const got = require('got'); +const Q = require('bluebird'); +const githubUpload = Q.promisify(require('gh-release-assets')); const options = minimist(process.argv.slice(2), { string: ['platform', 'walletSource'], @@ -55,8 +57,6 @@ const osArchList = [ console.log('You can select a platform like: --platform '); - -console.log('App type:', type); console.log('Mist version:', version); console.log('Electron version:', electronVersion); @@ -110,8 +110,10 @@ gulp.task('copy-app-source-files', ['clean:dist'], () => { './*.js', './clientBinaries.json', '!gulpfile.js', - ], { base: './' }) - .pipe(gulp.dest(`./dist_${type}/app`)); + ], { + base: './' + }) + .pipe(gulp.dest(`./dist_${type}/app`)); }); @@ -134,9 +136,11 @@ gulp.task('copy-build-folder-files', ['clean:dist', 'copy-app-folder-files'], () return gulp.src([ `./icons/${type}/*`, './interface/public/images/dmg-background.jpg', - ], { base: './' }) - .pipe(flatten()) - .pipe(gulp.dest(`./dist_${type}/build`)); + ], { + base: './' + }) + .pipe(flatten()) + .pipe(gulp.dest(`./dist_${type}/build`)); }); @@ -149,7 +153,7 @@ gulp.task('copy-node-folder-files', ['clean:dist'], () => { streams.push(gulp.src([ `./nodes/eth/${osArch}/*`, ]) - .pipe(gulp.dest(`./dist_${type}/app/nodes/eth/${osArch}`))); + .pipe(gulp.dest(`./dist_${type}/app/nodes/eth/${osArch}`))); } }); @@ -188,7 +192,7 @@ gulp.task('bundling-interface', ['switch-production'], (cb) => { if (options.walletSource === 'local') { console.log('Use local wallet at ../meteor-dapp-wallet/app'); exec(`cd interface/ && meteor-build-client ../dist_${type}/app/interface/ -p "" &&` + - `cd ../../meteor-dapp-wallet/app && meteor-build-client ../../mist/dist_${type}/app/interface/wallet -p ""`, (err, stdout) => { + `cd ../../meteor-dapp-wallet/app && meteor-build-client ../../mist/dist_${type}/app/interface/wallet -p ""`, (err, stdout) => { console.log(stdout); cb(err); @@ -196,7 +200,7 @@ gulp.task('bundling-interface', ['switch-production'], (cb) => { } else { console.log(`Pulling https://github.com/ethereum/meteor-dapp-wallet/tree/${options.walletSource} "${options.walletSource}" branch...`); exec(`cd interface/ && meteor-build-client ../dist_${type}/app/interface/ -p "" &&` + - `cd ../dist_${type}/ && git clone --depth 1 https://github.com/ethereum/meteor-dapp-wallet.git && cd meteor-dapp-wallet/app && meteor-build-client ../../app/interface/wallet -p "" && cd ../../ && rm -rf meteor-dapp-wallet`, (err, stdout) => { + `cd ../dist_${type}/ && git clone --depth 1 https://github.com/ethereum/meteor-dapp-wallet.git && cd meteor-dapp-wallet/app && meteor-build-client ../../app/interface/wallet -p "" && cd ../../ && rm -rf meteor-dapp-wallet`, (err, stdout) => { console.log(stdout); cb(err); @@ -211,12 +215,14 @@ gulp.task('copy-i18n', ['bundling-interface'], () => { return gulp.src([ './interface/i18n/*.*', './interface/project-tap.i18n', - ], { base: './' }) - .pipe(gulp.dest(`./dist_${type}/app`)); + ], { + base: './' + }) + .pipe(gulp.dest(`./dist_${type}/app`)); }); -gulp.task('build-dist', ['download-signatures', 'copy-i18n'], (cb) => { +gulp.task('build-dist', ['copy-i18n'], (cb) => { console.log('Bundling platforms: ', options.platform); const appPackageJson = _.extend({}, packJson, { @@ -225,7 +231,7 @@ gulp.task('build-dist', ['download-signatures', 'copy-i18n'], (cb) => { description: applicationName, homepage: 'https://github.com/ethereum/mist', build: { - appId: `com.ethereum.mist.${type}`, + appId: `com.ethereum.${type}`, category: 'public.app-category.productivity', asar: true, files: [ @@ -234,7 +240,7 @@ gulp.task('build-dist', ['download-signatures', 'copy-i18n'], (cb) => { 'build-dist.js', ], extraFiles: [ - 'nodes/eth/${os}-${arch}', // eslint-disable-line no-template-curly-in-string + 'nodes/eth/${os}-${arch}', // eslint-disable-line no-template-curly-in-string ], linux: { target: [ @@ -250,7 +256,7 @@ gulp.task('build-dist', ['download-signatures', 'copy-i18n'], (cb) => { }, dmg: { background: '../build/dmg-background.jpg', - 'icon-size': 128, + iconSize: 128, contents: [{ x: 441, y: 448, @@ -261,7 +267,8 @@ gulp.task('build-dist', ['download-signatures', 'copy-i18n'], (cb) => { x: 441, y: 142, type: 'file', - }], + } + ], }, }, directories: { @@ -320,13 +327,11 @@ gulp.task('release-dist', ['build-dist'], (done) => { _.each(osArchList, (osArch) => { if (platformIsActive(osArch)) { - switch (osArch) { // eslint-disable-line default-case + switch (osArch) { // eslint-disable-line default-case case 'win-ia32': - // cp(path.join('win-ia32', `${applicationName} Setup ${version}-ia32.exe`), `${appNameHypen}-win32-${versionDashed}.exe`); cp(`${applicationName}-${version}-ia32-win.zip`, `${appNameHypen}-win32-${versionDashed}.zip`); break; case 'win-x64': - // cp(path.join('win', `${applicationName} Setup ${version}.exe`), `${appNameHypen}-win64-${versionDashed}.exe`); cp(`${applicationName}-${version}-win.zip`, `${appNameHypen}-win64-${versionDashed}.zip`); break; case 'mac-x64': @@ -342,11 +347,53 @@ gulp.task('release-dist', ['build-dist'], (done) => { break; } } + + if (platformIsActive('win') && type === 'mist') { + runSeq('build-nsis'); + } }); done(); }); +gulp.task('upload-binaries', () => { + // token must be set using travis' ENVs + const GITHUB_TOKEN = process.env.GITHUB_TOKEN; + + // query github releases + return got(`https://api.github.com/repos/ethereum/mist/releases?access_token=${GITHUB_TOKEN}`, { + json: true, + }) + // filter draft with current version's tag + .then((res) => { + const draft = res.body[_.indexOf(_.pluck(res.body, 'tag_name'), `v${version}`)]; + + if (draft === undefined) throw new Error(`Couldn't find github release draft for v${version} release tag`); + + return draft; + }) + // upload binaries from release folders + .then((draft) => { + const dir = `dist_${type}/release`; + const files = fs.readdirSync(dir); + const filePaths = _.map(files, (file) => { return path.join(dir, file); }); + + // check if draft already contains target binaries + const existingAssets = _.intersection(files, _.pluck(draft.assets, 'name')); + if (!_.isEmpty(existingAssets)) throw new Error(`Github release draft already contains assets (${existingAssets}); will not upload, please remove and trigger rebuild`); + + return githubUpload({ + url: `https://uploads.github.com/repos/ethereum/mist/releases/${draft.id}/assets{?name}`, + token: [GITHUB_TOKEN], + assets: filePaths, + }).then((res) => { + console.log(`Successfully uploaded ${res} to v${version} release draft.`); + }); + }) + .catch((err) => { + console.log(err); + }); +}); gulp.task('get-release-checksums', (done) => { const releasePath = `./dist_${type}/release`; @@ -354,7 +401,9 @@ gulp.task('get-release-checksums', (done) => { const files = fs.readdirSync(releasePath); for (const file of files) { - const sha = shell.exec(`shasum -a 256 "${file}"`, { cwd: releasePath }); + const sha = shell.exec(`shasum -a 256 "${file}"`, { + cwd: releasePath + }); if (sha.code !== 0) { return done(new Error(`Error executing shasum: ${sha.stderr}`)); @@ -388,9 +437,11 @@ gulp.task('download-signatures', (cb) => { .catch(cb); }); -gulp.task('taskQueue', [ - 'release-dist', -]); +gulp.task('taskQueue', ['release-dist'], (cb) => { + if (process.env.TRAVIS_BRANCH === 'master') { + runSeq('upload-binaries', cb); + } +}); // MIST task gulp.task('mist', (cb) => { @@ -410,16 +461,31 @@ gulp.task('wallet-checksums', (cb) => { runSeq('set-variables-wallet', 'get-release-checksums', cb); }); +gulp.task('build-nsis', (cb) => { + const versionParts = version.split('.'); + const versionString = `-DVERSIONMAJOR=${versionParts[0]} -DVERSIONMINOR=${versionParts[1]} -DVERSIONBUILD=${versionParts[2]}`; + const cmdString = `makensis -V3 ${versionString} scripts/windows-installer.nsi`; + console.log(cmdString); + shell.exec(cmdString, cb); +}); -gulp.task('test-wallet', () => { + +const testApp = (app) => { return gulp.src([ - './tests/wallet/*.test.js', - ]) - .pipe(mocha({ + `./tests/${app}/*.test.js`, + ]).pipe(mocha({ timeout: 60000, ui: 'exports', reporter: 'spec', })); +}; + +gulp.task('test-wallet', () => { + testApp('wallet'); +}); + +gulp.task('test-mist', () => { + testApp('mist'); }); diff --git a/interface/client/collections.js b/interface/client/collections.js index 209f19737..b8545051f 100644 --- a/interface/client/collections.js +++ b/interface/client/collections.js @@ -4,7 +4,6 @@ */ - // BROWSER RELATED // Contains the accounts Tabs = new Mongo.Collection('tabs', {connection: null}); diff --git a/interface/client/lib/helpers/helperFunctions.js b/interface/client/lib/helpers/helperFunctions.js index 2133045c9..bb6dbb32e 100644 --- a/interface/client/lib/helpers/helperFunctions.js +++ b/interface/client/lib/helpers/helperFunctions.js @@ -116,9 +116,14 @@ Helpers.generateBreadcrumb = function (url) { filteredUrl = { protocol: Blaze._escape(url.protocol), host: Blaze._escape(url.host), - pathname: Blaze._escape(url.pathname) + pathname: Blaze._escape(url.pathname), + search: Blaze._escape(url.search), + hash: Blaze._escape(url.hash) }; + filteredUrl.pathname += filteredUrl.search.replace(/\?/g, '/'); + filteredUrl.pathname += filteredUrl.hash.replace(/#/g, '/'); + pathname = _.reject(filteredUrl.pathname.replace(/\/$/g, '').split('/'), function (el) { return el === ''; }); diff --git a/interface/client/lib/signatures.js b/interface/client/lib/signatures.js index d5371bba5..30234c664 100644 --- a/interface/client/lib/signatures.js +++ b/interface/client/lib/signatures.js @@ -10015,5 +10015,176 @@ window.SIGNATURES = { ], "0x38bbfa50": [ "__callback(bytes32,string,bytes)" + ], + "0xbc08afd9": [ + "WebOfTrustToken(address,uint256)" + ], + "0xa5bfa9a9": [ + "claimToken(bytes32)" + ], + "0x5669c94f": [ + "issueToken(address,string)" + ], + "0xcdcd77c0": [ + "baz(uint32,bool)" + ], + "0x0b811cb6": [ + "executeProposal(uint256,bytes32)" + ], + "0x1f5d0b4c": [ + "address(address,address,uint256)" + ], + "0x8ac0ca36": [ + "buyViaJohan()" + ], + "0xc1246d39": [ + "simulatePathwayFromBeneficiary()" + ], + "0x59e148fc": [ + "getLastOfferId()" + ], + "0x152583de": [ + "getAttributes()" + ], + "0x446d5aa4": [ + "getAttributes(address)" + ], + "0x88782386": [ + "UnicornMilk()" + ], + "0x13df7091": [ + "mintAll(int256)" + ], + "0xfa9acb05": [ + "addressInArray(address,address)" + ], + "0xb76e4890": [ + "Tester()" + ], + "0x0d2560ee": [ + "addMe()" + ], + "0x8894dd2b": [ + "addEther()" + ], + "0x1e9ea66a": [ + "balanceEther10000000(uint256)" + ], + "0xe5bf93b9": [ + "balanceEther(uint256)" + ], + "0xcd9f05b8": [ + "balanceEtherAddress(address)" + ], + "0xfd7ac203": [ + "TestToken()" + ], + "0x35b09a6e": [ + "someFunction()" + ], + "0x8f2c44a2": [ + "UnicornMilker()" + ], + "0xc26aa3c9": [ + "lockUnicorn(uint256)" + ], + "0xff556ecb": [ + "releaseUnicorn(uint256)" + ], + "0x27e8c2d8": [ + "burnUnicornShares()" + ], + "0xfff3c457": [ + "readMessages(uint256)" + ], + "0x6a226a49": [ + "addMessage(string)" + ], + "0x200ebe34": [ + "addTokensToGive(address)" + ], + "0x7a427d98": [ + "forceReturn()" + ], + "0xe53e04a5": [ + "refillGas()" + ], + "0x323082d7": [ + "Vote(string)" + ], + "0x90cf581c": [ + "voteYes()" + ], + "0x41c12a70": [ + "voteNo()" + ], + "0x49aa4ee2": [ + "removeVote()" + ], + "0xa48bdb7c": [ + "results()" + ], + "0x9832ee65": [ + "resultsWeightedByTokens()" + ], + "0x9dcb5c65": [ + "resultsWeightedByEther()" + ], + "0x49407a44": [ + "claimEther(uint256)" + ], + "0x509f8633": [ + "create_account()" + ], + "0x32fefb4c": [ + "add_account(address,address)" + ], + "0x9b5adea2": [ + "setMinter()" + ], + "0x0ecaea73": [ + "create(address,uint256)" + ], + "0xa24835d1": [ + "destroy(address,uint256)" + ], + "0x36f66528": [ + "EtherDelta(address,uint256,uint256)" + ], + "0x338b5dea": [ + "depositToken(address,uint256)" + ], + "0x9e281a98": [ + "withdrawToken(address,uint256)" + ], + "0xf7888aec": [ + "balanceOf(address,address)" + ], + "0x93f0bb51": [ + "order(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)" + ], + "0x0a19b14a": [ + "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)" + ], + "0x6c86888b": [ + "testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)" + ], + "0xfb6e155f": [ + "availableVolume(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)" + ], + "0xbb8be064": [ + "HardwareToken()" + ], + "0x57a373a1": [ + "uintInArray(uint256,uint256,int256,uint256[],uint256)" + ], + "0x32afa2f9": [ + "claimEtherOwner(uint256)" + ], + "0xa2a8336f": [ + "claimEtherSigner(uint256)" + ], + "0x4e077f2a": [ + "addGasEther()" ] -}; +}; \ No newline at end of file diff --git a/interface/client/styles/networkIndicator.import.less b/interface/client/styles/networkIndicator.import.less index c46672228..0cc4165a0 100644 --- a/interface/client/styles/networkIndicator.import.less +++ b/interface/client/styles/networkIndicator.import.less @@ -1,3 +1,4 @@ +// Applies to both onboarding and splash screen .network-indicator { position: absolute; top: 10px; @@ -9,8 +10,10 @@ opacity: 0.8; color: @colorGrey; text-transform: uppercase; +} - .unknown { +// Applies only to the splash screen +.splash-screen .network-indicator .unknown { position: absolute; top: 155px; text-align: center; @@ -21,5 +24,4 @@ font-weight: normal; text-transform: none; color: #fff; - } -} +} \ No newline at end of file diff --git a/interface/client/styles/popupWindows.import.less b/interface/client/styles/popupWindows.import.less index f8f9e23b3..f2685de8f 100644 --- a/interface/client/styles/popupWindows.import.less +++ b/interface/client/styles/popupWindows.import.less @@ -63,10 +63,10 @@ right: 0; padding: 0 @gridHeight; padding-top: @gridHeight * 3; - background: linear-gradient(transparent 0%, @colorGrayLight 20%); + background: linear-gradient(transparent 0%, @colorGrayLight 35%); &.dapp-small { - background: linear-gradient(transparent 50%, @colorGrayLight 70%); + background: linear-gradient(transparent 50%, @colorGrayLight 70%); } } @@ -75,7 +75,7 @@ font-weight: 600; } - &.update-available { + &.update-available { -webkit-user-select: all; .text { @@ -183,7 +183,7 @@ } } - // Parameters + // Parameters .fees, .parameters { font-size: 0.9em; @@ -216,7 +216,7 @@ &:hover strong { word-break: break-all; } - + } .type { text-align: right; @@ -230,9 +230,9 @@ } ::selection { - color: #FFF; + color: #FFF; background: @colorLink; - } + } } ol li::before { @@ -574,7 +574,7 @@ } .data { font-size: 0.9em; - + pre { margin: 0 -@defaultMargin; overflow: auto; diff --git a/interface/client/templates/popupWindows/onboardingScreen.html b/interface/client/templates/popupWindows/onboardingScreen.html index 4774ffbab..e7f415eba 100644 --- a/interface/client/templates/popupWindows/onboardingScreen.html +++ b/interface/client/templates/popupWindows/onboardingScreen.html @@ -3,15 +3,15 @@ {{> elements_networkIndicator}} -
+

{{i18n "mist.popupWindows.onboarding.description"}}

-

- +

+ {{i18n "mist.popupWindows.onboarding.goToTestnetDescription"}}

-

- +

+ {{i18n "mist.popupWindows.onboarding.gotoMainnetDescription"}}

@@ -20,8 +20,8 @@ {{> popupWindows_onboardingScreen_importAccount}}
@@ -66,8 +66,8 @@
{{{i18n "mist.popupWindows.onboarding.viaShapeshift"}}}
{{/if}}
@@ -79,8 +79,8 @@

{{i18n "mist.popupWindows.onboarding.learnIt"}}

@@ -90,10 +90,10 @@

{{i18n "mist.popupWindows.onboarding.learnIt"}}

{{{i18n "mist.popupWindows.onboarding.tutorial2Description"}}}

{{i18n "mist.popupWindows.onboarding.buttons.learnReceipt"}}

-
+
@@ -105,7 +105,7 @@

{{i18n "mist.popupWindows.onboarding.learnIt"}}

@@ -114,28 +114,25 @@

{{i18n "mist.popupWindows.onboarding.learnIt"}}

- {{#with TemplateVar.get "syncing"}} -
{{i18n "mist.popupWindows.onboarding.downloadingBlocks"}} ({{TemplateVar.get "peerCount"}} {{i18n 'mist.nodeInfo.peers'}})
-
- - {{ syncStatus }} - -
+ {{syncStatus}} + {{#if TemplateVar.get 'readyToLaunch'}} + {{else}} - {{#if TemplateVar.get 'readyToLaunch'}} - + {{#with TemplateVar.get "syncing"}} +
{{i18n "mist.popupWindows.onboarding.downloadingBlocks"}} ({{TemplateVar.get "peerCount"}} {{i18n 'mist.nodeInfo.peers'}})
+
{{syncStatusMessage}}
{{else}}
{{#if TemplateVar.get "peerCount"}} - {{TemplateVar.get "peerCount"}} {{i18n 'mist.nodeInfo.peers'}} + {{i18n 'mist.startScreen.nodeSyncFoundPeers' peers=(TemplateVar.get 'peerCount')}} {{else}} {{i18n 'mist.startScreen.nodeSyncConnecting'}} {{/if}}
- {{/if}} - {{/with}} + {{/with}} + {{/if}} - + @@ -151,14 +148,14 @@

{{i18n "mist.popupWindows.onboarding.doYouHaveAWalletFile"}}

{{i18n "mist.popupWindows.onboarding.importing"}}

{{else}} -
- -

- - -

- -
+
+ +

+ + +

+ +
{{/if}} {{else}} @@ -187,11 +184,11 @@

{{i18n "mist.popupWindows.onboar diff --git a/interface/client/templates/popupWindows/onboardingScreen.js b/interface/client/templates/popupWindows/onboardingScreen.js index 93d955790..35ba0b732 100644 --- a/interface/client/templates/popupWindows/onboardingScreen.js +++ b/interface/client/templates/popupWindows/onboardingScreen.js @@ -38,12 +38,12 @@ Template['popupWindows_onboardingScreen'].onCreated(function(){ if(syncing === true) { web3.reset(true); - } else if(_.isObject(syncing)) { // loads syncing data and adds it to old by using 'extend' var oldData = TemplateVar.get(template, 'syncing'); + TemplateVar.set(template, 'syncing', _.extend(oldData||{}, syncing||{})); - + } else { TemplateVar.set(template, 'syncing', false); } @@ -78,7 +78,7 @@ Template['popupWindows_onboardingScreen'].helpers({ return (account) ? account.toLowerCase() : ''; }, /** - Updates the Sync Message live + Updates the Sync Data @method syncStatus */ @@ -86,42 +86,61 @@ Template['popupWindows_onboardingScreen'].helpers({ // This functions loops trhough numbers while waiting for the node to respond var template = Template.instance(); + Meteor.clearInterval(template._intervalId); // Create an interval to quickly iterate trough the numbers template._intervalId = Meteor.setInterval(function(){ // load the sync information - var syncing = TemplateVar.get(template, 'syncing'); - - // Calculates a block t display that is always getting 1% closer to target - syncing._displayBlock = (syncing._displayBlock + (syncing.currentBlock - syncing._displayBlock) / 100 )|| syncing.currentBlock; + var syncing = TemplateVar.get(template, 'syncing'); - syncing._displayStatesDownload = Number(syncing._displayStatesDownload + (syncing.pulledStates/syncing.knownStates - syncing._displayStatesDownload) / 100 ) || syncing.pulledStates/syncing.knownStates; + if (syncing) { + // If it's syncing, then it's not ready + TemplateVar.set(template, 'readyToLaunch', false); + // Calculates a block t display that is always getting a few % closer to target + syncing._displayBlock = (syncing._displayBlock + 2*(syncing.currentBlock - syncing._displayBlock) / 100 ) || Number(syncing.startingBlock); - // Calculates progress - syncing.progress = Math.round(((syncing._displayBlock - syncing.startingBlock) / (syncing.highestBlock - syncing.startingBlock)) * 100); - - // Makes fancy strings - syncing.blockDiff = numeral(syncing.highestBlock - syncing.currentBlock).format('0,0'); - syncing.highestBlockString = numeral(syncing.highestBlock).format('0,0'); - syncing.displayBlock = numeral(Math.round(syncing._displayBlock)).format('0,0'); - syncing.statesPercent = numeral(Math.round(syncing._displayStatesDownload*10000)/100).format('0.00'); + syncing._displayStatesDownload = Number(syncing._displayStatesDownload + (syncing.pulledStates/(1 +syncing.knownStates) - syncing._displayStatesDownload) / 100 ) || Number(syncing.pulledStates)/Number(syncing.knownStates + 1); - // Saves the data back to the object - TemplateVar.set(template, 'syncing', syncing); + // Calculates progress + syncing.progress = 100 * (syncing._displayBlock - syncing.startingBlock) / (1 + Number(syncing.highestBlock) - syncing.startingBlock); + + // Makes fancy strings + syncing.blockDiff = numeral(syncing.highestBlock - syncing.currentBlock).format('0,0'); + syncing.highestBlockString = numeral(syncing.highestBlock).format('0,0'); + syncing.displayBlock = numeral(Math.round(syncing._displayBlock)).format('0,0'); + syncing.statesPercent = numeral(Math.round(syncing._displayStatesDownload*10000)/100).format('0.00'); + + // Saves the data back to the object + TemplateVar.set(template, 'syncing', syncing); - // Only show states if they are less than 50% downloaded - if (Math.round(1000*Number(syncing._displayStatesDownload)) !== Math.round(1000*Number(syncing.pulledStates/syncing.knownStates))) { - TemplateVar.set(template, "syncStatusMessageLive", TAPi18n.__('mist.popupWindows.onboarding.syncMessageWithStates', syncing)); - } else { - TemplateVar.set(template, "syncStatusMessageLive", TAPi18n.__('mist.popupWindows.onboarding.syncMessage', syncing)); - } + // If it's close enough, show the synced button + + if (Number(syncing.highestBlock) - syncing.currentBlock < 100 ) { + TemplateVar.set(template, 'readyToLaunch', true); + } + + // Only show states if they are changing + if (Math.round(1000*Number(syncing._displayStatesDownload)) !== Math.round(1000*Number(syncing.pulledStates/(syncing.knownStates+1)))) { + TemplateVar.set(template, "syncStatusMessageLive", TAPi18n.__('mist.popupWindows.onboarding.syncMessageWithStates', syncing)); + } else if (syncing.displayBlock == '0') { + TemplateVar.set(template, "syncStatusMessageLive", ''); + } else { + TemplateVar.set(template, "syncStatusMessageLive", TAPi18n.__('mist.popupWindows.onboarding.syncMessage', syncing)); + } + } }, 50); + }, + /** + Updates the Sync Message live - return TemplateVar.get(template, "syncStatusMessageLive"); + @method syncStatusMessage + */ + 'syncStatusMessage' : function() { + return TemplateVar.get("syncStatusMessageLive"); } }); @@ -136,12 +155,14 @@ Template['popupWindows_onboardingScreen'].events({ if(TemplateVar.get('testnet')) { ipc.send('onBoarding_changeNet', false); TemplateVar.set('testnet', false); + TemplateVar.set('syncing', null); } }, 'click .start-testnet': function(e, template){ if(!TemplateVar.get('testnet')) { ipc.send('onBoarding_changeNet', true); TemplateVar.set('testnet', true); + TemplateVar.set('syncing', null); } TemplateVar.set('currentActive','testnet'); @@ -156,15 +177,18 @@ Template['popupWindows_onboardingScreen'].events({ }, 'click .goto-tutorial-1': function(){ TemplateVar.set('currentActive','tutorial-1'); - TemplateVar.set('readyToLaunch', true); + if (!TemplateVar.get('syncing')) + TemplateVar.set('readyToLaunch', true); }, 'click .goto-tutorial-2': function(){ TemplateVar.set('currentActive','tutorial-2'); - TemplateVar.set('readyToLaunch', true); + if (!TemplateVar.get('syncing')) + TemplateVar.set('readyToLaunch', true); }, 'click .goto-tutorial-3': function(){ TemplateVar.set('currentActive','tutorial-3'); - TemplateVar.set('readyToLaunch', true); + if (!TemplateVar.get('syncing')) + TemplateVar.set('readyToLaunch', true); }, /** Start the application @@ -226,18 +250,35 @@ Template['popupWindows_onboardingScreen_importAccount'].events({ @event drop .dropable */ - 'drop .dropable': function(e, template){ + 'drop .dropable': function(e, template) { e.preventDefault(); - if(e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files.length) { - TemplateVar.set('filePath', e.originalEvent.dataTransfer.files[0].path); - Tracker.afterFlush(function(){ - template.$('.password').focus(); - }); - } else { - GlobalNotification.warning({ - content: TAPi18n.__('mist.popupWindows.onboarding.errors.unknownFile'), - duration: 4 + if (e.originalEvent.dataTransfer) files = e.originalEvent.dataTransfer.files; + + if (files.length) { + ipc.send('backendAction_checkWalletFile', files[0].path); + + ipc.on('uiAction_checkedWalletFile', function(e, error, type) { + switch (type) { + case 'presale': + TemplateVar.set(template, 'filePath', files[0].path); + Tracker.afterFlush(function() { + template.$('.password').focus(); + }); + break; + case 'web3': + TemplateVar.set(template, 'filePath', files[0].path); + TemplateVar.set(template, 'importing', true); + setTimeout(function() { + ipc.send('backendAction_closePopupWindow'); + }, 750); + break; + default: + GlobalNotification.warning({ + content: TAPi18n.__('mist.popupWindows.onboarding.errors.unknownFile'), + duration: 4 + }); + } }); } @@ -261,29 +302,29 @@ Template['popupWindows_onboardingScreen_importAccount'].events({ }, /** Checks the password match sends the file path and password to the mist backend to import - + @event submit form */ 'submit form': function(e, template){ var pw = template.find('input.password').value; - ipc.send('backendAction_importPresaleFile', TemplateVar.get('filePath'), pw); + ipc.send('backendAction_importWalletFile', TemplateVar.get('filePath'), pw); TemplateVar.set('importing', true); - ipc.on('uiAction_importedPresaleFile', function(e, error, address){ + ipc.on('uiAction_importedWalletFile', function(e, error, address){ TemplateVar.set(template, 'importing', false); TemplateVar.set(template, 'filePath', false); if(address) { - ipc.removeAllListeners('uiAction_importedPresaleFile'); + ipc.removeAllListeners('uiAction_importedWalletFile'); console.log('Imported account: ', address); // move to add account screen, when in the onboarding window if($('.onboarding-start')[0]) { TemplateVar.setTo('.onboarding-account', 'newAccount', web3.toChecksumAddress(address)); TemplateVar.setTo('.onboarding-screen', 'currentActive', 'account'); - + // otherwise simply close the window } else { ipc.send('backendAction_closePopupWindow'); @@ -337,7 +378,7 @@ Template['popupWindows_onboardingScreen_password'].helpers({ Template['popupWindows_onboardingScreen_password'].events({ /** Clear the form - + @event click button[type="button"] */ 'click button[type="button"]': function(e, template){ @@ -354,7 +395,7 @@ Template['popupWindows_onboardingScreen_password'].events({ }, /** Password checks - + @event click button[type="button"] */ 'input input, change input': function(e, template){ @@ -367,7 +408,7 @@ Template['popupWindows_onboardingScreen_password'].events({ }, /** Checks the password match and creates a new account - + @event submit form */ 'submit form': function(e, template){ @@ -392,7 +433,7 @@ Template['popupWindows_onboardingScreen_password'].events({ if(!e) { TemplateVar.setTo('.onboarding-account', 'newAccount', web3.toChecksumAddress(res)); TemplateVar.setTo('.onboarding-screen', 'currentActive', 'account'); - + // clear form pw = pwRepeat = null; @@ -405,4 +446,4 @@ Template['popupWindows_onboardingScreen_password'].events({ }); } } -}); \ No newline at end of file +}); diff --git a/interface/client/templates/popupWindows/sendTransactionConfirmation.html b/interface/client/templates/popupWindows/sendTransactionConfirmation.html index 3dbf4db12..4cc9c5ff8 100644 --- a/interface/client/templates/popupWindows/sendTransactionConfirmation.html +++ b/interface/client/templates/popupWindows/sendTransactionConfirmation.html @@ -11,7 +11,7 @@

{{i18n "mist.popupWindows.sendTransactionConfirmation.title.sendTransaction"

{{i18n "mist.popupWindows.sendTransactionConfirmation.title.createContract"}}

{{/if}} {{/if}} - +
@@ -34,7 +34,7 @@

{{i18n "mist.popupWindows.sendTransactionConfirmation.title.createContract"}

{{/if}}
- +
{{#if to}} {{#if TemplateVar.get "toIsContract"}} @@ -65,45 +65,11 @@

{{i18n "mist.popupWindows.sendTransactionConfirmation.title.createContract"} {{/unless}} {{/if}} - {{#if data}} - - {{#if showFormattedParams}} -
-

{{{i18n "mist.popupWindows.sendTransactionConfirmation.parameters"}}} - {{{i18n "mist.popupWindows.sendTransactionConfirmation.showRawBytecode"}}} -

-
    - {{# each param in params}} -
  1. {{> dapp_output output=param }}
  2. - {{/each}} -
-
- {{else}} -
-

{{i18n "mist.popupWindows.sendTransactionConfirmation.data"}} - - {{# if params}} - {{{i18n "mist.popupWindows.sendTransactionConfirmation.showDecodedParameters"}}} - {{else}} - {{#if to}} - {{#unless (TemplateVar.get "lookingUpFunctionSignature")}} - {{i18n "mist.popupWindows.sendTransactionConfirmation.lookupData"}} - - {{/unless}} - {{/if}} - {{/if}} -

- -
{{{formattedData}}}
-
- {{/if}} - {{/if}} -
  • - {{i18n "mist.popupWindows.sendTransactionConfirmation.estimatedFee"}} + {{i18n "mist.popupWindows.sendTransactionConfirmation.estimatedFee"}}
    {{#if $eq (TemplateVar.get "estimatedGas") "invalid"}} @@ -120,7 +86,7 @@

    {{i18n "mist.popupWindows.sendTransactionConfirmation.data"}} {{/if}}

    -
  • +
  • {{i18n "mist.popupWindows.sendTransactionConfirmation.gasLimit"}} @@ -138,23 +104,56 @@

    {{i18n "mist.popupWindows.sendTransactionConfirmation.data"}}

+ {{#if data}} + {{#if showFormattedParams}} +
+

{{{i18n "mist.popupWindows.sendTransactionConfirmation.parameters"}}} + {{{i18n "mist.popupWindows.sendTransactionConfirmation.showRawBytecode"}}} +

+
    + {{# each param in params}} +
  1. {{> dapp_output output=param }}
  2. + {{/each}} +
+
+ {{else}} +
+

{{i18n "mist.popupWindows.sendTransactionConfirmation.data"}} + + {{# if params}} + {{{i18n "mist.popupWindows.sendTransactionConfirmation.showDecodedParameters"}}} + {{else}} + {{#if to}} + {{#unless (TemplateVar.get "lookingUpFunctionSignature")}} + {{i18n "mist.popupWindows.sendTransactionConfirmation.lookupData"}} + + {{/unless}} + {{/if}} + {{/if}} +

+ +
{{{formattedData}}}
+
+ {{/if}} + {{/if}} +

{{#if TemplateVar.get "unlocking"}}

{{i18n "mist.popupWindows.sendTransactionConfirmation.unlocking"}}

{{else}} - +
- + {{/if}}
{{/with}} - +
diff --git a/interface/client/templates/popupWindows/sendTransactionConfirmation.js b/interface/client/templates/popupWindows/sendTransactionConfirmation.js index c0c9e5c48..52d913731 100644 --- a/interface/client/templates/popupWindows/sendTransactionConfirmation.js +++ b/interface/client/templates/popupWindows/sendTransactionConfirmation.js @@ -6,7 +6,7 @@ Template Controllers var setWindowSize = function(template){ Tracker.afterFlush(function(){ - ipc.send('backendAction_setWindowSize', 580, template.$('.popup-windows').height() + 60); + ipc.send('backendAction_setWindowSize', 580, template.$('.popup-windows').height() + 120); }); } @@ -103,7 +103,7 @@ Template['popupWindows_sendTransactionConfirmation'].onCreated(function(){ var data = Session.get('data'); if(data) { - + // set window size setWindowSize(template); @@ -127,10 +127,10 @@ Template['popupWindows_sendTransactionConfirmation'].onCreated(function(){ web3.eth.getCode(data.to, function(e, res){ if(!e && res && res.length > 2) { TemplateVar.set(template, 'toIsContract', true); - setWindowSize(template); + setWindowSize(template); } }); - + if (data.data) { localSignatureLookup(data.data).then(function(textSignature) { // Clean version of function signature. Striping params @@ -261,7 +261,7 @@ Template['popupWindows_sendTransactionConfirmation'].helpers({ @method (transactionInvalid) */ 'transactionInvalid': function() { - return TemplateVar.get('estimatedGas') === 'invalid' + return TemplateVar.get('estimatedGas') === 'invalid' || TemplateVar.get('estimatedGas') === 0 || typeof TemplateVar.get('estimatedGas') === 'undefined'; } @@ -294,7 +294,7 @@ Template['popupWindows_sendTransactionConfirmation'].events({ */ 'submit form': function(e, template){ e.preventDefault(); - + var data = Session.get('data'), pw = template.find('input[type="password"]').value, gas = web3.fromDecimal(TemplateVar.get('providedGas')); @@ -373,7 +373,7 @@ Template['popupWindows_sendTransactionConfirmation'].events({ remoteSignatureLookup(data.data).then(function(textSignature) { TemplateVar.set(template, 'lookingUpFunctionSignature', false); - + // Clean version of function signature. Striping params TemplateVar.set(template, 'executionFunction', textSignature.replace(/\(.+$/g, '')); TemplateVar.set(template, 'hasSignature', true); @@ -385,10 +385,9 @@ Template['popupWindows_sendTransactionConfirmation'].events({ ipc.send('backendAction_decodeFunctionSignature', textSignature, data.data); } }).catch(function(bytesSignature) { - TemplateVar.set(template, 'lookingUpFunctionSignature', false); + TemplateVar.set(template, 'lookingUpFunctionSignature', false); TemplateVar.set(template, 'executionFunction', bytesSignature); TemplateVar.set(template, 'hasSignature', false); }); } }); - diff --git a/interface/client/templates/popupWindows/splashScreen.js b/interface/client/templates/popupWindows/splashScreen.js index 8d51aaa57..4aea7fd79 100644 --- a/interface/client/templates/popupWindows/splashScreen.js +++ b/interface/client/templates/popupWindows/splashScreen.js @@ -92,6 +92,7 @@ Template['popupWindows_splashScreen'].onCreated(function(){ if (status === 'inProgress') { TemplateVar.set(template, 'showStartAppButton', true); TemplateVar.set(template, 'startAppButtonText', TAPi18n.__('mist.startScreen.launchApp')); + ipc.send('backendAction_skipSync'); if (data !== false) { // if state is "in progress" and we have data @@ -189,9 +190,9 @@ Template['popupWindows_splashScreen'].helpers({ syncData._displayKnownStates = Number(syncData.knownStates || 0); } else { // Increment each them slowly to match target number - syncData._displayBlock += (Number(syncData.currentBlock) - syncData._displayBlock) / 10; - syncData._displayState += (Number(syncData.pulledStates || 0) - syncData._displayState) / 10; - syncData._displayKnownStates += (Number(syncData.knownStates || 0) - syncData._displayKnownStates) / 10; + syncData._displayBlock += (Number(syncData.currentBlock) - syncData._displayBlock) / 100; + syncData._displayState += (Number(syncData.pulledStates || 0) - syncData._displayState) / 100; + syncData._displayKnownStates += (Number(syncData.knownStates || 0) - syncData._displayKnownStates) / 100; } // Create the fancy strings @@ -224,7 +225,7 @@ Template['popupWindows_splashScreen'].helpers({ } } - }, 100); + }, 10); return TemplateVar.get(template, "syncStatusMessageLive"); } diff --git a/interface/client/templates/views/webview.js b/interface/client/templates/views/webview.js index b64aa6ec6..e28d4b848 100644 --- a/interface/client/templates/views/webview.js +++ b/interface/client/templates/views/webview.js @@ -60,6 +60,10 @@ Template['views_webview'].onRendered(function(){ webviewLoadStop.call(this, tabId, e); }); + // show error pages + webview.addEventListener('did-fail-load', showError.bind(webview, tabId)); + webview.addEventListener('crashed', showError.bind(webview, tabId)); + // navigate page, and redirect to browser tab if necessary webview.addEventListener('will-navigate', webviewLoadStart.bind(webview, tabId)); webview.addEventListener('did-get-redirect-request', webviewLoadStart.bind(webview, tabId)); @@ -122,6 +126,10 @@ Template['views_webview'].helpers({ }}); } + // allow error pages + if(url && url.indexOf('file://'+ dirname + '/errorPages/') === 0) { + return url; + } // CHECK URL and throw error if not allowed if(!Helpers.sanitizeUrl(url, true)) { @@ -137,7 +145,7 @@ Template['views_webview'].helpers({ return 'file://'+ dirname + '/errorPages/400.html'; } - // remove redirect + // add url if(url) { template.url = url; Tabs.update(this._id, {$set: { diff --git a/interface/client/templates/webviewEvents.js b/interface/client/templates/webviewEvents.js index 26e10bfc8..332676911 100644 --- a/interface/client/templates/webviewEvents.js +++ b/interface/client/templates/webviewEvents.js @@ -1,4 +1,31 @@ +showError = function(tabId, e){ + if(e.isMainFrame || e.killed) { + var url, + path = 'file://'+ dirname + '/errorPages/'; + + if(e.killed) { + e.errorCode = 500; + } + + switch(e.errorCode) { + case -105: + url = path +'404.html'; + break; + case 500: + url = path +'500.html'; + break; + } + + if(url) { + Tabs.update(tabId, {$set: { + redirect: url + }}); + } + } +}; + + webviewChangeUrl = function(tabId, e){ if(e.type === 'did-navigate-in-page' && !e.isMainFrame) return; diff --git a/interface/i18n/app.nl.i18n.json b/interface/i18n/app.nl.i18n.json index 97b9670a1..a0eceea97 100644 --- a/interface/i18n/app.nl.i18n.json +++ b/interface/i18n/app.nl.i18n.json @@ -20,8 +20,8 @@ "sending": "Verzenden...", "create": "Aanmaken", "tryToReconnect": "Probeer te verbinden", - "stayAnonymous": "Stay anonymous", - "authorize": "Authorize" + "stayAnonymous": "Blijf anoniem", + "authorize": "Autoriseren" }, "commonWords": { "you": "u", diff --git a/interface/i18n/mist.de.i18n.json b/interface/i18n/mist.de.i18n.json index fa21cdcc1..2c8016b32 100644 --- a/interface/i18n/mist.de.i18n.json +++ b/interface/i18n/mist.de.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Konten", - "importPresale": "Pre-sale-Konto importieren", + "importPresale": "Konto importieren", "newAccount": "Neues Konto", "backup": "Sicherung", "backupKeyStore": "Konten", @@ -42,12 +42,16 @@ "devToolsWebview": "__webview__", "runTests": "Tests durchführen", "logFiles": "Logdatei anzeigen", + "openRemix": "Remix IDE öffnen", "ethereumNode": "Ethereum Node", "network": "Netzwerk", "mainNetwork": "Hauptnetzwerk", "startMining": "⛏ Mining starten (nur auf Testnetz)", "stopMining": "⛏ Mining stoppen", - "externalNode": "using external node" + "externalNode": "using external node", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Fenster", @@ -70,7 +74,7 @@ "linux": "Um Zeit Synchronisation einzuschalten installiere \"ntp\" via \"apt-get install ntp\".", "darwin": "Um Zeit Synchronisation einzuschalten, öffne die System Einstellungen und checke \"Zeit Datum automatisch\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -202,7 +206,7 @@ "gotoMainnet": "Verwende das Hauptnetz", "gotoMainnetDescription": " Sie werden etwas Ether benötigen, um Verträge anzulegen und auszuführen. Wir werden Ihnen helfen, etwas zu bekommen ...", "doYouHaveAWalletFile": "Haben Sie eine Wallet-Datei?", - "walletFileDescription": "

Wenn Sie 2014 am Ethereum-Pre-sale teilgenommen haben, sollten Sie über eine Datei mit dem Dateinamen ethereum_wallet_backup.json verfügen. Sie wurde nach dem Kauf heruntergeladen und Ihnen auch per E-Mail geschickt.

", + "walletFileDescription": "

Wallet-Datei zum importieren in dieses Fenster ziehen.
Wenn Sie 2014 am Ethereum-Pre-sale teilgenommen haben, sollten Sie über eine Datei mit dem Dateinamen ethereum_wallet_backup.json verfügen. Sie wurde nach dem Kauf heruntergeladen und Ihnen auch per E-Mail geschickt.

", "dropFilesHere": "Pre-sale Datei hochladen", "creating": "Erstellen...", "importing": "Importieren...", @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.en.i18n.json b/interface/i18n/mist.en.i18n.json index 2b0b04f29..cf3bd86b7 100644 --- a/interface/i18n/mist.en.i18n.json +++ b/interface/i18n/mist.en.i18n.json @@ -46,7 +46,7 @@ }, "accounts": { "label": "Accounts", - "importPresale": "Import Pre-sale Accounts", + "importPresale": "Import Accounts", "newAccount": "New account", "backup": "Backup", "backupKeyStore": "Accounts", @@ -60,10 +60,15 @@ "devToolsWebview": "__webview__", "runTests": "Run tests", "logFiles": "Show log file", + "openRemix": "Open Remix IDE", "externalNode": "using external node", "ethereumNode": "Ethereum Node", "network": "Network", "mainNetwork": "Main Network", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)", + "mainNetwork": "Main Network", "startMining": "⛏ Start Mining (Testnet only)", "stopMining": "⛏ Stop Mining" }, @@ -226,14 +231,14 @@ "lookupDataExplainer": "Look this up on the internet" }, "onboarding": { - "description" : "Ethereum is a public blockchain that features a turing complete programming for building solid, decentralized applications.", + "description" : "Ethereum is a platform for decentralized blockchain apps with a fully featured programming language", "goToTestnet" : "Use the test network", "goToTestnetDescription" : "Test the technology freely in a sandboxed testnet, without using real ether.", "gotoMainnet" : "Use the main network", "gotoMainnetDescription" : "You’ll need some Ether in order to create and execute contracts. Don't worry, we'll help you get some...", "doYouHaveAWalletFile" : "Do you have a wallet file?", - "walletFileDescription" : "

If you participated on the Ethereum Pre-sale 2014, you should have a file named ethereum_wallet_backup.json. It was downloaded after the sale and also sent to your email

", - "dropFilesHere" : "Drop pre-sale file", + "walletFileDescription" : "

Move any wallet file here to import.
If you participated on the Ethereum Pre-sale 2014, you should have a file named ethereum_wallet_backup.json. It was downloaded after the sale and also sent to your email

", + "dropFilesHere" : "Drop wallet file", "creating": "Creating...", "importing": "Importing...", "skip" : "Skip this step", @@ -253,6 +258,7 @@ "downloadingBlocks": "Downloading blocks", "syncMessage": "Block __displayBlock__ of __highestBlockString__", "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync..", "tutorial1Description" : "

Now the only thing left to do is wait for the download to finish. Here's some reading suggestions:

Make your own money

Make a cryptocurrency with a fixed market supply, tokens representing real world assets, etc

", "tutorial2Description" : "

Create a crowdsale

Raise funds for a common goal, fully trustable without a third party. Sidestep the hurdle of traditional funding system and go directly to the source by funding an organization via the blockchain.

", "tutorial3Description" : "

Create a blockchain organization

Create an autonomous organization with rules on spending money and making decisions for you and your investors.

", diff --git a/interface/i18n/mist.es.i18n.json b/interface/i18n/mist.es.i18n.json index 50747a5d0..1e7059e9b 100644 --- a/interface/i18n/mist.es.i18n.json +++ b/interface/i18n/mist.es.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Cuentas", - "importPresale": "Importar Cuentas de la Pre-venta", + "importPresale": "Importar Cuentas", "newAccount": "Nueva cuenta", "backup": "Copia de seguridad", "backupKeyStore": "Cuentas", @@ -47,7 +47,11 @@ "mainNetwork": "Red principal", "startMining": "⛏ Empezar a minar (sólo Testnet)", "stopMining": "⛏ Parar de minar", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Ventana", @@ -70,7 +74,7 @@ "linux": "Para permitir la sincronización con un servidor de tiempo instale \"ntp\" vía \"apt-get install ntp\".", "darwin": "Para habilitar la sincronización del tiempo, abra las preferencias de tiempo y marque \"Ajuste la hora y la fecha automáticamente\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "connectAccount": { "chooseAccountTitle": "Elegir sus cuentas", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.fa.i18n.json b/interface/i18n/mist.fa.i18n.json index 89faf57fe..b2d807e66 100644 --- a/interface/i18n/mist.fa.i18n.json +++ b/interface/i18n/mist.fa.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Accounts", - "importPresale": "Import Pre-sale Accounts", + "importPresale": "Import Accounts", "newAccount": "New account", "backup": "Backup", "backupKeyStore": "Accounts", @@ -47,7 +47,11 @@ "network": "Network", "mainNetwork": "Main Network", "startMining": "⛏ Start Mining (Testnet only)", - "stopMining": "⛏ Stop Mining" + "stopMining": "⛏ Stop Mining", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Window", @@ -70,7 +74,7 @@ "linux": "To enable a time sync server install \"ntp\" via \"apt-get install ntp\".", "darwin": "To enable time sync, open the time preferences and check \"Set the time and date automatically\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -249,7 +253,8 @@ "unknownFile": "File not recognised.", "wrongPassword": "Wrong password.", "importFailed": "Couldn't import the file, got: __error__" - } + }, + "startingSync": "Getting ready to sync.." }, "connectAccount": { "chooseAccountTitle": "Choose account", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.fr.i18n.json b/interface/i18n/mist.fr.i18n.json index 9a043b95c..74eda619f 100644 --- a/interface/i18n/mist.fr.i18n.json +++ b/interface/i18n/mist.fr.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Comptes", - "importPresale": "Importer les comptes de prévente", + "importPresale": "Importer les comptes", "newAccount": "Nouveau compte", "backup": "Sauvegarder", "backupKeyStore": "Comptes", @@ -47,7 +47,11 @@ "mainNetwork": "Réseau principal", "startMining": "⛏ Commencer à miner (seulement pour Testnet)", "stopMining": "⛏ Arrêter de miner", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Fenêtre", @@ -70,7 +74,7 @@ "linux": "Pour activer un serveur de synchronisation de temps, installez \"ntp\" via \"apt-get install ntp\".", "darwin": "Pour activer la synchronisation du temps, ouvrez les préférences de temps et cochez \"Régler la date et l'heure automatiquement\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.it.i18n.json b/interface/i18n/mist.it.i18n.json index d81d833f3..b6a312829 100644 --- a/interface/i18n/mist.it.i18n.json +++ b/interface/i18n/mist.it.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Accounts", - "importPresale": "Importa Accounts pre-vendita", + "importPresale": "Importa Accounts", "newAccount": "Nuovo account", "backup": "Backup", "backupKeyStore": "Accounts", @@ -47,7 +47,11 @@ "mainNetwork": "Rete principale", "startMining": "⛏ Inizia mining (solo Testnet)", "stopMining": "⛏ Ferma mining", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Finestra", @@ -70,7 +74,7 @@ "linux": "Per abilitare la sincronia con un time server installa \"ntp\" via \"apt-get install ntp\".", "darwin": "Per abilitare la sincronia dell'ora, apri le preferenze di orario e spunta \"Setta ora e data automaticamente\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.ja.i18n.json b/interface/i18n/mist.ja.i18n.json index 6d71de12b..9cbb4835b 100644 --- a/interface/i18n/mist.ja.i18n.json +++ b/interface/i18n/mist.ja.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "アカウント", - "importPresale": "プリセールアカウントを読み込む", + "importPresale": "アカウントを読み込む", "newAccount": "新規アカウント", "backup": "バックアップ", "backupKeyStore": "アカウント", @@ -47,7 +47,11 @@ "mainNetwork": "メインネットワーク", "startMining": "⛏ マイニングを始める (テストネット のみ)", "stopMining": "⛏ マイニングを中止する", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Window", @@ -70,7 +74,7 @@ "linux": "時間を同期させるサーバーを使うためには、 \"ntp\" を \"apt-get install ntp\" をコマンドラインから入力してインストールする必要があります。", "darwin": "時間を同期するためには、時間設定を開き \"時間と日にちを同期自動で同期\" にチェックすることが必要です." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.ko.i18n.json b/interface/i18n/mist.ko.i18n.json index b8d03ced8..948738ecf 100644 --- a/interface/i18n/mist.ko.i18n.json +++ b/interface/i18n/mist.ko.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "계정", - "importPresale": "프리세일 계정 추가하기", + "importPresale": "계정 추가하기", "newAccount": "새 계정", "backup": "백업", "backupKeyStore": "계정키 백업", @@ -47,7 +47,11 @@ "mainNetwork": "메인 네트워크", "startMining": "⛏ 채굴 시작(테스트넷만 해당)", "stopMining": "⛏ 채굴 중단", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "창", @@ -70,7 +74,7 @@ "linux": "시간 동기화 서버를 가동시키기 위해서는 \"ntp\" 를 \"apt-get install ntp\" 의 방법으로 설치하세요.", "darwin": "시간 동기화를 위해서, 시간 옵션을 열고 \"시간과 날짜 자동설정(Set the time and date automatically)\" 옵션을 선택하세요." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.kr.i18n.json b/interface/i18n/mist.kr.i18n.json index a93c84efc..41babc6ba 100644 --- a/interface/i18n/mist.kr.i18n.json +++ b/interface/i18n/mist.kr.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "계정", - "importPresale": "프리세일 계정 추가하기", + "importPresale": "계정 추가하기", "newAccount": "새 계정", "backup": "백업", "backupKeyStore": "계정키 백업", @@ -47,7 +47,11 @@ "mainNetwork": "메인 네트워크", "startMining": "⛏ 채굴 시작(테스트넷만 해당)", "stopMining": "⛏ 채굴 중단", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "창", @@ -70,7 +74,7 @@ "linux": "시간 동기화 서버를 가동시키기 위해서는 \"ntp\" 를 \"apt-get install ntp\" 의 방법으로 설치하세요.", "darwin": "시간 동기화를 위해서, 시간 옵션을 열고 \"시간과 날짜 자동설정(Set the time and date automatically)\" 옵션을 선택하세요." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", diff --git a/interface/i18n/mist.nb.i18n.json b/interface/i18n/mist.nb.i18n.json index 1f1b848d1..91ce3fe5c 100644 --- a/interface/i18n/mist.nb.i18n.json +++ b/interface/i18n/mist.nb.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Kontoer", - "importPresale": "Importer Forhåndssalg Kontoer", + "importPresale": "Importer Kontoer", "newAccount": "Ny konto", "backup": "Sikkerhetskopier", "backupKeyStore": "Kontoer", @@ -47,7 +47,11 @@ "mainNetwork": "Hovednettverk", "startMining": "⛏ Start Mining (Kun testnett)", "stopMining": "⛏ Stopp Mining", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Vindu", @@ -70,7 +74,7 @@ "linux": "For å aktivere en tidssynkroniseringsserver installer \"ntp\" via \"apt-get install ntp\".", "darwin": "For å aktivere tidssynkronisering, åpne tidsinnstillinger og velg \"Angi klokkeslett og dato automatisk\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.nl.i18n.json b/interface/i18n/mist.nl.i18n.json index dca843648..9440f6b4c 100644 --- a/interface/i18n/mist.nl.i18n.json +++ b/interface/i18n/mist.nl.i18n.json @@ -5,7 +5,7 @@ "label": "__app__", "about": "Over __app__", "checkForUpdates": "Op updates controleren...", - "checkForNodeUpdates": "Check for Ethereum node updates...", + "checkForNodeUpdates": "Controleer op Ethereum node updates...", "services": "Diensten", "hide": "__app__ verbergen", "hideOthers": "Andere verbergen", @@ -22,13 +22,31 @@ "selectAll": "Alles selecteren" }, "view": { - "label": "Bekijken", + "label": "Weergave", "fullscreen": "Volledig Scherm Inschakelen", - "default": "Default" + "languages": "Wijzig taal", + "default": "Standaard", + "langCodes": { + "de": "Deutsch", + "en": "English", + "es": "Español", + "fa": "فارسى", + "fr": "Français", + "it": "Italiano", + "ja": "日本語", + "ko": "한국어 ", + "nl": "Nederlands", + "nb": "Norsk", + "pt": "Português", + "sq": "Shqip", + "ru": "Pусский", + "zh": "普通話", + "zh-TW": "國語" + } }, "accounts": { "label": "Accounts", - "importPresale": "Importeer voorverkoop Accounts", + "importPresale": "Importeer Accounts", "newAccount": "Nieuw account", "backup": "Backup", "backupKeyStore": "Accounts", @@ -42,12 +60,16 @@ "devToolsWebview": "__webview__", "runTests": "Tests uitvoeren", "logFiles": "Toon log bestand", + "openRemix": "Open Remix IDE", + "externalNode": "Externe Node in gebruik", "ethereumNode": "Ethereum Node", "network": "Netwerk", + "nodeMode": "Chain download", + "fullNode": "Bewaar volledige blockchain", + "lightNode": "Gebruik light Node (experimenteel!)", "mainNetwork": "Hoofdnetwerk", "startMining": "⛏ Start Mining (Alleen testnet)", - "stopMining": "⛏ Stop Mining", - "externalNode": "using external node" + "stopMining": "⛏ Stop Mining" }, "window": { "label": "Scherm", @@ -57,26 +79,26 @@ }, "help": { "label": "Help", - "reportBug": "Report an issue on Github" + "reportBug": "Rapporteer een probleem op Github" } }, "errors": { - "nodeConnect": "Verbinden naar node niet mogelijk? Zie de logboek bestanden voor meer informatie:", - "nodeStartup": "Het lijkt erop dat de node niet kan worden opgestart, heeft u er al een aan staan? Is deze de database aan het upgraden?", + "nodeConnect": "Verbinden met node niet mogelijk? Zie de logboek bestanden voor meer informatie:", + "nodeStartup": "Het lijkt erop dat de node niet kan worden opgestart, draait er al een? Is deze de database aan het upgraden?", "timeSync": { - "title": "Uw computer's klok is niet gesynchroniseerd.", - "description": "Om succesvol met het Ethereum netwerk te verbinden moet u uw computer's klok synchroniseren met een tijdssynchronisatie server.", - "win32": "Ga naat uw Internet Tijd Instellingen in uw configuratiescherm en selecteer de optie. Zie deze uitleg voor details: http://www.guidingtech.com/3119/windows-clock-sync/", + "title": "Je computer's klok is niet gesynchroniseerd.", + "description": "Om succesvol met het Ethereum netwerk te verbinden moet je computer's klok gesynchroniseerd zijn met een tijdssynchronisatie server.", + "win32": "Ga naar je Internet Tijd Instellingen in je configuratiescherm en selecteer de optie. Zie deze uitleg voor details: http://www.guidingtech.com/3119/windows-clock-sync/", "linux": "Installeer voor een tijdssynchronisatieserver \"ntp\" via \"apt-get install ntp\".", - "darwin": "Om tijdssynchronisatie aan de zetten opent u uw instellingen en activeert u \"Tijd en datum automatisch instellen\"." + "darwin": "Zet tijdssynchronisatie aan door in je instellingen de optie \"Tijd en datum automatisch instellen\" te activeren." }, - "nodeChecksumMismatch": { - "title": "Checksum mismatch in downloaded node!", - "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." + "nodeChecksumMismatch": { + "title": "Checksum mismatch in gedownloade node!", + "description": "__algorithm__: __hash__\n\nInstalleer de __type__ node versie __version__ handmatig." }, "legacyChain": { - "title": "Legacy chain detected", - "description": "Your node is currently on the unsupported Ethereum Classic chain. To use this chain use tools provided by the ethereum classic project at\nhttps://ethereumclassic.github.io.\n\nTo revert to the main ethereum chain follow the tutorial here:\nhttps://github.com/ethereum/mist/releases/0.8.2" + "title": "Legacy chain gedetecteerd", + "description": "Je node draait momenteel op de niet ondersteunde Ethereum Classic chain. Om deze chain te gebruiken dien je de tools te gebruiken van het Ethereum Classic project op\nhttps://ethereumclassic.github.io.\n\nOm terug te gaan naar de standaard Ethereum chain kun je deze tutorial volgen:\nhttps://github.com/ethereum/mist/releases/0.8.2" } }, "rightClick": { @@ -87,17 +109,17 @@ "nodeInfo": { "nodeSyncing": "__blockDiff__ blokken te gaan", "blockReceived": "Nieuw blok ontvangen", - "blockNumber": "Uw laatste bloknummer", + "blockNumber": "Jouw laatste bloknummer", "timeSinceBlock": "Verstreken tijd sinds laatste blok", - "testnetExplain": "U best actief op een testnet, VERSTUUR GEEN echte ether naar deze adressen", - "peers": "peers", - "checkingWhichNetwork": "Checking network...", + "checkingWhichNetwork": "Netwerk aan het controleren...", "mainNetwork": "Main-net", "testNetwork": "Test-net", "privateNetwork": "Private-net", - "mainnetExplain": "You are on the main Ethereum global network", - "privatenetExplain": "You are on a private net, DO NOT SEND any real ether to these addresses", - "unknownnetExplain": "Unable to determine which network you are on" + "mainnetExplain": "Je zit op het main Ethereum wereldwijde netwerk", + "testnetExplain": "Je bent actief op het __name__, VERSTUUR GEEN echte Ether naar deze adressen", + "privatenetExplain": "Je zit op een private net, VERSTUUR GEEN echte Ether naar deze adressen", + "unknownnetExplain": "Niet in staat om te bepalen op welk netwerk je zit", + "peers": "peers" }, "sidebar": { "buttons": { @@ -107,54 +129,66 @@ "browserBar": { "buttons": { "noAccounts": "Geen accounts ingesteld", - "connect": "Connect" + "connect": "Verbind" } }, "startScreen": { "runningNodeFound": "Lopende Ethereum node gevonden!", "startingNode": "Ethereum node starten...", + "stoppingNode": "Ethereum node stoppen...", "startedNode": "Applicatie starten...", - "nodeConnectionTimeout": "Ethereum node opstarten niet mogelijk!
Als u Geth geinstalleerd heeft, gebruik dan dit commando om het op te starten:
geth --ipcpath __path__

Of meld een fout ", - "nodeBinaryNotFound": "Geen Ethereun node uitvoerbaar bestand gevonden!
Start er a.u.b. handmatig een. ", - "nodeSyncing": "Ethereum node moet synchroniseren, even gedult alstublieft...", + "nodeConnectionTimeout": "Ethereum node opstarten niet mogelijk!
Als je Geth geinstalleerd hebt, gebruik dan dit commando om het op te starten:
geth --ipcpath __path__

Of meld een fout ", + "nodeBinaryNotFound": "Geen Ethereum node gevonden!
Start er a.u.b. handmatig een. ", + "nodeStarting": "Ethereum node opstarten...", + "nodeStarted": "Ethereum node gestart", + "nodeConnected": "Ethereum node verbonden", + "nodeStopping": "Ethereum node afsluiten...", + "nodeStopped": "Ethereum node gestopt", + "nodeError": "Ethereum node verbindingsfout :'(", + "unableToBindPort": "Ethereum node kan niet opstarten. Draait er al een?", + "nodeSyncing": "Ethereum node moet synchroniseren, even geduld alstublieft...", "nodeSyncInfo": "Blok __currentBlock__ van __highestBlock__ aan het downloaden.", + "nodeSyncInfoStates": "Blok __displayBlock__ van __highestBlock__ aan het downloaden,
Chain structuur __displayState__ van __displayKnownStates__ aan het downloaden", "nodeSyncConnecting": "Zoeken naar peers...", - "stoppingNode": "Stopping Ethereum node...", - "nodeStarting": "Ethereum node starting up...", - "nodeStarted": "Ethereum node started", - "nodeConnected": "Ethereum node connected", - "nodeStopping": "Ethereum node stopping...", - "nodeStopped": "Ethereum node stopped", - "nodeError": "Ethereum node connection error :'(", - "unableToBindPort": "Ethereum node cannot run. Is another instance already running?", - "nodeSyncInfoStates": "Downloading block __displayBlock__ of __highestBlock__,
Downloading chain structure __displayState__ of __displayKnownStates__", - "nodeSyncFoundPeers": "Connecting to __peers__ peers...", - "nodeSyncingStopped": "Ethereum node sync stopped", - "peerSearchTimeout": "Skip peer search", - "launchApp": "Launch Application", + "nodeSyncFoundPeers": "Verbinden met __peers__ peers...", + "nodeSyncingStopped": "Ethereum node sync gestopt", + "peerSearchTimeout": "Sla peer search over", + "launchApp": "Applicatie Opstarten", "clientBinaries": { - "scanning": "Checking for node update...", - "downloading": "Downloading new node...", - "loadConfig": "Loading client config...", - "filtering": "Filtering client binaries...", + "scanning": "Controleren op node update...", + "downloading": "Downloaden van nieuwe node...", + "loadConfig": "Laden van client config...", + "filtering": "Filteren van client binaries...", "done": "Ethereum node up-to-date...", - "error": "Error running downloaded binary." + "error": "Fout bij het uitvoeren van de gedownloade binary." } }, "popupWindows": { + "updateAvailable": { + "newVersionAvailable": "Nieuwe __name__ versie beschikbaar", + "version": "Versie", + "downloadURL": "Download URL", + "checksum": "Checksum", + "downloadAndRestart": "Updaten en opnieuw opstarten", + "download": "Download nieuwe versie", + "skipUpdate": "Sla update over", + "notNow": "Vraag me later opnieuw", + "checking": "Controleren op updates voor __name__...", + "noUpdateFound": "Geen updates gevonden. Je hebt de laatste versie __name__." + }, "requestAccount": { "title": "Account aanmaken", "enterPassword": "Wachtwoord invoeren", "repeatPassword": "Wachtwoord herhalen", "creating": "Account genereren...", "errors": { - "passwordMismatch": "Uw wachtwoorden komen niet overeen.", - "passwordTooShort": "Make a longer password" + "passwordMismatch": "Je wachtwoorden komen niet overeen.", + "passwordTooShort": "Kies een langer wachtwoord" } }, "unlockMasterPassword": { - "title": "Voer meesterwachtwoord in", - "enterPassword": "Voer meesterwachtwoord in", + "title": "Voer hoofdwachtwoord in", + "enterPassword": "Voer hoofdwachtwoord in", "unlocking": "Ontgrendelen...", "errors": { "wrongPassword": "Wachtwoord is niet correct, probeer het nog eens." @@ -162,67 +196,71 @@ }, "sendTransactionConfirmation": { "title": { - "sendTransaction": "Send transaction", - "contractExecution": "Execute contract", - "createContract": "Create contract" + "sendTransaction": "Verzend transactie", + "contractExecution": "Voer contract uit", + "createContract": "Contract aanmaken" }, - "contractExecutionInfo": "U staat op het punt een functie uit te voeren op een contract. Dit kan overdrachten van waarde tot gevolg hebben.", - "contractCreationInfo": "U staat op het punt een contract aan te maken met de gegeven gevevens.", + "contractExecutionInfo": "Je staat op het punt een functie uit te voeren op een contract. Dit kan overdrachten van waarde tot gevolg hebben.", + "contractCreationInfo": "Je staat op het punt een contract aan te maken met de gegeven gevevens.", "enterPassword": "Voer wachtwoord in om de transactie te bevestigen", "unlocking": "Bevestigen...", "createContract": "Contract aanmaken", - "estimatedFee": "Ingeschatte kosten", - "estimatedGasError": "Data kon niet worden uitgevoerd, dus het zal alle mogelijke gas gebruiken.", + "estimatedFee": "Ingeschatte transactie kosten", + "estimatedGasError": "De kans is groot dat de transactie zal mislukken. Als je de transactie toch wilt uitvoeren zal misschien alle gas worden verbruikt.", + "transactionThrow": "Het contract staat niet toe dat deze transactie wordt uitgevoerd", + "noEstimate": "We konden de hoeveelheid gas niet inschatten.", "gasPrice": "Gas prijs", - "perMillionGas": "ether per millioen gas", - "gasLimit": "Geef maximum kosten aan", - "data": "Data", + "perMillionGas": "Ether per millioen gas", + "gasLimit": "Geef maximum transactie kosten aan", + "data": "Ruwe Data", + "parameters": "Parameters", "buttons": { "sendTransaction": "Verstuur transactie" }, "errors": { - "connectionTimeout": "Kon niet verbinden naar de node, is het in de achtergrond uitgevallen?", + "connectionTimeout": "Kon niet verbinden met de node, is het in de achtergrond uitgevallen?", "wrongPassword": "Onjuist wachtwoord", - "multipleKeysMatchAddress": "Multiple keys match address, please remove duplicates from keystore (menu -> accounts -> backup -> accounts)", - "insufficientFundsForGas": "Insufficient funds in main account (etherbase) to pay for gas", - "sameAccount": "Can't send to itself" + "multipleKeysMatchAddress": "Meerdere keys matchen hebben hetzelfde adres, verwijder duplicaten uit de keystore (menu -> accounts -> backup -> accounts)", + "insufficientFundsForGas": "Onvoldoende saldo in hoofd account (Etherbase) om gas te betalen", + "sameAccount": "Kan niet naar zichzelf versturen" }, - "transactionThrow": "The contract won't allow this transaction to be executed", - "noEstimate": "We couldn't estimate the gas.", - "parameters": "Parameters", - "showRawBytecode": "show raw data", - "showDecodedParameters": "show decoded parameters", - "lookupData": "Try to decode data", - "lookupDataExplainer": "Look this up on the internet" + "showRawBytecode": "Toon ruwe data", + "showDecodedParameters": "Toon gedecodeerde parameters", + "lookupData": "Probeer de data te decoderen", + "lookupDataExplainer": "Zoek hiernaar op het internet" }, "onboarding": { - "description": "Ethereum is een decentraal platform voor het bouwen van applicaties op een blockchain: software die immuun is voor fruide en levenslang waarde en eigendom over kan brengen", + "description": "Ethereum is een decentraal platform voor het bouwen van applicaties op een blockchain: software die immuun is voor fraude en levenslang waarde en eigendom over kan brengen", "goToTestnet": "Gebruik het test netwerk", - "goToTestnetDescription": "Test de technologie vrij in een testongeving, zonder echte ether te gebruiken.", + "goToTestnetDescription": "Test de technologie vrij in een testongeving, zonder echte Ether te gebruiken.", "gotoMainnet": "Gebruik hoofdnetwerk", - "gotoMainnetDescription": "U zal een beetje Ether nodig hebben om contracten uit te voeren. Geen zorgen, we helpen u met het verkrijgen...", - "doYouHaveAWalletFile": "Heeft u een wallet bestand?", - "walletFileDescription": "

Als u mee heeft gedaan met de Ethereum voorverkoop van 2014 zou u een bestand met de naam ethereum_wallet_backup.json ontvangen moeten hebben. U kon deze downloaden na uw contributie en is ook per email verstuurd

", + "gotoMainnetDescription": "Je zult een beetje Ether nodig hebben om contracten uit te voeren. Geen zorgen, we helpen je met het verkrijgen...", + "doYouHaveAWalletFile": "Heb je een wallet bestand?", + "walletFileDescription": "

Als je mee hebt gedaan met de Ethereum voorverkoop van 2014 zou je een bestand met de naam ethereum_wallet_backup.json ontvangen moeten hebben. Je kon dit bestand downloaden na je contributie en is ook per email verstuurd

", "dropFilesHere": "Sleep voorverkoop bestand hier", "creating": "Aanmaken...", "importing": "Importeren...", "skip": "Sla deze stap over", "next": "Volgende", - "protectTitle": "Bescherm uw account", - "protectDescription": "Kies een wachtwoord voor uw nieuwe account. Maak het even veilig alsof het uw huissleutels zijn!", + "protectTitle": "Bescherm je account", + "protectDescription": "Kies een wachtwoord voor je nieuwe account. Maak het even veilig alsof het uw huissleutels zijn!", "accountTitle": "Opladen!", "accountTitleTestnet": "Mine wat!", - "etherDescription": "Het ethereum netwerk is gebaseerd op het “Ether” token. U zal een kleine hoeveelheid nodig hebben om dingen op het netwerk te doen.", - "loadItDescription": "Als u al Bitcoins of een andere cryptocurrency heeft kan u deze makkelijk omzetten in ether met Shapeshift.

Wij raden aan een hoeveelheid van tussen de 0.25 en 1 ether om te zetten.", - "mineItDescription": "Op het testnetwerk kan u zelf ether minen door te gaan naar het Ontwikkelaars menu en te kiezen voor Begin Mining.
PROBEER GEEN ECHTE ETHER NAAR DIT ADRES TE VERSTUREN ", - "you": "U", - "etherbase": "Centrale account (etherbase)", + "etherDescription": "Het Ethereum netwerk is gebaseerd op het “Ether” token. Je zal een kleine hoeveelheid nodig hebben om dingen op het netwerk te doen.", + "loadItDescription": "Als je al Bitcoins of een andere cryptocurrency hebt kan je deze makkelijk inwisselen voor Ether met Shapeshift.

Wij raden aan een hoeveelheid van tussen de 0.25 en 1 Ether om te wisselen.", + "mineItDescription": "Op het testnetwerk kun je zelf Ether mijnen door te gaan naar het Ontwikkelaars menu en te kiezen voor Begin Mining.
PROBEER GEEN ECHTE ETHER NAAR DIT ADRES TE VERSTUREN ", + "you": "Je", + "etherbase": "Centrale account (Etherbase)", "depositBitcoin": "Bitcoin Storten", - "learnIt": "Leer terwijl u wacht", + "viaShapeshift": "Direct omwisselen via Shapeshift", + "learnIt": "Leer terwijl je wacht", "downloadingBlocks": "Blokken downloaden", - "tutorial1Description": "

Het enige wat er nog moet gebeuren is wachten tot de download compleet is. Hier zijn een aantal leessuggesties:

Maak uw eigen geld

Maak een cryptocurrency met een vaste uitgeveven hoeveelheid, tokens die vermogen uit de echte wereld voorstellen, etc

", + "syncMessage": "Blok __displayBlock__ van __highestBlockString__", + "syncMessageWithStates": "Blok __displayBlock__ van __highestBlockString__ (Chain structuur __statesPercent__%)", + "startingSync": "Wachten op synchronisatie..", + "tutorial1Description": "

Het enige wat er nog moet gebeuren is wachten tot de download compleet is. Hier zijn een aantal leessuggesties:

Maak je eigen geld

Maak een cryptocurrency met een vaste uitgeveven hoeveelheid, tokens die vermogen uit de echte wereld voorstellen, etc

", "tutorial2Description": "

Start een crowdsale

Haal geld op voor een gemeenschappelijk doel, volledig betrouwbaar zonder derde partij. Ga om het traditionele systeem heen en haal geld direct bij de bron op door een organisatie te crowdfunden via de blockchain

", - "tutorial3Description": "

Blockchain Organisatie

Maak een autonome organisatie aan met onbreekbare regels over het uitgeven van geld en wie beslissingen kan maken. Laat uw investeerders een actieve rol nemen in het besluiten hoe geld wordt uitgegeven

", + "tutorial3Description": "

Blockchain Organisatie

Maak een autonome organisatie aan met onbreekbare regels over het uitgeven van geld en wie beslissingen kan maken. Laat je investeerders een actieve rol nemen in het besluiten hoe geld wordt uitgegeven

", "buttons": { "showPassword": "Toon wachtwoord", "importAccount": "Importeer account", @@ -230,40 +268,25 @@ "learnReceipt": "Leer dit recept" }, "errors": { - "nodeNotStartedYet": "Wacht nog een aantal seconden tot uw node volledig is opgestart en probeer het nog een keer", + "nodeNotStartedYet": "Wacht nog een aantal seconden tot je node volledig is opgestart en probeer het nog een keer", "unknownFile": "Bestand niet herkent.", "wrongPassword": "Incorrect wachtwoord.", - "importFailed": "Kon bestand niet inporteren en kreeg: __error__" - }, - "viaShapeshift": "Instant conversion via Shapeshift", - "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" - }, - "updateAvailable": { - "newVersionAvailable": "New __name__ version available", - "version": "Version", - "downloadURL": "Download URL", - "checksum": "Checksum", - "downloadAndRestart": "Update and Restart", - "download": "Download new version", - "skipUpdate": "Skip Update", - "notNow": "Ask me later", - "checking": "Checking for updates to __name__...", - "noUpdateFound": "No update found. You are running the latest version of __name__." + "importFailed": "Bestand importeren mislukt: __error__" + } }, "connectAccount": { - "chooseAccountTitle": "Choose account", - "createAccount": "Create new account", - "pinToSidebar": "Pin app to the sidebar", - "connectAccountDescription": "You are sharing your identity with __dappName__. This allows the app to see any public information of your accounts, including balances connected to it." + "chooseAccountTitle": "Kies account", + "createAccount": "Creëer nieuw account", + "pinToSidebar": "Pin app aan de sidebar", + "connectAccountDescription": "Je deelt je indentiteit met __dappName__. Hierdoor heeft de app toegen tot alle openbare informatie van uw accounts inclusief de saldi." } } }, "elements": { - "checksumAlert": "Dit adres ziet er valide uit, maar het mist een aantal beveiligingsfuncties die u zullen beschermen teken typfouten, dus ga graag even na of dit de goede is. Als aangeveven, ga na of het beveiligingsicoon klopt.", + "checksumAlert": "Dit adres ziet er valide uit, maar het mist een aantal beveiligingsfuncties die je zullen beschermen teken typfouten, dus ga graag even na of dit de goede is. Als aangeveven, ga na of het beveiligingsicoon klopt.", "identiconHelper": "Dit is een beveilliginsicoon, als er enige veranderingen op dit adres plaats vinden dan zou er een volledig ander icoon moeten staan", "type": { - "address": "Address", + "address": "Adres", "bool": "Boolean", "int": "Integer", "uint": "Natural Number", diff --git a/interface/i18n/mist.pt.i18n.json b/interface/i18n/mist.pt.i18n.json index a6293987b..8a63a7806 100644 --- a/interface/i18n/mist.pt.i18n.json +++ b/interface/i18n/mist.pt.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Contas", - "importPresale": "Importar conta da pré-venda", + "importPresale": "Importar conta", "newAccount": "Nova conta", "backup": "Cópia de segurança", "backupKeyStore": "Contas", @@ -47,7 +47,11 @@ "mainNetwork": "Rede principal", "startMining": "⛏ Iniciar mineração (somente em teste)", "stopMining": "⛏ Parar mineração", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Janela", @@ -70,7 +74,7 @@ "linux": "Para instalar um servidor de tempo, instale \"ntp\" via \"apt-get install ntp\".", "darwin": "Abra suas preferências, escolha \"preferências de tempo\" e marque \"Ajustar o tempo automaticamente\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.ru.i18n.json b/interface/i18n/mist.ru.i18n.json index 8ce816d1f..7f4a73b8a 100644 --- a/interface/i18n/mist.ru.i18n.json +++ b/interface/i18n/mist.ru.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Аккаунты", - "importPresale": "Импорт предпродажных аккаунтов", + "importPresale": "Импорт аккаунтов", "newAccount": "Создать аккаунт", "backup": "Резервное копирование", "backupKeyStore": "Аккаунтов", @@ -47,7 +47,11 @@ "mainNetwork": "Основная сеть", "startMining": "⛏ Запустить майнинг (только для тестовой сети)", "stopMining": "⛏ Остановить майнинг", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Окно", @@ -70,7 +74,7 @@ "linux": "Чтобы использовать сервер синхронизации времени установите \"ntp\" через команду \"apt-get install ntp\".", "darwin": "Для включения синхронизации времени откройте системные настройки и укажите: \"Устанавливать время и дату автоматически\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -239,19 +243,24 @@ "wrongPassword": "Неверный пароль.", "importFailed": "Не удалось импортировать файл, дополнительно: __error__" }, - "accountTitleTestnet": "Mine some!" - }, - "clientUpdateAvailable": { - "downloadAndRestart": "Update and Restart", - "download": "Update", - "skipUpdate": "Skip Update", - "newVersionAvailable": "New Ethereum node versions are available!" + "accountTitleTestnet": "Mine some!", + "startingSync": "Getting ready to sync.." }, "connectAccount": { "chooseAccountTitle": "Choose account", "createAccount": "Create new account", "pinToSidebar": "Pin app to the sidebar", "connectAccountDescription": "You are sharing your identity with __dappName__. This allows the app to see any public information of your accounts, including balances connected to it." + }, + "requestAccount": { + "title": "Create account", + "enterPassword": "Enter password", + "repeatPassword": "Repeat password", + "creating": "Generating account...", + "errors": { + "passwordMismatch": "Your passwords don't match.", + "passwordTooShort": "Make a longer password" + } } } }, @@ -267,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.sq.i18n.json b/interface/i18n/mist.sq.i18n.json index c8312af25..8f7713eaa 100644 --- a/interface/i18n/mist.sq.i18n.json +++ b/interface/i18n/mist.sq.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "Llogari", - "importPresale": "Merr llogari të para-shitur", + "importPresale": "Merr llogari", "newAccount": "Llogari e re", "backup": "Ruaj një kopje rezervë", "backupKeyStore": "Llogari", @@ -47,7 +47,11 @@ "mainNetwork": "Rrjeti kryesor", "startMining": "⛏ Fillo të Prodhosh (Rrjet testimi)", "stopMining": "⛏ Ndalo së Prodhuari", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "Dritare", @@ -70,7 +74,7 @@ "linux": "Që të fusni në punë një server kohe të sinkronizuar instaloni \"ntp\" nëpërmjet \"apt-get install ntp\".", "darwin": "Që të mundësoni një sinkronizim kohe, hapni preferencat e kohes dhe përzgjidhni \"Set the time and date automatically\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", diff --git a/interface/i18n/mist.zh-TW.i18n.json b/interface/i18n/mist.zh-TW.i18n.json index eb33f3286..0a204209c 100644 --- a/interface/i18n/mist.zh-TW.i18n.json +++ b/interface/i18n/mist.zh-TW.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "帳號", - "importPresale": "導入預售帳號", + "importPresale": "導入帳號", "newAccount": "新建帳號", "backup": "備份", "backupKeyStore": "帳號", @@ -47,7 +47,11 @@ "mainNetwork": "主網路", "startMining": "⛏ 開啓挖礦(僅限Testnet網路)", "stopMining": "⛏ 停止挖礦", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "視窗", @@ -70,7 +74,7 @@ "linux": "爲開啓時間同步伺服器,請通過\"apt-get install ntp\"安裝\"ntp\"。", "darwin": "爲開啓時間同步,打開時間選項並勾選\"Set the time and date automatically\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/interface/i18n/mist.zh.i18n.json b/interface/i18n/mist.zh.i18n.json index fb2754d7d..32b67136a 100644 --- a/interface/i18n/mist.zh.i18n.json +++ b/interface/i18n/mist.zh.i18n.json @@ -28,7 +28,7 @@ }, "accounts": { "label": "账户", - "importPresale": "导入预售账户", + "importPresale": "导入账户", "newAccount": "新建账户", "backup": "备份", "backupKeyStore": "账户", @@ -47,7 +47,11 @@ "mainNetwork": "主网络", "startMining": "⛏ 开启挖矿(仅限Testnet网络)", "stopMining": "⛏ 停止挖矿", - "externalNode": "using external node" + "externalNode": "using external node", + "openRemix": "Open Remix IDE", + "nodeMode": "Chain download", + "fullNode": "Store full blockchain", + "lightNode": "Use light Node (experimental!)" }, "window": { "label": "窗口", @@ -70,7 +74,7 @@ "linux": "为开启时间同步服务器,请通过\"apt-get install ntp\"安装\"ntp\"。", "darwin": "为开启时间同步,打开时间选项并勾选\"Set the time and date automatically\"." }, - "nodeChecksumMismatch": { + "nodeChecksumMismatch": { "title": "Checksum mismatch in downloaded node!", "description": "__algorithm__: __hash__\n\nPlease install the __type__ node version __version__ manually." }, @@ -237,7 +241,8 @@ }, "viaShapeshift": "Instant conversion via Shapeshift", "syncMessage": "Block __displayBlock__ of __highestBlockString__", - "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)" + "syncMessageWithStates": "Block __displayBlock__ of __highestBlockString__ (Chain structure __statesPercent__%)", + "startingSync": "Getting ready to sync.." }, "updateAvailable": { "newVersionAvailable": "New __name__ version available", @@ -271,4 +276,4 @@ "bytes": "Bytes" } } -} +} \ No newline at end of file diff --git a/main.js b/main.js index 302a1662e..b11a553b6 100644 --- a/main.js +++ b/main.js @@ -1,8 +1,3 @@ -const squirrelStartup = require('electron-squirrel-startup'); -// windows only: don't run app during squirrel-install -function exit() { return; } -if (squirrelStartup) exit(); - global._ = require('./modules/utils/underscore'); const { app, dialog, ipcMain, shell } = require('electron'); @@ -415,7 +410,7 @@ onReady = () => { splashWindow.show(); } - if (Settings.inAutoTestMode) { + if (!Settings.inAutoTestMode) { return syncResultPromise; } diff --git a/modules/clientBinaryManager.js b/modules/clientBinaryManager.js index 7cb5c5e1a..0fa9b5817 100644 --- a/modules/clientBinaryManager.js +++ b/modules/clientBinaryManager.js @@ -73,6 +73,8 @@ class Manager extends EventEmitter { log.warn('Error fetching client binaries config from repo', err); }) .then((latestConfig) => { + if(!latestConfig) return; + let localConfig; let skipedVersion; const nodeVersion = latestConfig.clients[nodeType].version; @@ -178,7 +180,9 @@ class Manager extends EventEmitter { .then((localConfig) => { if (!localConfig) { log.info('No config for the ClientBinaryManager could be loaded, using local clientBinaries.json.'); - localConfig = require('../clientBinaries.json'); + + const localConfigPath = path.join(Settings.userDataPath, 'clientBinaries.json'); + localConfig = (fs.existsSync(localConfigPath)) ? require(localConfigPath) : require('../clientBinaries.json'); // eslint-disable-line no-param-reassign, global-require, import/no-dynamic-require, import/no-unresolved } // scan for node diff --git a/modules/db.js b/modules/db.js index 3b5fbd102..c7d95ce58 100644 --- a/modules/db.js +++ b/modules/db.js @@ -1,5 +1,4 @@ const fs = require('fs'); -const path = require('path'); const Q = require('bluebird'); const Loki = require('lokijs'); const Settings = require('./settings'); @@ -10,7 +9,7 @@ let db; exports.init = () => { - const filePath = path.join(Settings.userDataPath, 'mist.lokidb'); + const filePath = Settings.dbFilePath; return Q.try(() => { // if db file doesn't exist then create it diff --git a/modules/dbSync.js b/modules/dbSync.js index eda6e81f8..b21f9b22d 100644 --- a/modules/dbSync.js +++ b/modules/dbSync.js @@ -14,13 +14,13 @@ exports.backendSyncInit = function () { ipc.on('dbSync-add', (event, args) => { let collName = args.collName, - coll = db.getCollection('UI_'+ collName); + coll = db.getCollection(`UI_${collName}`); log.trace('dbSync-add', collName, args._id); const _id = args._id; - if (!coll.by("_id", _id)) { + if (!coll.by('_id', _id)) { args.fields._id = _id; coll.insert(args.fields); } @@ -28,12 +28,12 @@ exports.backendSyncInit = function () { ipc.on('dbSync-changed', (event, args) => { let collName = args.collName, - coll = db.getCollection('UI_'+ collName); + coll = db.getCollection(`UI_${collName}`); log.trace('dbSync-changed', collName, args._id); const _id = args._id; - const item = coll.by("_id", _id); + const item = coll.by('_id', _id); if (item) { for (const k in args.fields) { @@ -50,12 +50,12 @@ exports.backendSyncInit = function () { ipc.on('dbSync-removed', (event, args) => { let collName = args.collName, - coll = db.getCollection('UI_'+ collName); + coll = db.getCollection(`UI_${collName}`); log.trace('dbSync-removed', collName, args._id); const _id = args._id; - const item = coll.by("_id", _id); + const item = coll.by('_id', _id); if (item) { coll.remove(item); @@ -67,7 +67,7 @@ exports.backendSyncInit = function () { // Get all data (synchronous) ipc.on('dbSync-reloadSync', (event, args) => { let collName = args.collName, - coll = db.getCollection('UI_'+ collName), + coll = db.getCollection(`UI_${collName}`), docs = coll.find(); log.debug('dbSync-reloadSync, no. of docs:', collName, docs.length); @@ -88,15 +88,15 @@ exports.backendSyncInit = function () { }); }; -var syncDataFromBackend = function(coll){ - let ipc = ipcRenderer; +const syncDataFromBackend = function (coll) { + const ipc = ipcRenderer; - let collName = coll._name; + const collName = coll._name; console.debug('Load collection data from backend: ', collName); return new Promise((resolve, reject) => { - let dataJson = ipc.sendSync('dbSync-reloadSync', { + const dataJson = ipc.sendSync('dbSync-reloadSync', { collName, }); @@ -105,8 +105,9 @@ var syncDataFromBackend = function(coll){ coll.remove({}); - if(!dataJson.length) + if (!dataJson.length) { resolve(); + } // we do inserts slowly, to avoid race conditions when it comes // to updating the UI @@ -120,10 +121,11 @@ var syncDataFromBackend = function(coll){ record.redirect = null; } - if(record._id) + if (record._id) { coll.upsert(record._id, record); - else + } else { coll.insert(record); + } } catch (err) { console.error(err.toString()); } @@ -138,7 +140,7 @@ var syncDataFromBackend = function(coll){ } catch (err) { reject(err); } - }) + }); }; exports.syncDataFromBackend = syncDataFromBackend; @@ -146,8 +148,8 @@ exports.frontendSyncInit = function (coll) { let ipc = ipcRenderer, syncDoneResolver; - let collName = coll._name; - + const collName = coll._name; + coll.onceSynced = new Promise((resolve, reject) => { syncDoneResolver = resolve; }); diff --git a/modules/ethereumNode.js b/modules/ethereumNode.js index 2932dac0a..b37c67e8e 100644 --- a/modules/ethereumNode.js +++ b/modules/ethereumNode.js @@ -315,13 +315,14 @@ class EthereumNode extends EventEmitter { this._network = network; this._type = nodeType; - let client = ClientBinaryManager.getClient(nodeType); + const client = ClientBinaryManager.getClient(nodeType); let binPath; - if(client) + if (client) { binPath = client.binPath; - else + } else { throw new Error(`Node "${nodeType}" binPath is not available.`); + } log.info(`Start node using ${binPath}`); @@ -358,7 +359,7 @@ class EthereumNode extends EventEmitter { // START MAINNET else { args = (nodeType === 'geth') - ? ['--fast', '--cache', '1024'] + ? ['--fast', '--cache', '1024'] : ['--unsafe-transactions']; } diff --git a/modules/ipc/dechunker.js b/modules/ipc/dechunker.js index a77e54866..3bf74b22c 100644 --- a/modules/ipc/dechunker.js +++ b/modules/ipc/dechunker.js @@ -39,8 +39,9 @@ module.exports = class Dechunker { return _.each(dechunkedData, (data) => { // prepend the last chunk - if (this.lastChunk) - { data = this.lastChunk + data; } + if (this.lastChunk) { + data = this.lastChunk + data; + } let result = data; diff --git a/modules/ipc/ipcProviderBackend.js b/modules/ipc/ipcProviderBackend.js index 8ce1b4040..ee9bb46d3 100644 --- a/modules/ipc/ipcProviderBackend.js +++ b/modules/ipc/ipcProviderBackend.js @@ -20,7 +20,7 @@ const Windows = require('../windows'); const ERRORS = { - INVALID_PAYLOAD: { code: -32600, message: 'Payload invalid.' }, + INVALID_PAYLOAD: { code: -32600, message: 'Payload, or some of its content properties are invalid. Please check if they are valid HEX.' }, METHOD_DENIED: { code: -32601, message: "Method \'__method__\' not allowed." }, METHOD_TIMEOUT: { code: -32603, message: "Request timed out for method \'__method__\'." }, TX_DENIED: { code: -32603, message: 'Transaction denied' }, @@ -100,8 +100,7 @@ class IpcProviderBackend { socket.destroy().finally(() => { - if(!owner.isDestroyed()) - owner.send(`ipcProvider-${ev}`, JSON.stringify(data)); + if (!owner.isDestroyed()) { owner.send(`ipcProvider-${ev}`, JSON.stringify(data)); } }); delete this._connections[ownerId]; @@ -110,8 +109,9 @@ class IpcProviderBackend { }); socket.on('connect', (data) => { - if(!owner.isDestroyed()) + if (!owner.isDestroyed()) { owner.send('ipcProvider-connect', JSON.stringify(data)); + } }); // pass notifications back up the chain @@ -124,8 +124,9 @@ class IpcProviderBackend { data = this._makeResponsePayload(data, data); } - if(!owner.isDestroyed()) + if (!owner.isDestroyed()) { owner.send('ipcProvider-data', JSON.stringify(data)); + } }); } }) @@ -172,8 +173,9 @@ class IpcProviderBackend { } }) .then(() => { - if(!owner.isDestroyed()) + if (!owner.isDestroyed()) { owner.send('ipcProvider-setWritable', true); + } return this._connections[ownerId]; }); @@ -356,7 +358,7 @@ class IpcProviderBackend { if (isSync) { event.returnValue = returnValue; - } else if(!event.sender.isDestroyed()) { + } else if (!event.sender.isDestroyed()) { event.sender.send('ipcProvider-data', returnValue); } }); diff --git a/modules/ipc/methods/eth_sendTransaction.js b/modules/ipc/methods/eth_sendTransaction.js index fc90f073f..d6e4b29b2 100644 --- a/modules/ipc/methods/eth_sendTransaction.js +++ b/modules/ipc/methods/eth_sendTransaction.js @@ -34,13 +34,19 @@ module.exports = class extends BaseProcessor { // validate data try { - _.each(payload.params[0], (val) => { + _.each(payload.params[0], (val, key) => { // if doesn't have hex then leave if (_.isString(val)) { + + // make sure all data is lowercase and has 0x + if (val) val = `0x${val.toLowerCase().replace('0x', '')}`; + if (val.match(/[^0-9a-fx]/igm)) { throw this.ERRORS.INVALID_PAYLOAD; } } + + payload.params[0][key] = val; }); } catch (err) { return reject(err); @@ -70,8 +76,7 @@ module.exports = class extends BaseProcessor { ipc.once('backendAction_unlockedAccountAndSentTransaction', (ev, err, result) => { if (Windows.getById(ev.sender.id) === modalWindow - && !modalWindow.isClosed) - { + && !modalWindow.isClosed) { if (err || !result) { this._log.debug('Confirmation error', err); diff --git a/modules/ipcCommunicator.js b/modules/ipcCommunicator.js index a833daea5..0d0affe35 100644 --- a/modules/ipcCommunicator.js +++ b/modules/ipcCommunicator.js @@ -5,10 +5,14 @@ Window communication */ const _ = global._; +const fs = require('fs'); const { app, ipcMain: ipc, shell, webContents } = require('electron'); const Windows = require('./windows'); const logger = require('./utils/logger'); const appMenu = require('./menuItems'); +const Settings = require('./settings'); +const ethereumNode = require('./ethereumNode.js'); +const keyfileRecognizer = require('ethereum-keyfile-recognizer'); const log = logger.create('ipcCommunicator'); @@ -62,7 +66,7 @@ ipc.on('backendAction_windowCallback', (e, value1, value2, value3) => { const windowId = e.sender.id; const senderWindow = Windows.getById(windowId); - if(senderWindow.callback) { + if (senderWindow.callback) { senderWindow.callback(value1, value2, value3); } }); @@ -100,48 +104,99 @@ ipc.on('backendAction_setLanguage', (e, lang) => { ipc.on('backendAction_stopWebviewNavigation', (e, id) => { console.log('webcontent ID', id); - var webContent = webContents.fromId(id); + const webContent = webContents.fromId(id); - if(webContent && !webContent.isDestroyed()) + if (webContent && !webContent.isDestroyed()) { webContent.stop(); + } e.returnValue = true; }); +// check wallet file +ipc.on('backendAction_checkWalletFile', (e, path) => { + + log.warn(111); + fs.readFile(path, 'utf8', (event, data) => { + try { + const wallet = JSON.parse(data); + const result = keyfileRecognizer(wallet); + /** result + * [ 'ethersale', undefined ] Ethersale keyfile + * [ 'web3', 3 ] web3 (v3) keyfile + * null no valid keyfile + */ + + if (_.first(result) === 'ethersale') { + e.sender.send('uiAction_checkedWalletFile', null, 'presale'); + } else if (_.first(result) === 'web3') { + e.sender.send('uiAction_checkedWalletFile', null, 'web3'); + + let keystorePath = Settings.userHomePath; + // eth + if (ethereumNode.isEth) { + if (process.platform === 'win32') { + keystorePath = `${Settings.appDataPath}\\Web3\\keys`; + } else { + keystorePath += '/.web3/keys'; + } + // geth + } else { + if (process.platform === 'darwin') keystorePath += '/Library/Ethereum/keystore'; + + if (process.platform === 'freebsd' || + process.platform === 'linux' || + process.platform === 'sunos') keystorePath += '/.ethereum/keystore'; + + if (process.platform === 'win32') keystorePath = `${Settings.appDataPath}\\Ethereum\\keystore`; + } + + fs.writeFile(`${keystorePath}/0x${wallet.address}`, data, (err) => { + if (err) throw new Error("Can't write file to disk"); + }); + } else { + throw new Error('Wallet import: Cannot recognize keyfile'); + } + } catch (err) { + e.sender.send('uiAction_checkedWalletFile', null, 'invalid'); + log.error(err); + } + }); +}); + -// import presale file -ipc.on('backendAction_importPresaleFile', (e, path, pw) => { - const spawn = require('child_process').spawn; - const ClientBinaryManager = require('./clientBinaryManager'); +// import presale wallet +ipc.on('backendAction_importWalletFile', (e, path, pw) => { + const spawn = require('child_process').spawn; // eslint-disable-line global-require + const ClientBinaryManager = require('./clientBinaryManager'); // eslint-disable-line global-require let error = false; const binPath = ClientBinaryManager.getClient('geth').binPath; - - // start import process const nodeProcess = spawn(binPath, ['wallet', 'import', path]); nodeProcess.once('error', () => { error = true; - e.sender.send('uiAction_importedPresaleFile', 'Couldn\'t start the "geth wallet import " process.'); + e.sender.send('uiAction_importedWalletFile', 'Couldn\'t start the "geth wallet import " process.'); }); - nodeProcess.stdout.on('data', (data) => { - var data = data.toString(); - if (data) - { log.info('Imported presale: ', data); } + nodeProcess.stdout.on('data', (_data) => { + const data = _data.toString(); + if (data) { + log.info('Imported presale: ', data); + } if (/Decryption failed|not equal to expected addr|could not decrypt/.test(data)) { - e.sender.send('uiAction_importedPresaleFile', 'Decryption Failed'); + e.sender.send('uiAction_importedWalletFile', 'Decryption Failed'); - // if imported, return the address + // if imported, return the address } else if (data.indexOf('Address:') !== -1) { const find = data.match(/\{([a-f0-9]+)\}/i); if (find.length && find[1]) { - e.sender.send('uiAction_importedPresaleFile', null, `0x${find[1]}`); + e.sender.send('uiAction_importedWalletFile', null, `0x${find[1]}`); } else { - e.sender.send('uiAction_importedPresaleFile', data); + e.sender.send('uiAction_importedWalletFile', data); } - // if not stop, so we don't kill the process + // if not stop, so we don't kill the process } else { return; } @@ -155,7 +210,7 @@ ipc.on('backendAction_importPresaleFile', (e, path, pw) => { setTimeout(() => { if (!error) { nodeProcess.stdin.write(`${pw}\n`); - pw = null; + pw = null; // eslint-disable-line no-param-reassign } }, 2000); }); @@ -183,7 +238,7 @@ ipc.on('mistAPI_requestAccount', (e) => { ownerId: e.sender.id, electronOptions: { width: 460, - height: 497, + height: 520, maximizable: false, minimizable: false, alwaysOnTop: true, diff --git a/modules/menuItems.js b/modules/menuItems.js index 39b26a8c2..7545068dd 100644 --- a/modules/menuItems.js +++ b/modules/menuItems.js @@ -13,10 +13,10 @@ const ClientBinaryManager = require('./clientBinaryManager'); const switchForSystem = function (options) { if (process.platform in options) { return options[process.platform]; - } - else if ('default' in options) { + } else if ('default' in options) { return options.default; } + return null; }; @@ -298,7 +298,7 @@ let menuTempl = function (webviews) { // DEVELOP - let devToolsMenu = []; + const devToolsMenu = []; // change for wallet if (Settings.uiMode === 'mist') { @@ -338,16 +338,40 @@ let menuTempl = function (webviews) { } const externalNodeMsg = (ethereumNode.isOwnNode) ? '' : ` (${i18n.t('mist.applicationMenu.develop.externalNode')})`; - devToolsMenu = [{ + devToolsMenu.push({ label: i18n.t('mist.applicationMenu.develop.devTools'), submenu: devtToolsSubMenu, - }, { + }); + + if (Settings.uiMode === 'mist') { + devToolsMenu.push({ + label: i18n.t('mist.applicationMenu.develop.openRemix'), + enabled: true, + click() { + Windows.createPopup('remix', { + url: 'https://remix.ethereum.org', + electronOptions: { + width: 1024, + height: 720, + center: true, + frame: true, + resizable: true, + titleBarStyle: 'default', + } + }); + }, + }); + } + + devToolsMenu.push({ label: i18n.t('mist.applicationMenu.develop.runTests'), enabled: (Settings.uiMode === 'mist'), click() { Windows.getByType('main').send('uiAction_runTests', 'webview'); }, - }, { + }); + + devToolsMenu.push({ label: i18n.t('mist.applicationMenu.develop.logFiles') + externalNodeMsg, enabled: ethereumNode.isOwnNode, click() { @@ -358,9 +382,7 @@ let menuTempl = function (webviews) { log = 'Couldn\'t load log file.'; } }, - }, - ]; - + }); // add node switching menu devToolsMenu.push({ diff --git a/modules/nodeSync.js b/modules/nodeSync.js index 294ffca8e..558b19584 100644 --- a/modules/nodeSync.js +++ b/modules/nodeSync.js @@ -149,7 +149,7 @@ class NodeSync extends EventEmitter { const diff = now - +blockResult.timestamp; - log.debug(`Last block: ${blockResult.number}, ${diff}s ago`); + log.debug(`Last block: ${Number(blockResult.number)}, ${diff}s ago`); // need sync if > 1 minute if (diff > 60) { diff --git a/modules/preloader/browser.js b/modules/preloader/browser.js index 92b1241e5..1ba237466 100644 --- a/modules/preloader/browser.js +++ b/modules/preloader/browser.js @@ -18,7 +18,7 @@ ipcRenderer.sendToHost('setWebviewId'); ipcRenderer.send('ipcProvider-destroy'); // Security -process.on('loaded',function () { +process.on('loaded', function () { Object.freeze(window.JSON); // Object.freeze(window.Function); // Object.freeze(window.Function.prototype); diff --git a/modules/preloader/include/getFavicon.js b/modules/preloader/include/getFavicon.js index 6e67db48f..be7e26f2d 100644 --- a/modules/preloader/include/getFavicon.js +++ b/modules/preloader/include/getFavicon.js @@ -12,10 +12,11 @@ const { ipcRenderer } = require('electron'); function DOMContentLoaded(event) { const icon = document.querySelector('link[rel="apple-touch-icon"]') || document.querySelector('link[type="image/x-icon"]') || document.querySelector('link[rel="shortcut"]') || document.querySelector('link[rel="shortcut icon"]') || document.querySelector('link[rel="icon"]'); - if (icon) - { ipcRenderer.sendToHost('favicon', icon.href); } - else - { ipcRenderer.sendToHost('favicon', null); } + if (icon) { + ipcRenderer.sendToHost('favicon', icon.href); + } else { + ipcRenderer.sendToHost('favicon', null); + } document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false); } diff --git a/modules/preloader/include/getMetaTags.js b/modules/preloader/include/getMetaTags.js index 233a1260b..6186ddade 100644 --- a/modules/preloader/include/getMetaTags.js +++ b/modules/preloader/include/getMetaTags.js @@ -4,7 +4,7 @@ Gest the meta[name="ethereum-dapp-url-bar-style"] meta tag @module getMetaTags */ -const { ipcRenderer } = require('electron'); +const { ipcRenderer } = require('electron'); module.export = (function () { document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); @@ -12,10 +12,11 @@ module.export = (function () { function DOMContentLoaded(event) { const appBar = document.querySelector('meta[name="ethereum-dapp-url-bar-style"]'); - if (appBar) - { ipcRenderer.sendToHost('appBar', appBar.content); } - else - { ipcRenderer.sendToHost('appBar', null); } + if (appBar) { + ipcRenderer.sendToHost('appBar', appBar.content); + } else { + ipcRenderer.sendToHost('appBar', null); + } document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false); } diff --git a/modules/preloader/include/mistAPI.js b/modules/preloader/include/mistAPI.js index bd2389128..d931ac38a 100644 --- a/modules/preloader/include/mistAPI.js +++ b/modules/preloader/include/mistAPI.js @@ -56,6 +56,9 @@ module.exports = () => { ipcRenderer.send('mistAPI_requestAccount'); }, + solidity: { + version: String(packageJson.dependencies.solc).match(/\d+\.\d+\.\d+/)[0], + }, sounds: { bip: function playSound() { ipcRenderer.sendToHost('mistAPI_sound', `file://${__dirname}/../../../sounds/bip.mp3`); @@ -102,7 +105,7 @@ module.exports = () => { @param {Function} callback Change the callback to be called when the menu is pressed. */ add(id, options, callback) { - var args = Array.prototype.slice.call(arguments); + const args = Array.prototype.slice.call(arguments); callback = _.isFunction(args[args.length - 1]) ? args.pop() : null; options = _.isObject(args[args.length - 1]) ? args.pop() : null; id = _.isString(args[args.length - 1]) || _.isFinite(args[args.length - 1]) ? args.pop() : null; diff --git a/modules/preloader/include/openExternal.js b/modules/preloader/include/openExternal.js index 962eebb19..b4f484d64 100644 --- a/modules/preloader/include/openExternal.js +++ b/modules/preloader/include/openExternal.js @@ -12,10 +12,11 @@ document.addEventListener('click', (e) => { let node = false; - if (e.target.nodeName === 'A') - { node = e.target; } - else if (e.target.parentNode && e.target.parentNode.nodeName === 'A') - { node = e.target.parentNode; } + if (e.target.nodeName === 'A') { + node = e.target; + } else if (e.target.parentNode && e.target.parentNode.nodeName === 'A') { + node = e.target.parentNode; + } // open in browser if (node && node.attributes.target && node.attributes.target.value === '_blank') { diff --git a/modules/preloader/include/openPopup.js b/modules/preloader/include/openPopup.js index 54a1e1278..ddaa73720 100644 --- a/modules/preloader/include/openPopup.js +++ b/modules/preloader/include/openPopup.js @@ -10,10 +10,11 @@ const { remote } = require('electron'); document.addEventListener('click', (e) => { let node = false; - if (e.target.nodeName === 'A') - { node = e.target; } - else if (e.target.parentNode && e.target.parentNode.nodeName === 'A') - { node = e.target.parentNode; } + if (e.target.nodeName === 'A') { + node = e.target; + } else if (e.target.parentNode && e.target.parentNode.nodeName === 'A') { + node = e.target.parentNode; + } // open popup if (node && node.attributes.target && node.attributes.target.value === '_popup') { @@ -25,6 +26,6 @@ document.addEventListener('click', (e) => { nodeIntegration: false, } }); - win.loadURL(node.href, true); + win.loadURL(node.href); } }, false); diff --git a/modules/preloader/mistUI.js b/modules/preloader/mistUI.js index b1dd85be2..a42f50508 100644 --- a/modules/preloader/mistUI.js +++ b/modules/preloader/mistUI.js @@ -56,11 +56,12 @@ ipcRenderer.on('uiAction_windowMessage', (e, type, id, error, value) => { } // forward to the webview (TODO: remove and manage in the ipcCommunicator?) - var tab = Tabs.findOne({ webviewId: id }); - if(tab) { - webview = $('webview[data-id='+ tab._id +']')[0]; - if(webview) + const tab = Tabs.findOne({ webviewId: id }); + if (tab) { + webview = $(`webview[data-id=${tab._id}]`)[0]; + if (webview) { webview.send('uiAction_windowMessage', type, error, value); + } } }); @@ -73,20 +74,22 @@ ipcRenderer.on('uiAction_enableBlurOverlay', (e, value) => { ipcRenderer.on('uiAction_toggleWebviewDevTool', (e, id) => { const webview = Helpers.getWebview(id); - if (!webview) - { return; } + if (!webview) { + return; + } - if (webview.isDevToolsOpened()) - { webview.closeDevTools(); } - else - { webview.openDevTools(); } + if (webview.isDevToolsOpened()) { + webview.closeDevTools(); + } else { + webview.openDevTools(); + } }); // randomize accounts and drop half // also certainly remove the web3.ethbase one -var randomizeAccounts = (acc, coinbase) => { - var accounts = _.shuffle(acc); +const randomizeAccounts = (acc, coinbase) => { + let accounts = _.shuffle(acc); accounts = _.rest(accounts, (accounts.length / 2).toFixed(0)); accounts = _.without(accounts, coinbase); return accounts; @@ -117,7 +120,7 @@ ipcRenderer.on('uiAction_runTests', (e, type) => { // update the permissions, when accounts change Tracker.autorun(() => { - var accountList = _.pluck(EthAccounts.find({}, { fields: { address: 1 } }).fetch(), 'address'); + const accountList = _.pluck(EthAccounts.find({}, { fields: { address: 1 } }).fetch(), 'address'); Tabs.update('tests', { $set: { 'permissions.accounts': randomizeAccounts(accountList, coinbase), @@ -128,7 +131,6 @@ ipcRenderer.on('uiAction_runTests', (e, type) => { } }); - // CONTEXT MENU const currentMousePosition = { x: 0, y: 0 }; @@ -136,18 +138,21 @@ const menu = new Menu(); // menu.append(new MenuItem({ type: 'separator' })); menu.append(new MenuItem({ label: i18n.t('mist.rightClick.reload'), accelerator: 'Command+R', click() { const webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) - { webview.reloadIgnoringCache(); } + if (webview) { + webview.reloadIgnoringCache(); + } } })); menu.append(new MenuItem({ label: i18n.t('mist.rightClick.openDevTools'), click() { const webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) - { webview.openDevTools(); } + if (webview) { + webview.openDevTools(); + } } })); menu.append(new MenuItem({ label: i18n.t('mist.rightClick.inspectElements'), click() { const webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) - { webview.inspectElement(currentMousePosition.x, currentMousePosition.y); } + if (webview) { + webview.inspectElement(currentMousePosition.x, currentMousePosition.y); + } } })); @@ -167,7 +172,8 @@ document.addEventListener('keydown', (e) => { // RELOAD current webview if (e.metaKey && e.keyCode === 82) { const webview = Helpers.getWebview(LocalStore.get('selectedTab')); - if (webview) - { webview.reloadIgnoringCache(); } + if (webview) { + webview.reloadIgnoringCache(); + } } }, false); diff --git a/modules/preloader/walletMain.js b/modules/preloader/walletMain.js index 9b4909579..7bb9115f8 100644 --- a/modules/preloader/walletMain.js +++ b/modules/preloader/walletMain.js @@ -17,6 +17,7 @@ setTimeout(() => { }, 1000); setTimeout(() => { - if (document.getElementsByTagName('html')[0]) - { document.getElementsByTagName('html')[0].className = window.platform; } + if (document.getElementsByTagName('html')[0]) { + document.getElementsByTagName('html')[0].className = window.platform; + } }, 500); diff --git a/modules/settings.js b/modules/settings.js index 353cc0fb4..6f81ff7ec 100644 --- a/modules/settings.js +++ b/modules/settings.js @@ -156,6 +156,11 @@ class Settings { return app.getPath('userData'); } + get dbFilePath() { + const dbFileName = (this.inAutoTestMode) ? 'mist.test.lokidb' : 'mist.lokidb'; + return path.join(this.userDataPath, dbFileName); + } + get appDataPath() { // Application Support/ return app.getPath('appData'); diff --git a/modules/web3Admin.js b/modules/web3Admin.js index cde4400a7..b0bc656ae 100644 --- a/modules/web3Admin.js +++ b/modules/web3Admin.js @@ -13,7 +13,7 @@ module.exports = { property: 'admin', methods: [ - insertMethod('addPeer', 'admin_addPeer', 1, [web3._extend.utils.fromDecimal], web3._extend.formatters.formatOutputBool), + insertMethod('addPeer', 'admin_addPeer', 1, [null], web3._extend.formatters.formatOutputBool), insertMethod('exportChain', 'admin_exportChain', 1, [null], null), insertMethod('importChain', 'admin_importChain', 1, [null], null), insertMethod('verbosity', 'admin_verbosity', 1, [web3._extend.utils.formatInputInt], web3._extend.formatters.formatOutputBool), @@ -52,8 +52,8 @@ module.exports = { [ insertMethod('start', 'miner_start', 1, [web3._extend.formatters.formatInputInt], web3._extend.formatters.formatOutputBool), insertMethod('stop', 'miner_stop', 1, [web3._extend.formatters.formatInputInt], web3._extend.formatters.formatOutputBool), - insertMethod('setExtra', 'miner_setExtra', 1, [web3._extend.utils.formatInputString], web3._extend.formatters.formatOutputBool), - insertMethod('setGasPrice', 'miner_setGasPrice', 1, [web3._extend.utils.formatInputString], web3._extend.formatters.formatOutputBool), + insertMethod('setExtra', 'miner_setExtra', 1, [null], web3._extend.formatters.formatOutputBool), + insertMethod('setGasPrice', 'miner_setGasPrice', 1, [web3._extend.utils.fromDecimal], web3._extend.formatters.formatOutputBool), insertMethod('startAutoDAG', 'miner_startAutoDAG', 0, [], web3._extend.formatters.formatOutputBool), insertMethod('stopAutoDAG', 'miner_stopAutoDAG', 0, [], web3._extend.formatters.formatOutputBool), insertMethod('makeDAG', 'miner_makeDAG', 1, [web3._extend.formatters.inputDefaultBlockNumberFormatter], web3._extend.formatters.formatOutputBool), @@ -69,7 +69,6 @@ module.exports = { property: 'network', methods: [ - insertMethod('addPeer', 'net_addPeer', 1, [web3._extend.utils.formatInputString], web3._extend.formatters.formatOutputBool), insertMethod('getPeerCount', 'net_peerCount', 0, [], web3._extend.formatters.formatOutputString), ], properties: diff --git a/package.json b/package.json index 049540c38..1842ed745 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Mist", - "version": "0.8.8", + "version": "0.8.9", "license": "GPL-3.0", "author": "Ethereum Mist Team ", "repository": { @@ -8,53 +8,60 @@ "url": "https://github.com/ethereum/mist.git" }, "scripts": { - "ci": "gulp --platform=linux" + "postinstall": "cd interface && yarn" }, "main": "main.js", "dependencies": { - "babel-runtime": "^6.18.0", - "bignumber.js": "^2.1.4", - "bluebird": "^3.3.5", + "babel-runtime": "^6.22.0", + "bignumber.js": "^4.0.0", + "bluebird": "^3.4.7", + "chai-as-promised": "^6.0.0", + "chai-string": "^1.3.0", "electron-squirrel-startup": "^1.0.0", "ethereum-client-binaries": "^1.6.1", + "ethereum-keyfile-recognizer": "^1.0.2", "ethereumjs-abi": "^0.6.3", - "got": "^6.3.0", - "i18next": "^2.3.4", + "got": "^6.7.1", + "i18next": "^6.1.1", "log-rotate": "^0.2.7", - "log4js": "^0.6.35", - "lokijs": "^1.4.1", - "minimongo-standalone": "0.0.9", - "numeral": "^1.5.3", - "os-timesync": "^1.0.6", + "log4js": "^1.1.0", + "lokijs": "^1.4.2", + "minimongo-standalone": "^1.1.0-3", + "numeral": "^2.0.4", + "os-timesync": "^1.0.7", "semver": "^5.1.0", - "solc": "0.4.6", - "typescript": "^1.7.3", + "solc": "^0.4.8", + "typescript": "^2.1.5", "underscore": "^1.8.3", "underscore-deep-extend": "^1.1.5", - "uuid": "^2.0.2", + "uuid": "^3.0.1", "web3": "^0.17.0-alpha", - "yargs": "^4.3.1" + "yargs": "^6.6.0" }, "devDependencies": { "chai": "^3.5.0", - "co-mocha": "^1.1.2", - "del": "^1.2.1", + "chai-as-promised": "^6.0.0", + "co-mocha": "^1.2.0", + "del": "^2.2.2", + "ecstatic": "^2.1.0", "electron": "1.3.13", - "electron-builder": "=9.1.0", - "eslint": "^3.8.0", - "eslint-config-airbnb-base": "^8.0.0", - "eslint-plugin-import": "^1.16.0", + "electron-builder": "^12.2.2", + "eslint": "^3.14.1", + "eslint-config-airbnb-base": "^11.0.1", + "eslint-plugin-import": "^2.2.0", "genomatic": "^1.0.0", "geth-private": "^1.3.0", + "gh-release-assets": "^1.1.0", "gulp": "^3.9.0", "gulp-flatten": "^0.3.0", - "gulp-spawn-mocha": "^2.2.2", + "gulp-spawn-mocha": "^3.1.0", + "istanbul": "^0.4.5", "merge-stream": "^1.0.0", "minimist": "^1.2.0", + "mocha": "^3.2.0", "optimist": "^0.6.1", "run-sequence": "^1.2.1", - "shelljs": "^0.7.0", - "spectron": "^3.2.2", - "sync-request": "^3.0.1" + "shelljs": "^0.7.6", + "spectron": "3.3.0" } } diff --git a/scripts/Locate.nsh b/scripts/Locate.nsh new file mode 100755 index 000000000..a4ed00826 --- /dev/null +++ b/scripts/Locate.nsh @@ -0,0 +1,51 @@ +!define locate::Open `!insertmacro locate::Open` + +!macro locate::Open _PATH _OPTIONS _HANDLE + locate::_Open /NOUNLOAD `${_PATH}` `${_OPTIONS}` + Pop ${_HANDLE} +!macroend + + +!define locate::Find `!insertmacro locate::Find` + +!macro locate::Find _HANDLE _PATHANDNAME _PATH _NAME _SIZE _TIME _ATTRIB + locate::_Find /NOUNLOAD `${_HANDLE}` + Pop ${_PATHANDNAME} + Pop ${_PATH} + Pop ${_NAME} + Pop ${_SIZE} + Pop ${_TIME} + Pop ${_ATTRIB} +!macroend + + +!define locate::Close `!insertmacro locate::Close` + +!macro locate::Close _HANDLE + locate::_Close /NOUNLOAD `${_HANDLE}` +!macroend + + +!define locate::GetSize `!insertmacro locate::GetSize` + +!macro locate::GetSize _PATH _OPTIONS _SIZE _FILES _DIRS + locate::_GetSize /NOUNLOAD `${_PATH}` `${_OPTIONS}` + Pop ${_SIZE} + Pop ${_FILES} + Pop ${_DIRS} +!macroend + + +!define locate::RMDirEmpty `!insertmacro locate::RMDirEmpty` + +!macro locate::RMDirEmpty _PATH _OPTIONS _REMOVED + locate::_RMDirEmpty /NOUNLOAD `${_PATH}` `${_OPTIONS}` + Pop ${_REMOVED} +!macroend + + +!define locate::Unload `!insertmacro locate::Unload` + +!macro locate::Unload + locate::_Unload +!macroend diff --git a/scripts/MoveFileFolder.nsh b/scripts/MoveFileFolder.nsh new file mode 100644 index 000000000..dea78c357 --- /dev/null +++ b/scripts/MoveFileFolder.nsh @@ -0,0 +1,256 @@ +;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +; MoveFile and MoveFolder macros +; +; Author: theblazingangel@aol.com (for the AutoPatcher project - www.autopatcher.com) +; Created: June 2007 +;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +;================== +; MoveFile macro +;================== + + !macro MoveFile sourceFile destinationFile + + !define MOVEFILE_JUMP ${__LINE__} + + ; Check source actually exists + + IfFileExists "${sourceFile}" +3 0 + SetErrors + goto done_${MOVEFILE_JUMP} + + ; Add message to details-view/install-log + + DetailPrint "Moving/renaming file: ${sourceFile} to ${destinationFile}" + + ; If destination does not already exists simply move file + + IfFileExists "${destinationFile}" +3 0 + rename "${sourceFile}" "${destinationFile}" + goto done_${MOVEFILE_JUMP} + + ; If overwriting without 'ifnewer' check + + ${If} $switch_overwrite == 1 + delete "${destinationFile}" + rename "${sourceFile}" "${destinationFile}" + delete "${sourceFile}" + goto done_${MOVEFILE_JUMP} + ${EndIf} + + ; If destination already exists + + Push $R0 + Push $R1 + Push $R2 + push $R3 + + GetFileTime "${sourceFile}" $R0 $R1 + GetFileTime "${destinationFile}" $R2 $R3 + + IntCmp $R0 $R2 0 older_${MOVEFILE_JUMP} newer_${MOVEFILE_JUMP} + IntCmp $R1 $R3 older_${MOVEFILE_JUMP} older_${MOVEFILE_JUMP} newer_${MOVEFILE_JUMP} + + older_${MOVEFILE_JUMP}: + delete "${sourceFile}" + goto time_check_done_${MOVEFILE_JUMP} + + newer_${MOVEFILE_JUMP}: + delete "${destinationFile}" + rename "${sourceFile}" "${destinationFile}" + delete "${sourceFile}" ;incase above failed! + + time_check_done_${MOVEFILE_JUMP}: + + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + + done_${MOVEFILE_JUMP}: + + !undef MOVEFILE_JUMP + + !macroend + +;================== +; MoveFolder macro +;================== + + !macro MoveFolder source destination mask + + !define MOVEFOLDER_JUMP ${__LINE__} + + Push $R0 + Push $R1 + + ; Move path parameters into registers so they can be altered if necessary + + StrCpy $R0 "${source}" + StrCpy $R1 "${destination}" + + ; Sort out paths - remove final backslash if supplied + + Push $0 + + ; Source + StrCpy $0 "$R0" 1 -1 + StrCmp $0 '\' 0 +2 + StrCpy $R0 "$R0" -1 + + ; Destination + StrCpy $0 "$R1" 1 -1 + StrCmp $0 '\' 0 +2 + StrCpy $R1 "$R1" -1 + + Pop $0 + + ; Create destination dir + + CreateDirectory "$R1\" + + ; Add message to details-view/install-log + + DetailPrint "Moving files: $R0\${mask} to $R1\" + + ; Push registers used by ${Locate} onto stack + + Push $R6 + Push $R7 + Push $R8 + Push $R9 + + ; Duplicate dir structure (to preserve empty folders and such) + + ${Locate} "$R0" "/L=D" ".MoveFolder_Locate_createDir" + + ; Locate files and move (via callback function) + + ${Locate} "$R0" "/L=F /M=${mask} /S= /G=1" ".MoveFolder_Locate_moveFile" + + ; Delete subfolders left over after move + + Push $R2 + deldir_loop_${MOVEFOLDER_JUMP}: + StrCpy $R2 0 + ${Locate} "$R0" "/L=DE" ".MoveFolder_Locate_deleteDir" + StrCmp $R2 0 0 deldir_loop_${MOVEFOLDER_JUMP} + Pop $R2 + + ; Delete empty subfolders moved - say the user just wanted to move *.apm files, they now also have a load of empty dir's from dir structure duplication! + + Push $R2 + delnewdir_loop_${MOVEFOLDER_JUMP}: + StrCpy $R2 0 + ${Locate} "$R1" "/L=DE" ".MoveFolder_Locate_deleteDir" + StrCmp $R2 0 0 delnewdir_loop_${MOVEFOLDER_JUMP} + Pop $R2 + + ; Pop registers used by ${Locate} off the stack again + + Pop $R9 + Pop $R8 + Pop $R7 + Pop $R6 + + ; Delete source folder if empty + + rmdir "$R0" + + Pop $R1 + Pop $R0 + + !undef MOVEFOLDER_JUMP + + !macroend + +;================== +; MoveFolder macro's ${Locate} callback functions +;================== + + Function .MoveFolder_Locate_createDir + + ${If} $R6 == "" + Push $R2 + StrLen $R2 "$R0" + StrCpy $R2 $R9 '' $R2 + CreateDirectory "$R1$R2" + Pop $R2 + ${EndIf} + + Push $R1 + + FunctionEnd + + Function .MoveFolder_Locate_moveFile + + Push $R2 + + ; Get path to file + + StrLen $R2 "$R0" + StrCpy $R2 $R9 '' $R2 + StrCpy $R2 "$R1$R2" + + ; If destination does not already exists simply move file + + IfFileExists "$R2" +3 0 + rename "$R9" "$R2" + goto done + + ; If overwriting without 'ifnewer' check + + ${If} $switch_overwrite == 1 + delete "$R2" + rename "$R9" "$R2" + delete "$R9" + goto done + ${EndIf} + + ; If destination already exists + + Push $0 + Push $1 + Push $2 + push $3 + + GetFileTime "$R9" $0 $1 + GetFileTime "$R2" $2 $3 + + IntCmp $0 $2 0 older newer + IntCmp $1 $3 older older newer + + older: + delete "$R9" + goto time_check_done + + newer: + delete "$R2" + rename "$R9" "$R2" + delete "$R9" ;incase above failed! + + time_check_done: + + Pop $3 + Pop $2 + Pop $1 + Pop $0 + + done: + + Pop $R2 + + Push $R1 + + FunctionEnd + + Function .MoveFolder_Locate_deleteDir + + ${If} $R6 == "" + RMDir $R9 + IntOp $R2 $R2 + 1 + ${EndIf} + + Push $R1 + + FunctionEnd diff --git a/scripts/SimpleFC.dll b/scripts/SimpleFC.dll new file mode 100755 index 000000000..73b7d9634 Binary files /dev/null and b/scripts/SimpleFC.dll differ diff --git a/scripts/ZipDLL.dll b/scripts/ZipDLL.dll new file mode 100755 index 000000000..5925d5916 Binary files /dev/null and b/scripts/ZipDLL.dll differ diff --git a/scripts/locate.dll b/scripts/locate.dll new file mode 100755 index 000000000..6a15df88b Binary files /dev/null and b/scripts/locate.dll differ diff --git a/scripts/windows-installer.nsi b/scripts/windows-installer.nsi new file mode 100644 index 000000000..4c76e03cb --- /dev/null +++ b/scripts/windows-installer.nsi @@ -0,0 +1,269 @@ +# Add current directory to plugin path +!addplugindir .\ + +# Architecture detection +!include x64.nsh + +# Include LogicLib (http://nsis.sourceforge.net/LogicLib) +!include 'LogicLib.nsh' + +# Include ZipDLL plugin (http://nsis.sourceforge.net/ZipDLL_plug-in) +!include 'ZipDLL.nsh' + +# Include Locate plugin (http://nsis.sourceforge.net/Locate_plugin) +!include 'locate.nsh' + +# Include MoveFileFolder plugin (http://nsis.sourceforge.net/MoveFileFolder) +!include 'FileFunc.nsh' +!insertmacro Locate +Var /GLOBAL switch_overwrite +!include 'MoveFileFolder.nsh' + +# Enable CRC +CRCCheck on + +# Require admin privledges when UAC is on +RequestExecutionLevel admin + +!define APPNAME "Mist" +!define GROUPNAME "Ethereum" +!define HELPURL "https://github.com/ethereum/mist/releases/issues" +!define UPDATEURL "https://github.com/ethereum/mist/releases" +!define ABOUTURL "https://ethereum.org" +!define /date NOW "%Y%m%d" + +## These must be integers and can be set on the command line by NSIS with "/DMAJORVERSION=0 /DMINORVERSION=8 /DBUILDVERSION=7" +#!define VERSIONMAJOR 0 +#!define VERSIONMINOR 8 +#!define VERSIONBUILD 7 + +# Define some script globals +Name "${GROUPNAME} ${APPNAME}" +Icon "..\dist_mist\build\icon.ico" +OutFile "..\dist_mist\release\mist-installer-${VERSIONMAJOR}-${VERSIONMINOR}-${VERSIONBUILD}.exe" +var FILEDIR +var DATADIR +var NODEDATADIR +var ARCHDIR +var SHORTCUTDIR +var DESKTOPDIR + +# Check for administrative rights +!macro VerifyUserIsAdmin +UserInfo::GetAccountType +pop $0 +${If} $0 != "admin" + messageBox mb_iconstop "Administrator rights required!" + setErrorLevel 740 ;ERROR_ELEVATION_REQUIRED + quit +${EndIf} +!macroend + +# Create a shared function function for setting environment variables +!macro ENVFUNC un + Function ${un}setenv + + SetShellVarContext current + StrCpy $DATADIR "$APPDATA\${APPNAME}" + StrCpy $NODEDATADIR "$APPDATA\Ethereum" + StrCpy $SHORTCUTDIR "$SMPROGRAMS\${APPNAME}" + StrCpy $DESKTOPDIR "$DESKTOP" + + ${If} ${RunningX64} + StrCpy $FILEDIR "$PROGRAMFILES64\${APPNAME}" + StrCpy $ARCHDIR "win-unpacked" + ${Else} + StrCpy $FILEDIR "$PROGRAMFILES32\${APPNAME}" + StrCpy $ARCHDIR "win-ia32-unpacked" + ${Endif} + + SetShellVarContext all + + FunctionEnd +!macroend + +!insertmacro ENVFUNC "" +!insertmacro ENVFUNC "un." + +function .onInit + !insertmacro VerifyUserIsAdmin + call setenv +functionEnd + +# The license page. Can use .txt or .rtf data +PageEx license + LicenseData ..\LICENSE +PageExEnd + +# Components is a good place to allow the user to select optional software to install +# For example, it could be used to allow the user to select which node they want installed and then download it +#Page components + +# Select the location to install the main program files +PageEx directory + DirVar $FILEDIR +PageExEnd + +## Select the location for Mist's data directory +#PageEx directory +# DirText "Select a location for Mist's data files (watched contracts, etc.)" +# DirVar $DATADIR +#PageExEnd + +# Select the location for the node's data directory +PageEx directory + DirText "Select a location where blockchain data will be stored" + DirVar $NODEDATADIR +PageExEnd + +# Installation +Page instfiles + +# Uninstaller confirmation page. Useful to remind the user what data (if any) will remain, for example chaindata or keystore +UninstPage uninstConfirm + +# Uninstallation section +UninstPage instfiles + +# Show details by default +ShowInstDetails show +ShowUninstDetails show + +# Mist installer instructions +Section Mist MIST_IDX + StrCpy $switch_overwrite 1 + + # set the installation directory as the destination for the following actions + SetOutPath $TEMP + # include both architecture zip files + file "..\dist_mist\release\${APPNAME}-win64-${VERSIONMAJOR}-${VERSIONMINOR}-${VERSIONBUILD}.zip" + file "..\dist_mist\release\${APPNAME}-win32-${VERSIONMAJOR}-${VERSIONMINOR}-${VERSIONBUILD}.zip" + file "..\dist_mist\build\icon.ico" + + # Extract the zip file from TEMP to the user's selected installation directory + ${If} ${RunningX64} + ZipDLL::extractALL "$TEMP\${APPNAME}-win64-${VERSIONMAJOR}-${VERSIONMINOR}-${VERSIONBUILD}.zip" "$FILEDIR" + StrCpy $ARCHDIR "win-unpacked" + ${Else} + ZipDLL::extractALL "$TEMP\${APPNAME}-win32-${VERSIONMAJOR}-${VERSIONMINOR}-${VERSIONBUILD}.zip" "$FILEDIR" + StrCpy $ARCHDIR "win-ia32-unpacked" + ${Endif} + + # Move files out of subfolder + !insertmacro MoveFolder "$FILEDIR\$ARCHDIR" "$FILEDIR" "*.*" + # Copy icon from installer (not included in zip) + !insertmacro MoveFile "$TEMP\icon.ico" "$FILEDIR\logo.ico" + + # create the uninstaller + WriteUninstaller "$FILEDIR\uninstall.exe" + + # create shortcuts with flags in the start menu programs directory + createDirectory "$SHORTCUTDIR" + createShortCut "$SHORTCUTDIR\${APPNAME}.lnk" "$FILEDIR\${APPNAME}.exe" '--node-datadir="$NODEDATADIR"' "$FILEDIR\${APPNAME}.exe" 0 + + # create desktop shortcut + createShortCut "$DESKTOPDIR\${APPNAME}.lnk" "$FILEDIR\${APPNAME}.exe" '--node-datadir="$NODEDATADIR"' "$FILEDIR\${APPNAME}.exe" 0 + + # create a shortcut for the program uninstaller + CreateShortCut "$SHORTCUTDIR\Uninstall.lnk" "$FILEDIR\uninstall.exe" + + ## Firewall - add rules + #SimpleFC::AdvAddRule "Geth incoming peers (TCP:30303)" "" 6 1 1 2147483647 1 "$DATADIR\binaries\Geth\unpacked\geth.exe" "" "" "Ethereum" 30303 "" "" "" + #SimpleFC::AdvAddRule "Geth outgoing peers (TCP:30303)" "" 6 2 1 2147483647 1 "$DATADIR\binaries\Geth\unpacked\geth.exe" "" "" "Ethereum" "" 30303 "" "" + #SimpleFC::AdvAddRule "Geth UDP discovery (UDP:30303)" "" 17 2 1 2147483647 1 "$DATADIR\binaries\Geth\unpacked\geth.exe" "" "" "Ethereum" "" 30303 "" "" + + # write registry strings for uninstallation + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "DisplayName" "${GROUPNAME} ${APPNAME}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "UninstallString" '"$FILEDIR\uninstall.exe"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "InstallLocation" '"$FILEDIR"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "InstallDate" "${NOW}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "DisplayIcon" '"$FILEDIR\logo.ico"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "Publisher" "${GROUPNAME}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "HelpLink" '"${HELPURL}"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "URLUpdateInfo" '"${UPDATEURL}"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "URLInfoAbout" '"${ABOUTURL}"' + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "DisplayVersion" "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "VersionMajor" ${VERSIONMAJOR} + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "VersionMinor" ${VERSIONMINOR} + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "NoModify" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "NoRepair" 1 + # calculate and store installation size + Call GetInstalledSize + Pop $0 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" "EstimatedSize" "$0" + + # write registry strings for current user options + WriteRegStr HKCU "Software\${GROUPNAME} ${APPNAME}" "DATADIR" "$DATADIR" + WriteRegStr HKCU "Software\${GROUPNAME} ${APPNAME}" "NODEDATADIR" "$NODEDATADIR" + WriteRegStr HKCU "Software\${GROUPNAME} ${APPNAME}" "DESKTOPDIR" "$DESKTOPDIR" + + # Clean up temporary files + Delete "$TEMP\${APPNAME}-win32-${VERSIONMAJOR}-${VERSIONMINOR}-${VERSIONBUILD}.zip" + Delete "$TEMP\${APPNAME}-win64-${VERSIONMAJOR}-${VERSIONMINOR}-${VERSIONBUILD}.zip" +SectionEnd + +Function .onInstSuccess + ExecShell "open" "$SHORTCUTDIR" +FunctionEnd + +function un.onInit + call un.setenv + !insertmacro VerifyUserIsAdmin +functionEnd + +# uninstaller section start +Section "uninstall" + # get user settings from registry + ClearErrors + ReadRegStr $0 HKCU "Software\${GROUPNAME} ${APPNAME}" 'DATADIR' + ReadRegStr $1 HKCU "Software\${GROUPNAME} ${APPNAME}" 'NODEDATADIR' + ReadRegStr $2 HKCU "Software\${GROUPNAME} ${APPNAME}" 'DESKTOPDIR' + + IfErrors 0 +2 + MessageBox MB_ICONEXCLAMATION|MB_OK "Unable to read from the registry. Not all shortcuts will be removed" + + StrCpy $DATADIR $0 + StrCpy $NODEDATADIR $1 + StrCpy $DESKTOPDIR $2 + + # remove the link from the start menu + rmDir /r "$SHORTCUTDIR" + + # remove desktop shortcut + Delete "$DESKTOPDIR\${APPNAME}.lnk" + + # remove files from installation directory + rmDir /r /REBOOTOK "$FILEDIR" + + ## Firewall - remove rules (if exists) + #SimpleFC::AdvRemoveRule "Geth incoming peers (TCP:30303)" + #SimpleFC::AdvRemoveRule "Geth outgoing peers (TCP:30303)" + #SimpleFC::AdvRemoveRule "Geth UDP discovery (UDP:30303)" + + # delete registry strings + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GROUPNAME} ${APPNAME}" + DeleteRegKey HKCU "Software\${GROUPNAME} ${APPNAME}" +SectionEnd + +Function un.onUnInstSuccess + MessageBox MB_OK "Opening leftover data directories (backup before deleting!)" + ExecShell "open" "$DATADIR" + ExecShell "open" "$NODEDATADIR" +FunctionEnd + + +# Return on top of stack the total size (as DWORD) of the selected/installed sections. +Var GetInstalledSize.total +Function GetInstalledSize + StrCpy $GetInstalledSize.total 0 + + ${if} ${SectionIsSelected} ${MIST_IDX} + ${locate::GetSize} "$FILEDIR" "/S=Kb" $0 $1 $2 + # TODO check for return of -1 for error + IntOp $GetInstalledSize.total $GetInstalledSize.total + $0 + ${endif} + + IntFmt $GetInstalledSize.total "0x%08X" $GetInstalledSize.total + Push $GetInstalledSize.total +FunctionEnd diff --git a/scripts/zipdll.nsh b/scripts/zipdll.nsh new file mode 100755 index 000000000..32e8b7c88 --- /dev/null +++ b/scripts/zipdll.nsh @@ -0,0 +1,417 @@ +;ZipDLL include file for NSIS +;Written by Tim Kosse (mailto:tim.kosse@gmx.de) +;some improvements by deguix + +;Supported languages with their translators in alphabetical order: + +;Arabic translation by asdfuae +;Brazilian Portuguese translation by "deguix" +;Chinese, Simplified translation by Kii Ali +;Chinese, Traditional traslation by "matini" and Kii Ali +;Croatian translation by "iostriz" +;Danish translation by Claus Futtrup +;French translation by "veekee" +;German translation by Tim Kosse +;Hungarian translation by Toth Laszlo +;Korean translation by Seongab Kim +;Lithuanian translation by Vytautas Krivickas +;Polish translation by Krzysztof Galuszka +;Russion translation by Sergey +;Spanish translation by "dark_boy" + +!ifndef ZIPDLL_USED + +!define ZIPDLL_USED + +!macro ZIPDLL_EXTRACT SOURCE DESTINATION FILE + + !define "FILE_${FILE}" + + !ifndef FILE_ + Push "${FILE}" + !endif + + IfFileExists "${DESTINATION}" +2 + CreateDirectory "${DESTINATION}" + + Push "${DESTINATION}" + + IfFileExists "${SOURCE}" +2 + SetErrors + + Push "${SOURCE}" + + ;The strings that will be translated are (ready to copy, + ;remove leading semicolons in your language block): + + !ifdef LANG_ENGLISH + + ;English is default language of ZipDLL, no need to push the untranslated strings + + ;StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +1 + + ;Push " Error: %s" + ;Push "Could not get file attributes." + ;Push "Error: Could not get file attributes." + ;Push "Could not extract %s" + ;Push " Error: Could not extract %s" + + ;!ifdef FILE_ + ;Push " Extract: %s" + ;Push " Extracting %d files and directories" + ;Push "Extracting contents of %s to %s" + ;!else + ;Push "Specified file does not exist in archive." + ;Push "Error: Specified file does not exist in archive." + ;Push "Extracting the file %s from %s to %s" + ;!endif + + ;Push "/TRANSLATE" + + !endif + + !ifdef LANG_HUNGARIAN + + StrCmp $LANGUAGE ${LANG_HUNGARIAN} 0 +10 + + Push " Hiba: %s" + Push "Nem olvasható a fájl attribútumai." + Push "Hiba: Nem olvasható a fájl attribútumai." + Push "Nem sikerült kicsomagolni a(z) %s" + Push " Hiba: Nem sikerült kicsomagolni a(z) %s" + + !ifdef FILE_ + Push " Kicsomagolás: %s" + Push " %d fájl és mappa kicsomagolása" + Push "%s tartalom kicsomagolása a %s helyre" + !else + Push "A megadott fájl nem található az arhívumban." + Push "Hiba: A megadott fájl nem található az arhívumban." + Push "%s fájl kcsomagolása a(z) %s fájlból a %s helyre" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_FRENCH + + StrCmp $LANGUAGE ${LANG_FRENCH} 0 +10 + + Push " Erreur : %s" + Push "Impossible de récupérer les informations sur le fichier." + Push "Erreur : Impossible de récupérer les informations sur le fichier." + Push "Impossible de décompresser %s." + Push " Erreur : Impossible de décompresser %s." + + !ifdef FILE_ + Push " Décompression : %s" + Push " Décompression de %d fichiers et répertoires" + Push "Décompression des données de %s vers %s" + !else + Push "Le fichier spécifié n'existe pas dans l'archive" + Push "Erreur : Le fichier spécifié n'existe pas dans l'archive" + Push "Décompression du fichier %s depuis %s vers %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_GERMAN + + StrCmp $LANGUAGE ${LANG_GERMAN} 0 +10 + + Push " Fehler: %s" + Push "Dateiattribute konnten nicht ermittelt werden." + Push "Fehler: Dateiattribute konnten nicht ermittelt werden." + Push "%s konnte nicht dekomprimiert werden." + Push " Fehler: %s konnte nicht dekomprimiert werden." + + !ifdef FILE_ + Push " Dekomprimiere: %s" + Push " Dekomprimiere %d Dateien und Verzeichnisse" + Push "Dekomprimiere Inhalt von %s nach %s" + !else + Push "Die angegebene Datei existiert nicht im Archiv" + Push "Fehler: Die angegebene Datei existiert nicht im Archiv" + Push "Dekomprimiere Datei %s von %s nach %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_SPANISH + + StrCmp $LANGUAGE ${LANG_SPANISH} 0 +10 + + Push " Error: %s" + Push "No se obtuvieron atributos del archivo" + Push "Error: No se obtuvieron atributos del archivo" + Push "No se pudo extraer %s" + Push " Error: No se pudo extraer %s" + + !ifdef FILE_ + Push " Extraer: %s" + Push " Extrayendo %d archivos y directorios" + Push "Extraer archivos de %s a %s" + !else + Push "Archivo especificado no existe en el ZIP" + Push "Error: El archivo especificado no existe en el ZIP" + Push "Extrayendo el archivo %s de %s a %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_PORTUGUESEBR + + StrCmp $LANGUAGE ${LANG_PORTUGUESEBR} 0 +10 + + Push " Erro: %s" + Push "Não se pode ler os atributos do arquivo" + Push "Error: Não se pode ler os atributos do arquivo" + Push "Não se pode extrair %s" + Push " Erro: Não se pode extrair %s" + + !ifdef FILE_ + Push " Extraindo: %s" + Push " Extraindo %d arquivos e diretórios" + Push "Extraindo arquivos de %s a %s" + !else + Push "O arquivo especificado não existe no ZIP" + Push "Erro: O arquivo especificado não existe no ZIP" + Push "Extraindo o arquivo %s de %s a %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_TRADCHINESE + + StrCmp $LANGUAGE ${LANG_TRADCHINESE} 0 +11 + + Push " ¿ù»~: %s" + Push "µLªk¨ú±oÀÉ®×ÄÝ©Ê¡C" + Push "¿ù»~: µLªk¨ú±oÀÉ®×ÄÝ©Ê¡C" + Push "µLªk¸ÑÀ£ÁY %s" + Push " ¿ù»~¡GµLªk¸ÑÀ£ÁY %s" + + !ifdef FILE_ + Push " ¸ÑÀ£ÁY¡G%s" + Push " ¥¿¦b¸ÑÀ£ÁY %d ÀÉ®×»P¥Ø¿ý" + Push "¥¿¦b¸ÑÀ£ÁY %s ªº¤º®e¨ì %s" + !else + Push "«ü©wªºÀɮר䣦s¦b©óÀ£ÁY¥]¡C" + Push "¿ù»~¡G«ü©wªºÀɮר䣦s¦b©óÀ£ÁY¥]¡C" + Push "¥¿¦b¸ÑÀ£ÁYÀÉ®× %s ¡A±q %s ¨ì %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_SIMPCHINESE + + StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +11 + + Push " ´íÎó: %s" + Push "ÎÞ·¨È¡µÃÎļþÊôÐÔ¡£" + Push "´íÎó: ÎÞ·¨È¡µÃÎļþÊôÐÔ¡£" + Push "ÎÞ·¨½âѹËõ %s" + Push " ´íÎó£ºÎÞ·¨½âѹËõ %s" + + !ifdef FILE_ + Push " ½âѹËõ£º%s" + Push " ÕýÔÚ½âѹËõ %d ÎļþÓëĿ¼" + Push "ÕýÔÚ½âѹËõ %s µÄÄÚÈݵ½ %s" + !else + Push "Ö¸¶¨µÄÎļþ²¢²»´æÔÚÓÚѹËõ°ü¡£" + Push "´íÎó£ºÖ¸¶¨µÄÎļþ²¢²»´æÔÚÓÚѹËõ°ü¡£" + Push "ÕýÔÚ½âѹËõÎļþ %s £¬´Ó %s µ½ %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_LITHUANIAN + + StrCmp $LANGUAGE ${LANG_LITHUANIAN} 0 +10 + + Push " Klaida: %s" + Push "Negaleta gauti bylos nuorodu." + Push "Klaida: Negaleta gauti bylos nuorodu." + Push "Negaleta ištraukti %s" + Push " Klaida: Negaleta ištraukti %s" + + !ifdef FILE_ + Push " Ištraukiam : %s" + Push " Ištraukiame %d bylas ir katalogus" + Push "Ištraukiame viska is %s i %s" + !else + Push "Parinkta byla nesurasta šiame archyve." + Push "Klaida: Parinkta byla nesurasta šiame archyve." + Push "Ištraukiame byla %s iš %s i %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef "LANG_POLISH" + + strcmp $LANGUAGE ${LANG_POLISH} 0 +10 + + Push " B³¹d: %s" + Push "Nie mo¿e pobraæ atrybutu pliku." + Push "B³¹d: Nie mo¿e pobraæ atrybutu pliku." + Push "Nie mo¿e rozpakowaæ %s." + Push " B³¹d: Nie mo¿e rozpakowaæ %s." + + !ifdef FILE_ + Push " Rozpakuj: %s" + Push " Rozpakowywanie %d plików i katalogów" + Push "Rozpakowywanie zawartoœci %s do %s" + !else + Push "Plik nie istnieje w archiwum" + Push "B³¹d: Plik nie istnieje w archiwum" + Push "Rozpakowywanie pliku %s z %s do %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef "LANG_KOREAN" + strcmp $LANGUAGE ${LANG_KOREAN} 0 +10 + Push " ¿À·ù : %s" + Push "È­ÀÏ ¼Ó¼ºÀ» ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù." + Push "¿À·ù: È­ÀÏ ¼Ó¼ºÀ» ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù." + Push "%sÀ»(¸¦) Ç® ¼ö ¾ø½À´Ï´Ù." + Push " ¿À·ù: %sÀ»(¸¦) Ç® ¼ö ¾ø½À´Ï´Ù." + + !ifdef FILE_ + Push " Ç®±â : %s" + Push " %d°³ÀÇ ÆÄÀÏ°ú Æú´õ¸¦ Ǫ´Â Áß" + Push "%sÀÇ ³»¿ëÀ» %s¿¡ Ǫ´Â Áß" + !else + Push "ÁöÁ¤µÈ ÆÄÀÏÀÌ ¾ÐÃà ÆÄÀÏ ¾È¿¡ ¾ø½À´Ï´Ù." + Push "¿À·ù: ÁöÁ¤µÈ ÆÄÀÏÀÌ ¾ÐÃà ÆÄÀÏ ¾È¿¡ ¾ø½À´Ï´Ù." + Push "%s ÆÄÀÏÀ» %s¿¡¼­ %s·Î Ǫ´Â Áß" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef "LANG_RUSSIAN" + + strcmp $LANGUAGE ${LANG_RUSSIAN} 0 +10 + + Push " Îøèáêà: %s" + Push "Íå ìîãó ïîëó÷èòü àòðèáóòû ôàéëà." + Push "Îøèáêà: Íå ìîãó ïîëó÷èòü àòðèáóòû ôàéëà." + Push "Íå ìîãó èçâëå÷ü %s" + Push " Îøèáêà: Íå ìîãó èçâëå÷ü %s" + + !ifdef LANG_ + Push " Èçâëåêàþ : %s" + Push " Èçâëå÷åíèå %d ôàéëîâ è ïàïîê" + Push "Ñïèñîê èçâëåêàåìûõ ôàéëîâ èç %s â %s" + !else + Push "Èçâëåêàåìûé ôàéë íå îáíàðóæåí â àðõèâå." + Push "Îøèáêà: SÈçâëåêàåìûé ôàéë íå îáíàðóæåí â àðõèâå." + Push "Èçâëå÷åíèå ôàéëà %s èç %s â %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_ARABIC + + StrCmp $LANGUAGE ${LANG_ARABIC} 0 +10 + + Push " ÎØÇÁ: %s" + Push "áã íÍÕá Úáì ÎÕÇÆÕ ÇáãáÝ." + Push "ÎØÇÁ: áã íÍÕá Úáì ÎÕÇÆÕ ÇáãáÝ." + Push "áÇ íãßä ÇÓÊÎÑÇÌ %s" + Push " ÎØÇÁ: áÇ íãßä ÇÓÊÎÑÇÌ %s" + + !ifdef FILE_ + Push " ÇÓÊÎÑÇÌ : %s" + Push " ÇÓÊÎÑÇÌ ãÌáÏÇÊ æ ãáÝÇÊ %d" + Push "ÇÓÊÎÑÇÌ ãÍÊæíÇÊ %s Åáì %s" + !else + Push "ÇáãáÝ ÛíÑ ãæÌæÏ Ýí ÇáÓÌá." + Push "ÎØÇÁ: ÇáãáÝ ÛíÑ ãæÌæÏ Ýí ÇáÓÌá." + Push "ÇÓÊÎÑÇÌ ÇáãáÝ %s ãä %s Åáì %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_DANISH + + StrCmp $LANGUAGE ${LANG_DANISH} 0 +10 + + Push " Fejl: %s" + Push "Kunne ikke læse fil attributter." + Push "Fejl: Kunne ikke læse fil attributter." + Push "Kunne ikke udpakke %s" + Push " Fejl: Kunne ikke udpakke %s" + + !ifdef FILE_ + Push " Udpakker: %s" + Push " Udpakker %d filer og mapper" + Push "Udpakker indhold fra %s til %s" + !else + Push "Specificeret fil eksisterer ikke i filarkivet" + Push "Fejl: Specificeret fil eksisterer ikke i filarkivet" + Push "Udpakker fil %s fra %s til %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef LANG_CROATIAN + + StrCmp $LANGUAGE ${LANG_CROATIAN} 0 +10 + + Push " Greška: %s" + Push "Ne mogu dohvatiti atribute datoteke." + Push "Greška: Ne mogu dohvatiti atribute datoteke." + Push "Ne mogu ekstrahirati %s" + Push " Greška: Ne mogu ekstrahirati %s" + + !ifdef FILE_ + Push " Ekstrakcija: %s" + Push " Ekstrakcija %d datoteka i mapa" + Push "Ekstrakcija sadržaja %s u %s" + !else + Push "Tražena datoteka ne postoji u arhivi." + Push "Greška: Tražena datoteka ne postoji u arhivi." + Push "Ekstrakcija datoteke %s iz %s u %s" + !endif + + Push "/TRANSLATE" + + !endif + + !ifdef FILE_ + ZipDLL::extractall + !else + ZipDLL::extractfile + !endif + + !undef "FILE_${FILE}" + +!macroend + +!endif diff --git a/tests/_base.js b/tests/_base.js index 12d8a5bbf..a224fce53 100644 --- a/tests/_base.js +++ b/tests/_base.js @@ -1,7 +1,4 @@ - - require('co-mocha'); - const _ = require('underscore'); const genomatic = require('genomatic'); const Q = require('bluebird'); @@ -12,14 +9,52 @@ const path = require('path'); const packageJson = require('../package.json'); const gethPrivate = require('geth-private'); const Application = require('spectron').Application; - const chai = require('chai'); +const http = require('http'); +const ecstatic = require('ecstatic'); +const ClientBinaryManager = require('ethereum-client-binaries').Manager; +const Settings = require('../modules/settings'); + chai.should(); process.env.TEST_MODE = 'true'; +const startGeth = function* () { + let gethPath; -exports.mocha = function (_module, options) { + const config = JSON.parse( + fs.readFileSync(path.join('clientBinaries.json')).toString() + ); + const manager = new ClientBinaryManager(config); + yield manager.init(); + + if (manager.clients.Geth.state.available) { + gethPath = manager.clients.Geth.activeCli.fullPath; + } + else { + console.info('Downloading geth...'); + let downloadedGeth = yield manager.download('Geth'); + gethPath = downloadedGeth.client.activeCli.fullPath; + console.info('Geth downloaded at:', gethPath); + } + + const geth = gethPrivate({ + gethPath, + balance: 5, + genesisBlock: { + difficulty: '0x1', + extraData: '0x1', + }, + gethOptions: { + port: 58546, + rpcport: 58545, + }, + }); + yield geth.start(); + return geth; +}; + +exports.mocha = (_module, options) => { const tests = {}; options = _.extend({ @@ -28,7 +63,7 @@ exports.mocha = function (_module, options) { _module.exports[options.name || path.basename(_module.filename)] = { * before() { - this.timeout(10000000); + this.timeout(1e7); this.assert = chai.assert; this.expect = chai.expect; @@ -36,65 +71,38 @@ exports.mocha = function (_module, options) { const logFilePath = path.join(__dirname, 'mist.log'); shell.rm('-rf', logFilePath); - const appFileName = (options.app === 'wallet') ? 'Ethereum Wallet' : 'Mist', - appVers = packageJson.version.replace(/\./ig, '-'), - platformArch = `${process.platform}-${process.arch}`; + this.geth = yield startGeth(); - let appPath, - gethPath; + const appFileName = (options.app === 'wallet') ? 'Ethereum Wallet' : 'Mist'; + const appVers = packageJson.version.replace(/\./ig, '-'); + const platformArch = `${process.platform}-${process.arch}`; + + let appPath; + let ipcProviderPath = path.join(this.geth.dataDir, 'geth.ipc'); switch (platformArch) { case 'darwin-x64': - appPath = path.join( - process.cwd(), - `dist_${options.app}`, - 'dist', - 'mac', - `${appFileName}.app`, - 'Contents', - 'MacOS', - appFileName - ); + appPath = path.join(process.cwd(), `dist_${options.app}`, 'dist', 'mac', + `${appFileName}.app`, 'Contents', 'MacOS', appFileName + ); break; case 'linux-x64': - appPath = path.join( - process.cwd(), - `dist_${options.app}`, - `${appFileName}-linux64-${appVers}`, - appFileName - ); + appPath = path.join(process.cwd(), `dist_${options.app}`, 'dist', 'linux-unpacked', appFileName.toLowerCase()); break; default: throw new Error(`Cannot run tests on ${platformArch}, please run on: darwin-x64, linux-x64`); } - // check that appPath exists + // check that appPath exists if (!shell.test('-f', appPath)) { throw new Error(`Cannot find binary: ${appPath}`); } - this.geth = gethPrivate({ - gethPath: path.join(process.cwd(), 'nodes', 'geth', platformArch, 'geth'), - balance: 5, - genesisBlock: { - difficulty: '0x1', - extraData: '0x1', - }, - gethOptions: { - port: 58546, - rpcport: 58545, - }, - }); - - yield this.geth.start(); - this.web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:58545')); - - this.app = new Application({ requireName: 'electronRequire', - startTimeout: 5000, - waitTimeout: 5000, + startTimeout: 10000, + waitTimeout: 10000, quitTimeout: 10000, path: appPath, args: [ @@ -102,39 +110,101 @@ exports.mocha = function (_module, options) { '--loglevel', 'debug', '--logfile', logFilePath, '--node-datadir', this.geth.dataDir, - '--ipcpath', path.join(this.geth.dataDir, 'geth.ipc'), + '--rpc', ipcProviderPath, ], }); - yield this.app.start(); - this.client = this.app.client; + /* + Starting HTTP server for HTML fixtures + */ + const serverPort = 8080; + this.httpServer = http.createServer( + ecstatic({root: path.join(__dirname, 'fixtures')}) + ).listen(serverPort); + this.fixtureBaseUrl = `http://localhost:${serverPort}/`; - yield this.client.waitUntilWindowLoaded(); - // wait a small amount of time to ensure main app window is ready with data - yield Q.delay(8000); - - // console.log(this.app.chromeDriver.logLines); + this.client = this.app.client; + yield this.client.waitUntilWindowLoaded(); + // console.log(this.app.chromeDriver.logLines); - /* - Utility methods - */ + /* + Utility methods + */ for (const key in Utils) { this[key] = genomatic.bind(Utils[key], this); } + // Loop over windows trying to select Main Window + let app = this; + let selectMainWindow = function* (mainWindowSearch) { + let windowHandles = (yield app.client.windowHandles()).value; + + for (let handle in windowHandles) { + yield app.client.window(windowHandles[handle]); + const windowUrl = yield app.client.getUrl(); + const isMainWindow = mainWindowSearch.test(windowUrl); + if (isMainWindow) return true; + } + + // not main window. try again after 1 second. + yield Q.delay(1000); + yield selectMainWindow(mainWindowSearch); + } + + const mainWindowSearch = (options.app === 'wallet') ? /^file:\/\/\/$/ : /interface\/index\.html$/; + yield selectMainWindow(mainWindowSearch); + this.mainWindowHandle = (yield this.client.windowHandle()).value; }, - * after() { + * beforeEach () { + yield this.app.client.window(this.mainWindowHandle); + + yield this.client.execute(() => { // Code executed in context of browser + Tabs.remove({}); + LastVisitedPages.remove({}); + History.remove({}); + + Tabs.insert({ + _id: 'browser', + url: 'http://localhost:8080/', + redirect: 'http://localhost:8080/', + position: 0 + }); + Tabs.upsert({_id: 'wallet'}, {$set: { + url: 'https://wallet.ethereum.org', + redirect: 'https://wallet.ethereum.org', + position: 1, + permissions: { admin: true } + }}); + + LocalStore.set('selectedTab', 'browser'); + }); + yield Q.delay(2000); + // yield this.client.reload(); + }, + + * afterEach () { + }, + + * after () { + console.log('After tests triggered'); if (this.app && this.app.isRunning()) { + console.log('Stopping app...'); yield this.app.stop(); } if (this.geth && this.geth.isRunning) { + console.log('Stopping geth...'); yield this.geth.stop(); } + + if (this.httpServer && this.httpServer.isListening) { + console.log('Stopping http server...'); + yield this.httpServer.close(); + } }, tests, @@ -146,10 +216,15 @@ exports.mocha = function (_module, options) { const Utils = { * waitUntil(msg, promiseFn) { - yield this.client.waitUntil(promiseFn, - 10000, - msg, - 500); + yield this.client.waitUntil(promiseFn, 10000, msg, 500); + }, + * waitForText(selector, text, ms = 5000, message = 'Element couldn\'t be found') { + const client = this.client; + yield client.waitUntil(() => { + return client.getText(selector).then((e) => { + return e === text; + }); + }, ms, message); }, * getUiElements(selector) { const elems = yield this.client.elements(selector); @@ -176,7 +251,7 @@ const Utils = { const newHandles = (yield client.windowHandles()).value; - // focus on new window + // focus on new window yield client.window(newHandles.pop()); }, * execElemsMethod(clientElementIdMethod, selector) { @@ -214,17 +289,17 @@ const Utils = { ); accounts = accounts.map(a => a.toLowerCase()); - balances = balances.map(b => parseInt(b)); + balances = balances.map(b => parseInt(b, 10)); return _.object(accounts, balances); }, * getUiAccountBalances() { - // check balances on the pgetUiAccountsBalancesage + // check balances on the pgetUiAccountsBalancesage let _accounts = yield this.execElemsMethod('elementIdText', '.wallet-box .account-id'); let _balances = yield this.execElemsMethod('elementIdText', '.wallet-box .account-balance'); _accounts = _accounts.map(a => a.toLowerCase()); - _balances = _balances.map(b => parseInt(b)); + _balances = _balances.map(b => parseInt(b, 10)); return _.object(_accounts, _balances); }, @@ -233,10 +308,10 @@ const Utils = { let idx = -1; - accId = accId.toLowerCase(); + const accountId = accId.toLowerCase(); for (const i in _accounts) { - if (_accounts[i].toLowerCase() === accId) { + if (_accounts[i].toLowerCase() === accountId) { idx = i; } } @@ -257,5 +332,69 @@ const Utils = { * stopMining() { yield this.geth.consoleExec('miner.stop();'); }, + + * selectTab(tabId) { + const tab = yield this.getUiElement(`.sidebar [data-tab-id=${tabId}]`); + yield this.client.click(`.sidebar [data-tab-id=${tabId}] button.main`); + // TODO: returns webview reference + }, + * getActiveWebview() { + const webview = ''; + return webview; + }, + * loadFixture(uri = '') { + const client = this.client; + yield client.setValue('#url-input', `${this.fixtureBaseUrl}${uri}`); + yield client.submitForm('form.url'); + yield client.waitUntil(() => { + return client.getText('.dapp-info span', (e) => { + /Fixture/.test(e); + }); + }, 3000, 'expected to properly load fixture'); + }, + * getBrowserBarText() { + return yield this.client.getText('.url-breadcrumb'); + }, + *pinCurrentTab() { + const client = this.client; + + yield this.openAndFocusNewWindow(() => { + return client.click('span.connect-button'); + }); + yield client.click('.dapp-primary-button'); + + yield client.window(this.mainWindowHandle); // selects main window again + yield Q.delay(500); + + const pinnedWebview = (yield client.windowHandles()).value.pop(); + return pinnedWebview; + }, + *navigateTo(url) { + const client = this.client; + yield client.setValue('#url-input', url); + yield client.submitForm('form.url'); + }, + + /* + @method getWindowByUrl + + @param search: function that tells how to search by window + @param tries: amount of tries left until give up searching for + */ + *getWindowByUrl(search, tries = 5) { + if (tries < 0) throw new Error('Couldn\'t select window using given parameters.'); + + let windowHandles = (yield this.client.windowHandles()).value; + + for (let handle in windowHandles) { + yield this.client.window(windowHandles[handle]); + + const found = !!search(yield this.client.getUrl()); + if (found) return true; + } + yield Q.delay(500); + yield this.getWindowByUrl(search, --tries); + } + }; diff --git a/tests/fixtures/fixture-popup.html b/tests/fixtures/fixture-popup.html new file mode 100644 index 000000000..c9a6a1645 --- /dev/null +++ b/tests/fixtures/fixture-popup.html @@ -0,0 +1,10 @@ + + + Fixture Popup + + +

Fixture Popup

+ Target blank + Target popup + + diff --git a/tests/fixtures/index.html b/tests/fixtures/index.html new file mode 100644 index 000000000..6a1364a1d --- /dev/null +++ b/tests/fixtures/index.html @@ -0,0 +1,11 @@ + + + Fixture title + + +

Index page

+

This is a fixture page

+ + + diff --git a/tests/fixtures/page-01.html b/tests/fixtures/page-01.html new file mode 100644 index 000000000..4779eba84 --- /dev/null +++ b/tests/fixtures/page-01.html @@ -0,0 +1,8 @@ + + + Fixture 01 + + +

Fixture 01

+ + diff --git a/tests/mist/basic.test.js b/tests/mist/basic.test.js new file mode 100644 index 000000000..74ef89ff2 --- /dev/null +++ b/tests/mist/basic.test.js @@ -0,0 +1,230 @@ +const _ = require('underscore'); +const Q = require('bluebird'); +const fs = require('fs'); +const path = require('path'); +const should = require('chai').should(); + +const test = require('../_base').mocha(module, { + app: 'mist', +}); + +test['Check for Mist title'] = function* () { + (yield this.client.getTitle()).should.eql('Mist'); +}; + +test['Sanity Check: main window is focused'] = function* () { + const client = this.client; + (yield client.getUrl()).should.match(/interface\/index\.html$/); +}; + +// FAILING ON TRAVIS +test['Browser bar should render urls with separators'] = function* () { + const client = this.client; + + yield this.navigateTo('http://localhost:8080/page1/page2?param=value#hash'); + yield this.waitForText('.url-breadcrumb', 'http://localhost:8080 ▸ page1 ▸ page2 ▸ param=value ▸ hash'); +}; + +test['Browser bar should not render script tags on breadcrumb view'] = function* () { // ETH-01-001 + const client = this.client; + + yield this.navigateTo(''); + yield client.waitUntil(() => { + return client.getText('.url-breadcrumb').then((e) => { + return /404\.html$/.test(e); + }); + }, 5000, 'expected breadcrumb to render as HTML encoded'); + + should.exist(yield this.getUiElement('form.url')); + should.not.exist(yield this.getUiElement('form.url script')); +}; + +test['Browser bar should not render script tags in disguise on breadcrumb view'] = function* () { // ETH-01-001 + const client = this.client; + + yield client.setValue('#url-input', '<script>alert()</script>'); + const isUrlBlocked = (yield client.execute(() => { // Code executed in context of browser + try { $('form.url').submit(); } + catch(e) { return /Invalid URL/.test(e); } + return false; + })).value; + + isUrlBlocked.should.be.true; + should.not.exist(yield this.getUiElement('form.url script')); +}; + +test['Browser bar should not render script tags in disguise (2) on breadcrumb view'] = function* () { // ETH-01-001 + const client = this.client; + + yield this.navigateTo(''); + yield client.waitUntil(() => { + return client.getText('.url-breadcrumb').then((e) => { + return /404\.html$/.test(e); + }); + }, 5000, 'expected breadcrumb to render as HTML encoded'); + + should.exist(yield this.getUiElement('form.url')); + should.not.exist(yield this.getUiElement('form.url svg')); + should.not.exist(yield this.getUiElement('form.url script')); +}; + +test['Browser bar should not render arbitrary code as HTML'] = function* () { // ETH-01-001 + const client = this.client; + + yield client.waitUntil(() => { + return client.getText('.url-breadcrumb', (e) => { + return e === '%3Ciframe onload="alert%28%29%"%3E'; + }); + }, 5000, 'expected breadcrumb to render as HTML encoded'); +}; + +test['Browser bar should not execute JS'] = function* () { // ETH-01-001 + const client = this.client; + + yield this.navigateTo(''); + const mist = yield client.execute(() => { return window.mist }); // checking if `execute` works + const pwned = yield client.execute(() => { return window.pwned }); + + should.exist(mist.value); + should.not.exist(pwned.value); +}; + +test['Should select Wallet and Browse tabs properly'] = function* () { + const client = this.client; + const walletTab = yield this.selectTab('wallet'); +}; + +test['Load fixture page'] = function* () { + const client = this.client; + yield this.loadFixture(); +}; + +test['"http://" protocol should be allowed on browser bar'] = function* () { // ETH-01-002 + const client = this.client; + yield this.loadFixture(); + + yield client.setValue('#url-input', `${this.fixtureBaseUrl}index.html`); + const isProtocolBlocked = (yield client.execute(() => { // Code executed in context of browser + try { $('form.url').submit(); } + catch(e) { return /Invalid URL/.test(e); } + return false; + })).value; + isProtocolBlocked.should.be.false; + + yield this.waitForText('.url-breadcrumb', 'http://localhost:8080 ▸ index.html'); + + const browserBarText = yield this.client.getText('.url-breadcrumb'); + browserBarText.should.eql('http://localhost:8080 ▸ index.html'); // checks that did change displayed URL +}; + +test['"javascript:" protocol should be disallowed on browser bar'] = function* () { // ETH-01-002 + const client = this.client; + yield this.loadFixture(); + yield client.setValue('#url-input', 'javascript:window.close()'); + + const isProtocolBlocked = (yield client.execute(() => { // Code executed in context of browser + try { $('form.url').submit(); } + catch(e) { return /Invalid URL/.test(e); } + return false; + })).value; + isProtocolBlocked.should.be.true; + + yield Q.delay(500); + const browserBarText = yield this.getBrowserBarText(); + browserBarText.should.eql('http://localhost:8080'); // checks that hasn't changed displayed URL +}; + +test['"data:" protocol should be disallowed on browser bar'] = function* () { // ETH-01-002 + const client = this.client; + yield this.loadFixture(); + yield client.setValue('#url-input', 'data:text/plain;charset=utf-8;base64,dGhpcyB0ZXN0IGlzIG9uIGZpcmU='); + + const isProtocolBlocked = (yield client.execute(() => { // Code executed in context of browser + try { $('form.url').submit(); } + catch(e) { return /Invalid URL/.test(e); } + return false; + })).value; + isProtocolBlocked.should.be.true; + + yield Q.delay(500); + const browserBarText = yield this.getBrowserBarText(); + browserBarText.should.eql('http://localhost:8080'); // checks that hasn't changed displayed URL +}; + +// test['"file:///" protocol should be disallowed'] = function* () { // ETH-01-002 +// const client = this.client; +// const filePath = 'file://' + path.join(__dirname, '..', 'fixtures', 'index.html'); + +// yield this.navigateTo(filePath); +// yield Q.delay(1500); +// const browserBarText = yield this.getBrowserBarText(); +// browserBarText.should.match(/errorPages ▸ 400.html$/); +// }; + +test['Pin tab test'] = function* () { + const client = this.client; + const sidebarItems = (yield client.elements('.sidebar nav > ul > li')).value; + + yield this.selectTab('browser'); + yield this.pinCurrentTab(); + + const sidebarItemsAfterAdd = (yield client.elements('.sidebar nav > ul > li')).value; + + sidebarItems.length.should.eql(2); + sidebarItemsAfterAdd.length.should.eql(3); +}; + +// test['Browse tab should be changed to pinned tab if the URL is the same'] = function* () { // ETH-01-007 +// const client = this.client; +// yield this.selectTab('browser'); + +// yield this.navigateTo('https://wallet.ethereum.org' ); +// yield Q.delay(1000); +// const el = (yield client.element('.sidebar nav > ul > .selected')); +// console.log('el', el); + +// el.getAttribute('data-tab-id').should.eql('wallet'); + +// }; + +// test['Wallet tab shouldn\'t have the page replaced if URLs does not match'] = function* () { // ETH-01-007 +// const client = this.client; +// const app = this; +// yield this.selectTab('wallet'); + +// yield this.navigateTo(`${this.fixtureBaseUrl}index.html?https://wallet.ethereum.org`); +// yield client.waitUntil(() => { +// return client.element('.sidebar nav > ul > .selected').then((e) => { +// console.log('e', e); +// return e.getAttribute('data-tab-id') === 'browse'; +// }); +// }, 2000); +// }; + +// test['Wallet tab shouldn\'t have the page replaced if URLs does not match - 2'] = function* () { // ETH-01-007 +// const client = this.client; +// const app = this; +// yield this.selectTab('wallet'); + +// // Now changing address via JS +// yield client.setValue('#url-input', `${this.fixtureBaseUrl}index.html?https://wallet.ethereum.org`); +// const isProtocolBlocked = yield client.execute(() => { // Code executed in context of browser +// $('form.url').submit(); +// }); + +// yield client.waitUntil(() => { +// return client.element('.sidebar nav > ul > .selected').then((e) => { +// console.log('e', e); +// return e.getAttribute('data-tab-id') === 'browser'; +// }); +// }, 2000); +// }; + +test['Links with target _blank or _popup should open inside Mist'] = function* () { + const client = this.client; + yield this.navigateTo(`${this.fixtureBaseUrl}/fixture-popup.html`); + yield this.getWindowByUrl(e => /popup.html$/.test(e)); + + // TODO: click on the fixtures' links and assert if they opened on the same page +}; + diff --git a/tests/mocha-in-browser/spec/general-spec.js b/tests/mocha-in-browser/spec/general-spec.js index d5773843b..5a4786b95 100644 --- a/tests/mocha-in-browser/spec/general-spec.js +++ b/tests/mocha-in-browser/spec/general-spec.js @@ -26,6 +26,7 @@ describe('General', function () { 'requestAccount', 'sounds', 'menu', + 'solidity' ]; expect(mist).to.have.all.keys(allowedAttributes); @@ -34,10 +35,18 @@ describe('General', function () { it('should return platform', function () { expect(mist.platform).to.be.oneOf(['darwin', 'win32', 'freebsd', 'linux', 'sunos']); }); + + it('should report solidity version', function () { + expect(mist.solidity.version).to.match(/^\d\.\d{1,2}\.\d{1,2}$/); // match examples: 0.4.6, 0.5.10, 0.10.0 + }); }); describe('mist.menu', function () { - beforeEach(function () { + before(function () { + mist.menu.clear(); + }); + + afterEach(function () { mist.menu.clear(); }); diff --git a/tests/wallet/basic.test.js b/tests/wallet/basic.test.js index 4f1c2763d..c338f1ab5 100644 --- a/tests/wallet/basic.test.js +++ b/tests/wallet/basic.test.js @@ -8,13 +8,12 @@ const test = require('../_base').mocha(module, { app: 'wallet', }); +test['Title test'] = function* () { + const client = this.client; -test.title = function* () { - yield this.client.window(this.mainWindowHandle); - - (yield this.client.getTitle()).should.eql('Ethereum Wallet'); -}; - + yield client.waitUntilWindowLoaded(); + (yield client.getTitle()).should.eql('Ethereum Wallet'); +} test['account balances'] = function* () { const web3 = this.web3; @@ -23,6 +22,8 @@ test['account balances'] = function* () { const realBalances = this.getRealAccountBalances(); const appBalances = this.getUiAccountBalances(); + realBalances.should.not.be.null; + realBalances.should.eql('5'); appBalances.should.eql(realBalances); }; diff --git a/yarn.lock b/yarn.lock index ec86b88a9..31cca18ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -69,22 +69,14 @@ ansi-align@^1.1.0: dependencies: string-width "^1.0.1" -ansi-escapes@^1.1.0, ansi-escapes@^1.4.0: +ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - ansi-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -113,19 +105,6 @@ archiver@1.0.0: tar-stream "^1.5.0" zip-stream "^1.0.0" -archiver@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.2.0.tgz#fb5c6af5443b3fa6a426344753bad2a7b444aadd" - dependencies: - archiver-utils "^1.3.0" - async "^2.0.0" - buffer-crc32 "^0.2.1" - glob "^7.0.0" - lodash "^4.8.0" - readable-stream "^2.0.0" - tar-stream "^1.5.0" - zip-stream "^1.1.0" - archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -172,10 +151,6 @@ arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" -asap@^2.0.0, asap@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" - asar-electron-builder@^0.13.5: version "0.13.5" resolved "https://registry.yarnpkg.com/asar-electron-builder/-/asar-electron-builder-0.13.5.tgz#4ccd4d11fd7c9d3b3cffc782fde3deed9ef91af6" @@ -202,11 +177,15 @@ assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" -async@1.x, async@^1.2.1, async@^1.4.0, async@^1.5.0: +async@1.x, async@^1.4.0, async@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@>=0.1.0, async@^2.0.0, async@^2.0.1: +async@>=0.1.0, async@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +async@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" dependencies: @@ -246,12 +225,12 @@ babel-runtime@^5.8.25: dependencies: core-js "^1.0.0" -babel-runtime@^6.18.0, babel-runtime@^6.9.2: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" +babel-runtime@^6.22.0, babel-runtime@^6.9.2: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611" dependencies: core-js "^2.4.0" - regenerator-runtime "^0.9.5" + regenerator-runtime "^0.10.0" balanced-match@^0.4.1: version "0.4.2" @@ -271,9 +250,9 @@ beeper@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" -bignumber.js@^2.1.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" +bignumber.js@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.0.0.tgz#26b23a3240820fb6b875f07de822004c7d34b682" "bignumber.js@git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2": version "2.0.7" @@ -300,15 +279,15 @@ bl@^1.0.0, bl@~1.1.2: dependencies: readable-stream "~2.0.5" -bluebird-lst-c@^1.0.4, bluebird-lst-c@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bluebird-lst-c/-/bluebird-lst-c-1.0.5.tgz#50da657dcde337a0e29d9e080ba714c5a52016e2" +bluebird-lst-c@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/bluebird-lst-c/-/bluebird-lst-c-1.0.6.tgz#81f881d13f9df700f67d577f13480bc32d84bba9" dependencies: - bluebird "^3.4.6" + bluebird "^3.4.7" -bluebird@^3.3.4, bluebird@^3.3.5, bluebird@^3.4.6: - version "3.4.6" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" +bluebird@^3.3.4, bluebird@^3.4.7: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" bn.js@^4.10.0, bn.js@^4.11.3, bn.js@^4.4.0, bn.js@^4.8.0: version "4.11.6" @@ -353,6 +332,10 @@ brorand@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.0.6.tgz#4028706b915f91f7b349a2e0bf3c376039d216e5" +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + browserify-aes@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" @@ -448,6 +431,16 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chai-as-promised: + version "6.0.0" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-6.0.0.tgz#1a02a433a6f24dafac63b9c96fa1684db1aa8da6" + dependencies: + check-error "^1.0.2" + +chai-string: + version "1.3.0" + resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.3.0.tgz#df6139f294391b1035be5606f60a843b3a5041e7" + chai@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" @@ -472,20 +465,18 @@ chalk@*, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" chromium-pickle-js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" @@ -500,7 +491,7 @@ cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" -cli-cursor@^1.0.1, cli-cursor@^1.0.2: +cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" dependencies: @@ -526,7 +517,7 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -clone-stats@^0.0.1, clone-stats@~0.0.1: +clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" @@ -538,9 +529,9 @@ clone@^1.0.0, clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" -co-mocha@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/co-mocha/-/co-mocha-1.1.3.tgz#49bb9c85bcd17e3250f8b84b875dc76668bc41dc" +co-mocha@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/co-mocha/-/co-mocha-1.2.0.tgz#d9be35a2a2d16f4b1b0e83f6973401ca4b6660af" dependencies: co "^4.0.0" is-generator "^1.0.1" @@ -563,15 +554,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" - -commander@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" - -commander@^2.9.0: +commander@2.9.0, commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -737,33 +720,33 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -dateformat@^1.0.11, dateformat@^1.0.7-1.2.3: +date-format@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-0.0.0.tgz#09206863ab070eb459acea5542cbd856b11966b3" + +dateformat@^1.0.11: version "1.0.12" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" dependencies: get-stdin "^4.0.1" meow "^3.3.0" -debug@0.7.4: +debug@0.7.4, debug@^0.7.2: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" -debug@2.2.0, debug@^2.2.0: +debug@2.2.0, debug@^2.1.1, debug@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: ms "0.7.1" -debug@^2.1.1, debug@^2.1.3, debug@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" +debug@2.6.0, debug@^2.1.3, debug@^2.3.2, debug@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" dependencies: ms "0.7.2" -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -838,7 +821,7 @@ deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" -deep-is@~0.1.2, deep-is@~0.1.3: +deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -852,18 +835,7 @@ defaults@^1.0.0: dependencies: clone "^1.0.2" -del@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/del/-/del-1.2.1.tgz#aed6e5bcd7cb7325df34f563125fa265b2c1a014" - dependencies: - each-async "^1.0.0" - globby "^2.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^3.0.0" - rimraf "^2.2.8" - -del@^2.0.2: +del@^2.0.2, del@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" dependencies: @@ -893,25 +865,11 @@ dev-null@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" -dezalgo@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - dependencies: - asap "^2.0.0" - wrappy "1" - diff@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" -doctrine@1.3.x: - version "1.3.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^1.2.2: +doctrine@1.5.0, doctrine@^1.2.2: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" dependencies: @@ -957,67 +915,88 @@ duplexify@^3.2.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -each-async@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" - dependencies: - onetime "^1.0.0" - set-immediate-shim "^1.0.0" - ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" dependencies: jsbn "~0.1.0" +ecstatic: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-2.1.0.tgz#477a4a6b25cecb112f697dbd2c7fa354154ea6be" + dependencies: + he "^0.5.0" + mime "^1.2.11" + minimist "^1.1.0" + url-join "^1.0.0" + ejs@^2.3.1: version "2.5.3" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.3.tgz#bfeae1e2f7fa51c4527769fcaa14c5ca73eb5e47" -electron-builder@=9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-9.1.0.tgz#dce80e1e44791d635f01d4466225ed6383cc7f82" +electron-builder-core@11.2.1: + version "11.2.1" + resolved "https://registry.yarnpkg.com/electron-builder-core/-/electron-builder-core-11.2.1.tgz#1dca8c1a1cee8b51750b7708a04913aeffacf8a8" + +electron-builder-http@12.1.0, electron-builder-http@~12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/electron-builder-http/-/electron-builder-http-12.1.0.tgz#4469498f36a5c7af74a94c637b4d874ca1300b7e" + dependencies: + debug "2.6.0" + fs-extra-p "^3.1.0" + +electron-builder-util@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/electron-builder-util/-/electron-builder-util-12.1.0.tgz#2d2ef87ba54710cc35caa1a0d3b80dcc4f52eb30" + dependencies: + "7zip-bin" "^2.0.4" + bluebird-lst-c "^1.0.6" + chalk "^1.1.3" + debug "2.6.0" + electron-builder-http "~12.1.0" + fs-extra-p "^3.1.0" + is-ci "^1.0.10" + node-emoji "^1.5.1" + source-map-support "^0.4.11" + stat-mode "^0.2.2" + +electron-builder@^12.2.2: + version "12.2.2" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-12.2.2.tgz#f26979e27bd9232acf8f8de720816186ddf36470" dependencies: "7zip-bin" "^2.0.4" - ansi-escapes "^1.4.0" - archiver "^1.2.0" - archiver-utils "^1.3.0" asar-electron-builder "^0.13.5" - bluebird-lst-c "^1.0.5" + bluebird-lst-c "^1.0.6" chalk "^1.1.3" chromium-pickle-js "^0.2.0" - cli-cursor "^1.0.2" cuint "^0.2.2" - debug "^2.3.2" + electron-builder-core "11.2.1" + electron-builder-http "12.1.0" + electron-builder-util "12.1.0" electron-download-tf "3.1.0" - electron-macos-sign "^1.3.4" - fs-extra-p "^2.0.7" + electron-macos-sign "~1.5.0" + fs-extra-p "^3.1.0" hosted-git-info "^2.1.5" ini "^1.3.4" - isbinaryfile "^3.0.1" + is-ci "^1.0.10" + isbinaryfile "^3.0.2" js-yaml "^3.7.0" - lodash.template "^4.4.0" mime "^1.3.4" minimatch "^3.0.3" - node-emoji "^1.4.1" normalize-package-data "^2.3.5" parse-color "^1.0.0" plist "^2.0.1" - pretty-ms "^2.1.0" progress "^1.1.8" - progress-stream "^1.2.0" - read-installed "^4.0.3" sanitize-filename "^1.6.1" semver "^5.3.0" - source-map-support "^0.4.6" tunnel-agent "^0.4.3" - update-notifier "^1.0.2" + update-notifier "^1.0.3" uuid-1345 "^0.99.6" - yargs "^6.4.0" + yargs "^6.6.0" -electron-chromedriver@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-1.4.0.tgz#8e3fad1113288e9988a193eab279e36c2cd32103" +electron-chromedriver@~1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-1.3.2.tgz#4cb41d8cba675a5eaf4c9aebce8dc405e1347f92" dependencies: decompress "^3.0.0" mkdirp "^0.5.1" @@ -1050,15 +1029,14 @@ electron-download@^3.0.1: semver "^5.3.0" sumchecker "^1.2.0" -electron-macos-sign@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/electron-macos-sign/-/electron-macos-sign-1.3.4.tgz#641e011f974b26879f05ac505dde94b86481376a" +electron-macos-sign@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/electron-macos-sign/-/electron-macos-sign-1.5.0.tgz#fe3a8acb755b5f568f1fe144e9e66cee44019448" dependencies: - bluebird "^3.4.6" + bluebird "^3.4.7" compare-version "^0.1.2" - debug "^2.3.2" - isbinaryfile "^3.0.1" - minimist "^1.2.0" + debug "^2.6.0" + isbinaryfile "^3.0.2" plist "^2.0.1" electron-squirrel-startup@^1.0.0: @@ -1137,7 +1115,7 @@ es6-promise@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" -es6-set@^0.1.4, es6-set@~0.1.3: +es6-set@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" dependencies: @@ -1163,22 +1141,18 @@ es6-weak-map@^2.0.1: es6-iterator "2" es6-symbol "3" -escape-string-regexp@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" - -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escodegen@1.7.x: - version "1.7.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.7.1.tgz#30ecfcf66ca98dc67cd2fd162abeb6eafa8ce6fc" +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" dependencies: - esprima "^1.2.2" + esprima "^2.7.1" estraverse "^1.9.1" esutils "^2.0.2" - optionator "^0.5.0" + optionator "^0.8.1" optionalDependencies: source-map "~0.2.0" @@ -1191,9 +1165,9 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-config-airbnb-base@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-8.0.0.tgz#c5e958a469ab8af76aff068b43d784e5afe74ca7" +eslint-config-airbnb-base@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.0.1.tgz#5401dba284c6b7d7c8fb1c2ee19aba018f9dfa21" eslint-import-resolver-node@^0.2.0: version "0.2.3" @@ -1203,30 +1177,31 @@ eslint-import-resolver-node@^0.2.0: object-assign "^4.0.1" resolve "^1.1.6" -eslint-plugin-import@^1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" +eslint-module-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" + dependencies: + debug "2.2.0" + pkg-dir "^1.0.0" + +eslint-plugin-import@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" dependencies: builtin-modules "^1.1.1" contains-path "^0.1.0" debug "^2.2.0" - doctrine "1.3.x" - es6-map "^0.1.3" - es6-set "^0.1.4" + doctrine "1.5.0" eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^2.0.0" has "^1.0.1" lodash.cond "^4.3.0" - lodash.endswith "^4.0.1" - lodash.find "^4.3.0" - lodash.findindex "^4.3.0" minimatch "^3.0.3" - object-assign "^4.0.1" - pkg-dir "^1.0.0" pkg-up "^1.0.0" -eslint@^3.8.0: - version "3.11.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.11.1.tgz#408be581041385cba947cd8d1cd2227782b55dbf" +eslint@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.14.1.tgz#8a62175f2255109494747a1b25128d97b8eb3d97" dependencies: babel-code-frame "^6.16.0" chalk "^1.1.3" @@ -1239,7 +1214,7 @@ eslint@^3.8.0: esutils "^2.0.2" file-entry-cache "^2.0.0" glob "^7.0.3" - globals "^9.2.0" + globals "^9.14.0" ignore "^3.2.0" imurmurhash "^0.1.4" inquirer "^0.12.0" @@ -1258,7 +1233,7 @@ eslint@^3.8.0: require-uncached "^1.0.2" shelljs "^0.7.5" strip-bom "^3.0.0" - strip-json-comments "~1.0.1" + strip-json-comments "~2.0.1" table "^3.7.8" text-table "~0.2.0" user-home "^2.0.0" @@ -1270,15 +1245,7 @@ espree@^3.3.1: acorn "^4.0.1" acorn-jsx "^3.0.0" -esprima@2.5.x: - version "2.5.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.5.0.tgz#f387a46fd344c1b1a39baf8c20bfb43b6d0058cc" - -esprima@^1.2.2: - version "1.2.5" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" - -esprima@^2.6.0: +esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -1318,6 +1285,13 @@ ethereum-client-binaries@^1.6.1: node-unzip-2 "^0.2.1" tmp "0.0.29" +ethereum-keyfile-recognizer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ethereum-keyfile-recognizer/-/ethereum-keyfile-recognizer-1.0.2.tgz#c0315f91c77e076621e9f6b5f8099fd370f7a11d" + dependencies: + json-structure-diff "0.0.2" + underscore "^1.8.3" + ethereumjs-abi@^0.6.3: version "0.6.4" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.4.tgz#9ba1bb056492d00c27279f6eccd4d58275912c1a" @@ -1414,10 +1388,6 @@ fancy-log@^1.1.0: chalk "^1.1.1" time-stamp "^1.0.0" -fast-levenshtein@~1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" - fast-levenshtein@~2.0.4: version "2.0.5" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" @@ -1450,13 +1420,6 @@ filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" -fileset@0.2.x: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" - dependencies: - glob "5.x" - minimatch "2.x" - fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -1554,20 +1517,12 @@ fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" -fs-extra-p@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-2.0.7.tgz#525a86ee1250510210defe1ea39f473c23ecfa96" - dependencies: - bluebird-lst-c "^1.0.4" - fs-extra-tf "^1.0.0" - -fs-extra-tf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra-tf/-/fs-extra-tf-1.0.0.tgz#77d3d7dc2199fbc618a42fe5ea81137db95eeb2e" +fs-extra-p@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-3.1.0.tgz#eddf7bb8d9385d79014decb21f45b1d0c57900d3" dependencies: - graceful-fs "^4.1.10" - jsonfile "^2.4.0" - klaw "^1.3.1" + bluebird-lst-c "^1.0.6" + fs-extra "^2.0.0" fs-extra@^0.30.0: version "0.30.0" @@ -1587,6 +1542,13 @@ fs-extra@^1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" +fs-extra@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.0.0.tgz#337352bded4a0b714f3eb84de8cea765e9d37600" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1632,12 +1594,9 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" -get-stream@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" geth-private@^1.3.0: version "1.7.0" @@ -1656,6 +1615,16 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gh-release-assets@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gh-release-assets/-/gh-release-assets-1.1.0.tgz#00f76bd151d020032de10712f525d2a944814595" + dependencies: + async "^0.9.0" + mime "^1.3.4" + progress-stream "^1.1.1" + request "^2.55.0" + util-extend "^1.0.1" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -1712,20 +1681,14 @@ glob2base@^0.0.12: dependencies: find-index "^0.1.1" -glob@3.2.11: - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - dependencies: - inherits "2" - minimatch "0.3" - -glob@5.x, glob@^5.0.3: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" +glob@7.0.5, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.2" once "^1.3.0" path-is-absolute "^1.0.0" @@ -1738,9 +1701,9 @@ glob@^4.3.1: minimatch "^2.0.1" once "^1.3.0" -glob@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" +glob@^5.0.15, glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: inflight "^1.0.4" inherits "2" @@ -1748,17 +1711,6 @@ glob@^6.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@~3.1.21: version "3.1.21" resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" @@ -1783,19 +1735,10 @@ global-prefix@^0.1.4: osenv "^0.1.3" which "^1.2.10" -globals@^9.2.0: +globals@^9.14.0: version "9.14.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" -globby@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-2.1.0.tgz#9e9192bcd33f4ab6a4f894e5e7ea8b713213c482" - dependencies: - array-union "^1.0.1" - async "^1.2.1" - glob "^5.0.3" - object-assign "^3.0.0" - globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -1841,19 +1784,19 @@ got@^5.0.0: unzip-response "^1.0.2" url-parse-lax "^1.0.0" -got@^6.3.0, got@^6.5.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/got/-/got-6.6.3.tgz#ff72c56d7f040eb8918ffb80fb62bcaf489d4eec" +got@^6.5.0, got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" dependencies: create-error-class "^3.0.0" duplexer3 "^0.1.4" - get-stream "^2.3.0" + get-stream "^3.0.0" is-redirect "^1.0.0" is-retry-allowed "^1.0.0" is-stream "^1.0.0" lowercase-keys "^1.0.0" - node-status-codes "^2.0.0" - timed-out "^3.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" unzip-response "^2.0.1" url-parse-lax "^1.0.0" @@ -1863,11 +1806,7 @@ graceful-fs@^3.0.0, graceful-fs@~3.0.2: dependencies: natives "^1.1.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@^4.1.0, graceful-fs@^4.1.2: +graceful-fs@^4.0.0, graceful-fs@^4.1.0, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" @@ -1900,17 +1839,15 @@ gulp-sourcemaps@1.6.0: through2 "^2.0.0" vinyl "^1.0.0" -gulp-spawn-mocha@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/gulp-spawn-mocha/-/gulp-spawn-mocha-2.2.2.tgz#c2aaa353d3e8ef8930b2dc39fb1d72148959ed35" +gulp-spawn-mocha@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/gulp-spawn-mocha/-/gulp-spawn-mocha-3.1.0.tgz#b11e3b8e3b3d3ed1c88de5624de42a9e780c27c3" dependencies: - gulp-util "~2.2.10" - istanbul "^0.3.5" - lodash "^3.0.1" - mocha "^2" + gulp-util "~3.0.7" + lodash "^4.11.1" through "~2.3.4" -gulp-util@*, gulp-util@^3.0.0, gulp-util@^3.0.7: +gulp-util@*, gulp-util@^3.0.0, gulp-util@^3.0.7, gulp-util@~3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb" dependencies: @@ -1933,19 +1870,6 @@ gulp-util@*, gulp-util@^3.0.0, gulp-util@^3.0.7: through2 "^2.0.0" vinyl "^0.5.0" -gulp-util@~2.2.10: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - gulp@^3.9.0: version "3.9.1" resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" @@ -1989,12 +1913,6 @@ har-validator@~2.0.6: is-my-json-valid "^2.12.4" pinkie-promise "^2.0.0" -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2032,6 +1950,10 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +he@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" + hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" @@ -2044,18 +1966,6 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" -http-basic@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-2.5.1.tgz#8ce447bdb5b6c577f8a63e3fa78056ec4bb4dbfb" - dependencies: - caseless "~0.11.0" - concat-stream "^1.4.6" - http-response-object "^1.0.0" - -http-response-object@^1.0.0, http-response-object@^1.0.1, http-response-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-1.1.0.tgz#a7c4e75aae82f3bb4904e4f43f615673b4d518c3" - http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -2064,9 +1974,9 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -i18next@^2.3.4: - version "2.5.1" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-2.5.1.tgz#597c833e4b72b766a089f9b4cd8181df5577127b" +i18next@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-6.1.1.tgz#69a2c24993f99a4ef90fcac61c13c6007caff0ab" ignore@^3.2.0: version "3.2.0" @@ -2177,6 +2087,12 @@ is-bzip2@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" +is-ci@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -2199,7 +2115,7 @@ is-extglob@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.0.tgz#33411a482b046bf95e6b0cb27ee2711af4cf15ad" -is-finite@^1.0.0, is-finite@^1.0.1: +is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" dependencies: @@ -2360,9 +2276,9 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" -isbinaryfile@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.1.tgz#6e99573675372e841a0520c036b41513d783e79e" +isbinaryfile@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" isexe@^1.1.1: version "1.1.2" @@ -2378,15 +2294,15 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul@^0.3.5: - version "0.3.22" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.3.22.tgz#3e164d85021fe19c985d1f0e7ef0c3e22d012eb6" +istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" dependencies: abbrev "1.0.x" async "1.x" - escodegen "1.7.x" - esprima "2.5.x" - fileset "0.2.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" handlebars "^4.0.1" js-yaml "3.x" mkdirp "0.5.x" @@ -2397,17 +2313,6 @@ istanbul@^0.3.5: which "^1.1.1" wordwrap "^1.0.0" -jade@0.26.3: - version "0.26.3" - resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" - dependencies: - commander "0.6.1" - mkdirp "0.3.0" - -jju@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" - jodid25519@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" @@ -2433,12 +2338,6 @@ jsbn@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" -json-parse-helpfulerror@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" - dependencies: - jju "^1.1.0" - json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -2453,7 +2352,15 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -jsonfile@^2.1.0, jsonfile@^2.4.0: +json-structure-diff@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/json-structure-diff/-/json-structure-diff-0.0.2.tgz#838277f5c0a9562981b9a2af86fe5e90c131b0b3" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" optionalDependencies: @@ -2488,7 +2395,7 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.0.2" -klaw@^1.0.0, klaw@^1.3.1: +klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" optionalDependencies: @@ -2527,13 +2434,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -levn@~0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" - dependencies: - prelude-ls "~1.1.0" - type-check "~0.3.1" - liftoff@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" @@ -2558,10 +2458,21 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + lodash._basetostring@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" @@ -2570,36 +2481,14 @@ lodash._basevalues@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - lodash._reescape@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" @@ -2608,31 +2497,14 @@ lodash._reevaluate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - -lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: +lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - lodash._root@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -2645,16 +2517,13 @@ lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.endswith@^4.0.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" lodash.escape@^3.0.0: version "3.2.0" @@ -2662,22 +2531,6 @@ lodash.escape@^3.0.0: dependencies: lodash._root "^3.0.0" -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - -lodash.find@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" - -lodash.findindex@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -2698,12 +2551,6 @@ lodash.isequal@^4.0.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.4.0.tgz#6295768e98e14dc15ce8d362ef6340db82852031" -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.isplainobject@^4.0.4: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -2720,14 +2567,6 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - lodash.mapvalues@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" @@ -2740,18 +2579,6 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - lodash.template@^3.0.0: version "3.6.2" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" @@ -2766,13 +2593,6 @@ lodash.template@^3.0.0: lodash.restparam "^3.0.0" lodash.templatesettings "^3.0.0" -lodash.template@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.templatesettings "^4.0.0" - lodash.templatesettings@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" @@ -2780,34 +2600,11 @@ lodash.templatesettings@^3.0.0: lodash._reinterpolate "^3.0.0" lodash.escape "^3.0.0" -lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - dependencies: - lodash._reinterpolate "~3.0.0" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - dependencies: - lodash.keys "~2.4.1" - -lodash@^3.0.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.0.0, lodash@^4.3.0, lodash@^4.8.0: +lodash@^4.0.0, lodash@^4.11.1, lodash@^4.3.0, lodash@^4.8.0: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" @@ -2819,16 +2616,17 @@ log-rotate@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/log-rotate/-/log-rotate-0.2.7.tgz#aadb64259eea49e5668842342c864d0b142e8c2d" -log4js@^0.6.35: - version "0.6.38" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" +log4js@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-1.1.0.tgz#c7d2b616d91bbf47cc65fb79d6fe04581c8096fa" dependencies: - readable-stream "~1.0.2" - semver "~4.3.3" + debug "^2.2.0" + semver "^5.3.0" + streamroller "^0.2.1" -lokijs@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.4.1.tgz#ea17be92d2ea7caba1c816d6c2006424e8db0bfe" +lokijs@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/lokijs/-/lokijs-1.4.2.tgz#0f176380f9930d117946fc7c15ccb4ca001ddb4a" longest@^1.0.1: version "1.0.1" @@ -2928,24 +2726,17 @@ mime-types@^2.1.11, mime-types@~2.1.7: dependencies: mime-db "~1.25.0" -mime@^1.3.4: +mime@^1.2.11, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - "minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: brace-expansion "^1.0.0" -minimatch@2.x, minimatch@^2.0.1: +minimatch@^2.0.1: version "2.0.10" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" dependencies: @@ -2962,10 +2753,6 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -2974,17 +2761,13 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -minimongo-standalone@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/minimongo-standalone/-/minimongo-standalone-0.0.9.tgz#1c67a498ba83c479995c5fac60dcc5538f8c29b0" +minimongo-standalone@^1.1.0-3: + version "1.1.0-3" + resolved "https://registry.yarnpkg.com/minimongo-standalone/-/minimongo-standalone-1.1.0-3.tgz#cfdb3d0136811bab7fb92f6c13e0c74bd64dd5bd" dependencies: async ">=0.1.0" underscore ">=1.0.0" -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -2997,20 +2780,21 @@ mkdirp@0.5.0: dependencies: minimist "0.0.8" -mocha@^2: - version "2.5.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" +mocha@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" dependencies: - commander "2.3.0" + browser-stdout "1.3.0" + commander "2.9.0" debug "2.2.0" diff "1.4.0" - escape-string-regexp "1.0.2" - glob "3.2.11" + escape-string-regexp "1.0.5" + glob "7.0.5" growl "1.9.2" - jade "0.26.3" + json3 "3.3.2" + lodash.create "3.1.1" mkdirp "0.5.1" - supports-color "1.2.0" - to-iso-string "0.0.2" + supports-color "3.1.2" ms@0.7.1: version "0.7.1" @@ -3020,7 +2804,7 @@ ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" -multipipe@^0.1.0, multipipe@^0.1.2: +multipipe@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" dependencies: @@ -3046,9 +2830,9 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" -node-emoji@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.4.1.tgz#c9fa0cf91094335bcb967a6f42b2305c15af2ebc" +node-emoji@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" dependencies: string.prototype.codepointat "^0.2.0" @@ -3056,10 +2840,6 @@ node-status-codes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" -node-status-codes@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-2.0.1.tgz#298067659cb68a2b4670abbefde02a3819981f5b" - node-unzip-2@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/node-unzip-2/-/node-unzip-2-0.2.1.tgz#8e4a0e5a68f7b03d33b8dc52b83a93d1d003cdd8" @@ -3085,7 +2865,7 @@ nopt@3.x: dependencies: abbrev "1" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" dependencies: @@ -3120,9 +2900,9 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -numeral@^1.5.3: - version "1.5.6" - resolved "https://registry.yarnpkg.com/numeral/-/numeral-1.5.6.tgz#3831db968451b9cf6aff9bf95925f1ef8e37b33f" +numeral@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.4.tgz#545a0c709e090a9cf79bebec802b93f60061f038" oauth-sign@~0.8.1: version "0.8.2" @@ -3174,18 +2954,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.5.0.tgz#b75a8995a2d417df25b6e4e3862f50aa88651368" - dependencies: - deep-is "~0.1.2" - fast-levenshtein "~1.0.0" - levn "~0.2.5" - prelude-ls "~1.1.1" - type-check "~0.3.1" - wordwrap "~0.0.2" - -optionator@^0.8.2: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -3229,9 +2998,9 @@ os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" -os-timesync@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/os-timesync/-/os-timesync-1.0.6.tgz#0b315b0009ccbbd1796dedc38e3c590ac5cad1b7" +os-timesync@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/os-timesync/-/os-timesync-1.0.7.tgz#fc7ea7e6de1fc88742880cd08ff284327678e20d" os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: version "1.0.2" @@ -3286,10 +3055,6 @@ parse-json@^2.1.0, parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-ms@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" - path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -3368,15 +3133,11 @@ plist@^2.0.1: xmlbuilder "8.2.2" xmldom "0.1.x" -plur@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" - pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" -prelude-ls@~1.1.0, prelude-ls@~1.1.1, prelude-ls@~1.1.2: +prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -3399,19 +3160,11 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" -pretty-ms@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" - dependencies: - is-finite "^1.0.1" - parse-ms "^1.0.0" - plur "^1.0.0" - process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -progress-stream@^1.1.0, progress-stream@^1.2.0: +progress-stream@^1.1.0, progress-stream@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" dependencies: @@ -3422,12 +3175,6 @@ progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" -promise@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" - dependencies: - asap "~2.0.3" - pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -3453,7 +3200,7 @@ q@~1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" -qs@^6.1.0, qs@~6.2.0: +qs@~6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" @@ -3484,29 +3231,6 @@ read-all-stream@^3.0.0: pinkie-promise "^2.0.0" readable-stream "^2.0.0" -read-installed@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" - dependencies: - debuglog "^1.0.1" - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - semver "2 || 3 || 4 || 5" - slide "~1.1.3" - util-extend "^1.0.1" - optionalDependencies: - graceful-fs "^4.1.2" - -read-package-json@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.4.tgz#61ed1b2256ea438d8008895090be84b8e799c853" - dependencies: - glob "^6.0.0" - json-parse-helpfulerror "^1.0.2" - normalize-package-data "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.2" - read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -3522,7 +3246,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.17, readable-stream@~1.0.2, readable-stream@~1.0.31: +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: @@ -3531,6 +3255,15 @@ read-pkg@^1.0.0: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^1.1.7, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5: version "2.1.5" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" @@ -3543,15 +3276,6 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable string_decoder "~0.10.x" util-deprecate "~1.0.1" -readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@~2.0.0, readable-stream@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -3563,15 +3287,6 @@ readable-stream@~2.0.0, readable-stream@~2.0.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - readline2@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" @@ -3593,9 +3308,9 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -regenerator-runtime@^0.9.5: - version "0.9.6" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" +regenerator-runtime@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" regex-cache@^0.4.2: version "0.4.3" @@ -3660,7 +3375,7 @@ request@2.74.0: tough-cookie "~2.3.0" tunnel-agent "~0.4.1" -request@^2.45.0, request@^2.65.0: +request@^2.45.0, request@^2.55.0, request@^2.65.0: version "2.75.0" resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93" dependencies: @@ -3783,6 +3498,10 @@ rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + sanitize-filename@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" @@ -3817,7 +3536,7 @@ semver-diff@^2.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" -semver@^4.1.0, semver@~4.3.3: +semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" @@ -3829,10 +3548,6 @@ set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" -set-immediate-shim@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - "setimmediate@>= 1.0.2 < 2", setimmediate@~1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -3853,9 +3568,9 @@ shelljs@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" -shelljs@^0.7.0, shelljs@^0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" +shelljs@^0.7.5, shelljs@^0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -3885,7 +3600,7 @@ slice-ansi@0.0.4: dependencies: readable-stream "~1.0.31" -slide@^1.1.5, slide@~1.1.3: +slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -3895,13 +3610,14 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -solc@0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.6.tgz#afa929a1ceafc0252cfbb4217c8e2b1dab139db7" +solc@^0.4.8: + version "0.4.8" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.8.tgz#96abbee1266341ae97fb4bdc3abcc9bc1b5052ab" dependencies: fs-extra "^0.30.0" memorystream "^0.3.1" require-from-string "^1.1.0" + semver "^5.3.0" yargs "^4.7.1" source-map-resolve@^0.3.0: @@ -3913,9 +3629,9 @@ source-map-resolve@^0.3.0: source-map-url "~0.3.0" urix "~0.1.0" -source-map-support@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" +source-map-support@^0.4.11: + version "0.4.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322" dependencies: source-map "^0.5.3" @@ -3970,12 +3686,12 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" -spectron@^3.2.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/spectron/-/spectron-3.4.0.tgz#ff9e54dc34428ec4f99ab1c5efa050b9ad200b31" +spectron@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/spectron/-/spectron-3.3.0.tgz#b4f0b9fa00771715aa04aa31b336f1bd763d660f" dependencies: dev-null "^0.1.1" - electron-chromedriver "~1.4.0" + electron-chromedriver "~1.3.0" request "^2.65.0" split "^1.0.0" webdriverio "^4.0.4" @@ -4009,7 +3725,7 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -stat-mode@^0.2.0: +stat-mode@^0.2.0, stat-mode@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" @@ -4028,6 +3744,14 @@ stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +streamroller@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.2.2.tgz#a13420e04169e573db068f5920ee23d881abfe33" + dependencies: + date-format "^0.0.0" + debug "^0.7.2" + readable-stream "^1.1.7" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -4055,12 +3779,6 @@ stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -4108,10 +3826,14 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: +strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + sum-up@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" @@ -4125,31 +3847,15 @@ sumchecker@^1.2.0: debug "^2.2.0" es6-promise "^3.2.1" -supports-color@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" - -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.1.0, supports-color@^3.1.2: +supports-color@3.1.2, supports-color@^3.1.0, supports-color@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" dependencies: has-flag "^1.0.0" -sync-request@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-3.0.1.tgz#caa1235aaf889ba501076a1834c436830a82fb73" - dependencies: - concat-stream "^1.4.7" - http-response-object "^1.0.1" - then-request "^2.0.1" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" table@^3.7.8: version "3.8.3" @@ -4175,17 +3881,6 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -then-request@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-2.2.0.tgz#6678b32fa0ca218fe569981bbd8871b594060d81" - dependencies: - caseless "~0.11.0" - concat-stream "^1.4.7" - http-basic "^2.5.1" - http-response-object "^1.1.0" - promise "^7.1.1" - qs "^6.1.0" - throttleit@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" @@ -4197,13 +3892,6 @@ through2-filter@^2.0.0: through2 "~2.0.0" xtend "~4.0.0" -through2@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - through2@^0.6.0, through2@^0.6.1: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" @@ -4243,6 +3931,10 @@ timed-out@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.0.0.tgz#ff88de96030ce960eabd42487db61d3add229273" +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + tmp@0.0.28: version "0.0.28" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" @@ -4261,10 +3953,6 @@ to-absolute-glob@^0.1.1: dependencies: extend-shallow "^2.0.1" -to-iso-string@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" - tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" @@ -4297,7 +3985,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" -type-check@~0.3.1, type-check@~0.3.2: +type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" dependencies: @@ -4315,13 +4003,13 @@ typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript@^1.7.3: - version "1.8.10" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-1.8.10.tgz#b475d6e0dff0bf50f296e5ca6ef9fbb5c7320f1e" +typescript@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.5.tgz#6fe9479e00e01855247cea216e7561bafcdbcd4a" uglify-js@^2.6: - version "2.7.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2" + version "2.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" dependencies: async "~0.2.6" source-map "~0.5.1" @@ -4363,9 +4051,9 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -update-notifier@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.2.tgz#27c90519196dc15015be02a34ea52986feab8877" +update-notifier@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" dependencies: boxen "^0.6.0" chalk "^1.0.0" @@ -4380,6 +4068,10 @@ urix@^0.1.0, urix@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" +url-join@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -4425,10 +4117,14 @@ uuid-1345@^0.99.6: dependencies: macaddress "^0.2.7" -uuid@^2.0.1, uuid@^2.0.2: +uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" +uuid@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + v8flags@^2.0.2: version "2.0.11" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" @@ -4498,12 +4194,6 @@ vinyl-fs@^2.2.0: vali-date "^1.0.0" vinyl "^1.0.0" -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - dependencies: - clone-stats "~0.0.1" - vinyl@^0.4.0, vinyl@^0.4.3: version "0.4.6" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" @@ -4659,10 +4349,6 @@ xtend@~2.1.1: dependencies: object-keys "~0.4.0" -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" @@ -4678,13 +4364,13 @@ yargs-parser@^2.4.1: camelcase "^3.0.0" lodash.assign "^4.0.6" -yargs-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.1.0.tgz#313df030f20124124aeae8fbab2da53ec28c56d7" +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" dependencies: camelcase "^3.0.0" -yargs@^4.3.1, yargs@^4.3.2, yargs@^4.7.1: +yargs@^4.3.2, yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" dependencies: @@ -4703,9 +4389,9 @@ yargs@^4.3.1, yargs@^4.3.2, yargs@^4.7.1: y18n "^3.2.1" yargs-parser "^2.4.1" -yargs@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4" +yargs@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -4718,9 +4404,8 @@ yargs@^6.4.0: set-blocking "^2.0.0" string-width "^1.0.2" which-module "^1.0.0" - window-size "^0.2.0" y18n "^3.2.1" - yargs-parser "^4.1.0" + yargs-parser "^4.2.0" yargs@~3.10.0: version "3.10.0" @@ -4737,7 +4422,7 @@ yauzl@2.4.1, yauzl@^2.2.1: dependencies: fd-slicer "~1.0.1" -zip-stream@^1.0.0, zip-stream@^1.1.0: +zip-stream@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.1.0.tgz#2ad479fffc168e05a888e8c348ff6813b3f13733" dependencies: