UNPKG

2.58 kBJavaScriptView Raw
1"use strict";
2
3var ensureString = require("type/string/ensure")
4 , toShortString = require("type/lib/to-short-string")
5 , identity = require("es5-ext/function/identity")
6 , assign = require("es5-ext/object/assign")
7 , objToArray = require("es5-ext/object/to-array")
8 , d = require("d")
9 , lazy = require("d/lazy")
10 , emitter = require("../../emitter")
11 , isNamespaceToken = require("../is-namespace-token");
12
13module.exports = assign(
14 {
15 // Initializes and returns namespaced logger
16 get: d(function (namespace) {
17 namespace = ensureString(namespace);
18 var namespaceTokens = namespace.split(":");
19 namespaceTokens.forEach(function (namespaceToken) {
20 if (!isNamespaceToken(namespaceToken)) {
21 throw new TypeError(
22 toShortString(namespace) +
23 " is not a valid namespace string " +
24 "(only 'a-z0-9-' chars are allowed and ':' as delimiter)"
25 );
26 }
27 });
28 return namespaceTokens.reduce(function (currentLogger, token) {
29 return currentLogger._createNamespace(token);
30 }, this);
31 }),
32 isNamespaceInitialized: d("e", function (namespace) {
33 var namespaceTokens = ensureString(namespace).split(":");
34 var currentLogger = this;
35 return namespaceTokens.every(function (nsToken) {
36 return (currentLogger = currentLogger._childNamespaceLoggers[nsToken]);
37 });
38 }),
39
40 getAllInitializedNamespaces: d("e", function () {
41 return objToArray(this._childNamespaceLoggers, identity);
42 }),
43
44 _createNamespace: d(function (namespaceToken) {
45 if (this._childNamespaceLoggers[namespaceToken]) {
46 return this._childNamespaceLoggers[namespaceToken];
47 }
48 var logger = Object.defineProperties(this._createLogger(), {
49 _namespaceToken: d("", namespaceToken)
50 });
51 this._childNamespaceLoggers[namespaceToken] = logger;
52 emitter.emit("init", { logger: logger });
53 return logger;
54 }),
55
56 _namespaceToken: d("", null)
57 },
58 lazy({
59 // Full namespace string e.g. foo:bar:elo
60 namespace: d("e", function () { return this.namespaceTokens.join(":") || null; }, {
61 cacheName: "_namespace"
62 }),
63
64 // All namespace tokens e.g. ["foo", "bar", "elo"]
65 namespaceTokens: d(
66 "e",
67 function () {
68 return this._namespaceToken
69 ? Object.getPrototypeOf(this).namespaceTokens.concat(this._namespaceToken)
70 : [];
71 },
72 { cacheName: "_namespaceTokens" }
73 ),
74
75 // Internal: Map of children namespace loggers
76 _childNamespaceLoggers: d("", function () { return Object.create(null); }, {
77 cacheName: "__childNamespaceLoggers"
78 })
79 })
80);