2016-08-22 03:40:05 +00:00
|
|
|
var fs = require('fs');
|
|
|
|
var grunt = require('grunt');
|
2016-10-15 19:54:19 +00:00
|
|
|
var merge = require('merge');
|
2016-10-29 17:50:54 +00:00
|
|
|
var path = require('path');
|
2017-01-26 11:34:00 +00:00
|
|
|
var Plugins = require('./plugins.js');
|
2016-08-22 03:40:05 +00:00
|
|
|
|
2016-09-25 01:10:47 +00:00
|
|
|
// TODO: add wrapper for fs so it can also work in the browser
|
|
|
|
// can work with both read and save
|
2016-10-15 19:54:19 +00:00
|
|
|
var Config = function(options) {
|
|
|
|
this.env = options.env;
|
2016-08-22 03:40:05 +00:00
|
|
|
this.blockchainConfig = {};
|
|
|
|
this.contractsConfig = {};
|
|
|
|
this.pipelineConfig = {};
|
2016-09-25 01:10:47 +00:00
|
|
|
this.chainTracker = {};
|
2016-08-22 03:40:05 +00:00
|
|
|
this.assetFiles = {};
|
|
|
|
this.contractsFiles = [];
|
2016-10-15 19:54:19 +00:00
|
|
|
this.configDir = options.configDir || 'config/';
|
|
|
|
this.chainsFile = options.chainsFile || './chains.json';
|
2017-01-29 06:28:01 +00:00
|
|
|
this.plugins = options.plugins;
|
2017-01-26 11:34:00 +00:00
|
|
|
this.logger = options.logger;
|
2016-08-22 03:40:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
Config.prototype.loadConfigFiles = function(options) {
|
2017-02-06 11:42:58 +00:00
|
|
|
var interceptLogs = options.interceptLogs;
|
|
|
|
if (options.interceptLogs === undefined) {
|
|
|
|
interceptLogs = true;
|
|
|
|
}
|
2016-08-22 03:40:05 +00:00
|
|
|
this.embarkConfig = JSON.parse(fs.readFileSync(options.embarkConfig));
|
2017-01-29 06:28:01 +00:00
|
|
|
this.embarkConfig.plugins = this.embarkConfig.plugins || {};
|
2016-08-22 03:40:05 +00:00
|
|
|
|
2017-02-06 11:42:58 +00:00
|
|
|
this.plugins = new Plugins({plugins: this.embarkConfig.plugins, logger: this.logger, interceptLogs: interceptLogs});
|
2017-01-26 11:34:00 +00:00
|
|
|
this.plugins.loadPlugins();
|
|
|
|
|
2017-02-03 11:30:08 +00:00
|
|
|
this.loadPipelineConfigFile();
|
|
|
|
this.loadBlockchainConfigFile();
|
2017-02-10 12:44:06 +00:00
|
|
|
this.loadStorageConfigFile();
|
|
|
|
this.loadCommunicationConfigFile();
|
2017-02-03 11:30:08 +00:00
|
|
|
|
2016-08-22 03:40:05 +00:00
|
|
|
this.loadContractsConfigFile();
|
2016-09-25 01:10:47 +00:00
|
|
|
this.loadChainTrackerFile();
|
2017-01-26 11:34:00 +00:00
|
|
|
this.loadPluginContractFiles();
|
2016-08-22 03:40:05 +00:00
|
|
|
};
|
2016-09-23 08:37:15 +00:00
|
|
|
|
|
|
|
Config.prototype.reloadConfig = function() {
|
|
|
|
this.loadPipelineConfigFile();
|
|
|
|
this.loadBlockchainConfigFile();
|
2017-02-10 12:44:06 +00:00
|
|
|
this.loadStorageConfigFile();
|
|
|
|
this.loadCommunicationConfigFile();
|
2016-09-23 08:37:15 +00:00
|
|
|
this.loadContractsConfigFile();
|
2016-09-25 01:10:47 +00:00
|
|
|
this.loadChainTrackerFile();
|
2016-09-23 08:37:15 +00:00
|
|
|
};
|
2016-08-22 03:40:05 +00:00
|
|
|
|
|
|
|
Config.prototype.loadBlockchainConfigFile = function() {
|
2016-09-25 06:23:33 +00:00
|
|
|
var defaultBlockchainConfig = JSON.parse(fs.readFileSync(this.configDir + "blockchain.json"))[this.env];
|
2016-08-22 03:40:05 +00:00
|
|
|
this.blockchainConfig = defaultBlockchainConfig;
|
|
|
|
};
|
|
|
|
|
|
|
|
Config.prototype.loadContractsConfigFile = function() {
|
2017-01-26 11:34:00 +00:00
|
|
|
|
|
|
|
var configObject = {};
|
|
|
|
|
|
|
|
var configPlugins = this.plugins.getPluginsFor('contractsConfig');
|
|
|
|
if (configPlugins.length > 0) {
|
|
|
|
configPlugins.forEach(function(plugin) {
|
|
|
|
plugin.contractsConfigs.forEach(function(pluginConfig) {
|
|
|
|
configObject = merge.recursive(configObject, pluginConfig);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-10-15 19:54:19 +00:00
|
|
|
var contractsConfig = JSON.parse(fs.readFileSync(this.configDir + "contracts.json"));
|
2017-01-26 11:34:00 +00:00
|
|
|
configObject = merge.recursive(configObject, contractsConfig);
|
|
|
|
var defaultContractsConfig = configObject['default'];
|
|
|
|
var envContractsConfig = configObject[this.env];
|
2016-08-22 03:40:05 +00:00
|
|
|
|
2016-10-15 19:54:19 +00:00
|
|
|
var mergedConfig = merge.recursive(defaultContractsConfig, envContractsConfig);
|
|
|
|
this.contractsConfig = mergedConfig;
|
2016-08-22 03:40:05 +00:00
|
|
|
};
|
|
|
|
|
2017-02-10 12:44:06 +00:00
|
|
|
|
|
|
|
Config.prototype.loadStorageConfigFile = function() {
|
|
|
|
var configObject = {};
|
|
|
|
|
|
|
|
//var configPlugins = this.plugins.getPluginsFor('storageConfig');
|
|
|
|
//if (configPlugins.length > 0) {
|
|
|
|
// configPlugins.forEach(function(plugin) {
|
|
|
|
// plugin.contractsConfigs.forEach(function(pluginConfig) {
|
|
|
|
// configObject = merge.recursive(configObject, pluginConfig);
|
|
|
|
// });
|
|
|
|
// });
|
|
|
|
//}
|
|
|
|
|
|
|
|
var storageConfig = JSON.parse(fs.readFileSync(this.configDir + "storage.json"));
|
|
|
|
configObject = merge.recursive(configObject, storageConfig);
|
|
|
|
var defaultStorageConfig = configObject['default'];
|
|
|
|
var envStorageConfig = configObject[this.env];
|
|
|
|
|
|
|
|
var mergedConfig = merge.recursive(defaultStorageConfig, envStorageConfig);
|
|
|
|
this.storageConfig = mergedConfig;
|
|
|
|
};
|
|
|
|
|
|
|
|
Config.prototype.loadCommunicationConfigFile = function() {
|
|
|
|
var configObject = {};
|
|
|
|
|
|
|
|
//var configPlugins = this.plugins.getPluginsFor('communicationConfig');
|
|
|
|
//if (configPlugins.length > 0) {
|
|
|
|
// configPlugins.forEach(function(plugin) {
|
|
|
|
// plugin.contractsConfigs.forEach(function(pluginConfig) {
|
|
|
|
// configObject = merge.recursive(configObject, pluginConfig);
|
|
|
|
// });
|
|
|
|
// });
|
|
|
|
//}
|
|
|
|
|
|
|
|
var communicationConfig = JSON.parse(fs.readFileSync(this.configDir + "communication.json"));
|
|
|
|
configObject = merge.recursive(configObject, communicationConfig);
|
|
|
|
var defaultCommunicationConfig = configObject['default'];
|
|
|
|
var envCommunicationConfig = configObject[this.env];
|
|
|
|
|
|
|
|
var mergedConfig = merge.recursive(defaultCommunicationConfig, envCommunicationConfig);
|
|
|
|
this.communicationConfig = mergedConfig;
|
|
|
|
};
|
|
|
|
|
2016-08-22 03:40:05 +00:00
|
|
|
Config.prototype.loadPipelineConfigFile = function() {
|
|
|
|
var contracts = this.embarkConfig.contracts;
|
|
|
|
this.contractsFiles = this.loadFiles(contracts);
|
|
|
|
|
|
|
|
var assets = this.embarkConfig.app;
|
|
|
|
for(var targetFile in assets) {
|
|
|
|
this.assetFiles[targetFile] = this.loadFiles(assets[targetFile]);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.buildDir = this.embarkConfig.buildDir;
|
|
|
|
this.configDir = this.embarkConfig.config;
|
|
|
|
};
|
2016-09-25 01:10:47 +00:00
|
|
|
|
|
|
|
Config.prototype.loadChainTrackerFile = function() {
|
|
|
|
//var self = this;
|
|
|
|
var chainTracker;
|
|
|
|
try {
|
2016-10-15 19:54:19 +00:00
|
|
|
chainTracker = JSON.parse(fs.readFileSync(this.chainsFile));
|
2016-09-25 01:10:47 +00:00
|
|
|
}
|
|
|
|
catch(err) {
|
2016-10-15 19:54:19 +00:00
|
|
|
//self.logger.info(this.chainsFile + ' file not found, creating it...');
|
2016-09-25 01:10:47 +00:00
|
|
|
chainTracker = {};
|
2016-10-15 19:54:19 +00:00
|
|
|
fs.writeFileSync(this.chainsFile, '{}');
|
2016-09-25 01:10:47 +00:00
|
|
|
}
|
|
|
|
this.chainTracker = chainTracker;
|
|
|
|
};
|
2016-08-22 03:40:05 +00:00
|
|
|
|
|
|
|
Config.prototype.loadFiles = function(files) {
|
2017-02-03 11:30:08 +00:00
|
|
|
var self = this;
|
2016-08-22 03:40:05 +00:00
|
|
|
var originalFiles = grunt.file.expand({nonull: true}, files);
|
|
|
|
var readFiles = [];
|
|
|
|
|
2017-02-03 11:30:08 +00:00
|
|
|
// get embark.js object first
|
2016-08-22 03:40:05 +00:00
|
|
|
originalFiles.filter(function(file) {
|
|
|
|
return file.indexOf('.') >= 0;
|
|
|
|
}).filter(function(file) {
|
|
|
|
if (file === 'embark.js') {
|
2017-01-26 11:34:00 +00:00
|
|
|
readFiles.push({filename: 'web3.js', content: fs.readFileSync(path.join(__dirname, "/../js/web3.js")).toString(), path: path.join(__dirname, "/../js/web3.js")});
|
|
|
|
readFiles.push({filename: 'ipfs.js', content: fs.readFileSync(path.join(__dirname, "/../js/ipfs.js")).toString(), path: path.join(__dirname, "/../js/ipfs.js")});
|
2017-01-07 05:03:03 +00:00
|
|
|
// TODO: remove duplicated files if funcitonality is the same for storage and orbit
|
2017-01-26 11:34:00 +00:00
|
|
|
readFiles.push({filename: 'ipfs-api.js', content: fs.readFileSync(path.join(__dirname, "/../js/ipfs-api.min.js")).toString(), path: path.join(__dirname, "/../js/ipfs-api.min.js")});
|
|
|
|
readFiles.push({filename: 'orbit.js', content: fs.readFileSync(path.join(__dirname, "/../js/orbit.min.js")).toString(), path: path.join(__dirname, "/../js/orbit.min.js")});
|
|
|
|
readFiles.push({filename: 'embark.js', content: fs.readFileSync(path.join(__dirname, "/../js/build/embark.bundle.js")).toString(), path: path.join(__dirname, "/../js/build/embark.bundle.js")});
|
2016-08-22 03:40:05 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2017-02-03 11:30:08 +00:00
|
|
|
// get plugins
|
|
|
|
var filesFromPlugins = [];
|
|
|
|
|
|
|
|
var filePlugins = self.plugins.getPluginsFor('pipelineFiles');
|
|
|
|
|
|
|
|
if (filePlugins.length > 0) {
|
|
|
|
filePlugins.forEach(function(plugin) {
|
|
|
|
try {
|
|
|
|
var fileObjects = plugin.runFilePipeline();
|
|
|
|
for (var i=0; i < fileObjects.length; i++) {
|
|
|
|
var fileObject = fileObjects[i];
|
|
|
|
filesFromPlugins.push(fileObject);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch(err) {
|
|
|
|
self.logger.error(err.message);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
filesFromPlugins.filter(function(file) {
|
|
|
|
if (grunt.file.isMatch(files, file.intendedPath)) {
|
|
|
|
readFiles.push(file);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// get user files
|
|
|
|
originalFiles.filter(function(file) {
|
|
|
|
return file.indexOf('.') >= 0;
|
|
|
|
}).filter(function(file) {
|
|
|
|
if (file === 'embark.js') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
readFiles.push({filename: file, content: fs.readFileSync(file).toString(), path: file});
|
|
|
|
});
|
|
|
|
|
2016-08-22 03:40:05 +00:00
|
|
|
return readFiles;
|
|
|
|
};
|
|
|
|
|
2017-01-26 11:34:00 +00:00
|
|
|
Config.prototype.loadPluginContractFiles = function() {
|
|
|
|
var self = this;
|
|
|
|
|
|
|
|
var contractsPlugins = this.plugins.getPluginsFor('contractFiles');
|
|
|
|
if (contractsPlugins.length > 0) {
|
|
|
|
contractsPlugins.forEach(function(plugin) {
|
|
|
|
plugin.contractsFiles.forEach(function(file) {
|
|
|
|
var filename = file.replace('./','');
|
|
|
|
self.contractsFiles.push({filename: filename, content: plugin.loadPluginFile(file), path: plugin.pathToFile(file)});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2016-08-22 03:40:05 +00:00
|
|
|
module.exports = Config;
|