@vielzeug/logit 1.0.5 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +591 -0
- package/dist/index.d.ts +103 -51
- package/dist/logit.cjs +1 -1
- package/dist/logit.cjs.map +1 -1
- package/dist/logit.js +168 -76
- package/dist/logit.js.map +1 -1
- package/package.json +1 -1
package/dist/logit.js
CHANGED
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
1
|
+
const E = {};
|
|
2
|
+
const $ = {
|
|
3
3
|
debug: "log",
|
|
4
4
|
success: "log"
|
|
5
|
-
}, w = () => typeof window < "u" && $?.NODE_ENV ? !1 : typeof process < "u" && process.env?.NODE_ENV ? process.env.NODE_ENV === "production" : !1, _ = w(), L = typeof window < "u" && window.matchMedia?.("(prefers-color-scheme: dark)").matches, b = {
|
|
6
|
-
debug: { bg: "#616161", border: "#424242", color: "#fff", icon: "☕", symbol: "🅳" },
|
|
7
|
-
error: { bg: "#d32f2f", border: "#c62828", color: "#fff", icon: "✘", symbol: "🅴" },
|
|
8
|
-
group: { bg: "#546e7a", border: "#455a64", color: "#fff", icon: "⚭", symbol: "🅶" },
|
|
9
|
-
info: { bg: "#1976d2", border: "#1565c0", color: "#fff", icon: "ℹ", symbol: "🅸" },
|
|
10
|
-
ns: L ? { bg: "#fafafa", border: "#c7c7c7", color: "#000" } : { bg: "#424242", border: "#212121", color: "#fff" },
|
|
11
|
-
success: { bg: "#689f38", border: "#558b2f", color: "#fff", icon: "✔", symbol: "🆂" },
|
|
12
|
-
time: { bg: "#0097a7", border: "#00838f", color: "#fff", icon: "⏲", symbol: "🆃" },
|
|
13
|
-
trace: { bg: "#d81b60", border: "#c2185b", color: "#fff", icon: "⛢", symbol: "🆃" },
|
|
14
|
-
warn: { bg: "#ffb300", border: "#ffa000", color: "#fff", icon: "⚠", symbol: "🆆" }
|
|
15
5
|
}, l = {
|
|
16
6
|
debug: 0,
|
|
17
7
|
trace: 1,
|
|
@@ -22,76 +12,142 @@ const v = {
|
|
|
22
12
|
warn: 6,
|
|
23
13
|
error: 7,
|
|
24
14
|
off: 8
|
|
25
|
-
},
|
|
15
|
+
}, w = typeof window < "u" && window.matchMedia?.("(prefers-color-scheme: dark)").matches, p = {
|
|
16
|
+
debug: { bg: "#616161", border: "#424242", color: "#fff", icon: "☕", symbol: "🅳" },
|
|
17
|
+
error: { bg: "#d32f2f", border: "#c62828", color: "#fff", icon: "✘", symbol: "🅴" },
|
|
18
|
+
group: { bg: "#546e7a", border: "#455a64", color: "#fff", icon: "⚭", symbol: "🅶" },
|
|
19
|
+
info: { bg: "#1976d2", border: "#1565c0", color: "#fff", icon: "ℹ", symbol: "🅸" },
|
|
20
|
+
ns: w ? { bg: "#fafafa", border: "#c7c7c7", color: "#000" } : { bg: "#424242", border: "#212121", color: "#fff" },
|
|
21
|
+
success: { bg: "#689f38", border: "#558b2f", color: "#fff", icon: "✔", symbol: "🆂" },
|
|
22
|
+
time: { bg: "#0097a7", border: "#00838f", color: "#fff", icon: "⏲", symbol: "🆃" },
|
|
23
|
+
trace: { bg: "#d81b60", border: "#c2185b", color: "#fff", icon: "⛢", symbol: "🆃" },
|
|
24
|
+
warn: { bg: "#ffb300", border: "#ffa000", color: "#fff", icon: "⚠", symbol: "🆆" }
|
|
25
|
+
}, b = "border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;";
|
|
26
|
+
function L() {
|
|
27
|
+
return typeof window < "u" && E?.NODE_ENV === "production" ? !0 : typeof process < "u" && process.env?.NODE_ENV === "production";
|
|
28
|
+
}
|
|
29
|
+
const v = L(), o = {
|
|
26
30
|
environment: !0,
|
|
27
31
|
logLevel: "debug",
|
|
28
32
|
namespace: "",
|
|
29
33
|
remote: { handler: void 0, logLevel: "off" },
|
|
30
34
|
timestamp: !0,
|
|
31
35
|
variant: "symbol"
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
};
|
|
37
|
+
function a(e) {
|
|
38
|
+
return l[o.logLevel] <= l[e];
|
|
39
|
+
}
|
|
40
|
+
function g() {
|
|
41
|
+
return (/* @__PURE__ */ new Date()).toISOString().slice(11, 23);
|
|
42
|
+
}
|
|
43
|
+
function d() {
|
|
44
|
+
return v ? "🅿" : "🅳";
|
|
45
|
+
}
|
|
46
|
+
function _(e, t) {
|
|
47
|
+
const { handler: r, logLevel: n } = o.remote;
|
|
48
|
+
r && l[n] <= l[e] && Promise.resolve().then(() => {
|
|
49
|
+
r(e, {
|
|
50
|
+
args: t,
|
|
51
|
+
environment: v ? "production" : "development",
|
|
52
|
+
namespace: o.namespace || void 0,
|
|
53
|
+
timestamp: o.timestamp ? g() : void 0
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function u(e) {
|
|
58
|
+
return $[e] || e;
|
|
59
|
+
}
|
|
60
|
+
function f(e, t = "") {
|
|
61
|
+
const { bg: r, color: n, border: s } = p[e], c = `border: 1px solid ${s}; border-radius: 4px`;
|
|
62
|
+
switch (o.variant) {
|
|
37
63
|
case "symbol":
|
|
38
|
-
return `${s}; padding: 1px 1px 0${o}`;
|
|
39
64
|
case "icon":
|
|
40
|
-
return
|
|
65
|
+
return `color: ${r}; ${c}; padding: 0 3px${t}`;
|
|
41
66
|
default:
|
|
42
|
-
return `background: ${
|
|
67
|
+
return `background: ${r}; color: ${n}; ${c}; font-weight: bold; padding: 0 3px${t}`;
|
|
43
68
|
}
|
|
44
|
-
}, E = (e) => {
|
|
45
|
-
const o = b[e], { variant: t } = r;
|
|
46
|
-
return t === "text" || !o[t] ? e.toUpperCase() : o[t];
|
|
47
|
-
};
|
|
48
|
-
function D(e) {
|
|
49
|
-
const { namespace: o, timestamp: t, environment: c } = r;
|
|
50
|
-
let n = `%c${E(e)}%c`;
|
|
51
|
-
const s = [f(e), ""];
|
|
52
|
-
return o && (n += ` %c${o}%c`, s.push(f("ns", `; ${h}`), "")), c && (n += ` %c${d()}%c`, s.push("color: darkgray", "")), t && (n += ` %c${u()}%c`, s.push("color: gray", "")), { format: n, parts: s };
|
|
53
69
|
}
|
|
54
|
-
|
|
70
|
+
function h(e) {
|
|
71
|
+
if (e === "table")
|
|
72
|
+
return e.toUpperCase();
|
|
73
|
+
const t = p[e], { variant: r } = o;
|
|
74
|
+
return r === "text" || !t[r] ? e.toUpperCase() : t[r];
|
|
75
|
+
}
|
|
76
|
+
function x(e) {
|
|
77
|
+
const { namespace: t, timestamp: r, environment: n } = o;
|
|
78
|
+
let s = `%c${h(e)}%c`;
|
|
79
|
+
const c = [f(e), ""];
|
|
80
|
+
return t && (s += ` %c${t}%c`, c.push(f("ns", `; ${b}`), "")), n && (s += ` %c${d()}%c`, c.push("color: darkgray", "")), r && (s += ` %c${g()}%c`, c.push("color: gray", "")), { format: s, parts: c };
|
|
81
|
+
}
|
|
82
|
+
function i(e, ...t) {
|
|
55
83
|
if (typeof window > "u") {
|
|
56
|
-
const
|
|
57
|
-
|
|
84
|
+
const c = console[u(e)];
|
|
85
|
+
c(`${h(e)} | ${d()} |`, ...t);
|
|
58
86
|
return;
|
|
59
87
|
}
|
|
60
88
|
if (!a(e)) return;
|
|
61
|
-
const { format:
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
89
|
+
const { format: r, parts: n } = x(e), s = console[u(e)];
|
|
90
|
+
s(r, ...n, ...t), _(e, t);
|
|
91
|
+
}
|
|
92
|
+
function O(e) {
|
|
93
|
+
const t = o.namespace, r = t ? `${t}.${e}` : e, n = (s) => (...c) => {
|
|
94
|
+
const m = o.namespace;
|
|
95
|
+
o.namespace = r, i(s, ...c), o.namespace = m;
|
|
96
|
+
};
|
|
97
|
+
return {
|
|
98
|
+
debug: n("debug"),
|
|
99
|
+
error: n("error"),
|
|
100
|
+
info: n("info"),
|
|
101
|
+
success: n("success"),
|
|
102
|
+
trace: n("trace"),
|
|
103
|
+
warn: n("warn")
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const D = {
|
|
107
|
+
/**
|
|
108
|
+
* Asserts a condition and logs if false.
|
|
109
|
+
*/
|
|
110
|
+
assert: (e, t, r) => {
|
|
111
|
+
console.assert(e, t, r);
|
|
112
|
+
},
|
|
67
113
|
/**
|
|
68
|
-
*
|
|
114
|
+
* Logs a debug message.
|
|
69
115
|
*/
|
|
70
|
-
assert: (e, o, t) => console.assert(e, o, t),
|
|
71
116
|
debug: (...e) => i("debug", ...e),
|
|
117
|
+
/**
|
|
118
|
+
* Logs an error message.
|
|
119
|
+
*/
|
|
72
120
|
error: (...e) => i("error", ...e),
|
|
121
|
+
/**
|
|
122
|
+
* Gets environment indicator visibility.
|
|
123
|
+
*/
|
|
124
|
+
getEnvironment: () => o.environment,
|
|
73
125
|
/**
|
|
74
126
|
* Gets the current log level.
|
|
75
127
|
*/
|
|
76
|
-
getLevel: () =>
|
|
128
|
+
getLevel: () => o.logLevel,
|
|
129
|
+
/**
|
|
130
|
+
* Gets the current namespace.
|
|
131
|
+
*/
|
|
132
|
+
getPrefix: () => o.namespace,
|
|
77
133
|
/**
|
|
78
|
-
* Gets
|
|
134
|
+
* Gets timestamp visibility.
|
|
79
135
|
*/
|
|
80
|
-
|
|
136
|
+
getTimestamp: () => o.timestamp,
|
|
81
137
|
/**
|
|
82
|
-
* Gets
|
|
138
|
+
* Gets the current variant.
|
|
83
139
|
*/
|
|
84
|
-
|
|
140
|
+
getVariant: () => o.variant,
|
|
85
141
|
/**
|
|
86
|
-
* Creates a collapsed group
|
|
142
|
+
* Creates a collapsed console group.
|
|
87
143
|
*/
|
|
88
|
-
groupCollapsed: (e,
|
|
144
|
+
groupCollapsed: (e, t = "GROUP", r = Date.now()) => {
|
|
89
145
|
if (!a("success")) return;
|
|
90
|
-
const
|
|
146
|
+
const n = Date.now() - r, s = n ? `${n}ms` : "", c = d(), m = o.timestamp ? g() : "";
|
|
91
147
|
console.groupCollapsed(
|
|
92
|
-
`%c${
|
|
148
|
+
`%c${t}%c${o.namespace}%c${c}%c${m}%c${s}%c${e}`,
|
|
93
149
|
f("group", "; margin-right: 6px; padding: 1px 3px 0"),
|
|
94
|
-
f("ns", `; ${
|
|
150
|
+
f("ns", `; ${b}; margin-right: 6px`),
|
|
95
151
|
"color: darkgray; margin-right: 6px",
|
|
96
152
|
"color: gray; font-weight: lighter; margin-right: 6px",
|
|
97
153
|
"color: gray; font-weight: lighter; margin-right: 6px",
|
|
@@ -104,55 +160,73 @@ const i = (e, ...o) => {
|
|
|
104
160
|
groupEnd: () => {
|
|
105
161
|
a("success") && console.groupEnd();
|
|
106
162
|
},
|
|
163
|
+
/**
|
|
164
|
+
* Logs an info message.
|
|
165
|
+
*/
|
|
107
166
|
info: (...e) => i("info", ...e),
|
|
108
167
|
/**
|
|
109
|
-
*
|
|
168
|
+
* Creates a scoped logger with a namespace.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```ts
|
|
172
|
+
* const apiLogger = Logit.scope('api');
|
|
173
|
+
* apiLogger.info('Request received'); // [api] Request received
|
|
174
|
+
* ```
|
|
110
175
|
*/
|
|
111
|
-
|
|
112
|
-
Object.assign(r, e);
|
|
113
|
-
},
|
|
176
|
+
scope: (e) => O(e),
|
|
114
177
|
/**
|
|
115
|
-
* Sets the minimum log level
|
|
178
|
+
* Sets the minimum log level.
|
|
116
179
|
*/
|
|
117
180
|
setLogLevel: (e) => {
|
|
118
|
-
|
|
181
|
+
o.logLevel = e;
|
|
119
182
|
},
|
|
120
183
|
/**
|
|
121
|
-
* Sets the namespace prefix
|
|
184
|
+
* Sets the global namespace prefix.
|
|
122
185
|
*/
|
|
123
186
|
setPrefix: (e) => {
|
|
124
|
-
|
|
187
|
+
o.namespace = e;
|
|
125
188
|
},
|
|
126
189
|
/**
|
|
127
|
-
*
|
|
190
|
+
* Sets the remote logging options.
|
|
128
191
|
*/
|
|
129
192
|
setRemote: (e) => {
|
|
130
|
-
|
|
193
|
+
o.remote = { ...o.remote, ...e };
|
|
131
194
|
},
|
|
132
195
|
/**
|
|
133
|
-
* Sets the log level
|
|
196
|
+
* Sets the remote log level.
|
|
134
197
|
*/
|
|
135
198
|
setRemoteLogLevel: (e) => {
|
|
136
|
-
|
|
199
|
+
o.remote.logLevel = e;
|
|
137
200
|
},
|
|
138
201
|
/**
|
|
139
|
-
*
|
|
202
|
+
* Configures Logit with options.
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* ```ts
|
|
206
|
+
* Logit.setup({
|
|
207
|
+
* logLevel: 'info',
|
|
208
|
+
* variant: 'text',
|
|
209
|
+
* timestamp: false
|
|
210
|
+
* });
|
|
211
|
+
* ```
|
|
140
212
|
*/
|
|
141
|
-
|
|
142
|
-
|
|
213
|
+
setup: (e) => {
|
|
214
|
+
if (e.remote) {
|
|
215
|
+
o.remote = { ...o.remote, ...e.remote };
|
|
216
|
+
const { remote: t, ...r } = e;
|
|
217
|
+
Object.assign(o, r);
|
|
218
|
+
} else
|
|
219
|
+
Object.assign(o, e);
|
|
143
220
|
},
|
|
144
221
|
/**
|
|
145
|
-
*
|
|
222
|
+
* Sets the display variant.
|
|
146
223
|
*/
|
|
147
|
-
|
|
148
|
-
|
|
224
|
+
setVariant: (e) => {
|
|
225
|
+
o.variant = e;
|
|
149
226
|
},
|
|
150
227
|
/**
|
|
151
|
-
*
|
|
228
|
+
* Logs a success message.
|
|
152
229
|
*/
|
|
153
|
-
showTimestamp: (e) => {
|
|
154
|
-
r.timestamp = e;
|
|
155
|
-
},
|
|
156
230
|
success: (...e) => i("success", ...e),
|
|
157
231
|
/**
|
|
158
232
|
* Displays data in a table format.
|
|
@@ -161,21 +235,39 @@ const i = (e, ...o) => {
|
|
|
161
235
|
a("table") && console.table(...e);
|
|
162
236
|
},
|
|
163
237
|
/**
|
|
164
|
-
* Starts a timer
|
|
238
|
+
* Starts a timer.
|
|
165
239
|
*/
|
|
166
240
|
time: (e) => {
|
|
167
241
|
a("time") && console.time(e);
|
|
168
242
|
},
|
|
169
243
|
/**
|
|
170
|
-
* Ends a timer
|
|
244
|
+
* Ends a timer.
|
|
171
245
|
*/
|
|
172
246
|
timeEnd: (e) => {
|
|
173
247
|
a("time") && console.timeEnd(e);
|
|
174
248
|
},
|
|
249
|
+
/**
|
|
250
|
+
* Toggles or sets environment indicator visibility.
|
|
251
|
+
*/
|
|
252
|
+
toggleEnvironment: (e) => {
|
|
253
|
+
o.environment = e ?? !o.environment;
|
|
254
|
+
},
|
|
255
|
+
/**
|
|
256
|
+
* Toggles or sets timestamp visibility.
|
|
257
|
+
*/
|
|
258
|
+
toggleTimestamp: (e) => {
|
|
259
|
+
o.timestamp = e ?? !o.timestamp;
|
|
260
|
+
},
|
|
261
|
+
/**
|
|
262
|
+
* Logs a trace message.
|
|
263
|
+
*/
|
|
175
264
|
trace: (...e) => i("trace", ...e),
|
|
265
|
+
/**
|
|
266
|
+
* Logs a warning message.
|
|
267
|
+
*/
|
|
176
268
|
warn: (...e) => i("warn", ...e)
|
|
177
269
|
};
|
|
178
270
|
export {
|
|
179
|
-
|
|
271
|
+
D as Logit
|
|
180
272
|
};
|
|
181
273
|
//# sourceMappingURL=logit.js.map
|
package/dist/logit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logit.js","sources":["../src/logit.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noAssignInExpressions: - */\n/** biome-ignore-all lint/suspicious/noExplicitAny: - */\n\n/**\n * Environment indicator symbols.\n */\nconst ENV_PROD = '\\uD83C\\uDD3F'; // 🅿\nconst ENV_DEV = '\\uD83C\\uDD33'; // 🅳\n\n/**\n * Console method mappings for log types.\n */\nconst CONSOLE_METHOD_MAP: Record<string, keyof Console> = {\n debug: 'log',\n success: 'log',\n} as const;\n\n/**\n * Checks if the current environment is production.\n * Cached for performance - evaluated once at a module load.\n */\nconst isProduction = (): boolean => {\n // Browser environment (Vite, Webpack, etc.)\n if (typeof window !== 'undefined' && (import.meta as any)?.env?.NODE_ENV) {\n return (import.meta as any).env.NODE_ENV === 'production';\n }\n\n // Node.js environment\n // @ts-expect-error\n if (typeof process !== 'undefined' && (process as any).env?.NODE_ENV) {\n // @ts-expect-error\n return (process as any).env.NODE_ENV === 'production';\n }\n\n return false;\n};\n\n// Cache the result to avoid repeated checks\nconst IS_PROD = isProduction();\n\nexport type LogitInstance = typeof Logit;\nexport type LogitType = 'debug' | 'trace' | 'time' | 'table' | 'info' | 'success' | 'warn' | 'error';\nexport type LogitColors = Exclude<LogitType, 'table'> | 'group' | 'ns';\nexport type LogitLevel = LogitType | 'off';\nexport type LogitRemoteOptions = {\n handler?: (...args: any[]) => void;\n logLevel: LogitLevel;\n};\nexport type LogitOptions = {\n environment?: boolean;\n variant?: 'text' | 'symbol' | 'icon';\n logLevel?: LogitLevel;\n namespace?: string;\n remote?: LogitRemoteOptions;\n timestamp?: boolean;\n};\nexport type LogitTheme = { color: string; bg: string; border: string; icon?: string; symbol?: string };\n\n/**\n * Detects dark mode preference at module load time.\n * Note: This is intentionally static and won't update if the user changes their theme.\n */\nconst isDark = typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches;\n\nconst Theme: Readonly<Record<LogitColors, LogitTheme>> = {\n debug: { bg: '#616161', border: '#424242', color: '#fff', icon: '\\u2615', symbol: '\\uD83C\\uDD73' },\n error: { bg: '#d32f2f', border: '#c62828', color: '#fff', icon: '\\u2718', symbol: '\\uD83C\\uDD74' },\n group: { bg: '#546e7a', border: '#455a64', color: '#fff', icon: '\\u26AD', symbol: '\\uD83C\\uDD76' },\n info: { bg: '#1976d2', border: '#1565c0', color: '#fff', icon: '\\u2139', symbol: '\\uD83C\\uDD78' },\n ns: isDark\n ? { bg: '#fafafa', border: '#c7c7c7', color: '#000' }\n : { bg: '#424242', border: '#212121', color: '#fff' },\n success: { bg: '#689f38', border: '#558b2f', color: '#fff', icon: '\\u2714', symbol: '\\uD83C\\uDD82' },\n time: { bg: '#0097a7', border: '#00838f', color: '#fff', icon: '\\u23F2', symbol: '\\uD83C\\uDD83' },\n trace: { bg: '#d81b60', border: '#c2185b', color: '#fff', icon: '\\u26e2', symbol: '\\uD83C\\uDD83' },\n warn: { bg: '#ffb300', border: '#ffa000', color: '#fff', icon: '\\u26a0', symbol: '\\uD83C\\uDD86' },\n};\n\n// biome-ignore assist/source/useSortedKeys: -\nconst logLevel: Readonly<Record<LogitLevel, number>> = {\n debug: 0,\n trace: 1,\n time: 2,\n table: 3,\n info: 4,\n success: 5,\n warn: 6,\n error: 7,\n off: 8,\n};\n\nconst state: Required<LogitOptions> = {\n environment: true,\n logLevel: 'debug',\n namespace: '',\n remote: { handler: undefined, logLevel: 'off' },\n timestamp: true,\n variant: 'symbol',\n};\n\n/**\n * Determines if a log message should be shown based on the current log level.\n */\nconst shouldLog = (type: LogitType): boolean => logLevel[state.logLevel] <= logLevel[type];\n\n/**\n * Gets the current timestamp in ISO format (HH:MM:SS.mmm).\n */\nconst getCurrentTimestamp = (): string => new Date().toISOString().slice(11, 23);\n\n/**\n * Gets the environment indicator symbol.\n */\nconst getEnvIndicator = (): string => (IS_PROD ? ENV_PROD : ENV_DEV);\n\n/**\n * Sends log data to remote handler if configured.\n */\nconst sendRemoteLog = (type: LogitType, args: any[]): void => {\n if (state.remote.handler && logLevel[state.remote.logLevel] <= logLevel[type]) {\n state.remote.handler(type, ...args);\n }\n};\n\n/**\n * Gets the console method for a given log type.\n */\nconst getConsoleMethod = (type: LogitType): keyof Console => {\n return (CONSOLE_METHOD_MAP[type] || type) as keyof Console;\n};\n\n/**\n * CSS style constants for consistent formatting.\n */\nconst BASE_BORDER_STYLE = 'border: 1px solid';\nconst BASE_BORDER_RADIUS = 'border-radius: 4px';\nconst NAMESPACE_STYLE = 'border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter';\n\n/**\n * Generates CSS styles for log messages based on theme and variant.\n */\nconst style = (type: LogitColors, extra = ''): string => {\n const { bg, color, border } = Theme[type];\n const baseStyle = `color: ${bg}; ${BASE_BORDER_STYLE} ${border}; ${BASE_BORDER_RADIUS}`;\n\n switch (state.variant) {\n case 'symbol':\n return `${baseStyle}; padding: 1px 1px 0${extra}`;\n case 'icon':\n return `${baseStyle}; padding: 0 3px${extra}`;\n default:\n return `background: ${bg}; color: ${color}; ${BASE_BORDER_STYLE} ${border}; ${BASE_BORDER_RADIUS}; font-weight: bold; padding: 0 3px${extra}`;\n }\n};\n\n/**\n * Gets the display value for a log type based on current variant.\n */\nconst getDisplayValue = (type: LogitType): string => {\n const theme = Theme[type as LogitColors];\n const { variant } = state;\n\n // For 'text' variant or if the variant key doesn't exist, use uppercase type\n if (variant === 'text' || !theme[variant]) {\n return type.toUpperCase();\n }\n\n return theme[variant] as string;\n};\n\n/**\n * Builds the format string and style parts for browser console logging.\n */\nfunction buildBrowserLogParts(type: LogitType): { format: string; parts: string[] } {\n const { namespace, timestamp, environment } = state;\n\n let format = `%c${getDisplayValue(type)}%c`;\n const parts: string[] = [style(type as LogitColors), ''];\n\n if (namespace) {\n format += ` %c${namespace}%c`;\n parts.push(style('ns', `; ${NAMESPACE_STYLE}`), '');\n }\n\n if (environment) {\n format += ` %c${getEnvIndicator()}%c`;\n parts.push('color: darkgray', '');\n }\n\n if (timestamp) {\n format += ` %c${getCurrentTimestamp()}%c`;\n parts.push('color: gray', '');\n }\n\n return { format, parts };\n}\n\n/**\n * Logs messages to the console with styling and metadata.\n */\nconst log = (type: LogitType, ...args: any[]): void => {\n // Server-side logging (Node.js)\n if (typeof window === 'undefined') {\n const consoleMethod = console[getConsoleMethod(type)] as (...a: any[]) => void;\n consoleMethod(`${getDisplayValue(type)} | ${getEnvIndicator()} |`, ...args);\n return;\n }\n\n // Check log level\n if (!shouldLog(type)) return;\n\n // Browser-side logging with styling\n const { format, parts } = buildBrowserLogParts(type);\n const consoleMethod = console[getConsoleMethod(type)] as (...a: any[]) => void;\n\n consoleMethod(format, ...parts, ...args);\n sendRemoteLog(type, args);\n};\n\n/**\n * Formats the elapsed time for display.\n */\nconst formatElapsedTime = (startTime: number): string => {\n const elapsed = Math.floor(Date.now() - startTime);\n return elapsed ? `${elapsed}ms` : '';\n};\n\nexport const Logit = {\n /**\n * Asserts a condition and logs an error if it's false.\n */\n assert: (valid: boolean, message: string, context: Record<string, any>): void =>\n console.assert(valid, message, context),\n\n debug: (...args: any[]): void => log('debug', ...args),\n error: (...args: any[]): void => log('error', ...args),\n\n /**\n * Gets the current log level.\n */\n getLevel: (): LogitLevel => state.logLevel,\n\n /**\n * Gets the current namespace prefix.\n */\n getPrefix: (): string => state.namespace,\n\n /**\n * Gets whether timestamps are shown.\n */\n getTimestamp: (): boolean => state.timestamp,\n\n /**\n * Creates a collapsed group in the console.\n */\n groupCollapsed: (text: string, label = 'GROUP', time = Date.now()): void => {\n if (!shouldLog('success')) return;\n\n const elapsed = formatElapsedTime(time);\n const env = getEnvIndicator();\n const timestamp = state.timestamp ? getCurrentTimestamp() : '';\n\n console.groupCollapsed(\n `%c${label}%c${state.namespace}%c${env}%c${timestamp}%c${elapsed}%c${text}`,\n style('group', '; margin-right: 6px; padding: 1px 3px 0'),\n style('ns', `; ${NAMESPACE_STYLE}; margin-right: 6px`),\n 'color: darkgray; margin-right: 6px',\n 'color: gray; font-weight: lighter; margin-right: 6px',\n 'color: gray; font-weight: lighter; margin-right: 6px',\n 'color: inherit; font-weight: lighter',\n );\n },\n\n /**\n * Ends the current console group.\n */\n groupEnd: (): void => {\n if (shouldLog('success')) console.groupEnd();\n },\n\n info: (...args: any[]): void => log('info', ...args),\n\n /**\n * Initializes Logit with custom options.\n */\n initialise: (options: LogitOptions): void => {\n Object.assign(state, options);\n },\n\n /**\n * Sets the minimum log level to display.\n */\n setLogLevel: (level: LogitLevel): void => {\n state.logLevel = level;\n },\n\n /**\n * Sets the namespace prefix for all logs.\n */\n setPrefix: (namespace: string): void => {\n state.namespace = namespace;\n },\n\n /**\n * Configures remote logging options.\n */\n setRemote: (remote: LogitRemoteOptions): void => {\n state.remote = remote;\n },\n\n /**\n * Sets the log level for remote logging.\n */\n setRemoteLogLevel: (level: LogitLevel): void => {\n state.remote.logLevel = level;\n },\n\n /**\n * Sets the display variant (text, icon, or symbol).\n */\n setVariant: (variant: 'text' | 'icon' | 'symbol'): void => {\n state.variant = variant;\n },\n\n /**\n * Shows or hides the environment indicator.\n */\n showEnvironment: (value: boolean): void => {\n state.environment = value;\n },\n\n /**\n * Shows or hides timestamps in logs.\n */\n showTimestamp: (value: boolean): void => {\n state.timestamp = value;\n },\n\n success: (...args: any[]): void => log('success', ...args),\n\n /**\n * Displays data in a table format.\n */\n table: (...args: any[]): void => {\n if (shouldLog('table')) console.table(...args);\n },\n\n /**\n * Starts a timer with the given label.\n */\n time: (label: string): void => {\n if (shouldLog('time')) console.time(label);\n },\n\n /**\n * Ends a timer with the given label.\n */\n timeEnd: (label: string): void => {\n if (shouldLog('time')) console.timeEnd(label);\n },\n\n trace: (...args: any[]): void => log('trace', ...args),\n warn: (...args: any[]): void => log('warn', ...args),\n};\n"],"names":["CONSOLE_METHOD_MAP","isProduction","__vite_import_meta_env__","IS_PROD","isDark","Theme","logLevel","state","shouldLog","type","getCurrentTimestamp","getEnvIndicator","sendRemoteLog","args","getConsoleMethod","BASE_BORDER_STYLE","BASE_BORDER_RADIUS","NAMESPACE_STYLE","style","extra","bg","color","border","baseStyle","getDisplayValue","theme","variant","buildBrowserLogParts","namespace","timestamp","environment","format","parts","log","consoleMethod","formatElapsedTime","startTime","elapsed","Logit","valid","message","context","text","label","time","env","options","level","remote","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"logit.js","sources":["../src/logit.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\n\n/* -------------------- Core Types -------------------- */\n\nexport type LogLevel = 'debug' | 'trace' | 'time' | 'table' | 'info' | 'success' | 'warn' | 'error' | 'off';\nexport type LogType = Exclude<LogLevel, 'off'>;\nexport type ColorType = Exclude<LogType, 'table'> | 'group' | 'ns';\nexport type Variant = 'text' | 'symbol' | 'icon';\n\nexport type RemoteOptions = {\n handler?: (type: LogType, data: RemoteLogData) => void;\n logLevel?: LogLevel;\n};\n\nexport type RemoteLogData = {\n args: unknown[];\n environment: 'production' | 'development';\n namespace?: string;\n timestamp?: string;\n};\n\nexport type LogitOptions = {\n environment?: boolean;\n variant?: Variant;\n logLevel?: LogLevel;\n namespace?: string;\n remote?: RemoteOptions;\n timestamp?: boolean;\n};\n\nexport type ScopedLogger = {\n debug: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n success: (...args: unknown[]) => void;\n trace: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n};\n\n/* -------------------- Constants -------------------- */\n\nconst ENV_PROD = '🅿';\nconst ENV_DEV = '🅳';\n\nconst CONSOLE_METHOD_MAP: Partial<Record<LogType, keyof Console>> = {\n debug: 'log',\n success: 'log',\n};\n\n// biome-ignore assist/source/useSortedKeys: -\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n trace: 1,\n time: 2,\n table: 3,\n info: 4,\n success: 5,\n warn: 6,\n error: 7,\n off: 8,\n};\n\n/* -------------------- Theme & Styles -------------------- */\n\ntype Theme = {\n color: string;\n bg: string;\n border: string;\n icon?: string;\n symbol?: string;\n};\n\nconst isDarkMode = typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches;\n\nconst THEME: Record<ColorType, Theme> = {\n debug: { bg: '#616161', border: '#424242', color: '#fff', icon: '☕', symbol: '🅳' },\n error: { bg: '#d32f2f', border: '#c62828', color: '#fff', icon: '✘', symbol: '🅴' },\n group: { bg: '#546e7a', border: '#455a64', color: '#fff', icon: '⚭', symbol: '🅶' },\n info: { bg: '#1976d2', border: '#1565c0', color: '#fff', icon: 'ℹ', symbol: '🅸' },\n ns: isDarkMode\n ? { bg: '#fafafa', border: '#c7c7c7', color: '#000' }\n : { bg: '#424242', border: '#212121', color: '#fff' },\n success: { bg: '#689f38', border: '#558b2f', color: '#fff', icon: '✔', symbol: '🆂' },\n time: { bg: '#0097a7', border: '#00838f', color: '#fff', icon: '⏲', symbol: '🆃' },\n trace: { bg: '#d81b60', border: '#c2185b', color: '#fff', icon: '⛢', symbol: '🆃' },\n warn: { bg: '#ffb300', border: '#ffa000', color: '#fff', icon: '⚠', symbol: '🆆' },\n};\n\nconst NAMESPACE_STYLE = 'border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;';\n\n/* -------------------- Environment Detection -------------------- */\n\n/**\n * Detects if running in a production environment.\n * Checks both browser (import.meta.env) and Node.js (process.env).\n */\nfunction isProduction(): boolean {\n // Browser environment (Vite, Webpack, etc.)\n if (typeof window !== 'undefined' && (import.meta as any)?.env?.NODE_ENV === 'production') {\n return true;\n }\n\n // @ts-expect-error - process.env exists in Node.js but not in a browser\n return typeof process !== 'undefined' && (process as any).env?.NODE_ENV === 'production';\n}\n\nconst IS_PROD = isProduction();\n\n/* -------------------- State -------------------- */\n\nconst state: Required<LogitOptions> & { remote: Required<RemoteOptions> } = {\n environment: true,\n logLevel: 'debug',\n namespace: '',\n remote: { handler: undefined as any, logLevel: 'off' },\n timestamp: true,\n variant: 'symbol',\n};\n\n/* -------------------- Helper Functions -------------------- */\n\n/**\n * Checks if a log should be displayed based on the current log level.\n */\nfunction shouldLog(type: LogType): boolean {\n return LOG_LEVEL_PRIORITY[state.logLevel] <= LOG_LEVEL_PRIORITY[type];\n}\n\n/**\n * Gets the current timestamp in HH:MM:SS.mmm format.\n */\nfunction getTimestamp(): string {\n return new Date().toISOString().slice(11, 23);\n}\n\n/**\n * Gets environment indicator emoji.\n */\nfunction getEnvIndicator(): string {\n return IS_PROD ? ENV_PROD : ENV_DEV;\n}\n\n/**\n * Sends log to remote handler if configured.\n */\nfunction sendRemote(type: LogType, args: unknown[]): void {\n const { handler, logLevel } = state.remote;\n\n if (handler && LOG_LEVEL_PRIORITY[logLevel] <= LOG_LEVEL_PRIORITY[type]) {\n // Use microtask to make async without setTimeout overhead\n Promise.resolve().then(() => {\n handler(type, {\n args,\n environment: IS_PROD ? 'production' : 'development',\n namespace: state.namespace || undefined,\n timestamp: state.timestamp ? getTimestamp() : undefined,\n });\n });\n }\n}\n\n/**\n * Gets the console method for a log type.\n */\nfunction getConsoleMethod(type: LogType): keyof Console {\n return (CONSOLE_METHOD_MAP[type] || type) as keyof Console;\n}\n\n/**\n * Generates CSS style for a log type.\n */\nfunction getStyle(type: ColorType, extra = ''): string {\n const { bg, color, border } = THEME[type];\n const baseStyle = `border: 1px solid ${border}; border-radius: 4px`;\n\n switch (state.variant) {\n case 'symbol':\n case 'icon':\n return `color: ${bg}; ${baseStyle}; padding: 0 3px${extra}`;\n default:\n return `background: ${bg}; color: ${color}; ${baseStyle}; font-weight: bold; padding: 0 3px${extra}`;\n }\n}\n\n/**\n * Gets display value for a log type based on variant.\n */\nfunction getDisplayValue(type: LogType): string {\n // Table doesn't have a theme, return uppercase\n if (type === 'table') {\n return type.toUpperCase();\n }\n\n const theme = THEME[type as ColorType];\n const { variant } = state;\n\n if (variant === 'text' || !theme[variant]) {\n return type.toUpperCase();\n }\n\n return theme[variant]!;\n}\n\n/**\n * Builds browser console format string and style parts.\n */\nfunction buildLogParts(type: LogType): { format: string; parts: string[] } {\n const { namespace, timestamp, environment } = state;\n\n let format = `%c${getDisplayValue(type)}%c`;\n // Table doesn't have styling, but this is only called for types that do\n const parts: string[] = [getStyle(type as ColorType), ''];\n\n if (namespace) {\n format += ` %c${namespace}%c`;\n parts.push(getStyle('ns', `; ${NAMESPACE_STYLE}`), '');\n }\n\n if (environment) {\n format += ` %c${getEnvIndicator()}%c`;\n parts.push('color: darkgray', '');\n }\n\n if (timestamp) {\n format += ` %c${getTimestamp()}%c`;\n parts.push('color: gray', '');\n }\n\n return { format, parts };\n}\n\n/**\n * Core logging function.\n */\nfunction log(type: LogType, ...args: unknown[]): void {\n // Node.js logging (simplified)\n if (typeof window === 'undefined') {\n const method = console[getConsoleMethod(type)] as (...a: unknown[]) => void;\n method(`${getDisplayValue(type)} | ${getEnvIndicator()} |`, ...args);\n return;\n }\n\n // Check the log level\n if (!shouldLog(type)) return;\n\n // Browser logging with styles\n const { format, parts } = buildLogParts(type);\n const method = console[getConsoleMethod(type)] as (...a: unknown[]) => void;\n\n method(format, ...parts, ...args);\n sendRemote(type, args);\n}\n\n/**\n * Creates a scoped logger without mutating global state.\n */\nfunction createScopedLogger(scopeName: string): ScopedLogger {\n const originalNamespace = state.namespace;\n const fullNamespace = originalNamespace ? `${originalNamespace}.${scopeName}` : scopeName;\n\n const createMethod = (type: LogType) => {\n return (...args: unknown[]) => {\n const prev = state.namespace;\n state.namespace = fullNamespace;\n log(type, ...args);\n state.namespace = prev;\n };\n };\n\n return {\n debug: createMethod('debug'),\n error: createMethod('error'),\n info: createMethod('info'),\n success: createMethod('success'),\n trace: createMethod('trace'),\n warn: createMethod('warn'),\n };\n}\n\n/* -------------------- Public API -------------------- */\n\nexport const Logit = {\n /**\n * Asserts a condition and logs if false.\n */\n assert: (condition: boolean, message: string, context?: Record<string, unknown>): void => {\n console.assert(condition, message, context);\n },\n /**\n * Logs a debug message.\n */\n debug: (...args: unknown[]): void => log('debug', ...args),\n\n /**\n * Logs an error message.\n */\n error: (...args: unknown[]): void => log('error', ...args),\n\n /**\n * Gets environment indicator visibility.\n */\n getEnvironment: (): boolean => state.environment,\n\n /**\n * Gets the current log level.\n */\n getLevel: (): LogLevel => state.logLevel,\n\n /**\n * Gets the current namespace.\n */\n getPrefix: (): string => state.namespace,\n\n /**\n * Gets timestamp visibility.\n */\n getTimestamp: (): boolean => state.timestamp,\n\n /**\n * Gets the current variant.\n */\n getVariant: (): Variant => state.variant,\n\n /**\n * Creates a collapsed console group.\n */\n groupCollapsed: (text: string, label = 'GROUP', startTime = Date.now()): void => {\n if (!shouldLog('success')) return;\n\n const elapsed = Date.now() - startTime;\n const elapsedStr = elapsed ? `${elapsed}ms` : '';\n const env = getEnvIndicator();\n const timestamp = state.timestamp ? getTimestamp() : '';\n\n console.groupCollapsed(\n `%c${label}%c${state.namespace}%c${env}%c${timestamp}%c${elapsedStr}%c${text}`,\n getStyle('group', '; margin-right: 6px; padding: 1px 3px 0'),\n getStyle('ns', `; ${NAMESPACE_STYLE}; margin-right: 6px`),\n 'color: darkgray; margin-right: 6px',\n 'color: gray; font-weight: lighter; margin-right: 6px',\n 'color: gray; font-weight: lighter; margin-right: 6px',\n 'color: inherit; font-weight: lighter',\n );\n },\n\n /**\n * Ends the current console group.\n */\n groupEnd: (): void => {\n if (shouldLog('success')) console.groupEnd();\n },\n\n /**\n * Logs an info message.\n */\n info: (...args: unknown[]): void => log('info', ...args),\n\n /**\n * Creates a scoped logger with a namespace.\n *\n * @example\n * ```ts\n * const apiLogger = Logit.scope('api');\n * apiLogger.info('Request received'); // [api] Request received\n * ```\n */\n scope: (namespace: string): ScopedLogger => createScopedLogger(namespace),\n\n /**\n * Sets the minimum log level.\n */\n setLogLevel: (level: LogLevel): void => {\n state.logLevel = level;\n },\n\n /**\n * Sets the global namespace prefix.\n */\n setPrefix: (namespace: string): void => {\n state.namespace = namespace;\n },\n\n /**\n * Sets the remote logging options.\n */\n setRemote: (remote: RemoteOptions): void => {\n state.remote = { ...state.remote, ...remote };\n },\n\n /**\n * Sets the remote log level.\n */\n setRemoteLogLevel: (level: LogLevel): void => {\n state.remote.logLevel = level;\n },\n\n /**\n * Configures Logit with options.\n *\n * @example\n * ```ts\n * Logit.setup({\n * logLevel: 'info',\n * variant: 'text',\n * timestamp: false\n * });\n * ```\n */\n setup: (options: LogitOptions): void => {\n if (options.remote) {\n state.remote = { ...state.remote, ...options.remote };\n const { remote, ...rest } = options;\n Object.assign(state, rest);\n } else {\n Object.assign(state, options);\n }\n },\n\n /**\n * Sets the display variant.\n */\n setVariant: (variant: Variant): void => {\n state.variant = variant;\n },\n\n /**\n * Logs a success message.\n */\n success: (...args: unknown[]): void => log('success', ...args),\n\n /**\n * Displays data in a table format.\n */\n table: (...args: unknown[]): void => {\n if (shouldLog('table')) console.table(...args);\n },\n\n /**\n * Starts a timer.\n */\n time: (label: string): void => {\n if (shouldLog('time')) console.time(label);\n },\n\n /**\n * Ends a timer.\n */\n timeEnd: (label: string): void => {\n if (shouldLog('time')) console.timeEnd(label);\n },\n\n /**\n * Toggles or sets environment indicator visibility.\n */\n toggleEnvironment: (value?: boolean): void => {\n state.environment = value ?? !state.environment;\n },\n\n /**\n * Toggles or sets timestamp visibility.\n */\n toggleTimestamp: (value?: boolean): void => {\n state.timestamp = value ?? !state.timestamp;\n },\n\n /**\n * Logs a trace message.\n */\n trace: (...args: unknown[]): void => log('trace', ...args),\n\n /**\n * Logs a warning message.\n */\n warn: (...args: unknown[]): void => log('warn', ...args),\n};\n"],"names":["CONSOLE_METHOD_MAP","LOG_LEVEL_PRIORITY","isDarkMode","THEME","NAMESPACE_STYLE","isProduction","__vite_import_meta_env__","IS_PROD","state","shouldLog","type","getTimestamp","getEnvIndicator","sendRemote","args","handler","logLevel","getConsoleMethod","getStyle","extra","bg","color","border","baseStyle","getDisplayValue","theme","variant","buildLogParts","namespace","timestamp","environment","format","parts","log","method","createScopedLogger","scopeName","originalNamespace","fullNamespace","createMethod","prev","Logit","condition","message","context","text","label","startTime","elapsed","elapsedStr","env","level","remote","options","rest","value"],"mappings":"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"}
|