bare.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. "use strict";
  2. var d = require("d")
  3. , assign = require("es5-ext/object/assign")
  4. , forEach = require("es5-ext/object/for-each")
  5. , map = require("es5-ext/object/map")
  6. , primitiveSet = require("es5-ext/object/primitive-set")
  7. , setPrototypeOf = require("es5-ext/object/set-prototype-of")
  8. , memoize = require("memoizee")
  9. , memoizeMethods = require("memoizee/methods")
  10. , sgr = require("./lib/sgr")
  11. , supportsColor = require("./lib/supports-color");
  12. var mods = sgr.mods
  13. , join = Array.prototype.join
  14. , defineProperty = Object.defineProperty
  15. , max = Math.max
  16. , min = Math.min
  17. , variantModes = primitiveSet("_fg", "_bg")
  18. , xtermMatch = process.platform === "win32" ? require("./lib/xterm-match") : null;
  19. var getFn;
  20. // Some use cli-color as: console.log(clc.red('Error!'));
  21. // Which is inefficient as on each call it configures new clc object
  22. // with memoization we reuse once created object
  23. var memoized = memoize(function (scope, mod) {
  24. return defineProperty(getFn(), "_cliColorData", d(assign({}, scope._cliColorData, mod)));
  25. });
  26. var proto = Object.create(
  27. Function.prototype,
  28. assign(
  29. map(mods, function (mod) {
  30. return d.gs(function () { return memoized(this, mod); });
  31. }),
  32. memoizeMethods({
  33. // xterm (255) color
  34. xterm: d(function (code) {
  35. code = isNaN(code) ? 255 : min(max(code, 0), 255);
  36. return defineProperty(
  37. getFn(), "_cliColorData",
  38. d(
  39. assign({}, this._cliColorData, {
  40. _fg: [xtermMatch ? xtermMatch[code] : "38;5;" + code, 39]
  41. })
  42. )
  43. );
  44. }),
  45. bgXterm: d(function (code) {
  46. code = isNaN(code) ? 255 : min(max(code, 0), 255);
  47. return defineProperty(
  48. getFn(), "_cliColorData",
  49. d(
  50. assign({}, this._cliColorData, {
  51. _bg: [xtermMatch ? xtermMatch[code] + 10 : "48;5;" + code, 49]
  52. })
  53. )
  54. );
  55. })
  56. })
  57. )
  58. );
  59. var getEndRe = memoize(function (code) { return new RegExp("\x1b\\[" + code + "m", "g"); }, {
  60. primitive: true
  61. });
  62. getFn = function () {
  63. return setPrototypeOf(
  64. function self(/* …msg*/) {
  65. var start = ""
  66. , end = ""
  67. , msg = join.call(arguments, " ")
  68. , conf = self._cliColorData
  69. , hasAnsi = sgr.hasCSI(msg);
  70. forEach(
  71. conf,
  72. function (mod, key) {
  73. end = sgr(mod[1]) + end;
  74. start += sgr(mod[0]);
  75. if (hasAnsi) {
  76. msg = msg.replace(getEndRe(mod[1]), variantModes[key] ? sgr(mod[0]) : "");
  77. }
  78. },
  79. null,
  80. true
  81. );
  82. if (!supportsColor.isColorSupported()) return msg;
  83. return start + msg + end;
  84. },
  85. proto
  86. );
  87. };
  88. module.exports = Object.defineProperties(getFn(), {
  89. xtermSupported: d(!xtermMatch),
  90. _cliColorData: d("", {})
  91. });