var Immutable = require('immutable'); var TemplateBlock = require('./templateBlock'); var PREFIX = require('../constants/pluginPrefix'); var DEFAULT_VERSION = '*'; var Plugin = Immutable.Record({ name: String(), // Requirement version (ex: ">1.0.0") version: String(DEFAULT_VERSION), // Path to load this plugin path: String(), // Depth of this plugin in the dependency tree depth: Number(0), // Content of the "package.json" package: Immutable.Map(), // Content of the package itself content: Immutable.Map() }, 'Plugin'); Plugin.prototype.getName = function() { return this.get('name'); }; Plugin.prototype.getPath = function() { return this.get('path'); }; Plugin.prototype.getVersion = function() { return this.get('version'); }; Plugin.prototype.getPackage = function() { return this.get('package'); }; Plugin.prototype.getContent = function() { return this.get('content'); }; Plugin.prototype.getDepth = function() { return this.get('depth'); }; /** Return the ID on NPM for this plugin @return {String} */ Plugin.prototype.getNpmID = function() { return Plugin.nameToNpmID(this.getName()); }; /** Check if a plugin is loaded @return {Boolean} */ Plugin.prototype.isLoaded = function() { return Boolean(this.getPackage().size > 0); }; /** Return map of hooks @return {Map} */ Plugin.prototype.getHooks = function() { return this.getContent().get('hooks') || Immutable.Map(); }; /** Return infos about resources for a specific type @param {String} type @return {Map} */ Plugin.prototype.getResources = function(type) { if (type != 'website' && type != 'ebook') { throw new Error('Invalid assets type ' + type); } var content = this.getContent(); return (content.get(type) || (type == 'website'? content.get('book') : null) || Immutable.Map()); }; /** Return map of filters @return {Map} */ Plugin.prototype.getFilters = function() { return this.getContent().get('filters'); }; /** Return map of blocks @return {Map} */ Plugin.prototype.getBlocks = function() { var blocks = this.getContent().get('blocks'); blocks = blocks || Immutable.Map(); return blocks .map(function(block, blockName) { return TemplateBlock.create(blockName, block); }); }; /** Return a specific hook @param {String} name @return {Function|undefined} */ Plugin.prototype.getHook = function(name) { return this.getHooks().get(name); }; /** Create a plugin from a string @param {String} @return {Plugin} */ Plugin.createFromString = function(s) { var parts = s.split('@'); var name = parts[0]; var version = parts.slice(1).join('@'); return new Plugin({ name: name, version: version || DEFAULT_VERSION }); }; /** Create a plugin from a dependency @param {PluginDependency} @return {Plugin} */ Plugin.createFromDep = function(dep) { return new Plugin({ name: dep.getName(), version: dep.getVersion() }); }; /** Return NPM id for a plugin name @param {String} @return {String} */ Plugin.nameToNpmID = function(s) { return PREFIX + s; }; module.exports = Plugin;