118 lines
3.2 KiB
JavaScript
118 lines
3.2 KiB
JavaScript
|
var fs = require("fs");
|
||
|
var path = require("path");
|
||
|
var Immutable = require("immutable");
|
||
|
|
||
|
/**
|
||
|
* Take Browsersync plugins and determine if
|
||
|
* any UI is provided by looking at data in the the
|
||
|
* modules package.json file
|
||
|
* @param plugins
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
module.exports = function (plugins) {
|
||
|
return require("immutable")
|
||
|
.fromJS(plugins)
|
||
|
/**
|
||
|
* Exclude the UI
|
||
|
*/
|
||
|
.filter(function (plugin) {
|
||
|
return plugin.get("name") !== "UI";
|
||
|
})
|
||
|
/**
|
||
|
* Attempt to retrieve a plugins package.json file
|
||
|
*/
|
||
|
.map(function (plugin) {
|
||
|
|
||
|
var moduleName = plugin.getIn(["opts", "moduleName"]);
|
||
|
var pkg = {};
|
||
|
|
||
|
if (!moduleName) {
|
||
|
return plugin;
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
pkg = require("immutable").fromJS(require(path.join(moduleName, "package.json")));
|
||
|
} catch (e) {
|
||
|
console.error(e);
|
||
|
return plugin;
|
||
|
}
|
||
|
|
||
|
plugin = plugin.set("pkg", pkg);
|
||
|
|
||
|
return plugin.set("relpath", path.dirname(require.resolve(moduleName)));
|
||
|
})
|
||
|
/**
|
||
|
* Try to load markup for each plugin
|
||
|
*/
|
||
|
.map(function (plugin) {
|
||
|
|
||
|
if (!plugin.hasIn(["pkg", "browser-sync:ui"])) {
|
||
|
return plugin;
|
||
|
}
|
||
|
|
||
|
var markup = plugin.getIn(["pkg", "browser-sync:ui", "hooks", "markup"]);
|
||
|
|
||
|
if (markup) {
|
||
|
plugin = plugin.set("markup", fs.readFileSync(path.resolve(plugin.get("relpath"), markup), "utf8"));
|
||
|
}
|
||
|
|
||
|
return plugin;
|
||
|
})
|
||
|
/**
|
||
|
* Load any template files for the plugin
|
||
|
*/
|
||
|
.map(function (plugin) {
|
||
|
|
||
|
if (!plugin.hasIn(["pkg", "browser-sync:ui"])) {
|
||
|
return plugin;
|
||
|
}
|
||
|
|
||
|
return resolveIfPluginHas(["pkg", "browser-sync:ui", "hooks", "templates"], "templates", plugin);
|
||
|
})
|
||
|
/**
|
||
|
* Try to load Client JS for each plugin
|
||
|
*/
|
||
|
.map(function (plugin) {
|
||
|
|
||
|
if (!plugin.hasIn(["pkg", "browser-sync:ui"])) {
|
||
|
return plugin;
|
||
|
}
|
||
|
|
||
|
return resolveIfPluginHas(["pkg", "browser-sync:ui", "hooks", "client:js"], "client:js", plugin);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* If a plugin contains this option path, resolve/read the files
|
||
|
* @param {Array} optPath - How to access the collection
|
||
|
* @param {String} propName - Key for property access
|
||
|
* @param {Immutable.Map} plugin
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
function resolveIfPluginHas(optPath, propName, plugin) {
|
||
|
var opt = plugin.getIn(optPath);
|
||
|
if (opt.size) {
|
||
|
return plugin.set(
|
||
|
propName,
|
||
|
resolvePluginFiles(opt, plugin.get("relpath"))
|
||
|
);
|
||
|
}
|
||
|
return plugin;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Read & store a file from a plugin
|
||
|
* @param {Array|Immutable.List} collection
|
||
|
* @param {String} relPath
|
||
|
* @returns {any}
|
||
|
*/
|
||
|
function resolvePluginFiles (collection, relPath) {
|
||
|
return Immutable.fromJS(collection.reduce(function (all, item) {
|
||
|
var full = path.join(relPath, item);
|
||
|
if (fs.existsSync(full)) {
|
||
|
all[full] = fs.readFileSync(full, "utf8");
|
||
|
}
|
||
|
return all;
|
||
|
}, {}));
|
||
|
}
|