"use strict"; var messages = require("./connect-utils"); var utils = require("./utils"); var _ = require("../lodash.custom"); var template = "[{blue:%s}] "; var logger = require("eazy-logger").Logger({ prefix: template.replace("%s", "BS"), useLevelPrefixes: false }); module.exports.logger = logger; /** * @param name * @returns {*} */ module.exports.getLogger = function (name) { return logger.clone(function (config) { config.prefix = config.prefix + template.replace("%s", name); return config; }); }; /** * Logging Callbacks */ module.exports.callbacks = { /** * Log when file-watching has started * @param {BrowserSync} bs * @param data */ "file:watching": function (bs, data) { if (Object.keys(data).length) { logger.info("Watching files..."); } }, /** * Log when a file changes * @param {BrowserSync} bs * @param data */ "file:reload": function (bs, data) { if (canLogFileChange(bs, data)) { if (data.path[0] === "*") { return logger.info("{cyan:Reloading files that match: {magenta:%s", data.path); } logger.info("{cyan:File event [" + data.event + "] : {magenta:%s", data.path); } }, /** * */ "service:exit": function () { logger.debug("Exiting..."); }, /** * */ "browser:reload": function (bs) { if (canLogFileChange(bs)) { logger.info("{cyan:Reloading Browsers..."); } }, /** * */ "browser:error": function () { logger.error("Couldn't open browser (if you are using BrowserSync in a headless environment, you might want to set the {cyan:open} option to {cyan:false})"); }, /** * @param {BrowserSync} bs * @param data */ "stream:changed": function (bs, data) { if (canLogFileChange(bs)) { var changed = data.changed; logger.info("{cyan:%s %s changed} ({magenta:%s})", changed.length, changed.length > 1 ? "files" : "file", changed.join(", ") ); } }, /** * Client connected logging * @param {BrowserSync} bs * @param data */ "client:connected": function (bs, data) { var uaString = utils.getUaString(data.ua); var msg = "{cyan:Browser Connected: {magenta:%s, version: %s}"; var method = "info"; if (!bs.options.get("logConnections")) { method = "debug"; } logger.log(method, msg, uaString.name, uaString.version ); }, /** * Main logging when the service is running * @param {BrowserSync} bs * @param data */ "service:running": function (bs, data) { var type = data.type; if (type === "server") { var baseDir = bs.options.getIn(["server", "baseDir"]); logUrls(bs.options.get("urls").toJS()); if (baseDir) { if (utils.isList(baseDir)) { baseDir.forEach(serveFiles); } else { serveFiles(baseDir); } } } if (type === "proxy") { logger.info("Proxying: {cyan:%s}", bs.options.getIn(["proxy", "target"])); logUrls(bs.options.get("urls").toJS()); } if (type === "snippet") { if (bs.options.get("logSnippet")) { logger.info( "{bold:Copy the following snippet into your website, " + "just before the closing {cyan:} tag" ); logger.unprefixed("info", messages.scriptTags(bs.options) ); } logUrls(bs.options.get("urls").filter(function (value, key) { return key.slice(0, 2) === "ui"; }).toJS()); } function serveFiles (base) { logger.info("Serving files from: {magenta:%s}", base); } } }; /** * Plugin interface for BrowserSync * @param {EventEmitter} emitter * @param {BrowserSync} bs * @returns {Object} */ module.exports.plugin = function (emitter, bs) { var logPrefix = bs.options.get("logPrefix"); var logLevel = bs.options.get("logLevel"); // Should set logger level here! logger.setLevel(logLevel); if (logPrefix) { if (_.isFunction(logPrefix)) { logger.setPrefix(logPrefix); } else { logger.setPrefix(template.replace("%s", logPrefix)); } } _.each(exports.callbacks, function (func, event) { emitter.on(event, func.bind(this, bs)); }); return logger; }; /** * * @param urls */ function logUrls (urls) { var keys = Object.keys(urls); var longestName = 0; var longesturl = 0; var offset = 2; if (!keys.length) { return; } var names = keys.map(function (key) { if (key.length > longestName) { longestName = key.length; } if (urls[key].length > longesturl) { longesturl = urls[key].length; } return key; }); var underline = getChars(longestName + offset + longesturl + 1, "-"); var underlined = false; logger.info("{bold:Access URLs:"); logger.unprefixed("info", "{grey: %s", underline); keys.forEach(function (key, i) { var keyname = getKeyName(key); logger.unprefixed("info", " %s: {magenta:%s}", getPadding(key.length, longestName + offset) + keyname, urls[key] ); if (!underlined && names[i + 1] && names[i + 1].indexOf("ui") > -1) { underlined = true; logger.unprefixed("info", "{grey: %s}", underline); } }); logger.unprefixed("info", "{grey: %s}", underline); } /** * @param {Number} len * @param {Number} max * @returns {string} */ function getPadding (len, max) { return new Array(max - (len + 1)).join(" "); } /** * @param {Number} len * @param {String} char * @returns {string} */ function getChars (len, char) { return new Array(len).join(char); } /** * Transform url-key names into something more presentable * @param key * @returns {string} */ function getKeyName(key) { if (key.indexOf("ui") > -1) { if (key === "ui") { return "UI"; } if (key === "ui-external") { return "UI External"; } } return key.substr(0, 1).toUpperCase() + key.substring(1); } /** * Determine if file changes should be logged * @param bs * @param data * @returns {boolean} */ function canLogFileChange(bs, data) { if (data && data.log === false) { return false; } return bs.options.get("logFileChanges"); }