@vielzeug/logit 1.1.2 → 2.1.0

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/dist/index.d.ts CHANGED
@@ -1,162 +1,2 @@
1
- export declare type ColorType = Exclude<LogType, 'table'> | 'group' | 'ns';
2
-
3
- export declare const Logit: {
4
- /**
5
- * Asserts a condition and logs if false.
6
- */
7
- assert: (condition: boolean, message: string, context?: Record<string, unknown>) => void;
8
- /**
9
- * Logs a debug message.
10
- */
11
- debug: (...args: unknown[]) => void;
12
- /**
13
- * Logs an error message.
14
- */
15
- error: (...args: unknown[]) => void;
16
- /**
17
- * Gets environment indicator visibility.
18
- */
19
- getEnvironment: () => boolean;
20
- /**
21
- * Gets the current log level.
22
- */
23
- getLevel: () => LogLevel;
24
- /**
25
- * Gets the current namespace.
26
- */
27
- getPrefix: () => string;
28
- /**
29
- * Gets timestamp visibility.
30
- */
31
- getTimestamp: () => boolean;
32
- /**
33
- * Gets the current variant.
34
- */
35
- getVariant: () => Variant;
36
- /**
37
- * Creates a collapsed console group.
38
- */
39
- groupCollapsed: (text: string, label?: string, startTime?: number) => void;
40
- /**
41
- * Ends the current console group.
42
- */
43
- groupEnd: () => void;
44
- /**
45
- * Logs an info message.
46
- */
47
- info: (...args: unknown[]) => void;
48
- /**
49
- * Creates a scoped logger with a namespace.
50
- *
51
- * @example
52
- * ```ts
53
- * const apiLogger = Logit.scope('api');
54
- * apiLogger.info('Request received'); // [api] Request received
55
- * ```
56
- */
57
- scope: (namespace: string) => ScopedLogger;
58
- /**
59
- * Sets the minimum log level.
60
- */
61
- setLogLevel: (level: LogLevel) => void;
62
- /**
63
- * Sets the global namespace prefix.
64
- */
65
- setPrefix: (namespace: string) => void;
66
- /**
67
- * Sets the remote logging options.
68
- */
69
- setRemote: (remote: RemoteOptions) => void;
70
- /**
71
- * Sets the remote log level.
72
- */
73
- setRemoteLogLevel: (level: LogLevel) => void;
74
- /**
75
- * Configures Logit with options.
76
- *
77
- * @example
78
- * ```ts
79
- * Logit.setup({
80
- * logLevel: 'info',
81
- * variant: 'text',
82
- * timestamp: false
83
- * });
84
- * ```
85
- */
86
- setup: (options: LogitOptions) => void;
87
- /**
88
- * Sets the display variant.
89
- */
90
- setVariant: (variant: Variant) => void;
91
- /**
92
- * Logs a success message.
93
- */
94
- success: (...args: unknown[]) => void;
95
- /**
96
- * Displays data in a table format.
97
- */
98
- table: (...args: unknown[]) => void;
99
- /**
100
- * Starts a timer.
101
- */
102
- time: (label: string) => void;
103
- /**
104
- * Ends a timer.
105
- */
106
- timeEnd: (label: string) => void;
107
- /**
108
- * Toggles or sets environment indicator visibility.
109
- */
110
- toggleEnvironment: (value?: boolean) => void;
111
- /**
112
- * Toggles or sets timestamp visibility.
113
- */
114
- toggleTimestamp: (value?: boolean) => void;
115
- /**
116
- * Logs a trace message.
117
- */
118
- trace: (...args: unknown[]) => void;
119
- /**
120
- * Logs a warning message.
121
- */
122
- warn: (...args: unknown[]) => void;
123
- };
124
-
125
- export declare type LogitOptions = {
126
- environment?: boolean;
127
- variant?: Variant;
128
- logLevel?: LogLevel;
129
- namespace?: string;
130
- remote?: RemoteOptions;
131
- timestamp?: boolean;
132
- };
133
-
134
- /** biome-ignore-all lint/suspicious/noExplicitAny: - */
135
- export declare type LogLevel = 'debug' | 'trace' | 'time' | 'table' | 'info' | 'success' | 'warn' | 'error' | 'off';
136
-
137
- export declare type LogType = Exclude<LogLevel, 'off'>;
138
-
139
- export declare type RemoteLogData = {
140
- args: unknown[];
141
- environment: 'production' | 'development';
142
- namespace?: string;
143
- timestamp?: string;
144
- };
145
-
146
- export declare type RemoteOptions = {
147
- handler?: (type: LogType, data: RemoteLogData) => void;
148
- logLevel?: LogLevel;
149
- };
150
-
151
- export declare type ScopedLogger = {
152
- debug: (...args: unknown[]) => void;
153
- error: (...args: unknown[]) => void;
154
- info: (...args: unknown[]) => void;
155
- success: (...args: unknown[]) => void;
156
- trace: (...args: unknown[]) => void;
157
- warn: (...args: unknown[]) => void;
158
- };
159
-
160
- export declare type Variant = 'text' | 'symbol' | 'icon';
161
-
162
- export { }
1
+ export * from './logit';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,2 @@
1
- import { Logit as t } from "./logit.js";
2
- export {
3
- t as Logit
4
- };
5
- //# sourceMappingURL=index.js.map
1
+ import { Logit as e, createLogger as t } from "./logit.js";
2
+ export { e as Logit, t as createLogger };
package/dist/logit.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $={},w="🅿",E="🅳",L={debug:"log",success:"log"},l={debug:0,trace:1,time:2,table:3,info:4,success:5,warn:6,error:7,off:8},_=typeof window<"u"&&window.matchMedia?.("(prefers-color-scheme: dark)").matches,p={debug:{bg:"#616161",border:"#424242",color:"#fff",icon:"☕",symbol:"🅳"},error:{bg:"#d32f2f",border:"#c62828",color:"#fff",icon:"✘",symbol:"🅴"},group:{bg:"#546e7a",border:"#455a64",color:"#fff",icon:"⚭",symbol:"🅶"},info:{bg:"#1976d2",border:"#1565c0",color:"#fff",icon:"ℹ",symbol:"🅸"},ns:_?{bg:"#fafafa",border:"#c7c7c7",color:"#000"}:{bg:"#424242",border:"#212121",color:"#fff"},success:{bg:"#689f38",border:"#558b2f",color:"#fff",icon:"✔",symbol:"🆂"},time:{bg:"#0097a7",border:"#00838f",color:"#fff",icon:"⏲",symbol:"🆃"},trace:{bg:"#d81b60",border:"#c2185b",color:"#fff",icon:"⛢",symbol:"🆃"},warn:{bg:"#ffb300",border:"#ffa000",color:"#fff",icon:"⚠",symbol:"🆆"}},b="border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;";function x(){return typeof window<"u"&&$?.NODE_ENV==="production"?!0:typeof process<"u"&&process.env?.NODE_ENV==="production"}const v=x(),o={environment:!0,logLevel:"debug",namespace:"",remote:{handler:void 0,logLevel:"off"},timestamp:!0,variant:"symbol"};function a(e){return l[o.logLevel]<=l[e]}function g(){return new Date().toISOString().slice(11,23)}function d(){return v?w:E}function O(e,t){const{handler:r,logLevel:n}=o.remote;r&&l[n]<=l[e]&&Promise.resolve().then(()=>{r(e,{args:t,environment:v?"production":"development",namespace:o.namespace||void 0,timestamp:o.timestamp?g():void 0})})}function u(e){return L[e]||e}function f(e,t=""){const{bg:r,color:n,border:s}=p[e],c=`border: 1px solid ${s}; border-radius: 4px`;switch(o.variant){case"symbol":case"icon":return`color: ${r}; ${c}; padding: 0 3px${t}`;default:return`background: ${r}; color: ${n}; ${c}; font-weight: bold; padding: 0 3px${t}`}}function h(e){if(e==="table")return e.toUpperCase();const t=p[e],{variant:r}=o;return r==="text"||!t[r]?e.toUpperCase():t[r]}function y(e){const{namespace:t,timestamp:r,environment:n}=o;let s=`%c${h(e)}%c`;const c=[f(e),""];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}}function i(e,...t){if(typeof window>"u"){const c=console[u(e)];c(`${h(e)} | ${d()} |`,...t);return}if(!a(e))return;const{format:r,parts:n}=y(e),s=console[u(e)];s(r,...n,...t),O(e,t)}function P(e){const t=o.namespace,r=t?`${t}.${e}`:e,n=s=>(...c)=>{const m=o.namespace;o.namespace=r,i(s,...c),o.namespace=m};return{debug:n("debug"),error:n("error"),info:n("info"),success:n("success"),trace:n("trace"),warn:n("warn")}}const S={assert:(e,t,r)=>{console.assert(e,t,r)},debug:(...e)=>i("debug",...e),error:(...e)=>i("error",...e),getEnvironment:()=>o.environment,getLevel:()=>o.logLevel,getPrefix:()=>o.namespace,getTimestamp:()=>o.timestamp,getVariant:()=>o.variant,groupCollapsed:(e,t="GROUP",r=Date.now())=>{if(!a("success"))return;const n=Date.now()-r,s=n?`${n}ms`:"",c=d(),m=o.timestamp?g():"";console.groupCollapsed(`%c${t}%c${o.namespace}%c${c}%c${m}%c${s}%c${e}`,f("group","; margin-right: 6px; padding: 1px 3px 0"),f("ns",`; ${b}; margin-right: 6px`),"color: darkgray; margin-right: 6px","color: gray; font-weight: lighter; margin-right: 6px","color: gray; font-weight: lighter; margin-right: 6px","color: inherit; font-weight: lighter")},groupEnd:()=>{a("success")&&console.groupEnd()},info:(...e)=>i("info",...e),scope:e=>P(e),setLogLevel:e=>{o.logLevel=e},setPrefix:e=>{o.namespace=e},setRemote:e=>{o.remote={...o.remote,...e}},setRemoteLogLevel:e=>{o.remote.logLevel=e},setup:e=>{if(e.remote){o.remote={...o.remote,...e.remote};const{remote:t,...r}=e;Object.assign(o,r)}else Object.assign(o,e)},setVariant:e=>{o.variant=e},success:(...e)=>i("success",...e),table:(...e)=>{a("table")&&console.table(...e)},time:e=>{a("time")&&console.time(e)},timeEnd:e=>{a("time")&&console.timeEnd(e)},toggleEnvironment:e=>{o.environment=e??!o.environment},toggleTimestamp:e=>{o.timestamp=e??!o.timestamp},trace:(...e)=>i("trace",...e),warn:(...e)=>i("warn",...e)};exports.Logit=S;
2
- //# sourceMappingURL=logit.cjs.map
1
+ var e={debug:0,error:5,info:2,off:6,success:3,trace:1,warn:4},t={debug:{bg:`#616161`,border:`#424242`,color:`#fff`,icon:`☕`,symbol:`🅳`},error:{bg:`#d32f2f`,border:`#c62828`,color:`#fff`,icon:`✘`,symbol:`🅴`},group:{bg:`#546e7a`,border:`#455a64`,color:`#fff`,icon:`⚭`,symbol:`🅶`},info:{bg:`#1976d2`,border:`#1565c0`,color:`#fff`,icon:`ℹ`,symbol:`🅸`},ns:typeof window<`u`&&window.matchMedia?.(`(prefers-color-scheme: dark)`).matches?{bg:`#fafafa`,border:`#c7c7c7`,color:`#000`}:{bg:`#424242`,border:`#212121`,color:`#fff`},success:{bg:`#689f38`,border:`#558b2f`,color:`#fff`,icon:`✔`,symbol:`🆂`},trace:{bg:`#d81b60`,border:`#c2185b`,color:`#fff`,icon:`⛢`,symbol:`🆃`},warn:{bg:`#ffb300`,border:`#ffa000`,color:`#fff`,icon:`⚠`,symbol:`🆆`}},n=`border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;`,r=typeof window>`u`,i=r?process.env.NODE_ENV===`production`:!1,a=i?`🅿`:`🅳`,o={debug:`log`,error:`error`,info:`info`,success:`log`,trace:`trace`,warn:`warn`};function s(c={}){let l=typeof c==`string`?{namespace:c}:c,u={environment:!0,logLevel:`debug`,namespace:``,timestamp:!0,variant:`symbol`,...l,remote:{logLevel:`debug`,...l.remote}},d=t=>e[u.logLevel]<=e[t],f=()=>new Date().toISOString().slice(11,23),p=e=>{let n=t[e];return u.variant===`text`||!n[u.variant]?e.toUpperCase():n[u.variant]},m=(e,n=``)=>{let{bg:r,border:i,color:a}=t[e],o=`border: 1px solid ${i}; border-radius: 4px`;switch(u.variant){case`icon`:return`color: ${r}; ${o}; padding: 0 3px${n}`;case`symbol`:return`color: ${r}; ${o}; padding: 0 1px${n}`;default:return`background: ${r}; color: ${a}; ${o}; font-weight: bold; padding: 0 3px${n}`}},h=(e,t,n,r)=>{let i=[p(e)];u.environment&&i.push(a),t&&i.push(`[${t}]`),n&&i.push(n);let s=console[o[e]];s(`${i.join(` | `)} |`,...r)},g=(e,t,r,i)=>{let s=`%c${p(e)}%c`,c=[m(e),``];t&&(s+=` %c${t}%c`,c.push(m(`ns`,`; ${n}`),``)),u.environment&&(s+=` %c${a}%c`,c.push(`color: darkgray`,``)),r&&(s+=` %c${r}%c`,c.push(`color: gray`,``));let l=console[o[e]];l(s,...c,...i)},_=(t,n)=>{if(!d(t))return;let a=u.namespace,o=u.timestamp?f():``;r?h(t,a,o,n):g(t,a,o,n);let{handler:s,logLevel:c}=u.remote;if(s&&e[c]<=e[t]){let e={args:n,env:i?`production`:`development`,namespace:a||void 0,timestamp:u.timestamp?new Date().toISOString():void 0};Promise.resolve().then(()=>s(t,e)).catch(()=>{})}},v=e=>u.namespace?`[${u.namespace}] ${e}`:e,y=(e={})=>{let{remote:t,...n}=e;return s({...u,...n,remote:{...u.remote,...t}})},b=(e,t,n,r)=>{let i=e?console.groupCollapsed:console.group,o=[p(`group`)];u.environment&&o.push(a),o.push(t),n&&o.push(`[${n}]`),r&&o.push(r),i(o.join(` | `))},x=(e,t,r,i)=>{let o=e?console.groupCollapsed:console.group,s=`%c${t}%c`,c=[m(`group`,`; margin-right: 6px; padding: 1px 3px 0`),``];r&&(s+=` %c${r}%c`,c.push(m(`ns`,`; ${n}; margin-right: 6px`),``)),u.environment&&(s+=` %c${a}%c`,c.push(`color: darkgray; margin-right: 6px`,``)),i&&(s+=` %c${i}%c`,c.push(`color: gray; font-weight: lighter; margin-right: 6px`,``)),o(s,...c)},S=(e,t)=>{let n=u.namespace,i=u.timestamp?f():``;r?b(e,t,n,i):x(e,t,n,i)},C={assert:(e,...t)=>{d(`error`)&&console.assert(e,...t)},child:y,get config(){return{...u,remote:{...u.remote}}},debug:(...e)=>_(`debug`,e),enabled:e=>d(e),error:(...e)=>_(`error`,e),group:(e,t,n=!1)=>{if(!d(`debug`))return t();S(n,e);try{let e=t();return e instanceof Promise?e.finally(()=>console.groupEnd()):(console.groupEnd(),e)}catch(e){throw console.groupEnd(),e}},info:(...e)=>_(`info`,e),scope:e=>y({namespace:u.namespace?`${u.namespace}.${e}`:e}),setConfig:e=>{let{remote:t,...n}=e;return t!==void 0&&Object.assign(u.remote,t),Object.assign(u,n),C},success:(...e)=>_(`success`,e),table:(e,t)=>{d(`debug`)&&console.table(e,t)},time:(e,t)=>{if(!d(`debug`))return t();let n=v(e);console.time(n);try{let e=t();return e instanceof Promise?e.finally(()=>console.timeEnd(n)):(console.timeEnd(n),e)}catch(e){throw console.timeEnd(n),e}},trace:(...e)=>_(`trace`,e),warn:(...e)=>_(`warn`,e)};return C}var c=s();exports.Logit=c,exports.createLogger=s;
2
+ //# sourceMappingURL=logit.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"logit.cjs","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":["ENV_PROD","ENV_DEV","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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"}
1
+ {"version":3,"file":"logit.cjs","names":[],"sources":["../src/logit.ts"],"sourcesContent":["/* -------------------- Types -------------------- */\n\nexport type LogType = 'debug' | 'trace' | 'info' | 'success' | 'warn' | 'error';\nexport type LogLevel = LogType | 'off';\nexport type Variant = 'text' | 'symbol' | 'icon';\n\nexport type RemoteHandler = (type: LogType, data: RemoteLogData) => void;\n\nexport type RemoteOptions = { handler?: RemoteHandler; logLevel?: LogLevel };\n\nexport type RemoteLogData = {\n args: unknown[];\n env: 'production' | 'development';\n namespace?: string;\n timestamp?: string;\n};\n\nexport type LogitOptions = {\n environment?: boolean;\n logLevel?: LogLevel;\n namespace?: string;\n remote?: RemoteOptions;\n timestamp?: boolean;\n variant?: Variant;\n};\n\n/** The shape of a fully resolved logger config (all fields present). */\ntype ResolvedRemote = { handler?: RemoteHandler; logLevel: LogLevel };\nexport type LogitConfig = Omit<Required<LogitOptions>, 'remote'> & { remote: ResolvedRemote };\n\nexport type Logger = {\n assert: (condition: boolean, ...args: unknown[]) => void;\n child: (overrides?: LogitOptions) => Logger;\n readonly config: Readonly<LogitConfig>;\n debug: (...args: unknown[]) => void;\n enabled: (type: LogLevel) => boolean;\n error: (...args: unknown[]) => void;\n group: <T>(label: string, fn: () => T, collapsed?: boolean) => T;\n info: (...args: unknown[]) => void;\n scope: (name: string) => Logger;\n setConfig: (opts: LogitOptions) => Logger;\n success: (...args: unknown[]) => void;\n table: (data: unknown, properties?: string[]) => void;\n time: <T>(label: string, fn: () => T) => T;\n trace: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n};\n\n/* -------------------- Priority -------------------- */\n\nconst PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n error: 5,\n info: 2,\n off: 6,\n success: 3,\n trace: 1,\n warn: 4,\n};\n\n/* -------------------- Theme -------------------- */\n\ntype Theme = { bg: string; border: string; color: string; icon?: string; symbol?: string };\n\nconst isDarkMode = typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches;\n\nconst THEME: Record<LogType | 'group' | 'ns', 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 trace: { bg: '#d81b60', border: '#c2185b', color: '#fff', icon: '⛢', symbol: '🆃' },\n warn: { bg: '#ffb300', border: '#ffa000', color: '#fff', icon: '⚠', symbol: '🆆' },\n};\n\nconst NS_STYLE = 'border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;';\n\n/* -------------------- createLogger -------------------- */\n\nconst IS_NODE = typeof window === 'undefined';\nconst IS_PROD = IS_NODE\n ? // @ts-expect-error - process is Node-only\n (process as any).env?.NODE_ENV === 'production'\n : (import.meta as any)?.env?.NODE_ENV === 'production';\n\nconst ENV_BADGE = IS_PROD ? '🅿' : '🅳';\n\nconst LOG_METHOD: Record<LogType, 'log' | 'info' | 'warn' | 'error' | 'trace'> = {\n debug: 'log',\n error: 'error',\n info: 'info',\n success: 'log',\n trace: 'trace',\n warn: 'warn',\n};\n\n/**\n * Creates an independent logger instance with its own isolated configuration.\n *\n * @example\n * ```ts\n * const log = createLogger({ logLevel: 'info', namespace: 'App' });\n * log.info('Hello');\n *\n * const apiLog = log.scope('api');\n * apiLog.warn('slow request');\n * ```\n */\nexport function createLogger(initial: LogitOptions | string = {}): Logger {\n const opts: LogitOptions = typeof initial === 'string' ? { namespace: initial } : initial;\n const cfg: LogitConfig = {\n environment: true,\n logLevel: 'debug',\n namespace: '',\n timestamp: true,\n variant: 'symbol',\n ...opts,\n remote: { logLevel: 'debug', ...opts.remote }, // 'debug' default means a handler just works; set 'off' explicitly to disable\n };\n\n /* ---- helpers ---- */\n\n const passes = (type: LogLevel): boolean => PRIORITY[cfg.logLevel] <= PRIORITY[type];\n\n const ts = (): string => new Date().toISOString().slice(11, 23);\n\n const badge = (type: LogType | 'group'): string => {\n const theme = THEME[type];\n\n if (cfg.variant === 'text' || !theme[cfg.variant]) return type.toUpperCase();\n\n return theme[cfg.variant]!;\n };\n\n const style = (type: LogType | 'group' | 'ns', extra = ''): string => {\n const { bg, border, color } = THEME[type];\n const base = `border: 1px solid ${border}; border-radius: 4px`;\n\n switch (cfg.variant) {\n case 'icon':\n return `color: ${bg}; ${base}; padding: 0 3px${extra}`;\n case 'symbol':\n return `color: ${bg}; ${base}; padding: 0 1px${extra}`;\n default:\n return `background: ${bg}; color: ${color}; ${base}; font-weight: bold; padding: 0 3px${extra}`;\n }\n };\n\n const emitNode = (type: LogType, ns: string, stamp: string, args: unknown[]): void => {\n const meta = [badge(type)];\n\n if (cfg.environment) meta.push(ENV_BADGE);\n\n if (ns) meta.push(`[${ns}]`);\n\n if (stamp) meta.push(stamp);\n\n const method = console[LOG_METHOD[type]] as (...a: unknown[]) => void;\n\n method(`${meta.join(' | ')} |`, ...args);\n };\n\n const emitBrowser = (type: LogType, ns: string, stamp: string, args: unknown[]): void => {\n let fmt = `%c${badge(type)}%c`;\n const parts: string[] = [style(type), ''];\n\n if (ns) {\n fmt += ` %c${ns}%c`;\n parts.push(style('ns', `; ${NS_STYLE}`), '');\n }\n\n if (cfg.environment) {\n fmt += ` %c${ENV_BADGE}%c`;\n parts.push('color: darkgray', '');\n }\n\n if (stamp) {\n fmt += ` %c${stamp}%c`;\n parts.push('color: gray', '');\n }\n\n const method = console[LOG_METHOD[type]] as (...a: unknown[]) => void;\n\n method(fmt, ...parts, ...args);\n };\n\n const emit = (type: LogType, args: unknown[]): void => {\n if (!passes(type)) return;\n\n const ns = cfg.namespace;\n const stamp = cfg.timestamp ? ts() : '';\n\n if (IS_NODE) emitNode(type, ns, stamp, args);\n else emitBrowser(type, ns, stamp, args);\n\n /* remote dispatch — snapshot data now, dispatch in microtask to avoid blocking caller */\n const { handler, logLevel } = cfg.remote;\n\n if (handler && PRIORITY[logLevel] <= PRIORITY[type]) {\n const data: RemoteLogData = {\n args,\n env: IS_PROD ? 'production' : 'development',\n namespace: ns || undefined,\n timestamp: cfg.timestamp ? new Date().toISOString() : undefined,\n };\n\n Promise.resolve()\n .then(() => handler(type, data))\n .catch(() => {});\n }\n };\n\n const timeLabel = (label: string): string => (cfg.namespace ? `[${cfg.namespace}] ${label}` : label);\n\n /* ---- child factory ---- */\n const makeChild = (overrides: LogitOptions = {}): Logger => {\n const { remote: overrideRemote, ...overrideRest } = overrides;\n\n return createLogger({ ...cfg, ...overrideRest, remote: { ...cfg.remote, ...overrideRemote } });\n };\n\n /* ---- group renderer ---- */\n\n const renderGroupNode = (collapsed: boolean, label: string, ns: string, stamp: string): void => {\n const fn = collapsed ? console.groupCollapsed : console.group;\n const meta = [badge('group')];\n\n if (cfg.environment) meta.push(ENV_BADGE);\n\n meta.push(label);\n\n if (ns) meta.push(`[${ns}]`);\n\n if (stamp) meta.push(stamp);\n\n fn(meta.join(' | '));\n };\n\n const renderGroupBrowser = (collapsed: boolean, label: string, ns: string, stamp: string): void => {\n const fn = collapsed ? console.groupCollapsed : console.group;\n let fmt = `%c${label}%c`;\n const parts: string[] = [style('group', '; margin-right: 6px; padding: 1px 3px 0'), ''];\n\n if (ns) {\n fmt += ` %c${ns}%c`;\n parts.push(style('ns', `; ${NS_STYLE}; margin-right: 6px`), '');\n }\n\n if (cfg.environment) {\n fmt += ` %c${ENV_BADGE}%c`;\n parts.push('color: darkgray; margin-right: 6px', '');\n }\n\n if (stamp) {\n fmt += ` %c${stamp}%c`;\n parts.push('color: gray; font-weight: lighter; margin-right: 6px', '');\n }\n\n fn(fmt, ...parts);\n };\n\n const renderGroup = (collapsed: boolean, label: string): void => {\n const ns = cfg.namespace;\n const stamp = cfg.timestamp ? ts() : '';\n\n if (IS_NODE) renderGroupNode(collapsed, label, ns, stamp);\n else renderGroupBrowser(collapsed, label, ns, stamp);\n };\n\n /* ---- public API ---- */\n\n const logger: Logger = {\n assert: (condition: boolean, ...args: unknown[]): void => {\n if (passes('error')) console.assert(condition, ...args);\n },\n\n child: makeChild,\n\n get config(): Readonly<LogitConfig> {\n return { ...cfg, remote: { ...cfg.remote } };\n },\n\n debug: (...a) => emit('debug', a),\n\n enabled: (type: LogLevel): boolean => passes(type),\n error: (...a) => emit('error', a),\n\n group: <T>(label: string, fn: () => T, collapsed = false): T => {\n if (!passes('debug')) return fn();\n\n renderGroup(collapsed, label);\n\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result.finally(() => console.groupEnd()) as T;\n }\n\n console.groupEnd();\n\n return result;\n } catch (e) {\n console.groupEnd();\n throw e;\n }\n },\n\n info: (...a) => emit('info', a),\n\n scope: (name: string): Logger => makeChild({ namespace: cfg.namespace ? `${cfg.namespace}.${name}` : name }),\n\n setConfig: (opts: LogitOptions): Logger => {\n const { remote, ...rest } = opts;\n\n if (remote !== undefined) Object.assign(cfg.remote, remote);\n\n Object.assign(cfg, rest);\n\n return logger;\n },\n success: (...a) => emit('success', a),\n\n table: (data: unknown, properties?: string[]): void => {\n if (passes('debug')) console.table(data, properties);\n },\n\n time: <T>(label: string, fn: () => T): T => {\n if (!passes('debug')) return fn();\n\n const tl = timeLabel(label);\n\n console.time(tl);\n\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result.finally(() => console.timeEnd(tl)) as T;\n }\n\n console.timeEnd(tl);\n\n return result;\n } catch (e) {\n console.timeEnd(tl);\n throw e;\n }\n },\n\n trace: (...a) => emit('trace', a),\n warn: (...a) => emit('warn', a),\n };\n\n return logger;\n}\n\n/* -------------------- Default instance -------------------- */\n\n/**\n * Shared default logger instance. For isolated configurations use `createLogger()`.\n *\n * @example\n * ```ts\n * import { Logit } from '@vielzeug/logit';\n * Logit.info('Hello');\n * ```\n */\nexport const Logit = createLogger();\n"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export type LogType = 'debug' | 'trace' | 'info' | 'success' | 'warn' | 'error';
2
+ export type LogLevel = LogType | 'off';
3
+ export type Variant = 'text' | 'symbol' | 'icon';
4
+ export type RemoteHandler = (type: LogType, data: RemoteLogData) => void;
5
+ export type RemoteOptions = {
6
+ handler?: RemoteHandler;
7
+ logLevel?: LogLevel;
8
+ };
9
+ export type RemoteLogData = {
10
+ args: unknown[];
11
+ env: 'production' | 'development';
12
+ namespace?: string;
13
+ timestamp?: string;
14
+ };
15
+ export type LogitOptions = {
16
+ environment?: boolean;
17
+ logLevel?: LogLevel;
18
+ namespace?: string;
19
+ remote?: RemoteOptions;
20
+ timestamp?: boolean;
21
+ variant?: Variant;
22
+ };
23
+ /** The shape of a fully resolved logger config (all fields present). */
24
+ type ResolvedRemote = {
25
+ handler?: RemoteHandler;
26
+ logLevel: LogLevel;
27
+ };
28
+ export type LogitConfig = Omit<Required<LogitOptions>, 'remote'> & {
29
+ remote: ResolvedRemote;
30
+ };
31
+ export type Logger = {
32
+ assert: (condition: boolean, ...args: unknown[]) => void;
33
+ child: (overrides?: LogitOptions) => Logger;
34
+ readonly config: Readonly<LogitConfig>;
35
+ debug: (...args: unknown[]) => void;
36
+ enabled: (type: LogLevel) => boolean;
37
+ error: (...args: unknown[]) => void;
38
+ group: <T>(label: string, fn: () => T, collapsed?: boolean) => T;
39
+ info: (...args: unknown[]) => void;
40
+ scope: (name: string) => Logger;
41
+ setConfig: (opts: LogitOptions) => Logger;
42
+ success: (...args: unknown[]) => void;
43
+ table: (data: unknown, properties?: string[]) => void;
44
+ time: <T>(label: string, fn: () => T) => T;
45
+ trace: (...args: unknown[]) => void;
46
+ warn: (...args: unknown[]) => void;
47
+ };
48
+ /**
49
+ * Creates an independent logger instance with its own isolated configuration.
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const log = createLogger({ logLevel: 'info', namespace: 'App' });
54
+ * log.info('Hello');
55
+ *
56
+ * const apiLog = log.scope('api');
57
+ * apiLog.warn('slow request');
58
+ * ```
59
+ */
60
+ export declare function createLogger(initial?: LogitOptions | string): Logger;
61
+ /**
62
+ * Shared default logger instance. For isolated configurations use `createLogger()`.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * import { Logit } from '@vielzeug/logit';
67
+ * Logit.info('Hello');
68
+ * ```
69
+ */
70
+ export declare const Logit: Logger;
71
+ export {};
72
+ //# sourceMappingURL=logit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logit.d.ts","sourceRoot":"","sources":["../src/logit.ts"],"names":[],"mappings":"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"}