UNPKG

3.46 kBJavaScriptView Raw
1var toArray = require('./util/to-array')
2
3module.exports = function () {
4 function Logdown (prefix, opts) {
5 if (!(this instanceof Logdown)) {
6 return new Logdown(prefix, opts)
7 }
8
9 if (Logdown._isPrefixAlreadyInUse(prefix)) {
10 return Logdown._getInstanceByPrefix(prefix)
11 }
12
13 this.opts = Logdown._normalizeOpts(prefix, opts)
14 this.state = Logdown._getInitialState(this.opts)
15
16 Logdown._decorateLoggerMethods(this)
17 Logdown._instances.push(this)
18
19 return this
20 }
21
22 //
23 // Static
24 //
25
26 Logdown.transports = []
27 Logdown._instances = []
28 Logdown._prefixRegExps = []
29
30 Logdown._prepareRegExpForPrefixSearch = function (str) {
31 return new RegExp('^' + str.replace(/\*/g, '.*?') + '$')
32 }
33
34 Logdown._isPrefixAlreadyInUse = function (prefix) {
35 return Logdown._instances.some(function (instance) {
36 return (instance.opts.prefix === prefix)
37 })
38 }
39
40 Logdown._getInstanceByPrefix = function (prefix) {
41 return Logdown._instances.filter(function (instanceCur) {
42 return instanceCur.opts.prefix === prefix
43 })[0]
44 }
45
46 Logdown._normalizeOpts = function (prefix, opts) {
47 if (typeof prefix !== 'string') {
48 throw new TypeError('prefix must be a string')
49 }
50
51 opts = opts || {}
52
53 var markdown = opts.markdown === undefined ? true : Boolean(opts.markdown)
54 var prefixColor = opts.prefixColor || Logdown._getNextPrefixColor()
55 var logger = opts.logger || console
56
57 return {
58 logger: logger,
59 markdown: markdown,
60 prefix: prefix,
61 prefixColor: prefixColor
62 }
63 }
64
65 Logdown._getInitialState = function (opts) {
66 return {
67 isEnabled: Logdown._getEnableState(opts)
68 }
69 }
70
71 Logdown._getEnableState = function (opts) {
72 var isEnabled = false
73
74 Logdown._prefixRegExps.forEach(function (filter) {
75 if (
76 filter.type === 'enable' &&
77 filter.regExp.test(opts.prefix)
78 ) {
79 isEnabled = true
80 } else if (
81 filter.type === 'disable' &&
82 filter.regExp.test(opts.prefix)
83 ) {
84 isEnabled = false
85 }
86 })
87
88 return isEnabled
89 }
90
91 Logdown._decorateLoggerMethods = function (instance) {
92 var logger = instance.opts.logger
93
94 var loggerMethods = Object
95 .keys(logger)
96 .filter(function (method) { return typeof logger[method] === 'function' })
97
98 // In old Safari and Chrome browsers, `console` methods are not iterable.
99 // In that case, we provide a minimum API.
100 if (loggerMethods.length === 0) {
101 loggerMethods = ['log', 'warn', 'error']
102 }
103
104 loggerMethods
105 .forEach(function (method) {
106 instance[method] = function () {
107 var args = toArray(arguments)
108 var instance = this.opts.prefix
109
110 if (Logdown.transports.length) {
111 var msg = '[' + instance + '] ' +
112 args
113 .filter(function (arg) { return typeof arg !== 'object' })
114 .join(' ')
115
116 Logdown.transports.forEach(function (transport) {
117 transport({
118 state: this.state,
119 instance: instance,
120 level: method,
121 args: args,
122 msg: msg
123 })
124 }.bind(this))
125 }
126
127 if (this.state.isEnabled) {
128 var preparedOutput = this._prepareOutput(args, method)
129 logger[method].apply(logger, preparedOutput)
130 }
131 }
132 })
133 }
134
135 return Logdown
136}