123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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;
- }, {}));
- }
|