1 | "use strict";
|
2 |
|
3 | var 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 |
|
15 | var levelLoggers = Object.create(null);
|
16 |
|
17 | var 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 |
|
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 |
|
74 | warn: d(function () { return this._getLevelLogger("warning"); }, {
|
75 | cacheName: "_warning"
|
76 | })
|
77 | }
|
78 | )
|
79 | ),
|
80 |
|
81 | namespaceProps,
|
82 | enableDisableProps
|
83 | )
|
84 | );
|
85 |
|
86 | module.exports = loggerPrototype;
|