-
Notifications
You must be signed in to change notification settings - Fork 0
/
rubiks.ts
146 lines (129 loc) · 3.55 KB
/
rubiks.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import {
error,
fatal,
info,
type Level,
log,
success,
warn,
} from "./levels.ts";
import { type Modifier } from "./modifiers.ts";
type G = {
process?: { env: Record<string, string | undefined> };
Deno?: { noColor: boolean };
};
/**
* Class that represents a rubiks logger, each instance has it's own settings and data.
* @class
*/
export class Rubiks {
/** The format string that will end up being used for logging. */
format: string = "%s";
/** The level that is currently being used. */
level: string = "";
/** The prefixes map to use. */
prefixes: Record<string, string> | { all: string } = { all: "" };
/** The suffixes map to use. */
suffixes: Record<string, string> | { all: string } = { all: "" };
/** Is NO_COLOR enabled? */
noColor: boolean = false;
/** The levels that will be used in every log */
#levels: Level[] = [];
/**
* Helper function to apply format to the provided content
* @param content - The content to integrate into the format
* @returns The formatted content
*/
#replace(content: string): string {
return this.format.replace("%s", content);
}
constructor() {
const nc = (globalThis as G).process?.env?.NO_COLOR;
if (!nc && !(globalThis as G).Deno?.noColor) return;
this.noColor = true;
}
/**
* Applies a modifier to the logger
* @param modifier - The modifier to use
*/
use(modifier: Modifier): Rubiks {
const l = modifier(this);
if (typeof l !== "function") return this;
this.#levels.push(l);
return this;
}
/**
* Log the content you pass with the level you pass.
* @param content - The content to be logged.
* @param [level=log] - The log levels, it will use a normal log by default.
* @returns This instance.
*/
log(content: string, level: Level = log): Rubiks {
const c = this.#replace(content);
for (const l of this.#levels) l(this, c);
level(this, c);
return this;
}
/**
* Log the content you pass with the warn level.
* @param content - The content to be logged.
* @returns This instance.
*/
warn(content: string): Rubiks {
const c = this.#replace(content);
for (const l of this.#levels) l(this, c);
warn(this, c);
return this;
}
/**
* Log the content you pass with the error level.
* @param content - The content to be logged.
* @returns This instance.
*/
error(content: string): Rubiks {
const c = this.#replace(content);
for (const l of this.#levels) l(this, c);
error(this, c);
return this;
}
/**
* Log the content you pass with the fatal level.
* @param content - The content to be logged.
* @returns This instance.
*/
fatal(content: string): Rubiks {
const c = this.#replace(content);
for (const l of this.#levels) l(this, c);
fatal(this, c);
return this;
}
/**
* Log the content you pass with the success level.
* @param content - The content to be logged.
* @returns This instance.
*/
success(content: string): Rubiks {
const c = this.#replace(content);
for (const l of this.#levels) l(this, c);
success(this, c);
return this;
}
/**
* Log the content you pass with the info level.
* @param content - The content to be logged.
* @returns This instance.
*/
info(content: string): Rubiks {
const c = this.#replace(content);
for (const l of this.#levels) l(this, c);
info(this, c);
return this;
}
}
/**
* Creates and returns a new Rubiks instance.
* @returns a new Rubiks logger instance.
*/
export function rubiks(): Rubiks {
return new Rubiks();
}