plslog 1.0.0 → 1.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.mts +147 -2
- package/dist/index.d.ts +147 -2
- package/dist/index.js +509 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +509 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -15
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/validates.ts","../src/formatter.ts","../src/constants.ts","../src/styler.ts","../src/namespace-matcher.ts","../src/logger.ts"],"names":["prettyFormat"],"mappings":"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","file":"index.js","sourcesContent":["export function isBase64(link: string | null | undefined | ArrayBuffer): boolean {\n if (!link || typeof link !== 'string') return false;\n return link.startsWith('data:image/') && link.includes(';base64');\n}","import { isBase64 } from './utils/validates';\nimport {\n format as prettyFormat,\n Options as PrettyFormatOptions\n} from 'pretty-format';\n\n/**\n * Handles formatting of log messages, including base64 strings, objects, and arrays\n */\nexport default class Formatter {\n /**\n * Format base64 string for logging\n */\n static formatBase64String(str: string, previewLength: number = 20): string {\n const length = str.length;\n\n // Extract base64 part if it's a data URL\n let base64Part = str;\n let prefix = '';\n if (str.includes(',') && str.includes('base64')) {\n const parts = str.split(',');\n if (parts.length === 2 && parts[0].includes('base64')) {\n prefix = parts[0] + ',';\n base64Part = parts[1];\n }\n }\n\n const base64Length = base64Part.length;\n\n if (base64Length <= previewLength * 2) {\n return `[base64: ${prefix}${base64Part} (length: ${length})]`;\n }\n const start = base64Part.substring(0, previewLength);\n const end = base64Part.substring(base64Length - previewLength);\n return `[base64: ${prefix}${start}...${end} (length: ${length})]`;\n }\n\n /**\n * Helper to serialize Blob and File objects for logging\n */\n static serializeSpecialObjects(obj: any, maxDepth: number = 10, currentDepth: number = 0): any {\n if (currentDepth > maxDepth) return '[Max Depth Reached]';\n\n // Handle base64 strings\n if (typeof obj === 'string' && isBase64(obj)) {\n return this.formatBase64String(obj);\n }\n\n if (obj instanceof Blob) {\n return {\n size: obj.size,\n type: obj.type,\n };\n }\n\n if (obj instanceof File) {\n return {\n name: obj.name,\n size: obj.size,\n type: obj.type,\n lastModified: obj.lastModified,\n };\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.serializeSpecialObjects(item, maxDepth, currentDepth + 1));\n }\n\n if (obj !== null && typeof obj === 'object') {\n const serialized: Record<string, any> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n serialized[key] = this.serializeSpecialObjects(obj[key], maxDepth, currentDepth + 1);\n }\n }\n return serialized;\n }\n\n return obj;\n }\n\n /**\n * Custom format function with pretty-format for objects/arrays\n */\n static formatObj(args: unknown[], options?: Partial<PrettyFormatOptions>): string {\n if (args.length === 0) {\n return '';\n }\n\n const formattedArgs = args.map((arg: unknown) => {\n const isObject = typeof arg === 'object' && arg !== null && !Array.isArray(arg);\n const isArray = Array.isArray(arg);\n\n if (isObject || isArray) {\n // Serialize Blob/File objects before formatting\n const maxDepth = options?.maxDepth ?? 5;\n const serialized = this.serializeSpecialObjects(arg, maxDepth);\n\n // For objects and arrays, format them on a new line\n const formatted = prettyFormat(serialized, {\n ...options,\n indent: options?.indent ?? 2,\n maxDepth: maxDepth,\n // Remove Object and Array labels\n printFunctionName: false,\n printBasicPrototype: false\n });\n\n // Remove \"Object\" and \"Array\" labels from the output\n const cleaned = formatted\n .replace(/^Object\\s*/, '')\n .replace(/^Array\\s*/, '')\n .replace(/\\nObject\\s*/g, '\\n')\n .replace(/\\nArray\\s*/g, '\\n');\n\n // Add newline before the object/array\n return '\\n' + cleaned;\n }\n else {\n // For primitive values, check if it's a base64 string\n const stringValue = String(arg);\n if (isBase64(stringValue)) {\n return this.formatBase64String(stringValue);\n }\n return stringValue;\n }\n });\n\n return formattedArgs.join(' ');\n }\n}\n","import type { LogLevel } from './types';\n\nexport const LOG_COLORS: Record<LogLevel, string> = {\n debug: '#3E69B5',\n info: '#59c260',\n warn: '#d2b37e',\n error: '#b64938',\n none: '#fff',\n} as const;\n\nexport const DEFAULT_NAMESPACE = 'app';\n","import { LOG_COLORS } from './constants';\nimport type { LogLevel } from './types';\n\ninterface StylerOptions {\n namespace: string;\n level: LogLevel;\n location: string;\n formattedMessage: string;\n}\n\n/**\n * Get color for log level (browser only)\n */\nfunction getColorForLevel(level: string): string {\n const currentLevel = level as keyof typeof LOG_COLORS;\n return LOG_COLORS[currentLevel] || '#fff';\n}\n\nclass Styler {\n\n public static style(options: StylerOptions): { logMessage: string, logStyles: string[] } {\n const {\n namespace, level, location, formattedMessage,\n } = options;\n const levelColor = getColorForLevel(level);\n\n // Browser: Apply color only to the level\n // Use appropriate console method based on level for proper browser console filtering\n const logMessage = `%c[${namespace}] %c${level.toUpperCase()} %c${location}\\n%c${formattedMessage}`;\n const logStyles = [\n 'padding-bottom: 4px', // for namespace\n `color: ${levelColor}`, // for level\n 'color: #aaa; padding-bottom: 4px', // for location\n '', // empty style for formattedMessage,\n ];\n\n return {\n logMessage,\n logStyles,\n };\n }\n\n}\n\nexport default Styler;\n","\nclass NamespaceMatcher {\n private cachedPatterns: string[] | null = null;\n private cachedConfig: string | undefined = undefined;\n\n matches(namespace?: string, namespaces?: string): boolean {\n const ns = this.normalize(namespace);\n\n // Cache parsed patterns if config hasn't changed\n if (this.cachedConfig !== namespaces) {\n this.cachedPatterns = this.parsePatterns(namespaces);\n this.cachedConfig = namespaces;\n }\n\n const enabledNamespaces = this.cachedPatterns || [];\n\n // If no namespaces are configured, allow all namespaces to log\n if (!enabledNamespaces.length) return true;\n\n // Separate positive and negative patterns\n const positivePatterns: string[] = [];\n const negativePatterns: string[] = [];\n\n for (const pattern of enabledNamespaces) {\n if (pattern.startsWith('-')) {\n negativePatterns.push(pattern.slice(1));\n } else {\n positivePatterns.push(pattern);\n }\n }\n\n // Check if namespace matches any positive pattern\n const matches = positivePatterns.some((pattern) => {\n if (pattern === '*') return true;\n const normalizedPattern = this.normalize(pattern);\n if (pattern.includes('*')) {\n const regex = new RegExp('^' + normalizedPattern.replace(/\\*/g, '.*') + '$');\n // Also match base namespace if pattern is like 'base:*'\n if (regex.test(ns)) return true;\n // Check if base namespace matches (e.g., 'app' matches 'app:*')\n const basePattern = normalizedPattern.split(':')[0];\n if (ns === basePattern && normalizedPattern.startsWith(basePattern + ':')) {\n return true;\n }\n return false;\n }\n return ns === normalizedPattern;\n });\n\n if (!matches) return false;\n\n // Check if namespace is excluded by any negative pattern\n for (const negPattern of negativePatterns) {\n const neg = this.normalize(negPattern);\n if (neg.includes('*')) {\n // For wildcard negations, check if namespace matches the pattern\n const regex = new RegExp('^' + neg.replace(/\\*/g, '.*') + '$');\n if (regex.test(ns)) {\n return false;\n }\n // Also check prefix match (e.g., 'app:db' and 'app:db:query' match '-app:db:*')\n const negPrefix = this.normalize(neg.replace(/\\*.*$/, ''));\n if (negPrefix) {\n // Match if namespace equals the prefix or starts with prefix followed by ':'\n if (ns === negPrefix || ns.startsWith(negPrefix + ':')) {\n return false;\n }\n }\n }\n else {\n // For exact/prefix negations, check if namespace starts with the pattern\n if (ns.startsWith(neg)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private normalize(value?: string | null): string {\n if (!value) return '';\n return value.replace(/:+$/, '');\n }\n\n private parsePatterns(namespaces?: string): string[] {\n if (!namespaces) return [];\n return namespaces.split(',').map((s: string) => this.normalize(s.trim()));\n }\n}\n\nconst namespaceMatcher = new NamespaceMatcher();\n\nexport default namespaceMatcher;\n","import Formatter from './formatter';\nimport Styler from './styler';\nimport type { GlobalConfig, LogLevel, LoggerOptions } from './types';\nimport namespaceMatcher from './namespace-matcher';\nimport { DEFAULT_NAMESPACE } from './constants';\n\nlet globalConfig: GlobalConfig = {};\n\nfunction configure(options: GlobalConfig): void {\n globalConfig = { ...globalConfig, ...options };\n}\n\nclass Logger {\n private _namespace: string;\n private _level: LogLevel = 'debug';\n private _maxDepth: number;\n\n constructor(options: LoggerOptions = {}) {\n this._namespace = options.namespace ?? DEFAULT_NAMESPACE;\n this._level = options.level ?? globalConfig.level ?? 'debug';\n this._maxDepth = options.maxDepth ?? globalConfig.maxDepth ?? 10;\n }\n\n debug(message: string, ...args: unknown[]): this {\n this.log('debug', message, ...args);\n return this;\n }\n\n info(message: string, ...args: unknown[]): this {\n this.log('info', message, ...args);\n return this;\n }\n\n warn(message: string, ...args: unknown[]): this {\n this.log('warn', message, ...args);\n return this;\n }\n\n error(message: string, ...args: unknown[]): this {\n this.log('error', message, ...args);\n return this;\n }\n\n setLevel(level: LogLevel): void {\n this._level = level;\n }\n\n maxDepth(maxDepth: number): this {\n this._maxDepth = maxDepth;\n return this;\n }\n\n private getLevelPriority(level: LogLevel): number {\n const priorities: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n };\n return priorities[level];\n }\n\n private log(level: LogLevel, message: string, ...args: unknown[]): void {\n // show/hide\n if (!namespaceMatcher.matches(this._namespace, globalConfig.namespaces)) {\n return;\n }\n // Check activeLevels first (if configured), otherwise fall back to level priority\n if (globalConfig.activeLevels !== undefined) {\n if (!globalConfig.activeLevels.includes(level)) {\n return;\n }\n }\n else if (this.getLevelPriority(this._level) > this.getLevelPriority(level)) {\n return;\n }\n\n // format data\n const formattedObject = Formatter.formatObj(args, {\n maxDepth: this._maxDepth,\n });\n const formattedMessage = formattedObject ? `${message} ${formattedObject}` : message;\n\n // style data\n const { logMessage, logStyles } = Styler.style({\n namespace: this._namespace,\n level,\n location: '',\n formattedMessage,\n });\n\n switch (level) {\n case 'error':\n console.error(logMessage, ...logStyles);\n break;\n case 'warn':\n console.warn(logMessage, ...logStyles);\n break;\n case 'info':\n console.info(logMessage, ...logStyles);\n break;\n case 'debug':\n console.debug(logMessage, ...logStyles);\n break;\n default:\n console.log(logMessage, ...logStyles);\n }\n }\n}\n\ntype Plslog = {\n (options?: LoggerOptions): Logger;\n configure(options: GlobalConfig): void;\n};\n\nconst plslog = ((options: LoggerOptions = {}) => {\n return new Logger(options);\n}) as Plslog;\n\nplslog.configure = configure;\n\nexport default plslog;"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/validates.ts","../src/formatter.ts","../src/constants.ts","../src/styler.ts","../src/namespace-matcher.ts","../src/dedup-hasher.ts","../src/logger.ts"],"names":["prettyFormat"],"mappings":"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","file":"index.js","sourcesContent":["export function isBase64(link: string | null | undefined | ArrayBuffer): boolean {\n if (!link || typeof link !== 'string') return false;\n return link.startsWith('data:image/') && link.includes(';base64');\n}","import { isBase64 } from './utils/validates';\nimport {\n format as prettyFormat,\n Options as PrettyFormatOptions\n} from 'pretty-format';\nimport type { FilterFieldConfig, FilterMode, FormatterOptions, ErrorSerializationConfig } from './types';\n\n/**\n * Type representing a serialized error object\n */\ntype SerializedError = {\n name: string;\n message: string;\n code?: number;\n stack?: string;\n cause?: SerializedError | unknown;\n errors?: Array<SerializedError | unknown>;\n [key: string]: unknown;\n};\n\n/**\n * Handles formatting of log messages, including base64 strings, objects, and arrays\n */\nexport default class Formatter {\n /**\n * Check if a field should be filtered based on configured rules\n */\n static shouldFilterField(\n key: string,\n value: any,\n path: string[],\n filterFields?: FilterFieldConfig[]\n ): boolean {\n if (!filterFields || filterFields.length === 0) {\n return false;\n }\n\n for (const filter of filterFields) {\n // String exact match\n if (typeof filter === 'string' && key === filter) {\n return true;\n }\n\n // RegExp match\n if (filter instanceof RegExp && filter.test(key)) {\n return true;\n }\n\n // Function predicate - returns true if should filter (predicate returns false)\n if (typeof filter === 'function') {\n const shouldShow = filter(key, value, path);\n if (shouldShow === false) {\n return true; // Filter this field\n }\n }\n }\n\n return false;\n }\n\n /**\n * Check if a field should be included based on pick/omit rules\n */\n static shouldIncludeField(\n key: string,\n value: any,\n path: string[],\n options?: {\n pick?: string[];\n omit?: FilterFieldConfig[];\n }\n ): { include: boolean; filtered: boolean } {\n // If pick is specified, only include fields in the pick list\n if (options?.pick && options.pick.length > 0) {\n // Build full path, filtering out array indices for comparison\n const pathWithoutIndices = path.filter(p => !p.startsWith('['));\n const fullPath = [...pathWithoutIndices, key].join('.');\n\n // Check if current path or any parent path matches pick patterns\n const isInPickList = options.pick.some(pickPath => {\n // Support wildcards: 'user.*' matches 'user.name', 'user.email'\n if (pickPath.endsWith('.*')) {\n const prefix = pickPath.slice(0, -2);\n // Match if fullPath starts with prefix\n return fullPath.startsWith(prefix + '.') || fullPath === prefix;\n }\n\n // For simple field names (no dots), match against the key directly\n // This handles array elements: pick(['name']) should work on [{name: 'John'}]\n if (!pickPath.includes('.') && key === pickPath) {\n return true;\n }\n\n // Exact match or parent match\n // 'user.name' should match when pickPath is 'user.name'\n // 'user' should be included when pickPath is 'user.name' (parent)\n if (fullPath === pickPath) {\n return true;\n }\n\n // Check if this is a parent of a picked path\n // e.g., path='user', pickPath='user.name' -> include 'user'\n if (pickPath.startsWith(fullPath + '.')) {\n return true;\n }\n\n // Check if this is a child of a picked path\n // e.g., path='user.profile.name', pickPath='user.profile' -> include 'name'\n if (fullPath.startsWith(pickPath + '.')) {\n return true;\n }\n\n return false;\n });\n\n if (!isInPickList) {\n return { include: false, filtered: false }; // Hide completely\n }\n }\n\n // Check omit rules\n if (options?.omit && options.omit.length > 0) {\n const shouldOmit = this.shouldFilterField(key, value, path, options.omit);\n if (shouldOmit) {\n return { include: true, filtered: true }; // Include but mark as filtered\n }\n }\n\n return { include: true, filtered: false };\n }\n\n /**\n * Get the replacement value for a filtered field\n */\n static getFilteredValue(\n value: any,\n mode: FilterMode = 'redact',\n replacement: string = '***REDACTED***'\n ): any {\n switch (mode) {\n case 'redact':\n return replacement;\n\n case 'type':\n if (value === null) return '[null]';\n if (value === undefined) return '[undefined]';\n if (Array.isArray(value)) return `[Array(${value.length})]`;\n return `[${typeof value}]`;\n\n case 'length':\n if (typeof value === 'string') return `[${value.length} chars]`;\n if (Array.isArray(value)) return `[${value.length} items]`;\n if (typeof value === 'object' && value !== null) {\n return `[${Object.keys(value).length} keys]`;\n }\n return `[${typeof value}]`;\n\n case 'hide':\n return undefined; // Will be removed by caller\n\n default:\n return replacement;\n }\n }\n\n /**\n * Sanitize sensitive data from stack traces\n */\n static sanitizeStackTrace(stack: string, customPatterns?: RegExp[]): string {\n const defaultPatterns = [\n /([?&])(token|key|secret|password|auth|api[_-]?key|access[_-]?token|client[_-]?secret)=[^&\\s)#]*/gi,\n /\\/\\/[^/]*:[^@]*@/g, // Basic auth in URLs (user:pass@domain)\n /(bearer\\s+)[a-zA-Z0-9\\-._~+/]+=*/gi, // Bearer tokens\n ];\n\n const allPatterns = [...defaultPatterns, ...(customPatterns || [])];\n let sanitized = stack;\n\n allPatterns.forEach(pattern => {\n sanitized = sanitized.replace(pattern, (match, p1) => {\n // If there's a capture group (like ?& for URL params), preserve it\n if (p1) {\n return `${p1}***REDACTED***`;\n }\n return '***REDACTED***';\n });\n });\n\n return sanitized;\n }\n\n /**\n * Serialize Error objects with all relevant properties (name, message, stack, cause)\n */\n static serializeError(\n error: Error,\n config?: ErrorSerializationConfig,\n currentDepth: number = 0\n ): SerializedError | string {\n const maxCauseDepth = config?.maxCauseDepth ?? 10;\n if (currentDepth > maxCauseDepth) {\n return '[Max Cause Depth Reached]';\n }\n\n const includeStack = config?.includeStack ?? true;\n const includeCause = config?.includeCause ?? true;\n const stackFrameLimit = config?.stackFrameLimit;\n const sanitizeStack = config?.sanitizeStack ?? false;\n\n const serialized: SerializedError = {\n name: error.name,\n message: error.message,\n };\n\n // Handle DOMException-specific properties\n if ('code' in error) {\n const errorWithCode = error as Error & { code?: number };\n if (typeof errorWithCode.code === 'number') {\n serialized.code = errorWithCode.code;\n }\n }\n\n // Include stack trace (can be large, consider truncating in production)\n if (includeStack && error.stack) {\n let stack = error.stack;\n\n // Sanitize sensitive data from stack trace\n if (sanitizeStack) {\n stack = this.sanitizeStackTrace(stack, config?.sanitizePatterns);\n }\n\n // Truncate stack if stackFrameLimit is specified\n if (stackFrameLimit !== undefined && stackFrameLimit > 0) {\n const lines = stack.split('\\n');\n if (lines.length > stackFrameLimit) {\n stack = lines.slice(0, stackFrameLimit).join('\\n') + '\\n... (truncated)';\n }\n }\n\n serialized.stack = stack;\n }\n\n // Handle Error.cause (ES2022 feature)\n if (includeCause && error.cause !== undefined) {\n if (error.cause instanceof Error) {\n const serializedCause = this.serializeError(error.cause, config, currentDepth + 1);\n serialized.cause = typeof serializedCause === 'string' ? serializedCause : serializedCause;\n } else {\n // Cause can be any value, not just Error\n serialized.cause = error.cause;\n }\n }\n\n // Include any custom properties added to the error\n for (const key in error) {\n if (Object.prototype.hasOwnProperty.call(error, key)) {\n if (!['name', 'message', 'stack', 'cause'].includes(key)) {\n const errorWithCustomProps = error as Error & Record<string, unknown>;\n serialized[key] = errorWithCustomProps[key];\n }\n }\n }\n\n // Handle AggregateError (contains multiple errors)\n if (error.name === 'AggregateError' && 'errors' in error) {\n const aggregateError = error as Error & { errors?: unknown[] };\n if (Array.isArray(aggregateError.errors)) {\n serialized.errors = aggregateError.errors.map((e: unknown): SerializedError | unknown => {\n if (e instanceof Error) {\n const serializedErr = this.serializeError(e, config, currentDepth + 1);\n return typeof serializedErr === 'string' ? { name: 'Error', message: serializedErr } : serializedErr;\n }\n return e;\n });\n }\n }\n\n return serialized;\n }\n\n /**\n * Format base64 string for logging\n */\n static formatBase64String(str: string, previewLength: number = 20): string {\n const length = str.length;\n\n // Extract base64 part if it's a data URL\n let base64Part = str;\n let prefix = '';\n if (str.includes(',') && str.includes('base64')) {\n const parts = str.split(',');\n if (parts.length === 2 && parts[0].includes('base64')) {\n prefix = parts[0] + ',';\n base64Part = parts[1];\n }\n }\n\n const base64Length = base64Part.length;\n\n if (base64Length <= previewLength * 2) {\n return `[base64: ${prefix}${base64Part} (length: ${length})]`;\n }\n const start = base64Part.substring(0, previewLength);\n const end = base64Part.substring(base64Length - previewLength);\n return `[base64: ${prefix}${start}...${end} (length: ${length})]`;\n }\n\n /**\n * Helper to serialize Blob and File objects for logging\n */\n static serializeSpecialObjects(\n obj: any,\n maxDepth: number = 10,\n currentDepth: number = 0,\n filterOptions?: {\n pick?: string[];\n omit?: FilterFieldConfig[];\n filterFields?: FilterFieldConfig[];\n filterMode?: FilterMode;\n filterReplacement?: string;\n globalFilterMode?: FilterMode;\n globalFilterReplacement?: string;\n errorConfig?: ErrorSerializationConfig;\n },\n currentPath: string[] = []\n ): any {\n if (currentDepth > maxDepth) return '[Max Depth Reached]';\n\n // Handle Error objects (before other checks since Error is an object)\n if (obj instanceof Error) {\n return this.serializeError(obj, filterOptions?.errorConfig, 0);\n }\n\n // Handle base64 strings\n if (typeof obj === 'string' && isBase64(obj)) {\n return this.formatBase64String(obj);\n }\n\n if (obj instanceof Blob) {\n return {\n size: obj.size,\n type: obj.type,\n };\n }\n\n if (obj instanceof File) {\n return {\n name: obj.name,\n size: obj.size,\n type: obj.type,\n lastModified: obj.lastModified,\n };\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item, index) =>\n this.serializeSpecialObjects(\n item,\n maxDepth,\n currentDepth + 1,\n filterOptions,\n [...currentPath, `[${index}]`]\n )\n );\n }\n\n if (obj !== null && typeof obj === 'object') {\n const serialized: Record<string, any> = {};\n\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key];\n const newPath = [...currentPath, key];\n\n // Check if field should be included (pick/omit logic from per-log options)\n const { include, filtered } = this.shouldIncludeField(\n key,\n value,\n currentPath,\n filterOptions\n );\n\n if (!include) {\n continue; // Skip this field entirely (pick logic)\n }\n\n // Check global filterFields (always applied)\n let isGloballyFiltered = false;\n if (filterOptions?.filterFields && filterOptions.filterFields.length > 0) {\n isGloballyFiltered = this.shouldFilterField(key, value, currentPath, filterOptions.filterFields);\n }\n\n if (isGloballyFiltered) {\n // Global filter - use global filter mode\n const filteredValue = this.getFilteredValue(\n value,\n filterOptions?.globalFilterMode,\n filterOptions?.globalFilterReplacement\n );\n\n if (filteredValue !== undefined) {\n serialized[key] = filteredValue;\n }\n } else if (filtered) {\n // Per-log filter - use per-log filter mode\n const filteredValue = this.getFilteredValue(\n value,\n filterOptions?.filterMode,\n filterOptions?.filterReplacement\n );\n\n if (filteredValue !== undefined) {\n serialized[key] = filteredValue;\n }\n } else {\n // Recursively serialize\n serialized[key] = this.serializeSpecialObjects(\n value,\n maxDepth,\n currentDepth + 1,\n filterOptions,\n newPath\n );\n }\n }\n }\n return serialized;\n }\n\n return obj;\n }\n\n /**\n * Custom format function with pretty-format for objects/arrays\n */\n static formatObj(args: unknown[], options?: FormatterOptions): string {\n if (args.length === 0) {\n return '';\n }\n\n const formattedArgs = args.map((arg: unknown) => {\n const isObject = typeof arg === 'object' && arg !== null && !Array.isArray(arg);\n const isArray = Array.isArray(arg);\n\n if (isObject || isArray) {\n // Serialize Blob/File objects before formatting\n const maxDepth = options?.maxDepth ?? 5;\n const serialized = this.serializeSpecialObjects(\n arg,\n maxDepth,\n 0,\n {\n pick: options?.pick,\n omit: options?.omit,\n filterFields: options?.filterFields,\n filterMode: options?.filterMode,\n filterReplacement: options?.filterReplacement,\n globalFilterMode: options?.globalFilterMode,\n globalFilterReplacement: options?.globalFilterReplacement,\n errorConfig: options?.errorConfig,\n }\n );\n\n // For objects and arrays, format them on a new line\n const formatted = prettyFormat(serialized, {\n indent: 2,\n maxDepth: maxDepth,\n // Remove Object and Array labels\n printFunctionName: false,\n printBasicPrototype: false\n });\n\n // Remove \"Object\" and \"Array\" labels from the output\n const cleaned = formatted\n .replace(/^Object\\s*/, '')\n .replace(/^Array\\s*/, '')\n .replace(/\\nObject\\s*/g, '\\n')\n .replace(/\\nArray\\s*/g, '\\n');\n\n // Add newline before the object/array\n return '\\n' + cleaned;\n }\n else {\n // For primitive values, check if it's a base64 string\n const stringValue = String(arg);\n if (isBase64(stringValue)) {\n return this.formatBase64String(stringValue);\n }\n return stringValue;\n }\n });\n\n return formattedArgs.join(' ');\n }\n}\n","import type { LogLevel, DedupConfig } from './types';\n\nexport const LOG_COLORS: Record<LogLevel, string> = {\n debug: '#3E69B5',\n info: '#59c260',\n warn: '#d2b37e',\n error: '#b64938',\n none: '#fff',\n} as const;\n\nexport const DEFAULT_NAMESPACE = 'app';\n\nexport const DEFAULT_DEDUP_CONFIG: DedupConfig = {\n enabled: false,\n flushInterval: 100,\n} as const;\n","import { LOG_COLORS } from './constants';\nimport type { LogLevel } from './types';\n\ninterface StylerOptions {\n namespace: string;\n level: LogLevel;\n location: string;\n formattedMessage: string;\n}\n\n/**\n * Get color for log level (browser only)\n */\nfunction getColorForLevel(level: string): string {\n const currentLevel = level as keyof typeof LOG_COLORS;\n return LOG_COLORS[currentLevel] || '#fff';\n}\n\nclass Styler {\n\n public static style(options: StylerOptions): { logMessage: string, logStyles: string[] } {\n const {\n namespace, level, location, formattedMessage,\n } = options;\n const levelColor = getColorForLevel(level);\n\n // Browser: Apply color only to the level\n // Use appropriate console method based on level for proper browser console filtering\n const logMessage = `%c[${namespace}] %c${level.toUpperCase()} %c${location}\\n%c${formattedMessage}`;\n const logStyles = [\n 'padding-bottom: 4px', // for namespace\n `color: ${levelColor}`, // for level\n 'color: #aaa; padding-bottom: 4px', // for location\n '', // empty style for formattedMessage,\n ];\n\n return {\n logMessage,\n logStyles,\n };\n }\n\n}\n\nexport default Styler;\n","\nclass NamespaceMatcher {\n private cachedPatterns: string[] | null = null;\n private cachedConfig: string | undefined = undefined;\n\n matches(namespace?: string, namespaces?: string): boolean {\n const ns = this.normalize(namespace);\n\n // Cache parsed patterns if config hasn't changed\n if (this.cachedConfig !== namespaces) {\n this.cachedPatterns = this.parsePatterns(namespaces);\n this.cachedConfig = namespaces;\n }\n\n const enabledNamespaces = this.cachedPatterns || [];\n\n // If no namespaces are configured, allow all namespaces to log\n if (!enabledNamespaces.length) return true;\n\n // Separate positive and negative patterns\n const positivePatterns: string[] = [];\n const negativePatterns: string[] = [];\n\n for (const pattern of enabledNamespaces) {\n if (pattern.startsWith('-')) {\n negativePatterns.push(pattern.slice(1));\n } else {\n positivePatterns.push(pattern);\n }\n }\n\n // Check if namespace matches any positive pattern\n const matches = positivePatterns.some((pattern) => {\n if (pattern === '*') return true;\n const normalizedPattern = this.normalize(pattern);\n if (pattern.includes('*')) {\n const regex = new RegExp('^' + normalizedPattern.replace(/\\*/g, '.*') + '$');\n // Also match base namespace if pattern is like 'base:*'\n if (regex.test(ns)) return true;\n // Check if base namespace matches (e.g., 'app' matches 'app:*')\n const basePattern = normalizedPattern.split(':')[0];\n if (ns === basePattern && normalizedPattern.startsWith(basePattern + ':')) {\n return true;\n }\n return false;\n }\n return ns === normalizedPattern;\n });\n\n if (!matches) return false;\n\n // Check if namespace is excluded by any negative pattern\n for (const negPattern of negativePatterns) {\n const neg = this.normalize(negPattern);\n if (neg.includes('*')) {\n // For wildcard negations, check if namespace matches the pattern\n const regex = new RegExp('^' + neg.replace(/\\*/g, '.*') + '$');\n if (regex.test(ns)) {\n return false;\n }\n // Also check prefix match (e.g., 'app:db' and 'app:db:query' match '-app:db:*')\n const negPrefix = this.normalize(neg.replace(/\\*.*$/, ''));\n if (negPrefix) {\n // Match if namespace equals the prefix or starts with prefix followed by ':'\n if (ns === negPrefix || ns.startsWith(negPrefix + ':')) {\n return false;\n }\n }\n }\n else {\n // For exact/prefix negations, check if namespace starts with the pattern\n if (ns.startsWith(neg)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n private normalize(value?: string | null): string {\n if (!value) return '';\n return value.replace(/:+$/, '');\n }\n\n private parsePatterns(namespaces?: string): string[] {\n if (!namespaces) return [];\n return namespaces.split(',').map((s: string) => this.normalize(s.trim()));\n }\n}\n\nconst namespaceMatcher = new NamespaceMatcher();\n\nexport default namespaceMatcher;\n","import type { LogLevel } from './types';\n\n/**\n * Generates a hash key for deduplication based on log level, message, and arguments\n */\nclass DedupHasher {\n /**\n * Default hash function - simple string concatenation\n * For better performance, we use a simple approach rather than crypto hashing\n */\n static generateKey(level: LogLevel, message: string, args: unknown[]): string {\n // Serialize args to string for comparison\n const argsString = this.serializeArgs(args);\n return `${level}:${message}:${argsString}`;\n }\n\n /**\n * Serialize arguments to a consistent string representation\n */\n private static serializeArgs(args: unknown[]): string {\n if (args.length === 0) return '';\n\n try {\n // Use JSON.stringify with replacer to handle special cases\n return JSON.stringify(args, (key, value) => {\n // Handle functions\n if (typeof value === 'function') {\n return '[Function]';\n }\n // Handle symbols\n if (typeof value === 'symbol') {\n return value.toString();\n }\n // Handle undefined\n if (value === undefined) {\n return '[undefined]';\n }\n return value;\n });\n }\n catch (error) {\n // Fallback for circular references or other serialization issues\n return String(args);\n }\n }\n}\n\nexport default DedupHasher;\n","import Formatter from './formatter';\nimport Styler from './styler';\nimport type { GlobalConfig, LogLevel, LoggerOptions, DedupConfig, DedupEntry, LogFilterOptions, FilterFieldConfig, FilterMode, Condition, ConditionContext } from './types';\nimport namespaceMatcher from './namespace-matcher';\nimport { DEFAULT_NAMESPACE, DEFAULT_DEDUP_CONFIG } from './constants';\nimport DedupHasher from './dedup-hasher';\n\nlet globalConfig: GlobalConfig = {};\n\nfunction configure(options: GlobalConfig): void {\n globalConfig = { ...globalConfig, ...options };\n}\n\nclass Logger {\n private _namespace: string;\n private _level: LogLevel = 'debug';\n private _maxDepth: number;\n private _dedupConfig: DedupConfig;\n private _dedupBuffer: Map<string, DedupEntry> = new Map();\n\n // Temporary filter options that reset after each log\n private _tempFilterOptions: LogFilterOptions = {};\n\n // Custom context for conditional logging\n private _context: Record<string, unknown> = {};\n\n // Temporary conditions that reset after each log\n private _tempConditions: Condition[] = [];\n\n constructor(options: LoggerOptions = {}) {\n this._namespace = options.namespace ?? DEFAULT_NAMESPACE;\n this._level = options.level ?? globalConfig.level ?? 'debug';\n this._maxDepth = options.maxDepth ?? globalConfig.maxDepth ?? 10;\n this._context = options.context ?? {};\n\n // Merge dedup config: instance options > global config > defaults\n this._dedupConfig = {\n ...DEFAULT_DEDUP_CONFIG,\n ...(globalConfig.dedup || {}),\n ...(options.dedup || {}),\n };\n }\n\n debug(message: string, ...args: unknown[]): this {\n this.log('debug', message, ...args);\n return this;\n }\n\n info(message: string, ...args: unknown[]): this {\n this.log('info', message, ...args);\n return this;\n }\n\n warn(message: string, ...args: unknown[]): this {\n this.log('warn', message, ...args);\n return this;\n }\n\n error(message: string, ...args: unknown[]): this {\n this.log('error', message, ...args);\n return this;\n }\n\n /**\n * Assert that a condition is truthy. Logs an error if the condition is falsy.\n * Similar to console.assert() but integrates with plslog's features.\n * Uses JavaScript truthiness - falsy values: false, 0, '', null, undefined, NaN\n *\n * @param condition - The condition to assert (uses JavaScript truthiness)\n * @param message - Error message to log if assertion fails\n * @param args - Additional arguments to log\n * @returns this for chaining\n *\n * @example\n * logger.assert(user !== null, 'User should not be null', user);\n * logger.assert(count > 0, 'Count must be positive', { count });\n * logger.assert(data, 'Data is required'); // Checks if data is truthy\n */\n assert(condition: unknown, message: string, ...args: unknown[]): this {\n if (!condition) {\n this.log('error', message, ...args);\n }\n return this;\n }\n\n setLevel(level: LogLevel): void {\n this._level = level;\n }\n\n /**\n * Set the namespace for this logger instance\n * Returns this for method chaining\n *\n * @param namespace - The namespace string (e.g., 'service:api', 'component')\n * @returns this for chaining\n *\n * @example\n * const log = logger().namespace('service:api');\n * log.debug('Message'); // Logs with namespace 'service:api'\n *\n * // Can also be called after instantiation\n * const log2 = logger();\n * log2.namespace('component').debug('Message');\n */\n namespace(namespace: string): this {\n this._namespace = namespace;\n return this;\n }\n\n maxDepth(maxDepth: number): this {\n this._maxDepth = maxDepth;\n return this;\n }\n\n /**\n * Pick only specific fields to log (whitelist approach)\n * Supports dot notation for nested fields: 'user.name', 'user.email'\n * Supports wildcards: 'user.*' matches all fields under user\n */\n pick(fields: string[]): this {\n this._tempFilterOptions.pick = fields;\n return this;\n }\n\n /**\n * Omit specific fields from logging (blacklist approach)\n * Supports strings, regex patterns, and predicate functions\n */\n omit(fields: FilterFieldConfig[]): this {\n this._tempFilterOptions.omit = fields;\n return this;\n }\n\n /**\n * Set filter mode for per-log filtering\n * - 'redact': Replace with custom string (default: '***REDACTED***')\n * - 'hide': Remove field completely\n * - 'type': Show type info like '[string]', '[Array(3)]'\n * - 'length': Show length info like '[8 chars]', '[3 items]'\n */\n filterMode(mode: FilterMode, replacement?: string): this {\n this._tempFilterOptions.filterMode = mode;\n if (replacement !== undefined) {\n this._tempFilterOptions.filterReplacement = replacement;\n }\n return this;\n }\n\n once(enabled: boolean = true): this {\n this._dedupConfig.enabled = enabled;\n return this;\n }\n\n flushDedup(): this {\n const keys = Array.from(this._dedupBuffer.keys());\n keys.forEach(key => this.flushDedupEntry(key));\n return this;\n }\n\n /**\n * Execute log only if condition is true\n * Supports boolean values or predicate functions\n * Multiple when() calls are AND-ed together\n *\n * @example\n * // Boolean condition\n * logger.when(isDev).debug('Dev only');\n *\n * // Predicate with context\n * logger.when(ctx => ctx.namespace === 'auth').debug('Auth log');\n *\n * // Chaining (both must be true)\n * logger\n * .when(ctx => ctx.level === 'debug')\n * .when(isDevMode)\n * .debug('Conditional');\n */\n when(condition: Condition): this {\n this._tempConditions.push(condition);\n return this;\n }\n\n /**\n * Execute log only if condition is false (inverse of when)\n * Supports boolean values or predicate functions\n *\n * @example\n * // Boolean condition\n * logger.unless(isProd).debug('Not in production');\n *\n * // Predicate with context\n * logger.unless(ctx => ctx.level === 'error').info('Non-error log');\n */\n unless(condition: Condition): this {\n // Negate the condition\n if (typeof condition === 'function') {\n this._tempConditions.push((ctx) => !condition(ctx));\n }\n else {\n this._tempConditions.push(!condition);\n }\n return this;\n }\n\n private getLevelPriority(level: LogLevel): number {\n const priorities: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n };\n return priorities[level];\n }\n\n private log(level: LogLevel, message: string, ...args: unknown[]): void {\n // Evaluate conditions first (before any other checks)\n if (this._tempConditions.length > 0) {\n // Build context with namespace, level, and custom properties\n const ctx: ConditionContext = {\n namespace: this._namespace,\n level,\n ...this._context,\n };\n\n // Evaluate all conditions (AND logic - all must be true)\n const conditionsMet = this._tempConditions.every(condition =>\n typeof condition === 'function' ? condition(ctx) : condition\n );\n\n // Reset conditions immediately (prevent state leaks)\n this._tempConditions = [];\n\n // If conditions not met, skip logging\n if (!conditionsMet) {\n // Also reset filter options to prevent state leaks\n this._tempFilterOptions = {};\n return;\n }\n }\n\n // show/hide\n if (!namespaceMatcher.matches(this._namespace, globalConfig.namespaces)) {\n return;\n }\n // Check activeLevels first (if configured), otherwise fall back to level priority\n if (globalConfig.activeLevels !== undefined) {\n if (!globalConfig.activeLevels.includes(level)) {\n return;\n }\n }\n else if (this.getLevelPriority(this._level) > this.getLevelPriority(level)) {\n return;\n }\n\n // Capture filter options before they get reset\n const filterOptions = { ...this._tempFilterOptions };\n\n // Reset immediately to prevent interference between logs\n this._tempFilterOptions = {};\n\n // Route to dedup or immediate logging\n if (this._dedupConfig.enabled) {\n this.logWithDedup(level, message, filterOptions, ...args);\n }\n else {\n this.logImmediate(level, message, filterOptions, ...args);\n }\n }\n\n private logWithDedup(level: LogLevel, message: string, filterOptions: LogFilterOptions, ...args: unknown[]): void {\n const key = DedupHasher.generateKey(level, message, args);\n const existing = this._dedupBuffer.get(key);\n const now = Date.now();\n\n if (existing) {\n // Update existing entry\n existing.count++;\n existing.lastTimestamp = now;\n existing.args = args; // Keep latest args\n existing.filterOptions = filterOptions; // Keep latest filter options\n\n // Clear existing timeout\n if (existing.flushTimeoutId !== undefined) {\n clearTimeout(existing.flushTimeoutId);\n }\n\n // Schedule new flush\n existing.flushTimeoutId = setTimeout(() => {\n this.flushDedupEntry(key);\n }, this._dedupConfig.flushInterval) as unknown as number;\n }\n else {\n // Create new entry\n const entry: DedupEntry = {\n key,\n level,\n message,\n args,\n count: 1,\n firstTimestamp: now,\n lastTimestamp: now,\n filterOptions,\n };\n\n this._dedupBuffer.set(key, entry);\n\n // Schedule flush\n entry.flushTimeoutId = setTimeout(() => {\n this.flushDedupEntry(key);\n }, this._dedupConfig.flushInterval) as unknown as number;\n }\n }\n\n private flushDedupEntry(key: string): void {\n const entry = this._dedupBuffer.get(key);\n if (!entry) return;\n\n // Format message with count and timestamps if > 1\n let displayMessage = entry.message;\n if (entry.count > 1) {\n const firstTime = this.formatTimestamp(entry.firstTimestamp);\n const lastTime = this.formatTimestamp(entry.lastTimestamp);\n displayMessage = `${entry.message} (x${entry.count}, ${firstTime} → ${lastTime})`;\n }\n\n // Log immediately with formatted message and original filter options\n this.logImmediate(entry.level, displayMessage, entry.filterOptions || {}, ...entry.args);\n\n // Remove from buffer\n this._dedupBuffer.delete(key);\n }\n\n private formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp);\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n const milliseconds = String(date.getMilliseconds()).padStart(3, '0');\n return `${hours}:${minutes}:${seconds}.${milliseconds}`;\n }\n\n private logImmediate(level: LogLevel, message: string, filterOptions: LogFilterOptions, ...args: unknown[]): void {\n // format data with merged filter options\n // Global filterFields are always applied, per-log pick/omit override for specific logs\n const formattedObject = Formatter.formatObj(args, {\n maxDepth: this._maxDepth,\n // Global filter fields (always applied for security)\n filterFields: globalConfig.filterFields,\n globalFilterMode: globalConfig.filterMode,\n globalFilterReplacement: globalConfig.filterReplacement,\n // Per-log pick/omit (contextual filtering)\n pick: filterOptions.pick,\n omit: filterOptions.omit,\n filterMode: filterOptions.filterMode,\n filterReplacement: filterOptions.filterReplacement,\n // Error serialization config\n errorConfig: globalConfig.errorSerialization,\n });\n\n const formattedMessage = formattedObject ? `${message} ${formattedObject}` : message;\n\n // style data\n const { logMessage, logStyles } = Styler.style({\n namespace: this._namespace,\n level,\n location: '',\n formattedMessage,\n });\n\n switch (level) {\n case 'error':\n console.error(logMessage, ...logStyles);\n break;\n case 'warn':\n console.warn(logMessage, ...logStyles);\n break;\n case 'info':\n console.info(logMessage, ...logStyles);\n break;\n case 'debug':\n console.debug(logMessage, ...logStyles);\n break;\n default:\n console.log(logMessage, ...logStyles);\n }\n }\n}\n\ntype Plslog = {\n (options?: LoggerOptions | string): Logger;\n configure(options: GlobalConfig): void;\n};\n\nconst plslog = ((options: LoggerOptions | string = {}) => {\n // Normalize: if string, convert to object with namespace\n const normalizedOptions: LoggerOptions =\n typeof options === 'string'\n ? { namespace: options }\n : options;\n\n return new Logger(normalizedOptions);\n}) as Plslog;\n\nplslog.configure = configure;\n\nexport default plslog;"]}
|