var colors = require('./colors'); module['exports'] = function() { // // Extends prototype of native string object to allow for "foo".red syntax // var addProperty = function(color, func) { String.prototype.__defineGetter__(color, func); }; addProperty('strip', function() { return colors.strip(this); }); addProperty('stripColors', function() { return colors.strip(this); }); addProperty('trap', function() { return colors.trap(this); }); addProperty('zalgo', function() { return colors.zalgo(this); }); addProperty('zebra', function() { return colors.zebra(this); }); addProperty('rainbow', function() { return colors.rainbow(this); }); addProperty('random', function() { return colors.random(this); }); addProperty('america', function() { return colors.america(this); }); // // Iterate through all default styles and colors // var x = Object.keys(colors.styles); x.forEach(function(style) { addProperty(style, function() { return colors.stylize(this, style); }); }); function applyTheme(theme) { // // Remark: This is a list of methods that exist // on String that you should not overwrite. // var stringPrototypeBlacklist = [ '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt', 'indexOf', 'lastIndexOf', 'length', 'localeCompare', 'match', 'repeat', 'replace', 'search', 'slice', 'split', 'substring', 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight', ]; Object.keys(theme).forEach(function(prop) { if (stringPrototypeBlacklist.indexOf(prop) !== -1) { console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. ' + 'Ignoring style name'); } else { if (typeof(theme[prop]) === 'string') { colors[prop] = colors[theme[prop]]; addProperty(prop, function() { return colors[prop](this); }); } else { var themePropApplicator = function(str) { var ret = str || this; for (var t = 0; t < theme[prop].length; t++) { ret = colors[theme[prop][t]](ret); } return ret; }; addProperty(prop, themePropApplicator); colors[prop] = function(str) { return themePropApplicator(str); }; } } }); } colors.setTheme = function(theme) { if (typeof theme === 'string') { console.log('colors.setTheme now only accepts an object, not a string. ' + 'If you are trying to set a theme from a file, it is now your (the ' + 'caller\'s) responsibility to require the file. The old syntax ' + 'looked like colors.setTheme(__dirname + ' + '\'/../themes/generic-logging.js\'); The new syntax looks like '+ 'colors.setTheme(require(__dirname + ' + '\'/../themes/generic-logging.js\'));'); return; } else { applyTheme(theme); } }; };