2018-04-24 18:42:56 +00:00
const fs = require ( './fs.js' ) ;
const utils = require ( '../utils/utils.js' ) ;
const constants = require ( '../constants' ) ;
2018-05-29 13:58:19 +00:00
const _ = require ( 'underscore' ) ;
2017-03-31 11:34:43 +00:00
// TODO: pass other params like blockchainConfig, contract files, etc..
var Plugin = function ( options ) {
this . name = options . name ;
2017-12-16 20:39:30 +00:00
this . isInternal = options . isInternal ;
2017-03-31 11:34:43 +00:00
this . pluginModule = options . pluginModule ;
this . pluginPath = options . pluginPath ;
this . pluginConfig = options . pluginConfig ;
this . shouldInterceptLogs = options . interceptLogs ;
this . clientWeb3Providers = [ ] ;
2018-01-17 23:04:19 +00:00
this . beforeDeploy = [ ] ;
2017-03-31 11:34:43 +00:00
this . contractsGenerators = [ ] ;
this . pipeline = [ ] ;
this . pipelineFiles = [ ] ;
this . console = [ ] ;
this . contractsConfigs = [ ] ;
this . contractsFiles = [ ] ;
this . compilers = [ ] ;
this . serviceChecks = [ ] ;
this . pluginTypes = [ ] ;
2017-12-27 00:55:42 +00:00
this . uploadCmds = [ ] ;
2018-01-10 16:15:32 +00:00
this . imports = [ ] ;
2017-12-28 17:16:50 +00:00
this . embarkjs _code = [ ] ;
2017-12-28 22:42:25 +00:00
this . embarkjs _init _code = { } ;
2018-05-20 14:46:36 +00:00
this . afterContractsDeployActions = [ ] ;
2018-05-20 23:29:26 +00:00
this . onDeployActions = [ ] ;
2018-05-28 22:49:18 +00:00
this . eventActions = { } ;
2018-06-19 18:47:50 +00:00
this . _loggerObject = options . logger ;
this . logger = this . _loggerObject ; // Might get changed if we do intercept
2017-03-31 11:34:43 +00:00
this . events = options . events ;
this . config = options . config ;
2018-05-19 02:40:47 +00:00
this . env = options . env ;
2018-04-24 19:53:19 +00:00
this . loaded = false ;
2018-04-25 14:34:17 +00:00
this . currentContext = options . context ;
this . acceptedContext = options . pluginConfig . context || [ constants . contexts . any ] ;
if ( ! Array . isArray ( this . currentContext ) ) {
this . currentContext = [ this . currentContext ] ;
}
if ( ! Array . isArray ( this . acceptedContext ) ) {
this . acceptedContext = [ this . acceptedContext ] ;
}
} ;
2018-06-19 18:47:50 +00:00
Plugin . prototype . _log = function ( type ) {
this . _loggerObject [ type ] ( this . name + ':' , ... [ ] . slice . call ( arguments , 1 ) ) ;
} ;
Plugin . prototype . setUpLogger = function ( ) {
this . logger = {
log : this . _log . bind ( this , 'log' ) ,
warn : this . _log . bind ( this , 'warn' ) ,
error : this . _log . bind ( this , 'error' ) ,
info : this . _log . bind ( this , 'info' ) ,
debug : this . _log . bind ( this , 'debug' ) ,
trace : this . _log . bind ( this , 'trace' ) ,
dir : this . _log . bind ( this , 'dir' )
} ;
} ;
2018-04-25 14:34:17 +00:00
Plugin . prototype . isContextValid = function ( ) {
if ( this . currentContext . includes ( constants . contexts . any ) || this . acceptedContext . includes ( constants . contexts . any ) ) {
return true ;
}
return this . acceptedContext . some ( context => {
return this . currentContext . includes ( context ) ;
} ) ;
2017-03-31 11:34:43 +00:00
} ;
2018-04-25 14:57:23 +00:00
Plugin . prototype . hasContext = function ( context ) {
return this . currentContext . includes ( context ) ;
} ;
2018-04-25 14:34:17 +00:00
Plugin . prototype . loadPlugin = function ( ) {
if ( ! this . isContextValid ( ) ) {
2018-05-08 21:49:46 +00:00
this . logger . warn ( _ _ ( 'Plugin {{name}} can only be loaded in the context of "{{contextes}}"' , { name : this . name , contextes : this . acceptedContext . join ( ', ' ) } ) ) ;
2018-04-25 14:34:17 +00:00
return false ;
2018-04-24 18:42:56 +00:00
}
2018-04-24 19:53:19 +00:00
this . loaded = true ;
2017-02-06 11:42:58 +00:00
if ( this . shouldInterceptLogs ) {
2018-06-19 18:47:50 +00:00
this . setUpLogger ( ) ;
2017-02-06 11:42:58 +00:00
}
2017-03-31 11:34:43 +00:00
( this . pluginModule . call ( this , this ) ) ;
2016-12-07 02:33:31 +00:00
} ;
2017-12-16 20:39:30 +00:00
Plugin . prototype . loadInternalPlugin = function ( ) {
2017-12-16 21:05:46 +00:00
new this . pluginModule ( this , this . pluginConfig ) ; /*eslint no-new: "off"*/
2017-12-16 20:39:30 +00:00
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . loadPluginFile = function ( filename ) {
2017-01-26 11:34:00 +00:00
return fs . readFileSync ( this . pathToFile ( filename ) ) . toString ( ) ;
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . pathToFile = function ( filename ) {
2017-12-30 20:52:51 +00:00
if ( ! this . pluginPath ) {
throw new Error ( 'pluginPath not defined for plugin: ' + this . name ) ;
}
2017-02-18 19:10:01 +00:00
return utils . joinPath ( this . pluginPath , filename ) ;
2017-01-26 11:34:00 +00:00
} ;
2016-12-07 02:33:31 +00:00
// TODO: add deploy provider
2017-03-31 11:34:43 +00:00
Plugin . prototype . registerClientWeb3Provider = function ( cb ) {
2016-12-07 02:33:31 +00:00
this . clientWeb3Providers . push ( cb ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'clientWeb3Provider' ) ;
2018-01-17 23:04:19 +00:00
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . registerContractsGeneration = function ( cb ) {
2016-12-07 02:33:31 +00:00
this . contractsGenerators . push ( cb ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'contractGeneration' ) ;
2016-12-07 02:33:31 +00:00
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . registerPipeline = function ( matcthingFiles , cb ) {
2016-12-10 15:20:04 +00:00
// TODO: generate error for more than one pipeline per plugin
2017-01-15 19:30:41 +00:00
this . pipeline . push ( { matcthingFiles : matcthingFiles , cb : cb } ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'pipeline' ) ;
2016-12-10 15:20:04 +00:00
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . addFileToPipeline = function ( file , intendedPath , options ) {
2017-02-03 11:30:08 +00:00
this . pipelineFiles . push ( { file : file , intendedPath : intendedPath , options : options } ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'pipelineFiles' ) ;
2017-01-26 11:34:00 +00:00
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . addContractFile = function ( file ) {
2018-06-18 15:25:43 +00:00
if ( this . isInternal ) {
throw new Error ( "this API cannot work for internal modules. please use an event command instead: config:contractsFiles:add" ) ;
}
2017-01-26 11:34:00 +00:00
this . contractsFiles . push ( file ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'contractFiles' ) ;
2017-01-26 11:34:00 +00:00
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . registerConsoleCommand = function ( cb ) {
2017-01-16 12:00:41 +00:00
this . console . push ( cb ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'console' ) ;
2017-01-16 12:00:41 +00:00
} ;
2017-12-18 14:37:16 +00:00
// TODO: this only works for services done on startup
2017-03-31 11:34:43 +00:00
Plugin . prototype . registerServiceCheck = function ( checkName , checkFn , time ) {
2017-03-16 11:31:52 +00:00
this . serviceChecks . push ( { checkName : checkName , checkFn : checkFn , time : time } ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'serviceChecks' ) ;
2017-03-16 11:31:52 +00:00
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . has = function ( pluginType ) {
2016-12-07 02:33:31 +00:00
return this . pluginTypes . indexOf ( pluginType ) >= 0 ;
} ;
2018-05-31 17:12:56 +00:00
Plugin . prototype . addPluginType = function ( pluginType ) {
this . pluginTypes . push ( pluginType ) ;
this . pluginTypes = _ . uniq ( this . pluginTypes ) ;
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . generateProvider = function ( args ) {
return this . clientWeb3Providers . map ( function ( cb ) {
2016-12-07 02:33:31 +00:00
return cb . call ( this , args ) ;
} ) . join ( "\n" ) ;
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . generateContracts = function ( args ) {
return this . contractsGenerators . map ( function ( cb ) {
2016-12-07 02:33:31 +00:00
return cb . call ( this , args ) ;
} ) . join ( "\n" ) ;
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . registerContractConfiguration = function ( config ) {
2017-01-26 11:34:00 +00:00
this . contractsConfigs . push ( config ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'contractsConfig' ) ;
2017-01-26 11:34:00 +00:00
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . registerCompiler = function ( extension , cb ) {
2017-01-29 02:31:09 +00:00
this . compilers . push ( { extension : extension , cb : cb } ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'compilers' ) ;
2017-01-29 02:31:09 +00:00
} ;
2017-12-27 00:55:42 +00:00
Plugin . prototype . registerUploadCommand = function ( cmd , cb ) {
this . uploadCmds . push ( { cmd : cmd , cb : cb } ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'uploadCmds' ) ;
2017-12-27 00:55:42 +00:00
} ;
2017-12-28 17:16:50 +00:00
Plugin . prototype . addCodeToEmbarkJS = function ( code ) {
this . embarkjs _code . push ( code ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'embarkjsCode' ) ;
2017-12-28 17:16:50 +00:00
} ;
2017-12-28 22:42:25 +00:00
Plugin . prototype . addProviderInit = function ( providerType , code , initCondition ) {
this . embarkjs _init _code [ providerType ] = this . embarkjs _init _code [ providerType ] || [ ] ;
this . embarkjs _init _code [ providerType ] . push ( [ code , initCondition ] ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'initCode' ) ;
2017-12-28 22:42:25 +00:00
} ;
2018-01-10 16:15:32 +00:00
Plugin . prototype . registerImportFile = function ( importName , importLocation ) {
this . imports . push ( [ importName , importLocation ] ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'imports' ) ;
2018-01-10 16:15:32 +00:00
} ;
2018-05-28 22:49:18 +00:00
Plugin . prototype . registerActionForEvent = function ( eventName , cb ) {
if ( ! this . eventActions [ eventName ] ) {
this . eventActions [ eventName ] = [ ] ;
}
this . eventActions [ eventName ] . push ( cb ) ;
2018-05-31 17:12:56 +00:00
this . addPluginType ( 'eventActions' ) ;
2018-05-29 13:58:19 +00:00
} ;
2018-05-28 22:49:18 +00:00
2017-03-31 11:34:43 +00:00
Plugin . prototype . runFilePipeline = function ( ) {
var self = this ;
2017-01-26 11:34:00 +00:00
2017-03-31 11:34:43 +00:00
return this . pipelineFiles . map ( function ( file ) {
var obj = { } ;
obj . filename = file . file . replace ( './' , '' ) ;
obj . content = self . loadPluginFile ( file . file ) . toString ( ) ;
obj . intendedPath = file . intendedPath ;
obj . options = file . options ;
obj . path = self . pathToFile ( obj . filename ) ;
2017-01-26 11:34:00 +00:00
2017-03-31 11:34:43 +00:00
return obj ;
2017-01-26 11:34:00 +00:00
} ) ;
} ;
2017-03-31 11:34:43 +00:00
Plugin . prototype . runPipeline = function ( args ) {
2017-02-07 02:08:11 +00:00
// TODO: should iterate the pipelines
2017-03-31 11:34:43 +00:00
var pipeline = this . pipeline [ 0 ] ;
var shouldRunPipeline = utils . fileMatchesPattern ( pipeline . matcthingFiles , args . targetFile ) ;
2017-01-15 19:30:41 +00:00
if ( shouldRunPipeline ) {
return pipeline . cb . call ( this , args ) ;
} else {
return args . source ;
}
2016-12-10 15:20:04 +00:00
} ;
2016-12-07 02:33:31 +00:00
module . exports = Plugin ;