@vielzeug/logit 1.0.3 → 1.0.5
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/logit.cjs.map +1 -1
- package/dist/logit.js.map +1 -1
- package/package.json +1 -1
package/dist/logit.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logit.cjs","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\n"],"names":["ENV_PROD","ENV_DEV","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.cjs","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":["ENV_PROD","ENV_DEV","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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"}
|
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\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/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":";AAYA,MAAMA,IAAoD;AAAA,EACxD,OAAO;AAAA,EACP,SAAS;AACX,GAMMC,IAAe,MAEf,OAAO,SAAW,OAAgBC,GAA0B,WACtD,KAKN,OAAO,UAAY,OAAgB,QAAgB,KAAK,WAElD,QAAgB,IAAI,aAAa,eAGpC,IAIHC,IAAUF,EAAA,GAwBVG,IAAS,OAAO,SAAW,OAAe,OAAO,aAAa,8BAA8B,EAAE,SAE9FC,IAAmD;AAAA,EACvD,OAAO,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,KAAU,QAAQ,KAAA;AAAA,EAClF,OAAO,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,KAAU,QAAQ,KAAA;AAAA,EAClF,OAAO,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,KAAU,QAAQ,KAAA;AAAA,EAClF,MAAM,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,KAAU,QAAQ,KAAA;AAAA,EACjF,IAAID,IACA,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,OAAA,IAC3C,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,OAAA;AAAA,EAC/C,SAAS,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,KAAU,QAAQ,KAAA;AAAA,EACpF,MAAM,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,KAAU,QAAQ,KAAA;AAAA,EACjF,OAAO,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,KAAU,QAAQ,KAAA;AAAA,EAClF,MAAM,EAAE,IAAI,WAAW,QAAQ,WAAW,OAAO,QAAQ,MAAM,KAAU,QAAQ,KAAA;AACnF,GAGME,IAAiD;AAAA,EACrD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AACP,GAEMC,IAAgC;AAAA,EACpC,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ,EAAE,SAAS,QAAW,UAAU,MAAA;AAAA,EACxC,WAAW;AAAA,EACX,SAAS;AACX,GAKMC,IAAY,CAACC,MAA6BH,EAASC,EAAM,QAAQ,KAAKD,EAASG,CAAI,GAKnFC,IAAsB,OAAc,oBAAI,KAAA,GAAO,YAAA,EAAc,MAAM,IAAI,EAAE,GAKzEC,IAAkB,MAAeR,IAAU,OAAW,MAKtDS,IAAgB,CAACH,GAAiBI,MAAsB;AAC5D,EAAIN,EAAM,OAAO,WAAWD,EAASC,EAAM,OAAO,QAAQ,KAAKD,EAASG,CAAI,KAC1EF,EAAM,OAAO,QAAQE,GAAM,GAAGI,CAAI;AAEtC,GAKMC,IAAmB,CAACL,MAChBT,EAAmBS,CAAI,KAAKA,GAMhCM,IAAoB,qBACpBC,IAAqB,sBACrBC,IAAkB,+EAKlBC,IAAQ,CAACT,GAAmBU,IAAQ,OAAe;AACvD,QAAM,EAAE,IAAAC,GAAI,OAAAC,GAAO,QAAAC,EAAA,IAAWjB,EAAMI,CAAI,GAClCc,IAAY,UAAUH,CAAE,KAAKL,CAAiB,IAAIO,CAAM,KAAKN,CAAkB;AAErF,UAAQT,EAAM,SAAA;AAAA,IACZ,KAAK;AACH,aAAO,GAAGgB,CAAS,uBAAuBJ,CAAK;AAAA,IACjD,KAAK;AACH,aAAO,GAAGI,CAAS,mBAAmBJ,CAAK;AAAA,IAC7C;AACE,aAAO,eAAeC,CAAE,YAAYC,CAAK,KAAKN,CAAiB,IAAIO,CAAM,KAAKN,CAAkB,sCAAsCG,CAAK;AAAA,EAAA;AAEjJ,GAKMK,IAAkB,CAACf,MAA4B;AACnD,QAAMgB,IAAQpB,EAAMI,CAAmB,GACjC,EAAE,SAAAiB,MAAYnB;AAGpB,SAAImB,MAAY,UAAU,CAACD,EAAMC,CAAO,IAC/BjB,EAAK,YAAA,IAGPgB,EAAMC,CAAO;AACtB;AAKA,SAASC,EAAqBlB,GAAsD;AAClF,QAAM,EAAE,WAAAmB,GAAW,WAAAC,GAAW,aAAAC,EAAA,IAAgBvB;AAE9C,MAAIwB,IAAS,KAAKP,EAAgBf,CAAI,CAAC;AACvC,QAAMuB,IAAkB,CAACd,EAAMT,CAAmB,GAAG,EAAE;AAEvD,SAAImB,MACFG,KAAU,MAAMH,CAAS,MACzBI,EAAM,KAAKd,EAAM,MAAM,KAAKD,CAAe,EAAE,GAAG,EAAE,IAGhDa,MACFC,KAAU,MAAMpB,GAAiB,MACjCqB,EAAM,KAAK,mBAAmB,EAAE,IAG9BH,MACFE,KAAU,MAAMrB,GAAqB,MACrCsB,EAAM,KAAK,eAAe,EAAE,IAGvB,EAAE,QAAAD,GAAQ,OAAAC,EAAA;AACnB;AAKA,MAAMC,IAAM,CAACxB,MAAoBI,MAAsB;AAErD,MAAI,OAAO,SAAW,KAAa;AACjC,UAAMqB,IAAgB,QAAQpB,EAAiBL,CAAI,CAAC;AACpDyB,IAAAA,EAAc,GAAGV,EAAgBf,CAAI,CAAC,MAAME,GAAiB,MAAM,GAAGE,CAAI;AAC1E;AAAA,EACF;AAGA,MAAI,CAACL,EAAUC,CAAI,EAAG;AAGtB,QAAM,EAAE,QAAAsB,GAAQ,OAAAC,MAAUL,EAAqBlB,CAAI,GAC7CyB,IAAgB,QAAQpB,EAAiBL,CAAI,CAAC;AAEpD,EAAAyB,EAAcH,GAAQ,GAAGC,GAAO,GAAGnB,CAAI,GACvCD,EAAcH,GAAMI,CAAI;AAC1B,GAKMsB,IAAoB,CAACC,MAA8B;AACvD,QAAMC,IAAU,KAAK,MAAM,KAAK,IAAA,IAAQD,CAAS;AACjD,SAAOC,IAAU,GAAGA,CAAO,OAAO;AACpC,GAEaC,IAAQ;AAAA;AAAA;AAAA;AAAA,EAInB,QAAQ,CAACC,GAAgBC,GAAiBC,MACxC,QAAQ,OAAOF,GAAOC,GAASC,CAAO;AAAA,EAExC,OAAO,IAAI5B,MAAsBoB,EAAI,SAAS,GAAGpB,CAAI;AAAA,EACrD,OAAO,IAAIA,MAAsBoB,EAAI,SAAS,GAAGpB,CAAI;AAAA;AAAA;AAAA;AAAA,EAKrD,UAAU,MAAkBN,EAAM;AAAA;AAAA;AAAA;AAAA,EAKlC,WAAW,MAAcA,EAAM;AAAA;AAAA;AAAA;AAAA,EAK/B,cAAc,MAAeA,EAAM;AAAA;AAAA;AAAA;AAAA,EAKnC,gBAAgB,CAACmC,GAAcC,IAAQ,SAASC,IAAO,KAAK,UAAgB;AAC1E,QAAI,CAACpC,EAAU,SAAS,EAAG;AAE3B,UAAM6B,IAAUF,EAAkBS,CAAI,GAChCC,IAAMlC,EAAA,GACNkB,IAAYtB,EAAM,YAAYG,EAAA,IAAwB;AAE5D,YAAQ;AAAA,MACN,KAAKiC,CAAK,KAAKpC,EAAM,SAAS,KAAKsC,CAAG,KAAKhB,CAAS,KAAKQ,CAAO,KAAKK,CAAI;AAAA,MACzExB,EAAM,SAAS,yCAAyC;AAAA,MACxDA,EAAM,MAAM,KAAKD,CAAe,qBAAqB;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAY;AACpB,IAAIT,EAAU,SAAS,KAAG,QAAQ,SAAA;AAAA,EACpC;AAAA,EAEA,MAAM,IAAIK,MAAsBoB,EAAI,QAAQ,GAAGpB,CAAI;AAAA;AAAA;AAAA;AAAA,EAKnD,YAAY,CAACiC,MAAgC;AAC3C,WAAO,OAAOvC,GAAOuC,CAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,CAACC,MAA4B;AACxC,IAAAxC,EAAM,WAAWwC;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,CAACnB,MAA4B;AACtC,IAAArB,EAAM,YAAYqB;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,CAACoB,MAAqC;AAC/C,IAAAzC,EAAM,SAASyC;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,CAACD,MAA4B;AAC9C,IAAAxC,EAAM,OAAO,WAAWwC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,CAACrB,MAA8C;AACzD,IAAAnB,EAAM,UAAUmB;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,CAACuB,MAAyB;AACzC,IAAA1C,EAAM,cAAc0C;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,CAACA,MAAyB;AACvC,IAAA1C,EAAM,YAAY0C;AAAA,EACpB;AAAA,EAEA,SAAS,IAAIpC,MAAsBoB,EAAI,WAAW,GAAGpB,CAAI;AAAA;AAAA;AAAA;AAAA,EAKzD,OAAO,IAAIA,MAAsB;AAC/B,IAAIL,EAAU,OAAO,KAAG,QAAQ,MAAM,GAAGK,CAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,CAAC8B,MAAwB;AAC7B,IAAInC,EAAU,MAAM,KAAG,QAAQ,KAAKmC,CAAK;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,CAACA,MAAwB;AAChC,IAAInC,EAAU,MAAM,KAAG,QAAQ,QAAQmC,CAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,IAAI9B,MAAsBoB,EAAI,SAAS,GAAGpB,CAAI;AAAA,EACrD,MAAM,IAAIA,MAAsBoB,EAAI,QAAQ,GAAGpB,CAAI;AACrD;"}
|