Solc loading issue now fully resolved

Added better error checking for solidity compilation errors

Extracted timer functionality for downloading packages so it works across the main process and child processes.

Npm class is instantiated only once and reused for event commands.

Npm class can handle concurrent requests for the same package and callback the installation result for each request.
This commit is contained in:
emizzle 2018-06-14 18:09:02 +10:00 committed by Iuri Matias
parent a046acb732
commit eedcdc77a7
11 changed files with 446 additions and 154 deletions

147
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,147 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Embark: Mocha All",
"program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
"args": [
"--colors",
"--no-timeouts",
"${workspaceFolder}/test/"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Embark: Mocha Current File",
"program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
"args": [
"--colors",
"--no-timeouts",
"${file}"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Embark: embark test",
"autoAttachChildProcesses": true,
//"preLaunchTask": "npm_install",
"program": "${workspaceFolder}/lib/tests/test_embark",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Test app: Embark test",
"cwd": "${workspaceFolder}/test_apps/test_app/",
"autoAttachChildProcesses": true,
//"preLaunchTask": "npm_install",
"program": "${workspaceFolder}/bin/embark",
"args": [
"test"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Test app: Embark new testapp123",
"cwd": "${workspaceFolder}/test_apps/test_app/",
"autoAttachChildProcesses": true,
//"preLaunchTask": "npm_install",
"program": "${workspaceFolder}/bin/embark",
"args": [
"new",
"testapp123"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Test app: Embark upload",
"cwd": "${workspaceFolder}/test_apps/test_app/",
"autoAttachChildProcesses": true,
//"preLaunchTask": "npm_install",
"program": "${workspaceFolder}/bin/embark",
"args": [
"upload"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Test app: Embark run",
"cwd": "${workspaceFolder}/test_apps/test_app/",
"autoAttachChildProcesses": true,
//"preLaunchTask": "npm_install",
"program": "${workspaceFolder}/bin/embark",
"args": [
"run",
"--nodashboard"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Embark demo from main repo: Embark run",
"cwd": "${workspaceFolder}/../../embk-fw/embark/embark_demo/",
"autoAttachChildProcesses": true,
//"preLaunchTask": "npm_install",
"program": "${workspaceFolder}/bin/embark",
"args": [
"run"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Embark demo from dapp-bin: Embark run",
"cwd": "${workspaceFolder}/../../embk-fw/dapp-bin/embark_demo/",
"autoAttachChildProcesses": false,
//"preLaunchTask": "npm_install",
"program": "${workspaceFolder}/bin/embark",
"args": [
"run",
"--nodashboard"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"type": "node",
"request": "launch",
"name": "Embark react routes demo: Embark run",
"cwd": "${workspaceFolder}/../../emizzle/embark-demo-react-routes/",
"autoAttachChildProcesses": true,
//"preLaunchTask": "npm_install",
"program": "${workspaceFolder}/bin/embark",
"args": [
"run"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}

View File

@ -61,10 +61,10 @@ class IPFS {
return cb({name: "IPFS ", status: 'off'}); return cb({name: "IPFS ", status: 'off'});
} }
if (body.Version) { if (body.Version) {
self.logger.trace("Swarm available"); self.logger.trace("IPFS available");
return cb({name: ("IPFS " + body.Version), status: 'on'}); return cb({name: ("IPFS " + body.Version), status: 'on'});
} }
self.logger.trace("Swarm available"); self.logger.trace("IPFS available");
return cb({name: "IPFS ", status: 'on'}); return cb({name: "IPFS ", status: 'on'});
} }
}); });

View File

@ -75,7 +75,10 @@ class Solidity {
} }
}; };
self.solcW.compile(jsonObj, function (output) { self.solcW.compile(jsonObj, function (err, output) {
if(err){
return callback(err);
}
if (output.errors) { if (output.errors) {
for (let i=0; i<output.errors.length; i++) { for (let i=0; i<output.errors.length; i++) {
if (output.errors[i].type === 'Warning') { if (output.errors[i].type === 'Warning') {

View File

@ -3,10 +3,18 @@ const path = require('path');
const constants = require('../../constants'); const constants = require('../../constants');
const Utils = require('../../utils/utils'); const Utils = require('../../utils/utils');
const ProcessWrapper = require('../../process/processWrapper'); const ProcessWrapper = require('../../process/processWrapper');
const PluginManager = require('live-plugin-manager').PluginManager; const PluginManager = require('live-plugin-manager-git-fix').PluginManager;
const NpmTimer = require('../../versions/npmTimer');
class SolcProcess extends ProcessWrapper { class SolcProcess extends ProcessWrapper {
constructor(options){
super();
this._logger = options.logger;
this._npm = options.npm;
}
findImports(filename) { findImports(filename) {
if (filename.startsWith('http') || filename.startsWith('git')) { if (filename.startsWith('http') || filename.startsWith('git')) {
const fileObj = Utils.getExternalContractUrl(filename); const fileObj = Utils.getExternalContractUrl(filename);
@ -28,44 +36,55 @@ class SolcProcess extends ProcessWrapper {
let self = this; let self = this;
return new Promise((resolve) => { return new Promise((resolve) => {
let manager = new PluginManager({pluginsPath: packagePath}); let manager = new PluginManager({pluginsPath: packagePath});
let timer;
if (!fs.existsSync(packagePath)) {
timer = new NpmTimer({logger: self._logger, packageName: 'solc', version: solcVersion, showSpinner: true});
}
if(timer) timer.start();
manager.install('solc', solcVersion).then(() => { manager.install('solc', solcVersion).then(() => {
self.solc = manager.require('solc'); self.solc = manager.require('solc');
if(timer) timer.end();
resolve(); resolve();
}); });
}); });
} }
compile(jsonObj, cb) { compile(jsonObj, cb) {
// TODO: only available in 0.4.11; need to make versions warn about this // TODO: only available in 0.4.11; need to make versions warn about this
try {
let output = this.solc.compileStandardWrapper(JSON.stringify(jsonObj), this.findImports); let output = this.solc.compileStandardWrapper(JSON.stringify(jsonObj), this.findImports);
cb(output); cb(null, output);
} catch (err) {
cb(err.message);
}
} }
} }
let solcProcess; let solcProcess;
process.on('message', (msg) => {
process.on('message', function (msg) {
if (msg.action === "init") { if (msg.action === "init") {
solcProcess = new SolcProcess(msg.options); solcProcess = new SolcProcess(msg.options);
return this.send({result: "initiated"}); return process.send({result: "initiated"});
} }
else if (msg.action === 'loadCompiler') { else if (msg.action === 'loadCompiler') {
require('solc'); solcProcess.solc = require('solc');
return this.send({result: "loadedCompiler"}); return process.send({result: "loadedCompiler"});
} }
else if (msg.action == 'installAndLoadCompiler') { else if (msg.action == 'installAndLoadCompiler') {
solcProcess.installAndLoadCompiler(msg.solcVersion, msg.packagePath).then(() => { solcProcess.installAndLoadCompiler(msg.solcVersion, msg.packagePath).then(() => {
return this.send({result: "loadedCompiler"}); return process.send({result: "loadedCompiler"});
}); });
} }
else if (msg.action === 'compile') { else if (msg.action === 'compile') {
solcProcess.compile(msg.jsonObj, (output) => { solcProcess.compile(msg.jsonObj, (err, output) => {
this.send({result: "compilation-" + msg.id, output: output}); process.send({result: "compilation-" + msg.id, err: err, output: output});
}); });
} }
}); });

View File

@ -60,8 +60,7 @@ class SolcW {
self.compilerLoaded = true; self.compilerLoaded = true;
done(); done();
}); });
this.solcProcess.send({action: "init", options: {logger: self.logger}});
this.solcProcess.send({action: "init", options: {}});
if (this.ipc.isServer()) { if (this.ipc.isServer()) {
this.ipc.on('compile', self.compile.bind(this)); this.ipc.on('compile', self.compile.bind(this));
@ -80,7 +79,10 @@ class SolcW {
} }
this.solcProcess.once('result', 'compilation-' + id, (msg) => { this.solcProcess.once('result', 'compilation-' + id, (msg) => {
done(JSON.parse(msg.output)); if(msg.err) {
return done(msg.err);
}
done(null, JSON.parse(msg.output));
}); });
this.solcProcess.send({action: 'compile', jsonObj: jsonObj, id}); this.solcProcess.send({action: 'compile', jsonObj: jsonObj, id});

View File

@ -80,7 +80,12 @@ class Swarm {
let currentPIterationVersion = require('../../../package.json').dependencies["p-iteration"]; let currentPIterationVersion = require('../../../package.json').dependencies["p-iteration"];
if (pIterationVersion !== currentPIterationVersion) { if (pIterationVersion !== currentPIterationVersion) {
self.events.request("version:getPackageLocation", "p-iteration", pIterationVersion, function(err, location) { self.events.request("version:getPackageLocation", "p-iteration", pIterationVersion, function(err, location) {
if(!err){
self.embark.registerImportFile("p-iteration", fs.dappPath(location)); self.embark.registerImportFile("p-iteration", fs.dappPath(location));
}
else{
self.logger.error("Error getting package location for p-iteration: " + err);
}
}); });
} }
}); });

View File

@ -64,13 +64,12 @@ class LibraryManager {
} }
listenToCommandsToGetLibrary() { listenToCommandsToGetLibrary() {
let npm = new Npm({logger: this.embark.logger});
this.embark.events.setCommandHandler('version:getPackageLocation', (libName, version, cb) => { this.embark.events.setCommandHandler('version:getPackageLocation', (libName, version, cb) => {
let npm = new Npm({logger: this.embark.logger, packageName: libName, version:version});
npm.getPackageVersion(libName, version, cb); npm.getPackageVersion(libName, version, cb);
}); });
this.embark.events.setCommandHandler('version:getPackagePath', (libName, version, cb) => { this.embark.events.setCommandHandler('version:getPackagePath', (libName, version, cb) => {
let npm = new Npm({logger: this.embark.logger, packageName: libName, version:version}); cb(null, Npm.getPackagePath(libName, version));
cb(null, npm.packagePath);
}); });
} }

View File

@ -1,128 +1,57 @@
const fs = require('../core/fs.js'); const fs = require('../core/fs.js');
const {PerformanceObserver, performance} = require('perf_hooks');
const PluginManager = require('live-plugin-manager-git-fix').PluginManager; const PluginManager = require('live-plugin-manager-git-fix').PluginManager;
require('colors'); require('colors');
const _ = require('underscore'); const NpmTimer = require('./npmTimer');
class Npm { class Npm {
constructor(options) { constructor(options) {
this.logger = options.logger; this._logger = options.logger;
this.packageName = options.packageName; this._packageName = options.packageName;
this.version = options.version; this._version = options.version;
this._installing = {};
} }
get packagePath(){ static getPackagePath(packageName, version){
if(typeof this._packagePath == 'undefined'){ return './.embark/versions/' + packageName + '/' + version + '/' + packageName;
this._packagePath = './.embark/versions/' + this.packageName + '/' + this.version + '/';
}
return this._packagePath;
} }
get pluginManager(){ _isInstalling(packageName, version){
if(typeof this._pluginManager == 'undefined'){ return typeof this._installing[packageName + version] != 'undefined';
this._pluginManager = new PluginManager({pluginsPath: this.packagePath});
}
return this._pluginManager;
} }
getPackageVersion(packageName, version, callback) { getPackageVersion(packageName, version, callback) {
const packagePath = Npm.getPackagePath(packageName, version);
if (fs.existsSync(this.packagePath + packageName)) { // check if this package already exists in the filesystem
return callback(null, this.packagePath + packageName); if (fs.existsSync(packagePath)) {
return callback(null, packagePath);
} }
this.logger.info(__("Downloading and installing {{packageName}} {{version}}...", {packageName: packageName, version: version})); const pluginManager = new PluginManager({pluginsPath: './.embark/versions/' + packageName + '/' + version + '/'});
const obsMeasure = new PerformanceObserver((items) => { // check if we're already installing this package
let entry; if(this._isInstalling(packageName, version)){
let strDuration; this._installing[packageName + version].push(callback);
}else{
this._installing[packageName + version] = new Array(callback);
// find any download ongoing measurements we've made
entry = _.last(_.where(items.getEntries(), {name: downloadOngoing}));
if(entry){
// ongoing performance mark
strDuration = __('Downloading and installing {{packageName}} {{version}}... ({{duration}}ms elapsed)', {packageName: packageName, version: version, duration: entry.duration});
}
else{
// otherwise, find our download complete measurement
entry = _.last(_.where(items.getEntries(), {name: downloadComplete}));
if(entry){ const timer = new NpmTimer({logger: this._logger, packageName: packageName, version: version});
strDuration = __('Finished downloading and installing {{packageName}} {{version}} in {{duration}}ms', {packageName: packageName, version: version, duration: entry.duration}); timer.start();
performance.clearMarks();
}
}
// log our measurement and make it red if it has taken too long
if(entry && strDuration){
if(entry.duration > 4000){
strDuration = strDuration.red;
}
this.logger.info(strDuration);
}
});
obsMeasure.observe({entryTypes: ['measure']});
// define mark and measurement names
let startMark = 'downloadStart' + packageName + version;
let ongoingMark = 'downloadOngoingMark' + packageName + version;
let downloadOngoing = 'downloadOngoing' + packageName + version;
let endMark = 'downloadEnd' + packageName + version;
let downloadComplete = 'downloadComplete' + packageName + version;
// mark our start time
performance.mark(startMark);
// function that continually updates the console to show user that we're downloading a library
let intOngoingDownload = setInterval(
function(){
performance.mark(ongoingMark);
performance.measure(downloadOngoing, startMark, ongoingMark);
}, 750);
// do the package download/install // do the package download/install
this.pluginManager.install(packageName, version).then((result) => { pluginManager.install(packageName, version).then((result) => {
timer.end();
// if(packageName === 'solc'){ this._installing[packageName + version].forEach((cb) => {
cb(null, result.location);
// async.each(Object.keys(result.dependencies), function(dependency, cb){ });
delete this._installing[packageName + version];
// console.log('getting dependency: ' + dependency + ' ' + result.dependencies[dependency]); //callback(null, result.location);
}).catch(err => {
// self.pluginManager.install(dependency, result.dependencies[dependency]).then(() => { callback(err);
// console.log('installed ' + dependency + ' ' + result.dependencies[dependency]); });
// cb(); }
// })
// .catch(cb);
// }, function(err){
// // stop updating console for ongoing download
// clearInterval(intOngoingDownload);
// performance.mark(endMark);
// performance.measure(downloadComplete, startMark, endMark);
// if(err){
// self.logger.error(err);
// return callback(err);
// }else{
// return callback(null, result.location, self.pluginManager);
// }
// });
// }
// else{
// stop updating console for ongoing download
clearInterval(intOngoingDownload);
performance.mark(endMark);
performance.measure(downloadComplete, startMark, endMark);
callback(null, result.location);
//}
}).catch(callback);
} }
} }

109
lib/versions/npmTimer.js Normal file
View File

@ -0,0 +1,109 @@
const {PerformanceObserver, performance} = require('perf_hooks');
const _ = require('underscore');
require('colors');
const i18n = require('../i18n/i18n.js');
i18n.setOrDetectLocale('en');
class NpmTimer{
constructor(options){
this._logger = options.logger;
this._packageName = options.packageName;
this._version = options.version;
this._showSpinner = options.showSpinner || false;
this._spinnerStyle = options.spinnerStyle || 'dots';
this._interval = options.interval || 750;
// define mark and measurement names
this._startMark = 'downloadStart' + this._packageName + this._version;
this._ongoingMark = 'downloadOngoingMark' + this._packageName + this._version;
this._downloadOngoing = 'downloadOngoing' + this._packageName + this._version;
this._endMark = 'downloadEnd' + this._packageName + this._version;
this._downloadComplete = 'downloadComplete' + this._packageName + this._version;
this.observer.observe({entryTypes: ['measure']});
}
get observer(){
if(typeof this._observer == 'undefined'){
this._observer = new PerformanceObserver((items) => {
let entry;
let strDuration;
// find any download ongoing measurements we've made
entry = _.last(_.where(items.getEntries(), {name: this._downloadOngoing}));
if(entry){
// ongoing performance mark
strDuration = __('Downloading and installing {{packageName}} {{version}}... ({{duration}}ms elapsed)', {packageName: this._packageName, version: this._version, duration: entry.duration});
if(this._spinner) this._spinner.text = strDuration;
}
else{
// otherwise, find our download complete measurement
entry = _.last(_.where(items.getEntries(), {name: this._downloadComplete}));
if(entry){
strDuration = __('Finished downloading and installing {{packageName}} {{version}} in {{duration}}ms', {packageName: this._packageName, version: this._version, duration: entry.duration});
performance.clearMarks();
if(this._spinner) this._spinner.succeed(strDuration);
}
}
// log our measurement and make it red if it has taken too long
if(!this._showSpinner && entry && strDuration){
if(entry.duration > 4000){
strDuration = strDuration.red;
}
this._log(strDuration);
}
});
}
return this._observer;
}
_log(msg){
if(typeof this._logger.info == 'function'){
this._logger.info(msg);
}
else{ // occurs in subprocess as functions are not serialised/deserialised properly
console.log(msg.green);
}
}
start(){
let self = this;
const strDownloadStart = __("Downloading and installing {{packageName}} {{version}}...", {packageName: this._packageName, version: this._version});
if(this._showSpinner){
const ora = require('ora');
this._spinner = ora({
spinner: this._spinnerStyle,
text: strDownloadStart
}).start();
}else{
this._log(strDownloadStart);
}
// mark our start time
performance.mark(this._startMark);
// function that continually updates the console to show user that we're downloading a library
this._intOngoingDownload = setInterval(
function(){
self._log('npmTimer: hit an interval');
performance.mark(self._ongoingMark);
performance.measure(self._downloadOngoing, self._startMark, self._ongoingMark);
}, this._interval);
}
end(){
// stop updating console for ongoing download
clearInterval(this._intOngoingDownload);
performance.mark(this._endMark);
performance.measure(this._downloadComplete, this._startMark, this._endMark);
}
}
module.exports = NpmTimer;

130
package-lock.json generated
View File

@ -2344,9 +2344,9 @@
} }
}, },
"cli-spinners": { "cli-spinners": {
"version": "0.1.2", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
"integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=" "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg=="
}, },
"cli-table": { "cli-table": {
"version": "0.3.1", "version": "0.3.1",
@ -3037,6 +3037,14 @@
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true "dev": true
}, },
"defaults": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
"integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
"requires": {
"clone": "1.0.3"
}
},
"deferred-leveldown": { "deferred-leveldown": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz",
@ -6986,6 +6994,19 @@
"strip-ansi": "3.0.1" "strip-ansi": "3.0.1"
}, },
"dependencies": { "dependencies": {
"cli-cursor": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
"integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
"requires": {
"restore-cursor": "1.0.1"
}
},
"cli-spinners": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz",
"integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw="
},
"figures": { "figures": {
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
@ -7008,6 +7029,31 @@
"chalk": "1.1.3" "chalk": "1.1.3"
} }
}, },
"onetime": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
},
"ora": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz",
"integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=",
"requires": {
"chalk": "1.1.3",
"cli-cursor": "1.0.2",
"cli-spinners": "0.1.2",
"object-assign": "4.1.1"
}
},
"restore-cursor": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
"integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
"requires": {
"exit-hook": "1.1.1",
"onetime": "1.1.0"
}
},
"rxjs": { "rxjs": {
"version": "6.2.0", "version": "6.2.0",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.0.tgz", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.0.tgz",
@ -9037,36 +9083,60 @@
} }
}, },
"ora": { "ora": {
"version": "0.2.3", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", "resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz",
"integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "integrity": "sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==",
"requires": { "requires": {
"chalk": "1.1.3", "chalk": "2.4.1",
"cli-cursor": "1.0.2", "cli-cursor": "2.1.0",
"cli-spinners": "0.1.2", "cli-spinners": "1.3.1",
"object-assign": "4.1.1" "log-symbols": "2.2.0",
"strip-ansi": "4.0.0",
"wcwidth": "1.0.1"
}, },
"dependencies": { "dependencies": {
"cli-cursor": { "ansi-regex": {
"version": "1.0.2", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": { "requires": {
"restore-cursor": "1.0.1" "color-convert": "1.9.1"
} }
}, },
"onetime": { "chalk": {
"version": "1.1.0", "version": "2.4.1",
"resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
},
"restore-cursor": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
"integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
"requires": { "requires": {
"exit-hook": "1.1.1", "ansi-styles": "3.2.1",
"onetime": "1.1.0" "escape-string-regexp": "1.0.5",
"supports-color": "5.4.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "3.0.0"
}
},
"supports-color": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
"requires": {
"has-flag": "3.0.0"
} }
} }
} }
@ -12673,6 +12743,14 @@
"typechecker": "2.1.0" "typechecker": "2.1.0"
} }
}, },
"wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
"integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
"requires": {
"defaults": "1.0.3"
}
},
"web3": { "web3": {
"version": "1.0.0-beta.34", "version": "1.0.0-beta.34",
"resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.34.tgz", "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.34.tgz",

View File

@ -31,7 +31,6 @@
"babel-preset-es2017": "6.24.1", "babel-preset-es2017": "6.24.1",
"babel-preset-react": "^6.24.1", "babel-preset-react": "^6.24.1",
"bip39": "^2.5.0", "bip39": "^2.5.0",
"neo-blessed": "^0.2.0",
"chokidar": "^2.0.3", "chokidar": "^2.0.3",
"clone-deep": "^4.0.0", "clone-deep": "^4.0.0",
"colors": "^1.1.2", "colors": "^1.1.2",
@ -55,8 +54,10 @@
"ipfs-api": "17.2.4", "ipfs-api": "17.2.4",
"live-plugin-manager-git-fix": "^0.12.1", "live-plugin-manager-git-fix": "^0.12.1",
"merge": "^1.2.0", "merge": "^1.2.0",
"neo-blessed": "^0.2.0",
"node-http-proxy": "^0.2.3", "node-http-proxy": "^0.2.3",
"node-ipc": "^9.1.1", "node-ipc": "^9.1.1",
"ora": "^2.1.0",
"os-locale": "^2.1.0", "os-locale": "^2.1.0",
"p-iteration": "^1.1.7", "p-iteration": "^1.1.7",
"parse-json": "^4.0.0", "parse-json": "^4.0.0",