2018-04-18 16:09:42 +00:00
|
|
|
const async = require('async');
|
|
|
|
const fs = require('./fs.js');
|
|
|
|
const path = require('path');
|
|
|
|
const request = require('request');
|
2017-07-05 12:35:51 +00:00
|
|
|
|
|
|
|
class File {
|
|
|
|
|
2018-04-18 16:09:42 +00:00
|
|
|
constructor (options) {
|
2017-07-05 12:35:51 +00:00
|
|
|
this.filename = options.filename;
|
|
|
|
this.type = options.type;
|
|
|
|
this.path = options.path;
|
2018-02-24 01:36:11 +00:00
|
|
|
this.basedir = options.basedir;
|
2017-07-05 12:35:51 +00:00
|
|
|
this.resolver = options.resolver;
|
|
|
|
}
|
|
|
|
|
2018-04-18 20:32:51 +00:00
|
|
|
parseFileForImport(content, callback) {
|
2018-04-19 17:29:25 +00:00
|
|
|
const self = this;
|
|
|
|
if (self.filename.indexOf('.sol') < 0) {
|
2018-04-18 20:32:51 +00:00
|
|
|
// Only supported in Solidity
|
|
|
|
return callback();
|
|
|
|
}
|
|
|
|
const regex = /import "([a-zA-Z0-9_\-.\\\/]+)";/g;
|
|
|
|
let matches;
|
2018-04-19 14:05:11 +00:00
|
|
|
const filesToDownload = [];
|
2018-04-19 17:29:25 +00:00
|
|
|
const pathWithoutFile = path.dirname(self.path);
|
2018-04-18 20:32:51 +00:00
|
|
|
while ((matches = regex.exec(content))) {
|
2018-04-19 14:05:11 +00:00
|
|
|
filesToDownload.push({
|
2018-04-19 17:29:25 +00:00
|
|
|
fileRelativePath: path.join(path.dirname(self.filename), matches[1]),
|
|
|
|
url: `${pathWithoutFile}/${matches[1]}`
|
2018-04-19 14:05:11 +00:00
|
|
|
});
|
2018-04-18 20:32:51 +00:00
|
|
|
}
|
2018-04-19 17:29:25 +00:00
|
|
|
|
|
|
|
async.each(filesToDownload, ((fileObj, eachCb) => {
|
|
|
|
self.downloadFile(fileObj.fileRelativePath, fileObj.url, (_content) => {
|
|
|
|
eachCb();
|
|
|
|
});
|
|
|
|
}), callback);
|
2018-04-18 20:32:51 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 14:05:11 +00:00
|
|
|
downloadFile (filename, url, callback) {
|
2018-04-19 17:29:25 +00:00
|
|
|
console.log('Downloading:', filename, 'form', url);
|
|
|
|
const self = this;
|
2018-04-18 16:09:42 +00:00
|
|
|
async.waterfall([
|
|
|
|
function makeTheDir(next) {
|
2018-04-19 14:05:11 +00:00
|
|
|
fs.mkdirp(path.dirname(filename), (err) => {
|
2018-04-18 16:09:42 +00:00
|
|
|
if (err) {
|
|
|
|
return next(err);
|
|
|
|
}
|
|
|
|
next();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
function downloadTheFile(next) {
|
2018-04-19 14:05:11 +00:00
|
|
|
request(url)
|
2018-04-18 16:09:42 +00:00
|
|
|
.on('response', function (response) {
|
|
|
|
if (response.statusCode !== 200) {
|
|
|
|
next('Getting file returned code ' + response.statusCode);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.on('error', next)
|
2018-04-19 14:05:11 +00:00
|
|
|
.pipe(fs.createWriteStream(filename))
|
|
|
|
.on('finish', next);
|
2018-04-18 16:09:42 +00:00
|
|
|
},
|
|
|
|
function readFile(next) {
|
2018-04-19 14:05:11 +00:00
|
|
|
fs.readFile(filename, next);
|
2018-04-19 17:29:25 +00:00
|
|
|
},
|
|
|
|
function parseForImports(content, next) {
|
2018-04-18 20:32:51 +00:00
|
|
|
self.parseFileForImport(content, (err) => {
|
|
|
|
next(err, content);
|
|
|
|
});
|
2018-04-19 17:29:25 +00:00
|
|
|
}
|
2018-04-18 16:09:42 +00:00
|
|
|
], (err, content) => {
|
|
|
|
if (err) {
|
|
|
|
console.error('Error while downloading the file', err);
|
|
|
|
return callback('');
|
|
|
|
}
|
|
|
|
callback(content.toString());
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
content (callback) {
|
|
|
|
if (this.type === File.types.embark_internal) {
|
2017-07-05 12:35:51 +00:00
|
|
|
return callback(fs.readFileSync(fs.embarkPath(this.path)).toString());
|
2018-04-18 16:09:42 +00:00
|
|
|
} else if (this.type === File.types.dapp_file) {
|
2017-07-05 12:35:51 +00:00
|
|
|
return callback(fs.readFileSync(this.path).toString());
|
2018-04-18 16:09:42 +00:00
|
|
|
} else if (this.type === File.types.custom) {
|
2017-07-05 12:35:51 +00:00
|
|
|
return this.resolver(callback);
|
2018-04-18 16:09:42 +00:00
|
|
|
} else if (this.type === File.types.http) {
|
2018-04-19 14:05:11 +00:00
|
|
|
this.downloadFile(this.filename, this.path, (content) => {
|
|
|
|
if (!content) {
|
|
|
|
return callback(content);
|
|
|
|
}
|
|
|
|
this.path = this.filename;
|
|
|
|
this.type = File.types.dapp_file;
|
|
|
|
callback(content);
|
|
|
|
});
|
2017-07-05 12:35:51 +00:00
|
|
|
} else {
|
|
|
|
throw new Error("unknown file: " + this.filename);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-04-18 16:09:42 +00:00
|
|
|
File.types = {
|
|
|
|
embark_internal: 'embark_internal',
|
|
|
|
dapp_file: 'dapp_file',
|
|
|
|
custom: 'custom',
|
|
|
|
http: 'http'
|
|
|
|
};
|
|
|
|
|
2017-07-05 12:35:51 +00:00
|
|
|
module.exports = File;
|