|
|
|
@ -37,48 +37,55 @@ function compileFileOrFiles (filename, isDirectory, opts, cb) { |
|
|
|
|
// TODO: for now assumes filepath dir contains all tests, later all this
|
|
|
|
|
// should be replaced with remix's & browser solidity compiler code
|
|
|
|
|
|
|
|
|
|
// This logic is wrong
|
|
|
|
|
// We should only look into current file if a full file name with path is given
|
|
|
|
|
// We should only walk through directory if a directory name is passed
|
|
|
|
|
try { |
|
|
|
|
// walkSync only if it is a directory
|
|
|
|
|
fs.walkSync(filepath, foundpath => { |
|
|
|
|
// only process .sol files
|
|
|
|
|
if (foundpath.split('.').pop() === 'sol') { |
|
|
|
|
let c = fs.readFileSync(foundpath).toString() |
|
|
|
|
const s = /^(import)\s['"](remix_tests.sol|tests.sol)['"];/gm |
|
|
|
|
if (foundpath.indexOf('_test.sol') > 0 && c.regexIndexOf(s) < 0) { |
|
|
|
|
c = c.replace(/(pragma solidity \^?\d+\.\d+\.\d+;)/, '$1\nimport \'remix_tests.sol\';') |
|
|
|
|
} |
|
|
|
|
sources[foundpath] = { content: c } |
|
|
|
|
// https://github.com/mikeal/node-utils/blob/master/file/lib/main.js
|
|
|
|
|
fs.walkSync = function (start, callback) { |
|
|
|
|
fs.readdirSync(start).forEach(name => { |
|
|
|
|
if (name === 'node_modules') { |
|
|
|
|
return; // hack
|
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
} catch (e) { |
|
|
|
|
throw e |
|
|
|
|
} finally { |
|
|
|
|
async.waterfall([ |
|
|
|
|
function loadCompiler (next) { |
|
|
|
|
compiler = new RemixCompiler() |
|
|
|
|
compiler.onInternalCompilerLoaded() |
|
|
|
|
// compiler.event.register('compilerLoaded', this, function (version) {
|
|
|
|
|
next() |
|
|
|
|
// });
|
|
|
|
|
}, |
|
|
|
|
function doCompilation (next) { |
|
|
|
|
compiler.event.register('compilationFinished', this, function (success, data, source) { |
|
|
|
|
next(null, data) |
|
|
|
|
}) |
|
|
|
|
compiler.compile(sources, filepath) |
|
|
|
|
var abspath = path.join(start, name); |
|
|
|
|
if (fs.statSync(abspath).isDirectory()) { |
|
|
|
|
fs.walkSync(abspath, callback); |
|
|
|
|
} else { |
|
|
|
|
callback(abspath); |
|
|
|
|
} |
|
|
|
|
], function (err, result) { |
|
|
|
|
let errors = (result.errors || []).filter((e) => e.type === 'Error' || e.severity === 'error') |
|
|
|
|
if (errors.length > 0) { |
|
|
|
|
if (!isBrowser) require('signale').fatal(errors) |
|
|
|
|
return cb(new Error('errors compiling')) |
|
|
|
|
}); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
fs.walkSync(filepath, foundpath => { |
|
|
|
|
// only process .sol files
|
|
|
|
|
if (foundpath.split('.').pop() === 'sol') { |
|
|
|
|
let c = fs.readFileSync(foundpath).toString() |
|
|
|
|
const s = /^(import)\s['"](remix_tests.sol|tests.sol)['"];/gm |
|
|
|
|
if (foundpath.indexOf('_test.sol') > 0 && c.regexIndexOf(s) < 0) { |
|
|
|
|
c = c.replace(/(pragma solidity \^?\d+\.\d+\.\d+;)/, '$1\nimport \'remix_tests.sol\';') |
|
|
|
|
} |
|
|
|
|
cb(err, result.contracts) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
sources[foundpath] = { content: c } |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
async.waterfall([ |
|
|
|
|
function loadCompiler (next) { |
|
|
|
|
compiler = new RemixCompiler() |
|
|
|
|
compiler.onInternalCompilerLoaded() |
|
|
|
|
// compiler.event.register('compilerLoaded', this, function (version) {
|
|
|
|
|
next() |
|
|
|
|
// });
|
|
|
|
|
}, |
|
|
|
|
function doCompilation (next) { |
|
|
|
|
compiler.event.register('compilationFinished', this, function (success, data, source) { |
|
|
|
|
next(null, data) |
|
|
|
|
}) |
|
|
|
|
compiler.compile(sources, false) |
|
|
|
|
} |
|
|
|
|
], function (err, result) { |
|
|
|
|
let errors = (result.errors || []).filter((e) => e.type === 'Error' || e.severity === 'error') |
|
|
|
|
if (errors.length > 0) { |
|
|
|
|
if (!isBrowser) require('signale').fatal(errors) |
|
|
|
|
return cb(new Error('errors compiling')) |
|
|
|
|
} |
|
|
|
|
cb(err, result.contracts) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function compileContractSources (sources, importFileCb, opts, cb) { |
|
|
|
|