119 lines
2.9 KiB
JavaScript
119 lines
2.9 KiB
JavaScript
|
var fs = require("fs");
|
||
|
var path = require("path");
|
||
|
|
||
|
/**
|
||
|
* @type {string}
|
||
|
*/
|
||
|
var PLUGIN_NAME = "Snippet Injector";
|
||
|
|
||
|
/**
|
||
|
* @type
|
||
|
*/
|
||
|
var messages = {
|
||
|
added: function (path) {
|
||
|
return "{green:Snippet added to {cyan:" + path
|
||
|
},
|
||
|
removed: function (path) {
|
||
|
return "{green:Snippet removed from {cyan:" + path
|
||
|
},
|
||
|
exists: function (path) {
|
||
|
return "{green:Snippet already exists in: {cyan:" + path
|
||
|
},
|
||
|
notFound: function (path) {
|
||
|
return "{red:ERROR:} Closing body tag not found in: {cyan:" + path
|
||
|
},
|
||
|
fileNotFound: function (path) {
|
||
|
return "{red:ERROR:} File not found!: {cyan:" + path
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Main export
|
||
|
* @type {{name: string, plugin: plugin}}
|
||
|
*/
|
||
|
module.exports = {
|
||
|
|
||
|
"plugin:name": PLUGIN_NAME,
|
||
|
|
||
|
plugin: function (opts, bs) {
|
||
|
|
||
|
opts.file = opts.file || "";
|
||
|
|
||
|
opts.currentFilePath = path.resolve(opts.file);
|
||
|
|
||
|
opts.logger = bs.getLogger(PLUGIN_NAME);
|
||
|
opts.logger.debug("Setting events");
|
||
|
|
||
|
bs.events.on("service:running", addSnippet.bind(null, bs, opts));
|
||
|
bs.events.on("service:exit", removeSnippet.bind(null, bs, opts));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Add the snippet before a body tag
|
||
|
* @param {BrowserSync} bs
|
||
|
* @param {Object} opts - plugin specific options
|
||
|
*/
|
||
|
function addSnippet(bs, opts) {
|
||
|
|
||
|
var currentFilePath = opts.currentFilePath;
|
||
|
|
||
|
opts.logger.debug("Reading the file: %s", currentFilePath);
|
||
|
|
||
|
var read;
|
||
|
|
||
|
try {
|
||
|
read = fs.readFileSync(currentFilePath, "utf8");
|
||
|
} catch (e) {
|
||
|
opts.errored = true;
|
||
|
return opts.logger.info(messages.fileNotFound(path.basename(currentFilePath)));
|
||
|
}
|
||
|
|
||
|
var found = false;
|
||
|
|
||
|
if (read.indexOf(bs.options.get("snippet")) > -1) {
|
||
|
opts.logger.info(messages.exists(currentFilePath));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var modded = read.replace(/<\/body>(?![\s\S]*<\/body>)/, function () {
|
||
|
opts.currentSnippet = wrap(bs.options.get("snippet")) + "\n" + arguments[0];
|
||
|
found = true;
|
||
|
return opts.currentSnippet;
|
||
|
});
|
||
|
|
||
|
if (found) {
|
||
|
opts.logger.debug("Writing the file: %s", currentFilePath);
|
||
|
fs.writeFileSync(currentFilePath, modded);
|
||
|
opts.logger.info(messages.added(path.basename(currentFilePath)));
|
||
|
} else {
|
||
|
opts.logger.info(messages.notFound(path.basename(currentFilePath)));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param item snippet
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
function wrap (item) {
|
||
|
return "<!-- BS:SNIPPET-->" + item + "<!-- BS:SNIPPET:END-->";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param {BrowserSync} bs
|
||
|
* @param {Object} opts - plugin specific options
|
||
|
*/
|
||
|
function removeSnippet(bs, opts) {
|
||
|
|
||
|
if (opts.errored) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var read = fs.readFileSync(opts.currentFilePath, "utf8");
|
||
|
var modded = read.replace(opts.currentSnippet, function () {
|
||
|
return "</body>";
|
||
|
});
|
||
|
fs.writeFileSync(opts.currentFilePath, modded);
|
||
|
opts.logger.info(messages.removed(path.basename(opts.currentFilePath)));
|
||
|
}
|