1 | var toArray = require('./util/to-array')
|
2 |
|
3 | module.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 |
|
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 |
|
99 |
|
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 | }
|