UNPKG

2.71 kBJavaScriptView Raw
1"use strict";
2
3var ensureString = require("type/string/ensure")
4 , aFrom = require("es5-ext/array/from")
5 , assign = require("es5-ext/object/assign")
6 , setPrototypeOf = require("es5-ext/object/set-prototype-of")
7 , d = require("d")
8 , lazy = require("d/lazy")
9 , levelNames = require("../../../levels")
10 , emitter = require("../../emitter")
11 , enableDisableProps = require("./enable-disable-props")
12 , namespaceProps = require("./namespace-props");
13
14// Map of initialized top level loggers
15var levelLoggers = Object.create(null);
16
17var loggerPrototype = Object.create(
18 Function.prototype,
19 assign(
20 {
21 isLevelInitialized: d("e", function (level) {
22 level = ensureString(level);
23 if (this.level === level) return true;
24 var logger = levelLoggers[level];
25 if (!logger) return false;
26 if (!this.namespace) return true;
27 return logger.isNamespaceInitialized(this.namespace);
28 }),
29 getAllInitializedLevels: d("e", function () {
30 return Object.keys(levelLoggers)
31 .filter(function (level) { return this.isLevelInitialized(level); }, this)
32 .map(function (level) { return this._getLevelLogger(level); }, this);
33 }),
34
35 _createLogger: d(function () {
36 return setPrototypeOf(function self(msgItemIgnored /*, ...msgItemn*/) {
37 emitter.emit("log", { logger: self, messageTokens: aFrom(arguments) });
38 }, this);
39 }),
40 _createLevel: d(function (levelName) {
41 if (levelLoggers[levelName]) return levelLoggers[levelName];
42 var logger = loggerPrototype._createLogger();
43 Object.defineProperties(logger, {
44 level: d("e", levelName),
45 levelIndex: d("e", levelNames.indexOf(levelName)),
46 levelRoot: d("e", logger)
47 });
48 levelLoggers[levelName] = logger;
49 emitter.emit("init", { logger: logger });
50 return logger;
51 }),
52
53 _getLevelLogger: d(function (newLevel) {
54 if (this.level === newLevel) return this;
55 var levelLogger = this._createLevel(newLevel);
56 return this.namespaceTokens.reduce(function (currentLogger, token) {
57 return currentLogger._createNamespace(token);
58 }, levelLogger);
59 })
60 },
61 lazy(
62 assign(
63 // Loggers for all levels
64 levelNames.reduce(function (descriptors, level) {
65 descriptors[level] = d(
66 "e",
67 function () { return this._getLevelLogger(level); },
68 { cacheName: "_" + level }
69 );
70 return descriptors;
71 }, {}),
72 {
73 // Alias `warn` to `warning`
74 warn: d(function () { return this._getLevelLogger("warning"); }, {
75 cacheName: "_warning"
76 })
77 }
78 )
79 ),
80
81 namespaceProps,
82 enableDisableProps
83 )
84);
85
86module.exports = loggerPrototype;