@loggerjs/processors 0.0.2 → 0.3.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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["clampRate","DEFAULT_EXEMPT_LEVELS","defaultKey","snapshot","normalizeCount","normalizeBucketCount","snapshot","isRecord","defaultKey","snapshot","prune"],"sources":["../src/redact.ts","../src/sample.ts","../src/tags.ts","../src/dedupe.ts","../src/trace.ts","../src/rate-limit.ts","../src/fingers-crossed.ts","../src/enrich.ts","../src/level-override.ts","../src/filter-route.ts","../src/fingerprint.ts","../src/normalize-error.ts","../src/stack-parser.ts","../src/privacy-guard.ts","../src/schema-dev-check.ts","../src/dynamic-sampler.ts","../src/breadcrumb-buffer.ts"],"sourcesContent":["import type { LogEvent, Processor } from \"@loggerjs/core\";\n\nexport type RedactMatcher =\n | string\n | RegExp\n | ((key: string, path: string, value: unknown) => boolean);\n\nexport interface RedactOptions {\n keys?: RedactMatcher[];\n paths?: string[];\n replacement?: string;\n maxDepth?: number;\n}\n\nfunction matchesKey(key: string, path: string, value: unknown, matchers: RedactMatcher[]): boolean {\n return matchers.some((matcher) => {\n if (typeof matcher === \"string\") return matcher.toLowerCase() === key.toLowerCase();\n if (matcher instanceof RegExp) return matcher.test(key) || matcher.test(path);\n return matcher(key, path, value);\n });\n}\n\nfunction pathMatches(path: string, paths: string[]): boolean {\n return paths.includes(path);\n}\n\nfunction redactValue(\n value: unknown,\n options: Required<Pick<RedactOptions, \"replacement\" | \"maxDepth\">> &\n Pick<RedactOptions, \"keys\" | \"paths\">,\n path = \"\",\n depth = 0,\n seen = new WeakMap<object, unknown>(),\n): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value !== \"object\") return value;\n if (depth >= options.maxDepth) return value;\n if (seen.has(value)) return seen.get(value);\n\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n seen.set(value, out);\n for (let index = 0; index < value.length; index += 1) {\n out[index] = redactValue(value[index], options, `${path}[${index}]`, depth + 1, seen);\n }\n return out;\n }\n\n if (value instanceof Error) return value;\n if (value instanceof Date) return value;\n\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n seen.set(value, out);\n for (const [key, child] of Object.entries(input)) {\n const childPath = path ? `${path}.${key}` : key;\n if (\n matchesKey(key, childPath, child, options.keys ?? []) ||\n pathMatches(childPath, options.paths ?? [])\n ) {\n out[key] = options.replacement;\n } else {\n out[key] = redactValue(child, options, childPath, depth + 1, seen);\n }\n }\n return out;\n}\n\nexport function redactProcessor(options: RedactOptions = {}): Processor {\n const normalized = {\n keys: options.keys ?? [\n \"password\",\n \"passwd\",\n \"secret\",\n \"token\",\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"apiKey\",\n \"api_key\",\n ],\n paths: options.paths ?? [],\n replacement: options.replacement ?? \"[REDACTED]\",\n maxDepth: options.maxDepth ?? 8,\n };\n\n return (event: LogEvent): LogEvent => ({\n ...event,\n data: redactValue(event.data, normalized),\n context: redactValue(event.context, normalized) as Record<string, unknown> | undefined,\n tags: redactValue(event.tags, normalized) as LogEvent[\"tags\"],\n error: redactValue(event.error, normalized) as LogEvent[\"error\"],\n });\n}\n","import type { EnabledLogLevelName, LogEvent, Processor } from \"@loggerjs/core\";\n\nexport interface SampleOptions {\n defaultRate?: number;\n rates?: Partial<Record<EnabledLogLevelName, number>>;\n random?: () => number;\n}\n\nfunction clampRate(rate: number): number {\n if (Number.isNaN(rate)) return 1;\n return Math.max(0, Math.min(1, rate));\n}\n\nexport function sampleProcessor(options: SampleOptions = {}): Processor {\n const defaultRate = clampRate(options.defaultRate ?? 1);\n const random = options.random ?? Math.random;\n const rates = options.rates ?? {};\n\n return (event: LogEvent): LogEvent | false => {\n const rate = clampRate(rates[event.levelName] ?? defaultRate);\n if (rate >= 1) return event;\n if (rate <= 0) return false;\n return random() < rate ? event : false;\n };\n}\n","import {\n createBoundContext,\n createMiddleware,\n type Middleware,\n type Processor,\n type Tags,\n} from \"@loggerjs/core\";\n\nexport function tagsMiddleware(tags: Tags): Middleware {\n return createMiddleware(\"tags\", (record) => {\n record.tags = {\n ...record.tags,\n ...tags,\n };\n return record;\n });\n}\n\nexport function typeMiddleware(type: string): Middleware {\n return createMiddleware(\"type\", (record) => {\n record.type = type;\n return record;\n });\n}\n\nexport function contextMiddleware(context: Record<string, unknown>): Middleware {\n return createMiddleware(\"context\", (record) => {\n record.ctx = createBoundContext({\n ...record.ctx,\n ...context,\n });\n return record;\n });\n}\n\nexport function tagsProcessor(tags: Tags): Processor {\n return (event) => ({\n ...event,\n tags: {\n ...event.tags,\n ...tags,\n },\n });\n}\n\nexport function typeProcessor(type: string): Processor {\n return (event) => ({\n ...event,\n type,\n });\n}\n\nexport function contextProcessor(context: Record<string, unknown>): Processor {\n return (event) => ({\n ...event,\n context: {\n ...event.context,\n ...context,\n },\n });\n}\n","import type { LogEvent, Processor } from \"@loggerjs/core\";\n\nexport interface DedupeOptions {\n windowMs?: number;\n maxEntries?: number;\n key?: (event: LogEvent) => string;\n}\n\nexport function dedupeProcessor(options: DedupeOptions = {}): Processor {\n const windowMs = options.windowMs ?? 1000;\n const maxEntries = options.maxEntries ?? 1000;\n const keyFor =\n options.key ?? ((event) => `${event.levelName}:${event.message}:${event.error?.message ?? \"\"}`);\n const seen = new Map<string, number>();\n\n return (event, context): LogEvent | false => {\n const now = context.now();\n const key = keyFor(event);\n const previous = seen.get(key);\n if (previous !== undefined && now - previous < windowMs) return false;\n seen.set(key, now);\n\n if (seen.size > maxEntries) {\n const cutoff = now - windowMs;\n for (const [entryKey, timestamp] of seen) {\n if (timestamp < cutoff || seen.size > maxEntries) seen.delete(entryKey);\n }\n }\n\n return event;\n };\n}\n","import {\n createMiddleware,\n type Middleware,\n type Processor,\n type TraceContext,\n} from \"@loggerjs/core\";\n\nexport type TraceContextProvider = () => TraceContext | undefined;\n\nexport function traceContextMiddleware(provider: TraceContextProvider): Middleware {\n return createMiddleware(\"traceContext\", (record) => {\n const trace = provider();\n if (!trace) return record;\n record.trace = {\n ...record.trace,\n ...trace,\n };\n return record;\n });\n}\n\nexport function traceContextProcessor(provider: TraceContextProvider): Processor {\n return (event) => {\n const trace = provider();\n if (!trace) return event;\n return {\n ...event,\n trace: {\n ...event.trace,\n ...trace,\n },\n };\n };\n}\n","import {\n incrementLoggerMetaCounter,\n type EnabledLogLevelName,\n type LogEvent,\n type Processor,\n} from \"@loggerjs/core\";\n\nexport interface RateLimitBucket {\n readonly key: string;\n readonly tokens: number;\n readonly lastRefillMs: number;\n}\n\nexport interface RateLimitProcessor extends Processor {\n buckets(): readonly RateLimitBucket[];\n}\n\nexport interface RateLimitOptions {\n capacity?: number;\n refillPerSecond?: number;\n key?: (event: LogEvent) => string;\n exemptLevels?: readonly EnabledLogLevelName[];\n maxBuckets?: number;\n onDrop?: (event: LogEvent, key: string) => void;\n}\n\ninterface MutableBucket {\n key: string;\n tokens: number;\n lastRefillMs: number;\n lastSeenMs: number;\n}\n\nconst DEFAULT_EXEMPT_LEVELS = new Set<EnabledLogLevelName>([\"error\", \"fatal\"]);\n\nfunction defaultKey(event: LogEvent): string {\n return `${event.logger}:${event.levelName}:${event.source?.integration ?? event.type ?? \"manual\"}`;\n}\n\nfunction normalizePositive(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value <= 0) return fallback;\n return value;\n}\n\nfunction normalizeNonNegative(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value < 0) return fallback;\n return value;\n}\n\nfunction snapshot(bucket: MutableBucket): RateLimitBucket {\n return {\n key: bucket.key,\n tokens: bucket.tokens,\n lastRefillMs: bucket.lastRefillMs,\n };\n}\n\nexport function rateLimitProcessor(options: RateLimitOptions = {}): RateLimitProcessor {\n const capacity = normalizePositive(options.capacity, 100);\n const refillPerSecond = normalizeNonNegative(options.refillPerSecond, capacity);\n const maxBuckets = Math.max(1, Math.floor(options.maxBuckets ?? 10_000));\n const key = options.key ?? defaultKey;\n const exemptLevels = new Set(options.exemptLevels ?? DEFAULT_EXEMPT_LEVELS);\n const buckets = new Map<string, MutableBucket>();\n\n const prune = () => {\n while (buckets.size > maxBuckets) {\n let oldest: MutableBucket | undefined;\n for (const bucket of buckets.values()) {\n if (!oldest || bucket.lastSeenMs < oldest.lastSeenMs) oldest = bucket;\n }\n if (!oldest) return;\n buckets.delete(oldest.key);\n }\n };\n\n const processor = ((event, context) => {\n if (exemptLevels.has(event.levelName)) return event;\n\n const now = context.now();\n const bucketKey = key(event);\n let bucket = buckets.get(bucketKey);\n if (!bucket) {\n bucket = {\n key: bucketKey,\n tokens: capacity,\n lastRefillMs: now,\n lastSeenMs: now,\n };\n buckets.set(bucketKey, bucket);\n prune();\n }\n\n const elapsedSeconds = Math.max(0, (now - bucket.lastRefillMs) / 1000);\n bucket.tokens = Math.min(capacity, bucket.tokens + elapsedSeconds * refillPerSecond);\n bucket.lastRefillMs = now;\n bucket.lastSeenMs = now;\n\n if (bucket.tokens >= 1) {\n bucket.tokens -= 1;\n return event;\n }\n\n incrementLoggerMetaCounter(\"processor.rateLimit.dropped\");\n incrementLoggerMetaCounter(`processor.rateLimit.dropped.${event.levelName}`);\n options.onDrop?.(event, bucketKey);\n return false;\n }) as RateLimitProcessor;\n\n processor.buckets = () => [...buckets.values()].map(snapshot);\n\n return processor;\n}\n","import {\n eventToRecord,\n incrementLoggerMetaCounter,\n recordToEvent,\n toLevelValue,\n type LogEvent,\n type LoggerLevel,\n type Processor,\n type ProcessorContext,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport type FingersCrossedDropReason = \"buffer-full\" | \"bucket-pruned\";\n\nexport type FingersCrossedFlush = (\n events: readonly LogEvent[],\n context: ProcessorContext,\n) => void | Promise<void>;\n\nexport interface FingersCrossedState {\n readonly key: string;\n readonly buffered: number;\n readonly activeUntilMs: number;\n readonly lastSeenMs: number;\n}\n\nexport interface FingersCrossedProcessor extends Processor {\n states(): readonly FingersCrossedState[];\n reset(key?: string): void;\n}\n\nexport interface FingersCrossedOptions {\n triggerLevel?: LoggerLevel;\n shouldTrigger?: (event: LogEvent) => boolean;\n bufferSize?: number;\n activationMs?: number;\n flushTo?: Transport | FingersCrossedFlush;\n includeTrigger?: boolean;\n passthroughTrigger?: boolean;\n passthroughAfterTrigger?: boolean;\n key?: (event: LogEvent) => string;\n maxBuckets?: number;\n onTrigger?: (event: LogEvent, buffered: readonly LogEvent[], key: string) => void;\n onDrop?: (event: LogEvent, reason: FingersCrossedDropReason, key: string) => void;\n}\n\ninterface MutableState {\n key: string;\n buffer: LogEvent[];\n activeUntilMs: number;\n lastSeenMs: number;\n}\n\nconst DEFAULT_KEY = \"default\";\n\nfunction normalizeCount(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeBucketCount(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) return 1024;\n return Math.max(1, Math.floor(value));\n}\n\nfunction incrementBy(name: string, count: number): void {\n for (let index = 0; index < count; index += 1) incrementLoggerMetaCounter(name);\n}\n\nfunction snapshot(state: MutableState): FingersCrossedState {\n return {\n key: state.key,\n buffered: state.buffer.length,\n activeUntilMs: state.activeUntilMs,\n lastSeenMs: state.lastSeenMs,\n };\n}\n\nfunction isFlushFunction(target: Transport | FingersCrossedFlush): target is FingersCrossedFlush {\n return typeof target === \"function\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nasync function flushToTarget(\n target: Transport | FingersCrossedFlush,\n events: readonly LogEvent[],\n context: ProcessorContext,\n): Promise<void> {\n if (events.length === 0) return;\n if (isFlushFunction(target)) {\n await target(events, context);\n return;\n }\n\n const minLevel = target.minLevel === undefined ? undefined : toLevelValue(target.minLevel);\n const selected =\n minLevel === undefined ? [...events] : events.filter((event) => event.level >= minLevel);\n if (selected.length === 0) return;\n\n const transportContext: TransportContext = {\n loggerName: context.loggerName,\n now: context.now,\n toEvent: recordToEvent,\n reportInternalError: context.reportInternalError,\n };\n\n if (target.logBatch) {\n const result = target.logBatch(selected, transportContext);\n if (isPromiseLike(result)) await result;\n return;\n }\n if (target.log) {\n for (const event of selected) {\n const result = target.log(event, transportContext);\n if (isPromiseLike(result)) {\n // oxlint-disable-next-line no-await-in-loop -- Preserve buffered log order.\n await result;\n }\n }\n return;\n }\n\n const records = selected.map(eventToRecord);\n if (target.writeBatch) {\n const result = target.writeBatch(records, transportContext);\n if (isPromiseLike(result)) {\n await result;\n }\n return;\n }\n if (!target.write) return;\n for (const record of records) {\n const result = target.write(record, transportContext);\n if (isPromiseLike(result)) {\n // oxlint-disable-next-line no-await-in-loop -- Preserve buffered log order.\n await result;\n }\n }\n}\n\nfunction scheduleFlush(\n target: Transport | FingersCrossedFlush | undefined,\n events: readonly LogEvent[],\n context: ProcessorContext,\n): void {\n if (!target || events.length === 0) return;\n const batch = [...events];\n incrementBy(\"processor.fingersCrossed.flushed\", batch.length);\n void flushToTarget(target, batch, context).catch((error) => {\n context.reportInternalError(error, {\n phase: \"processor\",\n processor: \"fingersCrossed\",\n });\n });\n}\n\nexport function fingersCrossedProcessor(\n options: FingersCrossedOptions = {},\n): FingersCrossedProcessor {\n const triggerLevel = toLevelValue(options.triggerLevel ?? \"error\");\n const shouldTrigger = options.shouldTrigger ?? ((event: LogEvent) => event.level >= triggerLevel);\n const bufferSize = normalizeCount(options.bufferSize, 100);\n const maxBuckets = normalizeBucketCount(options.maxBuckets);\n const keyFor = options.key ?? (() => DEFAULT_KEY);\n const includeTrigger = options.includeTrigger ?? true;\n const passthroughTrigger = options.passthroughTrigger ?? !options.flushTo;\n const passthroughAfterTrigger = options.passthroughAfterTrigger ?? true;\n const activationMs = options.activationMs;\n const states = new Map<string, MutableState>();\n\n const drop = (event: LogEvent, reason: FingersCrossedDropReason, key: string) => {\n incrementLoggerMetaCounter(\"processor.fingersCrossed.dropped\");\n incrementLoggerMetaCounter(`processor.fingersCrossed.dropped.${reason}`);\n options.onDrop?.(event, reason, key);\n };\n\n const getState = (key: string, now: number): MutableState => {\n let state = states.get(key);\n if (!state) {\n state = { key, buffer: [], activeUntilMs: 0, lastSeenMs: now };\n states.set(key, state);\n }\n state.lastSeenMs = now;\n\n while (states.size > maxBuckets) {\n let oldest: MutableState | undefined;\n for (const candidate of states.values()) {\n if (!oldest || candidate.lastSeenMs < oldest.lastSeenMs) oldest = candidate;\n }\n if (!oldest) break;\n for (const buffered of oldest.buffer) drop(buffered, \"bucket-pruned\", oldest.key);\n states.delete(oldest.key);\n }\n\n return state;\n };\n\n const processor = ((event, context) => {\n const now = context.now();\n const key = keyFor(event);\n const state = getState(key, now);\n\n if (state.activeUntilMs > 0 && state.activeUntilMs <= now) {\n state.activeUntilMs = 0;\n }\n\n if (state.activeUntilMs > now) {\n return passthroughAfterTrigger ? event : false;\n }\n\n if (shouldTrigger(event)) {\n const buffered = state.buffer.splice(0);\n state.activeUntilMs =\n activationMs === undefined ? Number.POSITIVE_INFINITY : now + Math.max(0, activationMs);\n incrementLoggerMetaCounter(\"processor.fingersCrossed.triggered\");\n options.onTrigger?.(event, buffered, key);\n scheduleFlush(options.flushTo, includeTrigger ? [...buffered, event] : buffered, context);\n return passthroughTrigger ? event : false;\n }\n\n if (bufferSize === 0) return false;\n if (state.buffer.length >= bufferSize) {\n const dropped = state.buffer.shift();\n if (dropped) drop(dropped, \"buffer-full\", key);\n }\n state.buffer.push(event);\n incrementLoggerMetaCounter(\"processor.fingersCrossed.buffered\");\n return false;\n }) as FingersCrossedProcessor;\n\n processor.states = () => [...states.values()].map(snapshot);\n processor.reset = (key?: string) => {\n if (key === undefined) {\n states.clear();\n return;\n }\n states.delete(key);\n };\n\n return processor;\n}\n","import {\n createBoundContext,\n createMiddleware,\n type LogEvent,\n type LogRecord,\n type Middleware,\n type MiddlewareContext,\n type Processor,\n type ProcessorContext,\n type Tags,\n type TraceContext,\n} from \"@loggerjs/core\";\n\nexport interface EnrichPatch {\n message?: string;\n type?: string;\n tags?: Tags;\n data?: unknown;\n context?: Record<string, unknown>;\n trace?: TraceContext;\n source?: LogEvent[\"source\"];\n}\n\nexport type EnrichInput =\n | EnrichPatch\n | ((event: LogEvent, context: ProcessorContext) => EnrichPatch | false | void);\n\nexport interface EnrichRecordPatch {\n message?: string;\n type?: string;\n tags?: Tags;\n data?: unknown;\n context?: Record<string, unknown>;\n trace?: TraceContext;\n source?: string | LogEvent[\"source\"];\n}\n\nexport type EnrichMiddlewareInput =\n | EnrichRecordPatch\n | ((record: LogRecord, context: MiddlewareContext) => EnrichRecordPatch | false | void);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeData(current: unknown, patch: unknown): unknown {\n if (patch === undefined) return current;\n if (isRecord(current) && isRecord(patch)) return { ...current, ...patch };\n return patch;\n}\n\nfunction mergeRecordData(\n current: Record<string, unknown> | null,\n patch: unknown,\n): Record<string, unknown> | null {\n if (patch === undefined) return current;\n if (isRecord(current) && isRecord(patch)) return { ...current, ...patch };\n if (isRecord(patch)) return patch;\n return { value: patch };\n}\n\nfunction sourceForRecord(source: EnrichRecordPatch[\"source\"]): string | undefined {\n if (!source) return undefined;\n if (typeof source === \"string\") return source;\n return source.integration ?? source.runtime;\n}\n\nfunction applyPatch(event: LogEvent, patch: EnrichPatch): LogEvent {\n return {\n ...event,\n message: patch.message ?? event.message,\n type: patch.type ?? event.type,\n tags: patch.tags ? { ...event.tags, ...patch.tags } : event.tags,\n data: mergeData(event.data, patch.data),\n context: patch.context ? { ...event.context, ...patch.context } : event.context,\n trace: patch.trace ? { ...event.trace, ...patch.trace } : event.trace,\n source: patch.source ? { ...event.source, ...patch.source } : event.source,\n };\n}\n\nexport function enrichProcessor(input: EnrichInput): Processor {\n return (event, context) => {\n const patch = typeof input === \"function\" ? input(event, context) : input;\n if (patch === false) return false;\n if (!patch) return event;\n return applyPatch(event, patch);\n };\n}\n\nfunction applyRecordPatch(record: LogRecord, patch: EnrichRecordPatch): LogRecord {\n if (patch.message !== undefined) {\n record.msg = patch.message;\n record.lazy = null;\n }\n if (patch.type !== undefined) record.type = patch.type;\n if (patch.tags) {\n record.tags = {\n ...record.tags,\n ...patch.tags,\n };\n }\n if (patch.data !== undefined) record.props = mergeRecordData(record.props, patch.data);\n if (patch.context) {\n record.ctx = createBoundContext({\n ...record.ctx,\n ...patch.context,\n });\n }\n if (patch.trace) {\n record.trace = {\n ...record.trace,\n ...patch.trace,\n };\n }\n const source = sourceForRecord(patch.source);\n if (source) record.source = source;\n return record;\n}\n\nexport function enrichMiddleware(input: EnrichMiddlewareInput): Middleware {\n return createMiddleware(\"enrich\", (record, context) => {\n const patch = typeof input === \"function\" ? input(record, context) : input;\n if (patch === false) return null;\n if (!patch) return record;\n return applyRecordPatch(record, patch);\n });\n}\n","import {\n toLevelName,\n toLevelValue,\n type EnabledLogLevelName,\n type LogEvent,\n type LoggerLevel,\n type Processor,\n type ProcessorContext,\n type Tags,\n} from \"@loggerjs/core\";\n\nexport type LevelOverrideStringMatcher =\n | string\n | RegExp\n | ((value: string | undefined, event: LogEvent) => boolean);\n\nexport type LevelOverrideValue =\n | LoggerLevel\n | false\n | undefined\n | ((event: LogEvent, context: ProcessorContext) => LoggerLevel | false | void);\n\nexport interface LevelOverrideRule {\n level: LevelOverrideValue;\n when?: (event: LogEvent, context: ProcessorContext) => boolean;\n logger?: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[];\n type?: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[];\n integration?: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[];\n runtime?: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[];\n tags?: Tags;\n minLevel?: LoggerLevel;\n maxLevel?: LoggerLevel;\n}\n\nexport interface LevelOverrideOptions {\n rules: readonly LevelOverrideRule[];\n}\n\nexport type LevelOverrideInput =\n | LevelOverrideValue\n | readonly LevelOverrideRule[]\n | LevelOverrideOptions;\n\nfunction asMatchers(\n matcher: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[] | undefined,\n): readonly LevelOverrideStringMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher as LevelOverrideStringMatcher];\n}\n\nfunction matchOne(\n matcher: LevelOverrideStringMatcher,\n value: string | undefined,\n event: LogEvent,\n): boolean {\n if (typeof matcher === \"function\") return matcher(value, event);\n if (matcher instanceof RegExp) return matcher.test(value ?? \"\");\n return value === matcher;\n}\n\nfunction matchString(\n matcher: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[] | undefined,\n value: string | undefined,\n event: LogEvent,\n): boolean {\n const matchers = asMatchers(matcher);\n if (matchers.length === 0) return true;\n return matchers.some((item) => matchOne(item, value, event));\n}\n\nfunction matchTags(expected: Tags | undefined, actual: Tags | undefined): boolean {\n if (!expected) return true;\n for (const [key, value] of Object.entries(expected)) {\n if (actual?.[key] !== value) return false;\n }\n return true;\n}\n\nfunction matchLevelRange(event: LogEvent, rule: LevelOverrideRule): boolean {\n if (rule.minLevel !== undefined && event.level < toLevelValue(rule.minLevel)) return false;\n if (rule.maxLevel !== undefined && event.level > toLevelValue(rule.maxLevel)) return false;\n return true;\n}\n\nfunction matchesRule(event: LogEvent, context: ProcessorContext, rule: LevelOverrideRule): boolean {\n return (\n (!rule.when || rule.when(event, context)) &&\n matchString(rule.logger, event.logger, event) &&\n matchString(rule.type, event.type, event) &&\n matchString(rule.integration, event.source?.integration, event) &&\n matchString(rule.runtime, event.source?.runtime, event) &&\n matchTags(rule.tags, event.tags) &&\n matchLevelRange(event, rule)\n );\n}\n\nfunction resolveLevel(\n value: LevelOverrideValue,\n event: LogEvent,\n context: ProcessorContext,\n): LoggerLevel | false | undefined {\n if (typeof value === \"function\") {\n const level = value(event, context);\n return level === undefined ? undefined : level;\n }\n return value;\n}\n\nfunction applyLevel(event: LogEvent, level: LoggerLevel | false | undefined): LogEvent | false {\n if (level === undefined) return event;\n if (level === false || level === \"silent\") return false;\n\n const nextLevel = toLevelValue(level, event.level);\n if (!Number.isFinite(nextLevel)) return false;\n\n const nextLevelName: EnabledLogLevelName = toLevelName(nextLevel);\n if (nextLevel === event.level && nextLevelName === event.levelName) return event;\n return { ...event, level: nextLevel, levelName: nextLevelName };\n}\n\nfunction isOptions(input: LevelOverrideInput): input is LevelOverrideOptions {\n return typeof input === \"object\" && input !== null && !Array.isArray(input);\n}\n\nfunction isRuleArray(input: LevelOverrideInput): input is readonly LevelOverrideRule[] {\n return Array.isArray(input);\n}\n\nexport function levelOverrideProcessor(input: LevelOverrideInput): Processor {\n if (!isRuleArray(input) && !isOptions(input)) {\n return (event, context) => applyLevel(event, resolveLevel(input, event, context));\n }\n\n const rules = isRuleArray(input) ? input : input.rules;\n return (event, context) => {\n for (const rule of rules) {\n if (matchesRule(event, context, rule)) {\n return applyLevel(event, resolveLevel(rule.level, event, context));\n }\n }\n return event;\n };\n}\n","import {\n toLevelValue,\n withLogEventRoute,\n type EnabledLogLevelName,\n type LogEvent,\n type LogEventRoute,\n type LoggerLevel,\n type Processor,\n type ProcessorContext,\n type Tags,\n} from \"@loggerjs/core\";\n\nexport type EventStringMatcher =\n | string\n | RegExp\n | ((value: string | undefined, event: LogEvent) => boolean);\n\nexport interface EventMatch {\n when?: (event: LogEvent, context: ProcessorContext) => boolean;\n logger?: EventStringMatcher | readonly EventStringMatcher[];\n type?: EventStringMatcher | readonly EventStringMatcher[];\n integration?: EventStringMatcher | readonly EventStringMatcher[];\n runtime?: EventStringMatcher | readonly EventStringMatcher[];\n levelName?: EnabledLogLevelName | readonly EnabledLogLevelName[];\n tags?: Tags;\n minLevel?: LoggerLevel;\n maxLevel?: LoggerLevel;\n}\n\nexport type FilterAction = \"keep\" | \"drop\";\nexport type FilterPredicate = (event: LogEvent, context: ProcessorContext) => boolean;\n\nexport interface FilterRule extends EventMatch {\n action?: FilterAction;\n reason?: string;\n}\n\nexport interface FilterOptions {\n rules: readonly FilterRule[];\n defaultAction?: FilterAction;\n onDrop?: (event: LogEvent, reason: string) => void;\n}\n\nexport type FilterInput = FilterPredicate | readonly FilterRule[] | FilterOptions;\n\nexport interface RouteRule extends EventMatch, LogEventRoute {}\n\nexport interface RouteOptions {\n rules: readonly RouteRule[];\n defaultRoute?: LogEventRoute;\n}\n\nexport type RouteInput = LogEventRoute | readonly RouteRule[] | RouteOptions;\n\nfunction stringMatchers(\n matcher: EventStringMatcher | readonly EventStringMatcher[] | undefined,\n): readonly EventStringMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher as EventStringMatcher];\n}\n\nfunction matchesString(\n matcher: EventStringMatcher | readonly EventStringMatcher[] | undefined,\n value: string | undefined,\n event: LogEvent,\n): boolean {\n const matchers = stringMatchers(matcher);\n if (matchers.length === 0) return true;\n\n for (const item of matchers) {\n if (typeof item === \"function\" && item(value, event)) return true;\n if (item instanceof RegExp && item.test(value ?? \"\")) return true;\n if (typeof item === \"string\" && value === item) return true;\n }\n return false;\n}\n\nfunction matchesLevelName(\n expected: EnabledLogLevelName | readonly EnabledLogLevelName[] | undefined,\n actual: EnabledLogLevelName,\n): boolean {\n if (!expected) return true;\n return Array.isArray(expected) ? expected.includes(actual) : expected === actual;\n}\n\nfunction matchesTags(expected: Tags | undefined, actual: Tags | undefined): boolean {\n if (!expected) return true;\n for (const [key, value] of Object.entries(expected)) {\n if (actual?.[key] !== value) return false;\n }\n return true;\n}\n\nfunction matchesLevelRange(event: LogEvent, match: EventMatch): boolean {\n if (match.minLevel !== undefined && event.level < toLevelValue(match.minLevel)) return false;\n if (match.maxLevel !== undefined && event.level > toLevelValue(match.maxLevel)) return false;\n return true;\n}\n\nfunction matchesEvent(event: LogEvent, context: ProcessorContext, match: EventMatch): boolean {\n return (\n (!match.when || match.when(event, context)) &&\n matchesString(match.logger, event.logger, event) &&\n matchesString(match.type, event.type, event) &&\n matchesString(match.integration, event.source?.integration, event) &&\n matchesString(match.runtime, event.source?.runtime, event) &&\n matchesLevelName(match.levelName, event.levelName) &&\n matchesTags(match.tags, event.tags) &&\n matchesLevelRange(event, match)\n );\n}\n\nfunction isFilterRuleArray(\n input: readonly FilterRule[] | FilterOptions,\n): input is readonly FilterRule[] {\n return Array.isArray(input);\n}\n\nfunction normalizeFilterOptions(input: readonly FilterRule[] | FilterOptions): FilterOptions {\n return isFilterRuleArray(input) ? { rules: input } : input;\n}\n\nfunction reportDrop(options: FilterOptions, event: LogEvent, reason: string): false {\n options.onDrop?.(event, reason);\n return false;\n}\n\nexport function filterProcessor(input: FilterInput): Processor {\n if (typeof input === \"function\") {\n return (event, context) => (input(event, context) ? event : false);\n }\n\n const options = normalizeFilterOptions(input);\n const defaultAction = options.defaultAction ?? \"keep\";\n\n return (event, context) => {\n for (const rule of options.rules) {\n if (!matchesEvent(event, context, rule)) continue;\n const action = rule.action ?? \"drop\";\n return action === \"keep\" ? event : reportDrop(options, event, rule.reason ?? \"rule\");\n }\n\n return defaultAction === \"keep\" ? event : reportDrop(options, event, \"default\");\n };\n}\n\nfunction hasRoute(route: LogEventRoute | undefined): route is LogEventRoute {\n return Boolean(route?.transports || route?.excludeTransports);\n}\n\nfunction routeFromRule(rule: RouteRule): LogEventRoute {\n return {\n transports: rule.transports,\n excludeTransports: rule.excludeTransports,\n };\n}\n\nfunction isRouteOptions(input: RouteInput): input is RouteOptions {\n return typeof input === \"object\" && input !== null && \"rules\" in input;\n}\n\nfunction isRouteRuleArray(input: RouteInput): input is readonly RouteRule[] {\n return Array.isArray(input);\n}\n\nexport function routeProcessor(input: RouteInput): Processor {\n if (!isRouteRuleArray(input) && !isRouteOptions(input)) {\n return (event) => (hasRoute(input) ? withLogEventRoute(event, input) : event);\n }\n\n const rules = isRouteRuleArray(input) ? input : input.rules;\n const defaultRoute = isRouteRuleArray(input) ? undefined : input.defaultRoute;\n return (event, context) => {\n for (const rule of rules) {\n if (matchesEvent(event, context, rule)) {\n const route = routeFromRule(rule);\n return hasRoute(route) ? withLogEventRoute(event, route) : event;\n }\n }\n\n return hasRoute(defaultRoute) ? withLogEventRoute(event, defaultRoute) : event;\n };\n}\n","import type { LogEvent, Processor, ProcessorContext } from \"@loggerjs/core\";\n\nexport type FingerprintPart =\n | \"logger\"\n | \"level\"\n | \"type\"\n | \"message\"\n | \"error.name\"\n | \"error.message\"\n | \"source.integration\"\n | \"source.runtime\"\n | \"stack.top\"\n | ((event: LogEvent, context: ProcessorContext) => unknown);\n\nexport interface FingerprintOptions {\n parts?: readonly FingerprintPart[];\n hash?: (input: string) => string;\n target?: \"tags\" | \"context\";\n key?: string;\n separator?: string;\n prefix?: string;\n}\n\nconst DEFAULT_PARTS: readonly FingerprintPart[] = [\n \"logger\",\n \"type\",\n \"message\",\n \"error.name\",\n \"error.message\",\n \"source.integration\",\n];\n\nfunction fnv1a32(input: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction stackTop(stack: string | undefined): string | undefined {\n if (!stack) return undefined;\n const lines = stack.split(\"\\n\");\n return (lines[1] ?? lines[0])?.trim();\n}\n\nfunction partValue(part: FingerprintPart, event: LogEvent, context: ProcessorContext): unknown {\n if (typeof part === \"function\") return part(event, context);\n if (part === \"logger\") return event.logger;\n if (part === \"level\") return event.levelName;\n if (part === \"type\") return event.type;\n if (part === \"message\") return event.message;\n if (part === \"error.name\") return event.error?.name;\n if (part === \"error.message\") return event.error?.message;\n if (part === \"source.integration\") return event.source?.integration;\n if (part === \"source.runtime\") return event.source?.runtime;\n return stackTop(event.error?.stack);\n}\n\nfunction stringifyPart(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n if (value instanceof Error) return `${value.name}:${value.message}`;\n return String(value);\n}\n\nfunction writeFingerprint(\n event: LogEvent,\n target: \"tags\" | \"context\",\n key: string,\n fingerprint: string,\n): LogEvent {\n if (target === \"context\") {\n return {\n ...event,\n context: { ...event.context, [key]: fingerprint },\n };\n }\n\n return {\n ...event,\n tags: { ...event.tags, [key]: fingerprint },\n };\n}\n\nexport function fingerprintProcessor(options: FingerprintOptions = {}): Processor {\n const parts = options.parts ?? DEFAULT_PARTS;\n const hash = options.hash ?? fnv1a32;\n const target = options.target ?? \"tags\";\n const key = options.key ?? \"fingerprint\";\n const separator = options.separator ?? \"\\u001f\";\n const prefix = options.prefix ?? \"\";\n\n return (event, context) => {\n const input = parts\n .map((part) => stringifyPart(partValue(part, event, context)))\n .join(separator);\n return writeFingerprint(event, target, key, `${prefix}${hash(input)}`);\n };\n}\n","import type { Processor, SerializedError } from \"@loggerjs/core\";\n\nexport interface NormalizeErrorProcessorOptions {\n maxDepth?: number;\n maxStackLines?: number;\n includeEnumerableProperties?: boolean;\n includeAggregateErrors?: boolean;\n dataErrorKeys?: readonly string[];\n}\n\nexport interface NormalizedError extends SerializedError {\n cause?: NormalizedError;\n errors?: NormalizedError[];\n}\n\ninterface NormalizedOptions {\n maxDepth: number;\n maxStackLines: number;\n includeEnumerableProperties: boolean;\n includeAggregateErrors: boolean;\n dataErrorKeys: readonly string[];\n}\n\nfunction stackWithLimit(stack: unknown, maxStackLines: number): string | undefined {\n if (typeof stack !== \"string\" || maxStackLines <= 0) return undefined;\n return stack.split(\"\\n\").slice(0, maxStackLines).join(\"\\n\");\n}\n\nfunction errorMessage(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\" && \"message\" in value) {\n const message = (value as { message?: unknown }).message;\n if (typeof message === \"string\") return message;\n }\n return String(value);\n}\n\nfunction errorName(value: unknown): string | undefined {\n if (value && typeof value === \"object\" && \"name\" in value) {\n const name = (value as { name?: unknown }).name;\n if (typeof name === \"string\") return name;\n }\n return value instanceof Error ? value.name : undefined;\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction normalizeUnknownError(\n value: unknown,\n options: NormalizedOptions,\n depth: number,\n seen: WeakSet<object>,\n): NormalizedError {\n if (depth > options.maxDepth) return { message: \"[Max error depth]\" };\n if (value === null || value === undefined) return { message: String(value) };\n if (typeof value !== \"object\") return { message: errorMessage(value) };\n\n if (seen.has(value)) return { message: \"[Circular error]\" };\n seen.add(value);\n\n const record = objectRecord(value);\n const out: NormalizedError = {\n name: errorName(value),\n message: errorMessage(value),\n stack: stackWithLimit(record?.stack, options.maxStackLines),\n };\n\n const code = record?.code;\n if (typeof code === \"string\" || typeof code === \"number\") out.code = code;\n\n if (record?.cause !== undefined) {\n out.cause = normalizeUnknownError(record.cause, options, depth + 1, seen);\n }\n\n if (options.includeAggregateErrors && Array.isArray(record?.errors)) {\n out.errors = record.errors.map((item) => normalizeUnknownError(item, options, depth + 1, seen));\n }\n\n if (options.includeEnumerableProperties && record) {\n for (const key of Object.keys(record)) {\n if (key in out || key === \"errors\" || key === \"cause\") continue;\n out[key] = record[key];\n }\n }\n\n return out;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeDataErrors(\n data: unknown,\n options: NormalizedOptions,\n seen: WeakSet<object>,\n): unknown {\n if (!isRecord(data) || options.dataErrorKeys.length === 0) return data;\n\n let next: Record<string, unknown> | undefined;\n for (const key of options.dataErrorKeys) {\n if (!(key in data) || data[key] === undefined || data[key] === null) continue;\n next ??= { ...data };\n next[key] = normalizeUnknownError(data[key], options, 0, seen);\n }\n return next ?? data;\n}\n\nexport function normalizeErrorProcessor(options: NormalizeErrorProcessorOptions = {}): Processor {\n const normalized: NormalizedOptions = {\n maxDepth: Math.max(0, Math.floor(options.maxDepth ?? 5)),\n maxStackLines: Math.max(0, Math.floor(options.maxStackLines ?? 40)),\n includeEnumerableProperties: options.includeEnumerableProperties ?? true,\n includeAggregateErrors: options.includeAggregateErrors ?? true,\n dataErrorKeys: options.dataErrorKeys ?? [],\n };\n\n return (event) => {\n const seen = new WeakSet<object>();\n const error =\n event.error === undefined\n ? undefined\n : normalizeUnknownError(event.error, normalized, 0, seen);\n const data = normalizeDataErrors(event.data, normalized, seen);\n\n if (error === undefined && data === event.data) return event;\n return {\n ...event,\n error,\n data,\n };\n };\n}\n","import type { LogEvent, Processor } from \"@loggerjs/core\";\n\nexport interface StackFrame {\n raw?: string;\n function?: string;\n file?: string;\n line?: number;\n column?: number;\n}\n\nexport interface StackParserOptions {\n maxFrames?: number;\n dropInternal?: boolean;\n includeRaw?: boolean;\n target?: \"error\" | \"context\";\n key?: string;\n parser?: (stack: string) => readonly StackFrame[];\n}\n\nconst V8_FRAME = /^\\s*at\\s+(?:(.*?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?\\s*$/;\nconst FIREFOX_FRAME = /^\\s*(?:(.*?)@)?(.+?):(\\d+):(\\d+)\\s*$/;\n\nfunction toNumber(input: string): number | undefined {\n const value = Number(input);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction cleanFunctionName(input: string | undefined): string | undefined {\n if (!input || input === \"async\") return undefined;\n return input.trim() || undefined;\n}\n\nfunction frameFromMatch(raw: string, match: RegExpMatchArray): StackFrame {\n return {\n raw,\n function: cleanFunctionName(match[1]),\n file: match[2],\n line: match[3] ? toNumber(match[3]) : undefined,\n column: match[4] ? toNumber(match[4]) : undefined,\n };\n}\n\nfunction parseLine(raw: string): StackFrame {\n const v8 = raw.match(V8_FRAME);\n if (v8) return frameFromMatch(raw, v8);\n\n const firefox = raw.match(FIREFOX_FRAME);\n if (firefox) return frameFromMatch(raw, firefox);\n\n return { raw };\n}\n\nfunction isInternalFrame(frame: StackFrame): boolean {\n const file = frame.file ?? frame.raw ?? \"\";\n return file.startsWith(\"node:internal\") || file.includes(\"/node:internal/\");\n}\n\nfunction defaultParseStack(stack: string): StackFrame[] {\n const frames: StackFrame[] = [];\n for (const raw of stack.split(\"\\n\")) {\n const line = raw.trim();\n if (!line || !line.includes(\":\")) continue;\n const frame = parseLine(line);\n if (frame.file || line.startsWith(\"at \") || line.includes(\"@\")) frames.push(frame);\n }\n return frames;\n}\n\nfunction stripRaw(frame: StackFrame): StackFrame {\n const { raw: _raw, ...rest } = frame;\n return rest;\n}\n\nfunction normalizeFrames(\n frames: readonly StackFrame[],\n options: RequiredStackOptions,\n): StackFrame[] {\n const out: StackFrame[] = [];\n for (const frame of frames) {\n if (options.dropInternal && isInternalFrame(frame)) continue;\n out.push(options.includeRaw ? frame : stripRaw(frame));\n if (out.length >= options.maxFrames) break;\n }\n return out;\n}\n\ninterface RequiredStackOptions {\n maxFrames: number;\n dropInternal: boolean;\n includeRaw: boolean;\n target: \"error\" | \"context\";\n key: string;\n parser: (stack: string) => readonly StackFrame[];\n}\n\nfunction writeFrames(\n event: LogEvent,\n options: RequiredStackOptions,\n frames: StackFrame[],\n): LogEvent {\n if (options.target === \"context\") {\n return { ...event, context: { ...event.context, [options.key]: frames } };\n }\n return {\n ...event,\n error: {\n message: event.error?.message ?? event.message,\n ...event.error,\n [options.key]: frames,\n },\n };\n}\n\nexport function parseStack(stack: string): StackFrame[] {\n return defaultParseStack(stack);\n}\n\nexport function stackParserProcessor(options: StackParserOptions = {}): Processor {\n const normalized: RequiredStackOptions = {\n maxFrames: Math.max(0, Math.floor(options.maxFrames ?? 20)),\n dropInternal: options.dropInternal ?? false,\n includeRaw: options.includeRaw ?? true,\n target: options.target ?? \"error\",\n key: options.key ?? \"frames\",\n parser: options.parser ?? defaultParseStack,\n };\n\n return (event) => {\n const stack = event.error?.stack;\n if (!stack || normalized.maxFrames === 0) return event;\n\n const frames = normalizeFrames(normalized.parser(stack), normalized);\n return frames.length > 0 ? writeFrames(event, normalized, frames) : event;\n };\n}\n","import type { LogEvent, Processor } from \"@loggerjs/core\";\n\nexport type PrivacyGuardMatcher =\n | string\n | RegExp\n | ((key: string, path: string, value: unknown) => boolean);\n\nexport type PrivacyGuardTarget = \"message\" | \"data\" | \"context\" | \"tags\" | \"error\";\n\nexport interface PrivacyPattern {\n name: string;\n pattern: RegExp;\n replacement?: string;\n validate?: (match: string) => boolean;\n}\n\nexport interface PrivacyGuardOptions {\n targets?: readonly PrivacyGuardTarget[];\n denyKeys?: readonly PrivacyGuardMatcher[];\n allowKeys?: readonly PrivacyGuardMatcher[];\n patterns?: readonly PrivacyPattern[];\n replacement?: string;\n maxDepth?: number;\n maxStringLength?: number;\n truncateSuffix?: string;\n onRedact?: (path: string, reason: string) => void;\n}\n\ninterface NormalizedPrivacyOptions {\n targets: ReadonlySet<PrivacyGuardTarget>;\n denyKeys: readonly PrivacyGuardMatcher[];\n allowKeys: readonly PrivacyGuardMatcher[];\n patterns: readonly PrivacyPattern[];\n replacement: string;\n maxDepth: number;\n maxStringLength: number;\n truncateSuffix: string;\n onRedact?: (path: string, reason: string) => void;\n}\n\ninterface GuardResult {\n value: unknown;\n changed: boolean;\n}\n\nconst DEFAULT_DENY_KEYS: readonly PrivacyGuardMatcher[] = [\n \"password\",\n \"passwd\",\n \"secret\",\n \"token\",\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"apiKey\",\n \"api_key\",\n /session/i,\n];\n\nfunction digitsOnly(input: string): string {\n return input.replace(/\\D/g, \"\");\n}\n\nfunction passesLuhn(input: string): boolean {\n const digits = digitsOnly(input);\n if (digits.length < 13 || digits.length > 19) return false;\n\n let sum = 0;\n let doubleDigit = false;\n for (let index = digits.length - 1; index >= 0; index -= 1) {\n let value = digits.charCodeAt(index) - 48;\n if (doubleDigit) {\n value *= 2;\n if (value > 9) value -= 9;\n }\n sum += value;\n doubleDigit = !doubleDigit;\n }\n return sum % 10 === 0;\n}\n\nconst DEFAULT_PATTERNS: readonly PrivacyPattern[] = [\n {\n name: \"email\",\n pattern: /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi,\n },\n {\n name: \"bearer-token\",\n pattern: /\\bBearer\\s+[A-Za-z0-9._~+/=-]+\\b/g,\n },\n {\n name: \"credit-card\",\n pattern: /\\b(?:\\d[ -]*?){13,19}\\b/g,\n validate: passesLuhn,\n },\n];\n\nfunction matcherMatches(\n matcher: PrivacyGuardMatcher,\n key: string,\n path: string,\n value: unknown,\n): boolean {\n if (typeof matcher === \"string\") return matcher.toLowerCase() === key.toLowerCase();\n if (matcher instanceof RegExp) {\n matcher.lastIndex = 0;\n return matcher.test(key) || matcher.test(path);\n }\n return matcher(key, path, value);\n}\n\nfunction matchesAny(\n matchers: readonly PrivacyGuardMatcher[],\n key: string,\n path: string,\n value: unknown,\n): boolean {\n return matchers.some((matcher) => matcherMatches(matcher, key, path, value));\n}\n\nfunction redact(path: string, reason: string, options: NormalizedPrivacyOptions): string {\n options.onRedact?.(path, reason);\n return options.replacement;\n}\n\nfunction guardString(input: string, path: string, options: NormalizedPrivacyOptions): GuardResult {\n let value = input;\n\n for (const item of options.patterns) {\n item.pattern.lastIndex = 0;\n value = value.replace(item.pattern, (match) => {\n if (item.validate && !item.validate(match)) return match;\n options.onRedact?.(path, item.name);\n return item.replacement ?? options.replacement;\n });\n }\n\n if (value.length > options.maxStringLength) {\n options.onRedact?.(path, \"max-string-length\");\n value = `${value.slice(0, options.maxStringLength)}${options.truncateSuffix}`;\n }\n\n return { value, changed: value !== input };\n}\n\nfunction guardValue(\n value: unknown,\n path: string,\n key: string,\n depth: number,\n options: NormalizedPrivacyOptions,\n seen: WeakMap<object, unknown>,\n): GuardResult {\n if (\n matchesAny(options.denyKeys, key, path, value) &&\n !matchesAny(options.allowKeys, key, path, value)\n ) {\n return { value: redact(path, \"deny-key\", options), changed: true };\n }\n\n if (typeof value === \"string\") return guardString(value, path, options);\n if (value === null || value === undefined || typeof value !== \"object\") {\n return { value, changed: false };\n }\n if (depth >= options.maxDepth) {\n return { value: redact(path, \"max-depth\", options), changed: true };\n }\n if (seen.has(value)) return { value: seen.get(value), changed: true };\n if (value instanceof Date || value instanceof Error) return { value, changed: false };\n\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n seen.set(value, out);\n let changed = false;\n for (let index = 0; index < value.length; index += 1) {\n const child = guardValue(\n value[index],\n `${path}[${index}]`,\n String(index),\n depth + 1,\n options,\n seen,\n );\n out[index] = child.value;\n changed ||= child.changed;\n }\n return { value: changed ? out : value, changed };\n }\n\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n seen.set(value, out);\n let changed = false;\n for (const [childKey, childValue] of Object.entries(input)) {\n const childPath = path ? `${path}.${childKey}` : childKey;\n const child = guardValue(childValue, childPath, childKey, depth + 1, options, seen);\n out[childKey] = child.value;\n changed ||= child.changed;\n }\n return { value: changed ? out : value, changed };\n}\n\nfunction guardField<T>(\n value: T,\n path: string,\n options: NormalizedPrivacyOptions,\n): { value: T; changed: boolean } {\n const guarded = guardValue(value, path, path, 0, options, new WeakMap<object, unknown>());\n return { value: guarded.value as T, changed: guarded.changed };\n}\n\nfunction maybeSet<T extends object, K extends keyof T>(\n target: T,\n key: K,\n value: T[K],\n changed: boolean,\n): T {\n if (!changed) return target;\n return { ...target, [key]: value };\n}\n\nexport function privacyGuardProcessor(options: PrivacyGuardOptions = {}): Processor {\n const normalized: NormalizedPrivacyOptions = {\n targets: new Set(options.targets ?? [\"message\", \"data\", \"context\", \"tags\", \"error\"]),\n denyKeys: options.denyKeys ?? DEFAULT_DENY_KEYS,\n allowKeys: options.allowKeys ?? [],\n patterns: options.patterns ?? DEFAULT_PATTERNS,\n replacement: options.replacement ?? \"[REDACTED]\",\n maxDepth: Math.max(0, Math.floor(options.maxDepth ?? 8)),\n maxStringLength: Math.max(1, Math.floor(options.maxStringLength ?? 8_192)),\n truncateSuffix: options.truncateSuffix ?? \"...\",\n onRedact: options.onRedact,\n };\n\n return (event) => {\n let next: LogEvent = event;\n\n if (normalized.targets.has(\"message\")) {\n const result = guardString(event.message, \"message\", normalized);\n next = maybeSet(next, \"message\", result.value as string, result.changed);\n }\n if (normalized.targets.has(\"data\")) {\n const result = guardField(event.data, \"data\", normalized);\n next = maybeSet(next, \"data\", result.value, result.changed);\n }\n if (normalized.targets.has(\"context\")) {\n const result = guardField(event.context, \"context\", normalized);\n next = maybeSet(next, \"context\", result.value, result.changed);\n }\n if (normalized.targets.has(\"tags\")) {\n const result = guardField(event.tags, \"tags\", normalized);\n next = maybeSet(next, \"tags\", result.value, result.changed);\n }\n if (normalized.targets.has(\"error\")) {\n const result = guardField(event.error, \"error\", normalized);\n next = maybeSet(next, \"error\", result.value, result.changed);\n }\n\n return next;\n };\n}\n","import type { LogEvent, Processor, ProcessorContext } from \"@loggerjs/core\";\n\nexport type SchemaCheckResult = true | false | string | readonly string[] | void;\nexport type SchemaValidator = (\n data: unknown,\n event: LogEvent,\n context: ProcessorContext,\n) => SchemaCheckResult;\n\nexport type SchemaDevCheckAction = \"report\" | \"tag\" | \"drop\";\n\nexport interface SchemaDevCheckOptions {\n enabled?: boolean;\n action?: SchemaDevCheckAction;\n validators?: Readonly<Record<string, SchemaValidator>>;\n validate?: SchemaValidator;\n select?: (event: LogEvent, context: ProcessorContext) => SchemaValidator | undefined;\n tagKey?: string;\n contextKey?: string;\n onInvalid?: (event: LogEvent, errors: readonly string[]) => void;\n}\n\nfunction resultToErrors(result: SchemaCheckResult): readonly string[] {\n if (result === undefined || result === true) return [];\n if (result === false) return [\"schema validation failed\"];\n if (typeof result === \"string\") return [result];\n return result;\n}\n\nfunction validatorFor(\n event: LogEvent,\n context: ProcessorContext,\n options: SchemaDevCheckOptions,\n): SchemaValidator | undefined {\n return (\n options.validate ??\n options.select?.(event, context) ??\n (event.type ? options.validators?.[event.type] : undefined)\n );\n}\n\nfunction tagInvalid(\n event: LogEvent,\n options: SchemaDevCheckOptions,\n errors: readonly string[],\n): LogEvent {\n return {\n ...event,\n tags: { ...event.tags, [options.tagKey ?? \"schemaInvalid\"]: true },\n context: { ...event.context, [options.contextKey ?? \"schemaErrors\"]: [...errors] },\n };\n}\n\nfunction reportInvalid(\n event: LogEvent,\n context: ProcessorContext,\n options: SchemaDevCheckOptions,\n errors: readonly string[],\n): void {\n options.onInvalid?.(event, errors);\n context.reportInternalError(\n new Error(`loggerjs schema validation failed: ${errors.join(\"; \")}`),\n {\n phase: \"processor\",\n processor: \"schema-dev-check\",\n eventType: event.type,\n logger: event.logger,\n },\n );\n}\n\nexport function schemaDevCheckProcessor(options: SchemaDevCheckOptions = {}): Processor {\n const enabled = options.enabled ?? true;\n const action = options.action ?? \"report\";\n\n return (event, context) => {\n if (!enabled) return event;\n\n const validator = validatorFor(event, context, options);\n if (!validator) return event;\n\n let errors: readonly string[];\n try {\n errors = resultToErrors(validator(event.data, event, context));\n } catch (error) {\n context.reportInternalError(error, {\n phase: \"processor\",\n processor: \"schema-dev-check\",\n eventType: event.type,\n logger: event.logger,\n });\n return event;\n }\n\n if (errors.length === 0) return event;\n if (action === \"drop\") {\n options.onInvalid?.(event, errors);\n return false;\n }\n if (action === \"tag\") {\n reportInvalid(event, context, options, errors);\n return tagInvalid(event, options, errors);\n }\n\n reportInvalid(event, context, options, errors);\n return event;\n };\n}\n","import {\n incrementLoggerMetaCounter,\n type EnabledLogLevelName,\n type LogEvent,\n type Processor,\n type ProcessorContext,\n} from \"@loggerjs/core\";\n\nexport interface DynamicSamplerStats {\n readonly key: string;\n readonly seen: number;\n readonly kept: number;\n readonly dropped: number;\n readonly lastSeenMs: number;\n}\n\nexport interface DynamicSamplerDecisionContext extends DynamicSamplerStats {\n readonly now: number;\n}\n\nexport type DynamicSampleRate =\n | number\n | ((event: LogEvent, state: DynamicSamplerDecisionContext) => number);\n\nexport interface DynamicSamplerRule {\n rate: DynamicSampleRate;\n when?: (event: LogEvent, context: ProcessorContext) => boolean;\n key?: (event: LogEvent) => string;\n stickyBy?: (event: LogEvent) => string | undefined;\n}\n\nexport interface DynamicSamplerProcessor extends Processor {\n stats(): readonly DynamicSamplerStats[];\n reset(key?: string): void;\n}\n\nexport interface DynamicSamplerOptions {\n defaultRate?: DynamicSampleRate;\n rules?: readonly DynamicSamplerRule[];\n key?: (event: LogEvent) => string;\n stickyBy?: (event: LogEvent) => string | undefined;\n random?: () => number;\n exemptLevels?: readonly EnabledLogLevelName[];\n maxKeys?: number;\n onDrop?: (event: LogEvent, key: string, rate: number) => void;\n}\n\ninterface MutableStats {\n key: string;\n seen: number;\n kept: number;\n dropped: number;\n lastSeenMs: number;\n}\n\nconst DEFAULT_EXEMPT_LEVELS = new Set<EnabledLogLevelName>([\"error\", \"fatal\"]);\n\nfunction defaultKey(event: LogEvent): string {\n return event.trace?.traceId ?? `${event.logger}:${event.levelName}:${event.type ?? \"manual\"}`;\n}\n\nfunction clampRate(rate: number): number {\n if (!Number.isFinite(rate) || Number.isNaN(rate)) return 1;\n return Math.max(0, Math.min(1, rate));\n}\n\nfunction hashRatio(input: string): number {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0) / 0x100000000;\n}\n\nfunction snapshot(stats: MutableStats): DynamicSamplerStats {\n return {\n key: stats.key,\n seen: stats.seen,\n kept: stats.kept,\n dropped: stats.dropped,\n lastSeenMs: stats.lastSeenMs,\n };\n}\n\nfunction decisionContext(stats: MutableStats, now: number): DynamicSamplerDecisionContext {\n return { ...snapshot(stats), now };\n}\n\nfunction resolveRule(\n event: LogEvent,\n context: ProcessorContext,\n options: DynamicSamplerOptions,\n): DynamicSamplerRule {\n const rule = options.rules?.find((item) => !item.when || item.when(event, context));\n return {\n rate: rule?.rate ?? options.defaultRate ?? 1,\n key: rule?.key ?? options.key ?? defaultKey,\n stickyBy: rule?.stickyBy ?? options.stickyBy,\n };\n}\n\nfunction prune(statsByKey: Map<string, MutableStats>, maxKeys: number): void {\n while (statsByKey.size > maxKeys) {\n let oldest: MutableStats | undefined;\n for (const item of statsByKey.values()) {\n if (!oldest || item.lastSeenMs < oldest.lastSeenMs) oldest = item;\n }\n if (!oldest) return;\n statsByKey.delete(oldest.key);\n }\n}\n\nfunction shouldKeep(\n event: LogEvent,\n rule: DynamicSamplerRule,\n rate: number,\n random: () => number,\n): boolean {\n if (rate >= 1) return true;\n if (rate <= 0) return false;\n\n const stickyKey = rule.stickyBy?.(event);\n return (stickyKey ? hashRatio(stickyKey) : random()) < rate;\n}\n\nexport function dynamicSamplerProcessor(\n options: DynamicSamplerOptions = {},\n): DynamicSamplerProcessor {\n const random = options.random ?? Math.random;\n const exemptLevels = new Set(options.exemptLevels ?? DEFAULT_EXEMPT_LEVELS);\n const maxKeys = Math.max(1, Math.floor(options.maxKeys ?? 10_000));\n const statsByKey = new Map<string, MutableStats>();\n\n const processor = ((event, context) => {\n if (exemptLevels.has(event.levelName)) return event;\n\n const now = context.now();\n const rule = resolveRule(event, context, options);\n const key = (rule.key ?? defaultKey)(event);\n let stats = statsByKey.get(key);\n if (!stats) {\n stats = { key, seen: 0, kept: 0, dropped: 0, lastSeenMs: now };\n statsByKey.set(key, stats);\n prune(statsByKey, maxKeys);\n }\n\n stats.seen += 1;\n stats.lastSeenMs = now;\n\n const rateValue =\n typeof rule.rate === \"function\" ? rule.rate(event, decisionContext(stats, now)) : rule.rate;\n const rate = clampRate(rateValue);\n\n if (shouldKeep(event, rule, rate, random)) {\n stats.kept += 1;\n return event;\n }\n\n stats.dropped += 1;\n incrementLoggerMetaCounter(\"processor.dynamicSampler.dropped\");\n incrementLoggerMetaCounter(`processor.dynamicSampler.dropped.${event.levelName}`);\n options.onDrop?.(event, key, rate);\n return false;\n }) as DynamicSamplerProcessor;\n\n processor.stats = () => [...statsByKey.values()].map(snapshot);\n processor.reset = (key?: string) => {\n if (key) statsByKey.delete(key);\n else statsByKey.clear();\n };\n\n return processor;\n}\n","import { toLevelValue, type LogEvent, type LoggerLevel, type Processor } from \"@loggerjs/core\";\n\nexport interface Breadcrumb {\n time: number;\n levelName: LogEvent[\"levelName\"];\n logger: string;\n message: string;\n type?: string;\n tags?: LogEvent[\"tags\"];\n source?: LogEvent[\"source\"];\n}\n\nexport interface BreadcrumbBufferState {\n readonly key: string;\n readonly buffered: number;\n readonly lastSeenMs: number;\n}\n\nexport interface BreadcrumbBufferProcessor extends Processor {\n states(): readonly BreadcrumbBufferState[];\n reset(key?: string): void;\n}\n\nexport interface BreadcrumbBufferOptions<TBreadcrumb = Breadcrumb> {\n triggerLevel?: LoggerLevel;\n shouldAttach?: (event: LogEvent) => boolean;\n shouldBuffer?: (event: LogEvent) => boolean;\n bufferSize?: number;\n maxBuckets?: number;\n key?: (event: LogEvent) => string;\n map?: (event: LogEvent) => TBreadcrumb;\n target?: \"context\" | \"data\";\n field?: string;\n includeTrigger?: boolean;\n clearOnTrigger?: boolean;\n}\n\ninterface MutableState<TBreadcrumb> {\n key: string;\n buffer: TBreadcrumb[];\n lastSeenMs: number;\n}\n\nfunction defaultKey(event: LogEvent): string {\n const contextKey = event.context?.sessionId ?? event.context?.userId;\n return event.trace?.traceId ?? (contextKey === undefined ? event.logger : String(contextKey));\n}\n\nfunction defaultBreadcrumb(event: LogEvent): Breadcrumb {\n return {\n time: event.time,\n levelName: event.levelName,\n logger: event.logger,\n message: event.message,\n type: event.type,\n tags: event.tags,\n source: event.source,\n };\n}\n\nfunction normalizeCount(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeBucketCount(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) return 1024;\n return Math.max(1, Math.floor(value));\n}\n\nfunction snapshot<TBreadcrumb>(state: MutableState<TBreadcrumb>): BreadcrumbBufferState {\n return {\n key: state.key,\n buffered: state.buffer.length,\n lastSeenMs: state.lastSeenMs,\n };\n}\n\nfunction prune<TBreadcrumb>(\n states: Map<string, MutableState<TBreadcrumb>>,\n maxBuckets: number,\n): void {\n while (states.size > maxBuckets) {\n let oldest: MutableState<TBreadcrumb> | undefined;\n for (const state of states.values()) {\n if (!oldest || state.lastSeenMs < oldest.lastSeenMs) oldest = state;\n }\n if (!oldest) return;\n states.delete(oldest.key);\n }\n}\n\nfunction attachBreadcrumbs<TBreadcrumb>(\n event: LogEvent,\n target: \"context\" | \"data\",\n field: string,\n breadcrumbs: readonly TBreadcrumb[],\n): LogEvent {\n if (breadcrumbs.length === 0) return event;\n if (\n target === \"data\" &&\n event.data &&\n typeof event.data === \"object\" &&\n !Array.isArray(event.data)\n ) {\n return { ...event, data: { ...(event.data as Record<string, unknown>), [field]: breadcrumbs } };\n }\n if (target === \"data\") {\n return { ...event, data: { value: event.data, [field]: breadcrumbs } };\n }\n return { ...event, context: { ...event.context, [field]: breadcrumbs } };\n}\n\nexport function breadcrumbBufferProcessor<TBreadcrumb = Breadcrumb>(\n options: BreadcrumbBufferOptions<TBreadcrumb> = {},\n): BreadcrumbBufferProcessor {\n const triggerLevel = toLevelValue(options.triggerLevel ?? \"error\");\n const shouldAttach = options.shouldAttach ?? ((event: LogEvent) => event.level >= triggerLevel);\n const shouldBuffer = options.shouldBuffer ?? ((event: LogEvent) => event.level < triggerLevel);\n const bufferSize = normalizeCount(options.bufferSize, 50);\n const maxBuckets = normalizeBucketCount(options.maxBuckets);\n const keyFor = options.key ?? defaultKey;\n const map = options.map ?? (defaultBreadcrumb as (event: LogEvent) => TBreadcrumb);\n const target = options.target ?? \"context\";\n const field = options.field ?? \"breadcrumbs\";\n const includeTrigger = options.includeTrigger ?? false;\n const clearOnTrigger = options.clearOnTrigger ?? false;\n const states = new Map<string, MutableState<TBreadcrumb>>();\n\n const getState = (key: string, now: number): MutableState<TBreadcrumb> => {\n let state = states.get(key);\n if (!state) {\n state = { key, buffer: [], lastSeenMs: now };\n states.set(key, state);\n prune(states, maxBuckets);\n }\n state.lastSeenMs = now;\n return state;\n };\n\n const processor = ((event: LogEvent) => {\n const state = getState(keyFor(event), event.time);\n\n if (shouldAttach(event)) {\n const breadcrumbs = includeTrigger ? [...state.buffer, map(event)] : [...state.buffer];\n const next = attachBreadcrumbs(event, target, field, breadcrumbs);\n if (clearOnTrigger) state.buffer.splice(0, state.buffer.length);\n return next;\n }\n\n if (bufferSize > 0 && shouldBuffer(event)) {\n state.buffer.push(map(event));\n if (state.buffer.length > bufferSize) {\n state.buffer.splice(0, state.buffer.length - bufferSize);\n }\n }\n\n return event;\n }) as unknown as BreadcrumbBufferProcessor;\n\n processor.states = () => [...states.values()].map(snapshot);\n processor.reset = (key?: string) => {\n if (key) states.delete(key);\n else states.clear();\n };\n\n return processor;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["clampRate","DEFAULT_EXEMPT_LEVELS","defaultKey","snapshot","normalizeCount","normalizeBucketCount","snapshot","isRecord","writeFrames","defaultKey","snapshot","prune"],"sources":["../src/redact.ts","../src/sample.ts","../src/tags.ts","../src/coalesce.ts","../src/dedupe.ts","../src/trace.ts","../src/rate-limit.ts","../src/fingers-crossed.ts","../src/enrich.ts","../src/level-override.ts","../src/filter-route.ts","../src/fingerprint.ts","../src/normalize-error.ts","../src/stack-parser.ts","../src/symbolicate-stack.ts","../src/privacy-guard.ts","../src/schema-dev-check.ts","../src/dynamic-sampler.ts","../src/breadcrumb-buffer.ts"],"sourcesContent":["import type { LogEvent, Processor } from \"@loggerjs/core\";\n\nexport type RedactMatcher =\n | string\n | RegExp\n | ((key: string, path: string, value: unknown) => boolean);\n\nexport interface RedactOptions {\n keys?: RedactMatcher[];\n paths?: string[];\n replacement?: string;\n censor?: string;\n remove?: boolean;\n maxDepth?: number;\n}\n\nfunction matchesKey(key: string, path: string, value: unknown, matchers: RedactMatcher[]): boolean {\n return matchers.some((matcher) => {\n if (typeof matcher === \"string\") return matcher.toLowerCase() === key.toLowerCase();\n if (matcher instanceof RegExp) {\n matcher.lastIndex = 0;\n const keyMatches = matcher.test(key);\n matcher.lastIndex = 0;\n return keyMatches || matcher.test(path);\n }\n return matcher(key, path, value);\n });\n}\n\nfunction pathMatches(path: string, paths: string[]): boolean {\n return paths.includes(path);\n}\n\nfunction redactValue(\n value: unknown,\n options: Required<Pick<RedactOptions, \"replacement\" | \"remove\" | \"maxDepth\">> &\n Pick<RedactOptions, \"keys\" | \"paths\">,\n path = \"\",\n depth = 0,\n seen = new WeakMap<object, unknown>(),\n): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value !== \"object\") return value;\n if (depth >= options.maxDepth) return value;\n if (seen.has(value)) return seen.get(value);\n\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n seen.set(value, out);\n for (let index = 0; index < value.length; index += 1) {\n out[index] = redactValue(value[index], options, `${path}[${index}]`, depth + 1, seen);\n }\n return out;\n }\n\n if (value instanceof Error) return value;\n if (value instanceof Date) return value;\n\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n seen.set(value, out);\n for (const [key, child] of Object.entries(input)) {\n const childPath = path ? `${path}.${key}` : key;\n if (\n matchesKey(key, childPath, child, options.keys ?? []) ||\n pathMatches(childPath, options.paths ?? [])\n ) {\n if (options.remove) continue;\n out[key] = options.replacement;\n } else {\n out[key] = redactValue(child, options, childPath, depth + 1, seen);\n }\n }\n return out;\n}\n\nexport function redactProcessor(options: RedactOptions = {}): Processor {\n const normalized = {\n keys: options.keys ?? [\n \"password\",\n \"passwd\",\n \"secret\",\n \"token\",\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"apiKey\",\n \"api_key\",\n ],\n paths: options.paths ?? [],\n replacement: options.replacement ?? options.censor ?? \"[REDACTED]\",\n remove: options.remove ?? false,\n maxDepth: options.maxDepth ?? 8,\n };\n\n return (event: LogEvent): LogEvent => ({\n ...event,\n data: redactValue(event.data, normalized),\n context: redactValue(event.context, normalized) as Record<string, unknown> | undefined,\n tags: redactValue(event.tags, normalized) as LogEvent[\"tags\"],\n error: redactValue(event.error, normalized) as LogEvent[\"error\"],\n });\n}\n","import type { EnabledLogLevelName, LogEvent, Processor } from \"@loggerjs/core\";\n\nexport interface SampleOptions {\n defaultRate?: number;\n rates?: Partial<Record<EnabledLogLevelName, number>>;\n random?: () => number;\n}\n\nfunction clampRate(rate: number): number {\n if (Number.isNaN(rate)) return 1;\n return Math.max(0, Math.min(1, rate));\n}\n\nexport function sampleProcessor(options: SampleOptions = {}): Processor {\n const defaultRate = clampRate(options.defaultRate ?? 1);\n const random = options.random ?? Math.random;\n const rates = options.rates ?? {};\n\n return (event: LogEvent): LogEvent | false => {\n const rate = clampRate(rates[event.levelName] ?? defaultRate);\n if (rate >= 1) return event;\n if (rate <= 0) return false;\n return random() < rate ? event : false;\n };\n}\n","import {\n createBoundContext,\n createMiddleware,\n type Middleware,\n type Processor,\n type Tags,\n} from \"@loggerjs/core\";\n\nexport function tagsMiddleware(tags: Tags): Middleware {\n return createMiddleware(\"tags\", (record) => {\n record.tags = {\n ...record.tags,\n ...tags,\n };\n return record;\n });\n}\n\nexport function typeMiddleware(type: string): Middleware {\n return createMiddleware(\"type\", (record) => {\n record.type = type;\n return record;\n });\n}\n\nexport function contextMiddleware(context: Record<string, unknown>): Middleware {\n return createMiddleware(\"context\", (record) => {\n record.ctx = createBoundContext({\n ...record.ctx,\n ...context,\n });\n return record;\n });\n}\n\nexport function tagsProcessor(tags: Tags): Processor {\n return (event) => ({\n ...event,\n tags: {\n ...event.tags,\n ...tags,\n },\n });\n}\n\nexport function typeProcessor(type: string): Processor {\n return (event) => ({\n ...event,\n type,\n });\n}\n\nexport function contextProcessor(context: Record<string, unknown>): Processor {\n return (event) => ({\n ...event,\n context: {\n ...event.context,\n ...context,\n },\n });\n}\n","import { incrementLoggerMetaCounter, type LogEvent, type Processor } from \"@loggerjs/core\";\n\nexport interface CoalesceOptions {\n windowMs?: number;\n maxEntries?: number;\n key?: (event: LogEvent) => string;\n field?: string;\n updateMessage?: boolean;\n}\n\ninterface CoalesceState {\n firstSeen: number;\n lastSeen: number;\n count: number;\n}\n\nfunction attachCoalesced(\n event: LogEvent,\n field: string,\n key: string,\n state: CoalesceState,\n updateMessage: boolean,\n): LogEvent {\n if (state.count <= 1) return event;\n const payload = {\n key,\n count: state.count,\n firstSeen: state.firstSeen,\n lastSeen: state.lastSeen,\n };\n return {\n ...event,\n message: updateMessage ? `${event.message} (x${state.count})` : event.message,\n data:\n event.data && typeof event.data === \"object\" && !Array.isArray(event.data)\n ? { ...(event.data as Record<string, unknown>), [field]: payload }\n : { value: event.data, [field]: payload },\n };\n}\n\nexport function coalesceProcessor(options: CoalesceOptions = {}): Processor {\n const windowMs = options.windowMs ?? 1000;\n const maxEntries = options.maxEntries ?? 1000;\n const field = options.field ?? \"coalesced\";\n const updateMessage = options.updateMessage ?? true;\n const keyFor =\n options.key ?? ((event) => `${event.levelName}:${event.message}:${event.error?.message ?? \"\"}`);\n const seen = new Map<string, CoalesceState>();\n\n return (event, context): LogEvent | false => {\n const now = context.now();\n const key = keyFor(event);\n const previous = seen.get(key);\n\n if (previous && now - previous.lastSeen < windowMs) {\n previous.count += 1;\n previous.lastSeen = now;\n incrementLoggerMetaCounter(\"processor.coalesce.suppressed\");\n return false;\n }\n\n const next: CoalesceState = {\n firstSeen: now,\n lastSeen: now,\n count: 1,\n };\n seen.set(key, next);\n\n if (seen.size > maxEntries) {\n const cutoff = now - windowMs;\n for (const [entryKey, state] of seen) {\n if (state.lastSeen < cutoff || seen.size > maxEntries) seen.delete(entryKey);\n }\n }\n\n return previous ? attachCoalesced(event, field, key, previous, updateMessage) : event;\n };\n}\n","import type { LogEvent, Processor } from \"@loggerjs/core\";\n\nexport interface DedupeOptions {\n windowMs?: number;\n maxEntries?: number;\n key?: (event: LogEvent) => string;\n}\n\nexport function dedupeProcessor(options: DedupeOptions = {}): Processor {\n const windowMs = options.windowMs ?? 1000;\n const maxEntries = options.maxEntries ?? 1000;\n const keyFor =\n options.key ?? ((event) => `${event.levelName}:${event.message}:${event.error?.message ?? \"\"}`);\n const seen = new Map<string, number>();\n\n return (event, context): LogEvent | false => {\n const now = context.now();\n const key = keyFor(event);\n const previous = seen.get(key);\n if (previous !== undefined && now - previous < windowMs) return false;\n seen.set(key, now);\n\n if (seen.size > maxEntries) {\n const cutoff = now - windowMs;\n for (const [entryKey, timestamp] of seen) {\n if (timestamp < cutoff || seen.size > maxEntries) seen.delete(entryKey);\n }\n }\n\n return event;\n };\n}\n","import {\n createMiddleware,\n type Middleware,\n type Processor,\n type TraceContext,\n} from \"@loggerjs/core\";\n\nexport type TraceContextProvider = () => TraceContext | undefined;\n\nexport function traceContextMiddleware(provider: TraceContextProvider): Middleware {\n return createMiddleware(\"traceContext\", (record) => {\n const trace = provider();\n if (!trace) return record;\n record.trace = {\n ...record.trace,\n ...trace,\n };\n return record;\n });\n}\n\nexport function traceContextProcessor(provider: TraceContextProvider): Processor {\n return (event) => {\n const trace = provider();\n if (!trace) return event;\n return {\n ...event,\n trace: {\n ...event.trace,\n ...trace,\n },\n };\n };\n}\n","import {\n incrementLoggerMetaCounter,\n type EnabledLogLevelName,\n type LogEvent,\n type Processor,\n} from \"@loggerjs/core\";\n\nexport interface RateLimitBucket {\n readonly key: string;\n readonly tokens: number;\n readonly lastRefillMs: number;\n}\n\nexport interface RateLimitProcessor extends Processor {\n buckets(): readonly RateLimitBucket[];\n}\n\nexport interface RateLimitOptions {\n capacity?: number;\n refillPerSecond?: number;\n key?: (event: LogEvent) => string;\n exemptLevels?: readonly EnabledLogLevelName[];\n maxBuckets?: number;\n onDrop?: (event: LogEvent, key: string) => void;\n}\n\ninterface MutableBucket {\n key: string;\n tokens: number;\n lastRefillMs: number;\n lastSeenMs: number;\n}\n\nconst DEFAULT_EXEMPT_LEVELS = new Set<EnabledLogLevelName>([\"error\", \"fatal\"]);\n\nfunction defaultKey(event: LogEvent): string {\n return `${event.logger}:${event.levelName}:${event.source?.integration ?? event.type ?? \"manual\"}`;\n}\n\nfunction normalizePositive(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value <= 0) return fallback;\n return value;\n}\n\nfunction normalizeNonNegative(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value < 0) return fallback;\n return value;\n}\n\nfunction snapshot(bucket: MutableBucket): RateLimitBucket {\n return {\n key: bucket.key,\n tokens: bucket.tokens,\n lastRefillMs: bucket.lastRefillMs,\n };\n}\n\nexport function rateLimitProcessor(options: RateLimitOptions = {}): RateLimitProcessor {\n const capacity = normalizePositive(options.capacity, 100);\n const refillPerSecond = normalizeNonNegative(options.refillPerSecond, capacity);\n const maxBuckets = Math.max(1, Math.floor(options.maxBuckets ?? 10_000));\n const key = options.key ?? defaultKey;\n const exemptLevels = new Set(options.exemptLevels ?? DEFAULT_EXEMPT_LEVELS);\n const buckets = new Map<string, MutableBucket>();\n\n const prune = () => {\n while (buckets.size > maxBuckets) {\n let oldest: MutableBucket | undefined;\n for (const bucket of buckets.values()) {\n if (!oldest || bucket.lastSeenMs < oldest.lastSeenMs) oldest = bucket;\n }\n if (!oldest) return;\n buckets.delete(oldest.key);\n }\n };\n\n const processor = ((event, context) => {\n if (exemptLevels.has(event.levelName)) return event;\n\n const now = context.now();\n const bucketKey = key(event);\n let bucket = buckets.get(bucketKey);\n if (!bucket) {\n bucket = {\n key: bucketKey,\n tokens: capacity,\n lastRefillMs: now,\n lastSeenMs: now,\n };\n buckets.set(bucketKey, bucket);\n prune();\n }\n\n const elapsedSeconds = Math.max(0, (now - bucket.lastRefillMs) / 1000);\n bucket.tokens = Math.min(capacity, bucket.tokens + elapsedSeconds * refillPerSecond);\n bucket.lastRefillMs = now;\n bucket.lastSeenMs = now;\n\n if (bucket.tokens >= 1) {\n bucket.tokens -= 1;\n return event;\n }\n\n incrementLoggerMetaCounter(\"processor.rateLimit.dropped\");\n incrementLoggerMetaCounter(`processor.rateLimit.dropped.${event.levelName}`);\n options.onDrop?.(event, bucketKey);\n return false;\n }) as RateLimitProcessor;\n\n processor.buckets = () => [...buckets.values()].map(snapshot);\n\n return processor;\n}\n","import {\n eventToRecord,\n incrementLoggerMetaCounter,\n recordToEvent,\n toLevelValue,\n type LogEvent,\n type LoggerLevel,\n type Processor,\n type ProcessorContext,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\n\nexport type FingersCrossedDropReason = \"buffer-full\" | \"bucket-pruned\";\n\nexport type FingersCrossedFlush = (\n events: readonly LogEvent[],\n context: ProcessorContext,\n) => void | Promise<void>;\n\nexport interface FingersCrossedState {\n readonly key: string;\n readonly buffered: number;\n readonly activeUntilMs: number;\n readonly lastSeenMs: number;\n}\n\nexport interface FingersCrossedProcessor extends Processor {\n states(): readonly FingersCrossedState[];\n reset(key?: string): void;\n}\n\nexport interface FingersCrossedOptions {\n triggerLevel?: LoggerLevel;\n shouldTrigger?: (event: LogEvent) => boolean;\n bufferSize?: number;\n activationMs?: number;\n flushTo?: Transport | FingersCrossedFlush;\n includeTrigger?: boolean;\n passthroughTrigger?: boolean;\n passthroughAfterTrigger?: boolean;\n key?: (event: LogEvent) => string;\n maxBuckets?: number;\n onTrigger?: (event: LogEvent, buffered: readonly LogEvent[], key: string) => void;\n onDrop?: (event: LogEvent, reason: FingersCrossedDropReason, key: string) => void;\n}\n\ninterface MutableState {\n key: string;\n buffer: LogEvent[];\n activeUntilMs: number;\n lastSeenMs: number;\n}\n\nconst DEFAULT_KEY = \"default\";\n\nfunction normalizeCount(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeBucketCount(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) return 1024;\n return Math.max(1, Math.floor(value));\n}\n\nfunction incrementBy(name: string, count: number): void {\n for (let index = 0; index < count; index += 1) incrementLoggerMetaCounter(name);\n}\n\nfunction snapshot(state: MutableState): FingersCrossedState {\n return {\n key: state.key,\n buffered: state.buffer.length,\n activeUntilMs: state.activeUntilMs,\n lastSeenMs: state.lastSeenMs,\n };\n}\n\nfunction isFlushFunction(target: Transport | FingersCrossedFlush): target is FingersCrossedFlush {\n return typeof target === \"function\";\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nasync function flushToTarget(\n target: Transport | FingersCrossedFlush,\n events: readonly LogEvent[],\n context: ProcessorContext,\n): Promise<void> {\n if (events.length === 0) return;\n if (isFlushFunction(target)) {\n await target(events, context);\n return;\n }\n\n const minLevel = target.minLevel === undefined ? undefined : toLevelValue(target.minLevel);\n const selected =\n minLevel === undefined ? [...events] : events.filter((event) => event.level >= minLevel);\n if (selected.length === 0) return;\n\n const transportContext: TransportContext = {\n loggerName: context.loggerName,\n now: context.now,\n toEvent: recordToEvent,\n reportInternalError: context.reportInternalError,\n };\n\n if (target.logBatch) {\n const result = target.logBatch(selected, transportContext);\n if (isPromiseLike(result)) await result;\n return;\n }\n if (target.log) {\n for (const event of selected) {\n const result = target.log(event, transportContext);\n if (isPromiseLike(result)) {\n // oxlint-disable-next-line no-await-in-loop -- Preserve buffered log order.\n await result;\n }\n }\n return;\n }\n\n const records = selected.map(eventToRecord);\n if (target.writeBatch) {\n const result = target.writeBatch(records, transportContext);\n if (isPromiseLike(result)) {\n await result;\n }\n return;\n }\n if (!target.write) return;\n for (const record of records) {\n const result = target.write(record, transportContext);\n if (isPromiseLike(result)) {\n // oxlint-disable-next-line no-await-in-loop -- Preserve buffered log order.\n await result;\n }\n }\n}\n\nfunction scheduleFlush(\n target: Transport | FingersCrossedFlush | undefined,\n events: readonly LogEvent[],\n context: ProcessorContext,\n): void {\n if (!target || events.length === 0) return;\n const batch = [...events];\n incrementBy(\"processor.fingersCrossed.flushed\", batch.length);\n void flushToTarget(target, batch, context).catch((error) => {\n context.reportInternalError(error, {\n phase: \"processor\",\n processor: \"fingersCrossed\",\n });\n });\n}\n\nexport function fingersCrossedProcessor(\n options: FingersCrossedOptions = {},\n): FingersCrossedProcessor {\n const triggerLevel = toLevelValue(options.triggerLevel ?? \"error\");\n const shouldTrigger = options.shouldTrigger ?? ((event: LogEvent) => event.level >= triggerLevel);\n const bufferSize = normalizeCount(options.bufferSize, 100);\n const maxBuckets = normalizeBucketCount(options.maxBuckets);\n const keyFor = options.key ?? (() => DEFAULT_KEY);\n const includeTrigger = options.includeTrigger ?? true;\n const passthroughTrigger = options.passthroughTrigger ?? !options.flushTo;\n const passthroughAfterTrigger = options.passthroughAfterTrigger ?? true;\n const activationMs = options.activationMs;\n const states = new Map<string, MutableState>();\n\n const drop = (event: LogEvent, reason: FingersCrossedDropReason, key: string) => {\n incrementLoggerMetaCounter(\"processor.fingersCrossed.dropped\");\n incrementLoggerMetaCounter(`processor.fingersCrossed.dropped.${reason}`);\n options.onDrop?.(event, reason, key);\n };\n\n const getState = (key: string, now: number): MutableState => {\n let state = states.get(key);\n if (!state) {\n state = { key, buffer: [], activeUntilMs: 0, lastSeenMs: now };\n states.set(key, state);\n }\n state.lastSeenMs = now;\n\n while (states.size > maxBuckets) {\n let oldest: MutableState | undefined;\n for (const candidate of states.values()) {\n if (!oldest || candidate.lastSeenMs < oldest.lastSeenMs) oldest = candidate;\n }\n if (!oldest) break;\n for (const buffered of oldest.buffer) drop(buffered, \"bucket-pruned\", oldest.key);\n states.delete(oldest.key);\n }\n\n return state;\n };\n\n const processor = ((event, context) => {\n const now = context.now();\n const key = keyFor(event);\n const state = getState(key, now);\n\n if (state.activeUntilMs > 0 && state.activeUntilMs <= now) {\n state.activeUntilMs = 0;\n }\n\n if (state.activeUntilMs > now) {\n return passthroughAfterTrigger ? event : false;\n }\n\n if (shouldTrigger(event)) {\n const buffered = state.buffer.splice(0);\n state.activeUntilMs =\n activationMs === undefined ? Number.POSITIVE_INFINITY : now + Math.max(0, activationMs);\n incrementLoggerMetaCounter(\"processor.fingersCrossed.triggered\");\n options.onTrigger?.(event, buffered, key);\n scheduleFlush(options.flushTo, includeTrigger ? [...buffered, event] : buffered, context);\n return passthroughTrigger ? event : false;\n }\n\n if (bufferSize === 0) return false;\n if (state.buffer.length >= bufferSize) {\n const dropped = state.buffer.shift();\n if (dropped) drop(dropped, \"buffer-full\", key);\n }\n state.buffer.push(event);\n incrementLoggerMetaCounter(\"processor.fingersCrossed.buffered\");\n return false;\n }) as FingersCrossedProcessor;\n\n processor.states = () => [...states.values()].map(snapshot);\n processor.reset = (key?: string) => {\n if (key === undefined) {\n states.clear();\n return;\n }\n states.delete(key);\n };\n\n return processor;\n}\n","import {\n createBoundContext,\n createMiddleware,\n type LogEvent,\n type LogRecord,\n type Middleware,\n type MiddlewareContext,\n type Processor,\n type ProcessorContext,\n type Tags,\n type TraceContext,\n} from \"@loggerjs/core\";\n\nexport interface EnrichPatch {\n message?: string;\n type?: string;\n tags?: Tags;\n data?: unknown;\n context?: Record<string, unknown>;\n trace?: TraceContext;\n source?: LogEvent[\"source\"];\n}\n\nexport type EnrichInput =\n | EnrichPatch\n | ((event: LogEvent, context: ProcessorContext) => EnrichPatch | false | void);\n\nexport interface EnrichRecordPatch {\n message?: string;\n type?: string;\n tags?: Tags;\n data?: unknown;\n context?: Record<string, unknown>;\n trace?: TraceContext;\n source?: string | LogEvent[\"source\"];\n}\n\nexport type EnrichMiddlewareInput =\n | EnrichRecordPatch\n | ((record: LogRecord, context: MiddlewareContext) => EnrichRecordPatch | false | void);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeData(current: unknown, patch: unknown): unknown {\n if (patch === undefined) return current;\n if (isRecord(current) && isRecord(patch)) return { ...current, ...patch };\n return patch;\n}\n\nfunction mergeRecordData(\n current: Record<string, unknown> | null,\n patch: unknown,\n): Record<string, unknown> | null {\n if (patch === undefined) return current;\n if (isRecord(current) && isRecord(patch)) return { ...current, ...patch };\n if (isRecord(patch)) return patch;\n return { value: patch };\n}\n\nfunction sourceForRecord(source: EnrichRecordPatch[\"source\"]): string | undefined {\n if (!source) return undefined;\n if (typeof source === \"string\") return source;\n return source.integration ?? source.runtime;\n}\n\nfunction applyPatch(event: LogEvent, patch: EnrichPatch): LogEvent {\n return {\n ...event,\n message: patch.message ?? event.message,\n type: patch.type ?? event.type,\n tags: patch.tags ? { ...event.tags, ...patch.tags } : event.tags,\n data: mergeData(event.data, patch.data),\n context: patch.context ? { ...event.context, ...patch.context } : event.context,\n trace: patch.trace ? { ...event.trace, ...patch.trace } : event.trace,\n source: patch.source ? { ...event.source, ...patch.source } : event.source,\n };\n}\n\nexport function enrichProcessor(input: EnrichInput): Processor {\n return (event, context) => {\n const patch = typeof input === \"function\" ? input(event, context) : input;\n if (patch === false) return false;\n if (!patch) return event;\n return applyPatch(event, patch);\n };\n}\n\nfunction applyRecordPatch(record: LogRecord, patch: EnrichRecordPatch): LogRecord {\n if (patch.message !== undefined) {\n record.msg = patch.message;\n record.lazy = null;\n }\n if (patch.type !== undefined) record.type = patch.type;\n if (patch.tags) {\n record.tags = {\n ...record.tags,\n ...patch.tags,\n };\n }\n if (patch.data !== undefined) record.props = mergeRecordData(record.props, patch.data);\n if (patch.context) {\n record.ctx = createBoundContext({\n ...record.ctx,\n ...patch.context,\n });\n }\n if (patch.trace) {\n record.trace = {\n ...record.trace,\n ...patch.trace,\n };\n }\n const source = sourceForRecord(patch.source);\n if (source) record.source = source;\n return record;\n}\n\nexport function enrichMiddleware(input: EnrichMiddlewareInput): Middleware {\n return createMiddleware(\"enrich\", (record, context) => {\n const patch = typeof input === \"function\" ? input(record, context) : input;\n if (patch === false) return null;\n if (!patch) return record;\n return applyRecordPatch(record, patch);\n });\n}\n","import {\n toLevelName,\n toLevelValue,\n type EnabledLogLevelName,\n type LogEvent,\n type LoggerLevel,\n type Processor,\n type ProcessorContext,\n type Tags,\n} from \"@loggerjs/core\";\n\nexport type LevelOverrideStringMatcher =\n | string\n | RegExp\n | ((value: string | undefined, event: LogEvent) => boolean);\n\nexport type LevelOverrideValue =\n | LoggerLevel\n | false\n | undefined\n | ((event: LogEvent, context: ProcessorContext) => LoggerLevel | false | void);\n\nexport interface LevelOverrideRule {\n level: LevelOverrideValue;\n when?: (event: LogEvent, context: ProcessorContext) => boolean;\n logger?: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[];\n type?: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[];\n integration?: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[];\n runtime?: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[];\n tags?: Tags;\n minLevel?: LoggerLevel;\n maxLevel?: LoggerLevel;\n}\n\nexport interface LevelOverrideOptions {\n rules: readonly LevelOverrideRule[];\n}\n\nexport type LevelOverrideInput =\n | LevelOverrideValue\n | readonly LevelOverrideRule[]\n | LevelOverrideOptions;\n\nfunction asMatchers(\n matcher: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[] | undefined,\n): readonly LevelOverrideStringMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher as LevelOverrideStringMatcher];\n}\n\nfunction matchOne(\n matcher: LevelOverrideStringMatcher,\n value: string | undefined,\n event: LogEvent,\n): boolean {\n if (typeof matcher === \"function\") return matcher(value, event);\n if (matcher instanceof RegExp) return matcher.test(value ?? \"\");\n return value === matcher;\n}\n\nfunction matchString(\n matcher: LevelOverrideStringMatcher | readonly LevelOverrideStringMatcher[] | undefined,\n value: string | undefined,\n event: LogEvent,\n): boolean {\n const matchers = asMatchers(matcher);\n if (matchers.length === 0) return true;\n return matchers.some((item) => matchOne(item, value, event));\n}\n\nfunction matchTags(expected: Tags | undefined, actual: Tags | undefined): boolean {\n if (!expected) return true;\n for (const [key, value] of Object.entries(expected)) {\n if (actual?.[key] !== value) return false;\n }\n return true;\n}\n\nfunction matchLevelRange(event: LogEvent, rule: LevelOverrideRule): boolean {\n if (rule.minLevel !== undefined && event.level < toLevelValue(rule.minLevel)) return false;\n if (rule.maxLevel !== undefined && event.level > toLevelValue(rule.maxLevel)) return false;\n return true;\n}\n\nfunction matchesRule(event: LogEvent, context: ProcessorContext, rule: LevelOverrideRule): boolean {\n return (\n (!rule.when || rule.when(event, context)) &&\n matchString(rule.logger, event.logger, event) &&\n matchString(rule.type, event.type, event) &&\n matchString(rule.integration, event.source?.integration, event) &&\n matchString(rule.runtime, event.source?.runtime, event) &&\n matchTags(rule.tags, event.tags) &&\n matchLevelRange(event, rule)\n );\n}\n\nfunction resolveLevel(\n value: LevelOverrideValue,\n event: LogEvent,\n context: ProcessorContext,\n): LoggerLevel | false | undefined {\n if (typeof value === \"function\") {\n const level = value(event, context);\n return level === undefined ? undefined : level;\n }\n return value;\n}\n\nfunction applyLevel(event: LogEvent, level: LoggerLevel | false | undefined): LogEvent | false {\n if (level === undefined) return event;\n if (level === false || level === \"silent\") return false;\n\n const nextLevel = toLevelValue(level, event.level);\n if (!Number.isFinite(nextLevel)) return false;\n\n const nextLevelName: EnabledLogLevelName = toLevelName(nextLevel);\n if (nextLevel === event.level && nextLevelName === event.levelName) return event;\n return { ...event, level: nextLevel, levelName: nextLevelName };\n}\n\nfunction isOptions(input: LevelOverrideInput): input is LevelOverrideOptions {\n return typeof input === \"object\" && input !== null && !Array.isArray(input);\n}\n\nfunction isRuleArray(input: LevelOverrideInput): input is readonly LevelOverrideRule[] {\n return Array.isArray(input);\n}\n\nexport function levelOverrideProcessor(input: LevelOverrideInput): Processor {\n if (!isRuleArray(input) && !isOptions(input)) {\n return (event, context) => applyLevel(event, resolveLevel(input, event, context));\n }\n\n const rules = isRuleArray(input) ? input : input.rules;\n return (event, context) => {\n for (const rule of rules) {\n if (matchesRule(event, context, rule)) {\n return applyLevel(event, resolveLevel(rule.level, event, context));\n }\n }\n return event;\n };\n}\n","import {\n toLevelValue,\n withLogEventRoute,\n type EnabledLogLevelName,\n type LogEvent,\n type LogEventRoute,\n type LoggerLevel,\n type Processor,\n type ProcessorContext,\n type Tags,\n} from \"@loggerjs/core\";\n\nexport type EventStringMatcher =\n | string\n | RegExp\n | ((value: string | undefined, event: LogEvent) => boolean);\n\nexport interface EventMatch {\n when?: (event: LogEvent, context: ProcessorContext) => boolean;\n logger?: EventStringMatcher | readonly EventStringMatcher[];\n type?: EventStringMatcher | readonly EventStringMatcher[];\n integration?: EventStringMatcher | readonly EventStringMatcher[];\n runtime?: EventStringMatcher | readonly EventStringMatcher[];\n levelName?: EnabledLogLevelName | readonly EnabledLogLevelName[];\n tags?: Tags;\n minLevel?: LoggerLevel;\n maxLevel?: LoggerLevel;\n}\n\nexport type FilterAction = \"keep\" | \"drop\";\nexport type FilterPredicate = (event: LogEvent, context: ProcessorContext) => boolean;\n\nexport interface FilterRule extends EventMatch {\n action?: FilterAction;\n reason?: string;\n}\n\nexport interface FilterOptions {\n rules: readonly FilterRule[];\n defaultAction?: FilterAction;\n onDrop?: (event: LogEvent, reason: string) => void;\n}\n\nexport type FilterInput = FilterPredicate | readonly FilterRule[] | FilterOptions;\n\nexport interface RouteRule extends EventMatch, LogEventRoute {}\n\nexport interface RouteOptions {\n rules: readonly RouteRule[];\n defaultRoute?: LogEventRoute;\n}\n\nexport type RouteInput = LogEventRoute | readonly RouteRule[] | RouteOptions;\n\nfunction stringMatchers(\n matcher: EventStringMatcher | readonly EventStringMatcher[] | undefined,\n): readonly EventStringMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher as EventStringMatcher];\n}\n\nfunction matchesString(\n matcher: EventStringMatcher | readonly EventStringMatcher[] | undefined,\n value: string | undefined,\n event: LogEvent,\n): boolean {\n const matchers = stringMatchers(matcher);\n if (matchers.length === 0) return true;\n\n for (const item of matchers) {\n if (typeof item === \"function\" && item(value, event)) return true;\n if (item instanceof RegExp && item.test(value ?? \"\")) return true;\n if (typeof item === \"string\" && value === item) return true;\n }\n return false;\n}\n\nfunction matchesLevelName(\n expected: EnabledLogLevelName | readonly EnabledLogLevelName[] | undefined,\n actual: EnabledLogLevelName,\n): boolean {\n if (!expected) return true;\n return Array.isArray(expected) ? expected.includes(actual) : expected === actual;\n}\n\nfunction matchesTags(expected: Tags | undefined, actual: Tags | undefined): boolean {\n if (!expected) return true;\n for (const [key, value] of Object.entries(expected)) {\n if (actual?.[key] !== value) return false;\n }\n return true;\n}\n\nfunction matchesLevelRange(event: LogEvent, match: EventMatch): boolean {\n if (match.minLevel !== undefined && event.level < toLevelValue(match.minLevel)) return false;\n if (match.maxLevel !== undefined && event.level > toLevelValue(match.maxLevel)) return false;\n return true;\n}\n\nfunction matchesEvent(event: LogEvent, context: ProcessorContext, match: EventMatch): boolean {\n return (\n (!match.when || match.when(event, context)) &&\n matchesString(match.logger, event.logger, event) &&\n matchesString(match.type, event.type, event) &&\n matchesString(match.integration, event.source?.integration, event) &&\n matchesString(match.runtime, event.source?.runtime, event) &&\n matchesLevelName(match.levelName, event.levelName) &&\n matchesTags(match.tags, event.tags) &&\n matchesLevelRange(event, match)\n );\n}\n\nfunction isFilterRuleArray(\n input: readonly FilterRule[] | FilterOptions,\n): input is readonly FilterRule[] {\n return Array.isArray(input);\n}\n\nfunction normalizeFilterOptions(input: readonly FilterRule[] | FilterOptions): FilterOptions {\n return isFilterRuleArray(input) ? { rules: input } : input;\n}\n\nfunction reportDrop(options: FilterOptions, event: LogEvent, reason: string): false {\n options.onDrop?.(event, reason);\n return false;\n}\n\nexport function filterProcessor(input: FilterInput): Processor {\n if (typeof input === \"function\") {\n return (event, context) => (input(event, context) ? event : false);\n }\n\n const options = normalizeFilterOptions(input);\n const defaultAction = options.defaultAction ?? \"keep\";\n\n return (event, context) => {\n for (const rule of options.rules) {\n if (!matchesEvent(event, context, rule)) continue;\n const action = rule.action ?? \"drop\";\n return action === \"keep\" ? event : reportDrop(options, event, rule.reason ?? \"rule\");\n }\n\n return defaultAction === \"keep\" ? event : reportDrop(options, event, \"default\");\n };\n}\n\nfunction hasRoute(route: LogEventRoute | undefined): route is LogEventRoute {\n return Boolean(route?.transports || route?.excludeTransports);\n}\n\nfunction routeFromRule(rule: RouteRule): LogEventRoute {\n return {\n transports: rule.transports,\n excludeTransports: rule.excludeTransports,\n };\n}\n\nfunction isRouteOptions(input: RouteInput): input is RouteOptions {\n return typeof input === \"object\" && input !== null && \"rules\" in input;\n}\n\nfunction isRouteRuleArray(input: RouteInput): input is readonly RouteRule[] {\n return Array.isArray(input);\n}\n\nexport function routeProcessor(input: RouteInput): Processor {\n if (!isRouteRuleArray(input) && !isRouteOptions(input)) {\n return (event) => (hasRoute(input) ? withLogEventRoute(event, input) : event);\n }\n\n const rules = isRouteRuleArray(input) ? input : input.rules;\n const defaultRoute = isRouteRuleArray(input) ? undefined : input.defaultRoute;\n return (event, context) => {\n for (const rule of rules) {\n if (matchesEvent(event, context, rule)) {\n const route = routeFromRule(rule);\n return hasRoute(route) ? withLogEventRoute(event, route) : event;\n }\n }\n\n return hasRoute(defaultRoute) ? withLogEventRoute(event, defaultRoute) : event;\n };\n}\n","import type { LogEvent, Processor, ProcessorContext } from \"@loggerjs/core\";\n\nexport type FingerprintPart =\n | \"logger\"\n | \"level\"\n | \"type\"\n | \"message\"\n | \"error.name\"\n | \"error.message\"\n | \"source.integration\"\n | \"source.runtime\"\n | \"stack.top\"\n | ((event: LogEvent, context: ProcessorContext) => unknown);\n\nexport interface FingerprintOptions {\n parts?: readonly FingerprintPart[];\n hash?: (input: string) => string;\n target?: \"tags\" | \"context\";\n key?: string;\n separator?: string;\n prefix?: string;\n}\n\nconst DEFAULT_PARTS: readonly FingerprintPart[] = [\n \"logger\",\n \"type\",\n \"message\",\n \"error.name\",\n \"error.message\",\n \"source.integration\",\n];\n\nfunction fnv1a32(input: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction stackTop(stack: string | undefined): string | undefined {\n if (!stack) return undefined;\n const lines = stack.split(\"\\n\");\n return (lines[1] ?? lines[0])?.trim();\n}\n\nfunction partValue(part: FingerprintPart, event: LogEvent, context: ProcessorContext): unknown {\n if (typeof part === \"function\") return part(event, context);\n if (part === \"logger\") return event.logger;\n if (part === \"level\") return event.levelName;\n if (part === \"type\") return event.type;\n if (part === \"message\") return event.message;\n if (part === \"error.name\") return event.error?.name;\n if (part === \"error.message\") return event.error?.message;\n if (part === \"source.integration\") return event.source?.integration;\n if (part === \"source.runtime\") return event.source?.runtime;\n return stackTop(event.error?.stack);\n}\n\nfunction stringifyPart(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n if (value instanceof Error) return `${value.name}:${value.message}`;\n return String(value);\n}\n\nfunction writeFingerprint(\n event: LogEvent,\n target: \"tags\" | \"context\",\n key: string,\n fingerprint: string,\n): LogEvent {\n if (target === \"context\") {\n return {\n ...event,\n context: { ...event.context, [key]: fingerprint },\n };\n }\n\n return {\n ...event,\n tags: { ...event.tags, [key]: fingerprint },\n };\n}\n\nexport function fingerprintProcessor(options: FingerprintOptions = {}): Processor {\n const parts = options.parts ?? DEFAULT_PARTS;\n const hash = options.hash ?? fnv1a32;\n const target = options.target ?? \"tags\";\n const key = options.key ?? \"fingerprint\";\n const separator = options.separator ?? \"\\u001f\";\n const prefix = options.prefix ?? \"\";\n\n return (event, context) => {\n const input = parts\n .map((part) => stringifyPart(partValue(part, event, context)))\n .join(separator);\n return writeFingerprint(event, target, key, `${prefix}${hash(input)}`);\n };\n}\n","import type { Processor, SerializedError } from \"@loggerjs/core\";\n\nexport interface NormalizeErrorProcessorOptions {\n maxDepth?: number;\n maxStackLines?: number;\n includeEnumerableProperties?: boolean;\n includeAggregateErrors?: boolean;\n dataErrorKeys?: readonly string[];\n}\n\nexport interface NormalizedError extends SerializedError {\n cause?: NormalizedError;\n errors?: NormalizedError[];\n}\n\ninterface NormalizedOptions {\n maxDepth: number;\n maxStackLines: number;\n includeEnumerableProperties: boolean;\n includeAggregateErrors: boolean;\n dataErrorKeys: readonly string[];\n}\n\nfunction stackWithLimit(stack: unknown, maxStackLines: number): string | undefined {\n if (typeof stack !== \"string\" || maxStackLines <= 0) return undefined;\n return stack.split(\"\\n\").slice(0, maxStackLines).join(\"\\n\");\n}\n\nfunction errorMessage(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\" && \"message\" in value) {\n const message = (value as { message?: unknown }).message;\n if (typeof message === \"string\") return message;\n }\n return String(value);\n}\n\nfunction errorName(value: unknown): string | undefined {\n if (value && typeof value === \"object\" && \"name\" in value) {\n const name = (value as { name?: unknown }).name;\n if (typeof name === \"string\") return name;\n }\n return value instanceof Error ? value.name : undefined;\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction normalizeUnknownError(\n value: unknown,\n options: NormalizedOptions,\n depth: number,\n seen: WeakSet<object>,\n): NormalizedError {\n if (depth > options.maxDepth) return { message: \"[Max error depth]\" };\n if (value === null || value === undefined) return { message: String(value) };\n if (typeof value !== \"object\") return { message: errorMessage(value) };\n\n if (seen.has(value)) return { message: \"[Circular error]\" };\n seen.add(value);\n\n const record = objectRecord(value);\n const out: NormalizedError = {\n name: errorName(value),\n message: errorMessage(value),\n stack: stackWithLimit(record?.stack, options.maxStackLines),\n };\n\n const code = record?.code;\n if (typeof code === \"string\" || typeof code === \"number\") out.code = code;\n\n if (record?.cause !== undefined) {\n out.cause = normalizeUnknownError(record.cause, options, depth + 1, seen);\n }\n\n if (options.includeAggregateErrors && Array.isArray(record?.errors)) {\n out.errors = record.errors.map((item) => normalizeUnknownError(item, options, depth + 1, seen));\n }\n\n if (options.includeEnumerableProperties && record) {\n for (const key of Object.keys(record)) {\n if (key in out || key === \"errors\" || key === \"cause\") continue;\n out[key] = record[key];\n }\n }\n\n return out;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeDataErrors(\n data: unknown,\n options: NormalizedOptions,\n seen: WeakSet<object>,\n): unknown {\n if (!isRecord(data) || options.dataErrorKeys.length === 0) return data;\n\n let next: Record<string, unknown> | undefined;\n for (const key of options.dataErrorKeys) {\n if (!(key in data) || data[key] === undefined || data[key] === null) continue;\n next ??= { ...data };\n next[key] = normalizeUnknownError(data[key], options, 0, seen);\n }\n return next ?? data;\n}\n\nexport function normalizeErrorProcessor(options: NormalizeErrorProcessorOptions = {}): Processor {\n const normalized: NormalizedOptions = {\n maxDepth: Math.max(0, Math.floor(options.maxDepth ?? 5)),\n maxStackLines: Math.max(0, Math.floor(options.maxStackLines ?? 40)),\n includeEnumerableProperties: options.includeEnumerableProperties ?? true,\n includeAggregateErrors: options.includeAggregateErrors ?? true,\n dataErrorKeys: options.dataErrorKeys ?? [],\n };\n\n return (event) => {\n const seen = new WeakSet<object>();\n const error =\n event.error === undefined\n ? undefined\n : normalizeUnknownError(event.error, normalized, 0, seen);\n const data = normalizeDataErrors(event.data, normalized, seen);\n\n if (error === undefined && data === event.data) return event;\n return {\n ...event,\n error,\n data,\n };\n };\n}\n","import type { LogEvent, Processor } from \"@loggerjs/core\";\n\nexport interface StackFrame {\n raw?: string;\n function?: string;\n file?: string;\n line?: number;\n column?: number;\n}\n\nexport interface StackParserOptions {\n maxFrames?: number;\n dropInternal?: boolean;\n includeRaw?: boolean;\n target?: \"error\" | \"context\";\n key?: string;\n parser?: (stack: string) => readonly StackFrame[];\n}\n\nconst V8_FRAME = /^\\s*at\\s+(?:(.*?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?\\s*$/;\nconst FIREFOX_FRAME = /^\\s*(?:(.*?)@)?(.+?):(\\d+):(\\d+)\\s*$/;\n\nfunction toNumber(input: string): number | undefined {\n const value = Number(input);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction cleanFunctionName(input: string | undefined): string | undefined {\n if (!input || input === \"async\") return undefined;\n return input.trim() || undefined;\n}\n\nfunction frameFromMatch(raw: string, match: RegExpMatchArray): StackFrame {\n return {\n raw,\n function: cleanFunctionName(match[1]),\n file: match[2],\n line: match[3] ? toNumber(match[3]) : undefined,\n column: match[4] ? toNumber(match[4]) : undefined,\n };\n}\n\nfunction parseLine(raw: string): StackFrame {\n const v8 = raw.match(V8_FRAME);\n if (v8) return frameFromMatch(raw, v8);\n\n const firefox = raw.match(FIREFOX_FRAME);\n if (firefox) return frameFromMatch(raw, firefox);\n\n return { raw };\n}\n\nfunction isInternalFrame(frame: StackFrame): boolean {\n const file = frame.file ?? frame.raw ?? \"\";\n return file.startsWith(\"node:internal\") || file.includes(\"/node:internal/\");\n}\n\nfunction defaultParseStack(stack: string): StackFrame[] {\n const frames: StackFrame[] = [];\n for (const raw of stack.split(\"\\n\")) {\n const line = raw.trim();\n if (!line || !line.includes(\":\")) continue;\n const frame = parseLine(line);\n if (frame.file || line.startsWith(\"at \") || line.includes(\"@\")) frames.push(frame);\n }\n return frames;\n}\n\nfunction stripRaw(frame: StackFrame): StackFrame {\n const { raw: _raw, ...rest } = frame;\n return rest;\n}\n\nfunction normalizeFrames(\n frames: readonly StackFrame[],\n options: RequiredStackOptions,\n): StackFrame[] {\n const out: StackFrame[] = [];\n for (const frame of frames) {\n if (options.dropInternal && isInternalFrame(frame)) continue;\n out.push(options.includeRaw ? frame : stripRaw(frame));\n if (out.length >= options.maxFrames) break;\n }\n return out;\n}\n\ninterface RequiredStackOptions {\n maxFrames: number;\n dropInternal: boolean;\n includeRaw: boolean;\n target: \"error\" | \"context\";\n key: string;\n parser: (stack: string) => readonly StackFrame[];\n}\n\nfunction writeFrames(\n event: LogEvent,\n options: RequiredStackOptions,\n frames: StackFrame[],\n): LogEvent {\n if (options.target === \"context\") {\n return { ...event, context: { ...event.context, [options.key]: frames } };\n }\n return {\n ...event,\n error: {\n message: event.error?.message ?? event.message,\n ...event.error,\n [options.key]: frames,\n },\n };\n}\n\nexport function parseStack(stack: string): StackFrame[] {\n return defaultParseStack(stack);\n}\n\nexport function stackParserProcessor(options: StackParserOptions = {}): Processor {\n const normalized: RequiredStackOptions = {\n maxFrames: Math.max(0, Math.floor(options.maxFrames ?? 20)),\n dropInternal: options.dropInternal ?? false,\n includeRaw: options.includeRaw ?? true,\n target: options.target ?? \"error\",\n key: options.key ?? \"frames\",\n parser: options.parser ?? defaultParseStack,\n };\n\n return (event) => {\n const stack = event.error?.stack;\n if (!stack || normalized.maxFrames === 0) return event;\n\n const frames = normalizeFrames(normalized.parser(stack), normalized);\n return frames.length > 0 ? writeFrames(event, normalized, frames) : event;\n };\n}\n","import type { LogEvent, Processor } from \"@loggerjs/core\";\nimport { parseStack, type StackFrame } from \"./stack-parser\";\n\nexport interface SymbolicatedStackFrame extends StackFrame {\n original?: StackFrame;\n}\n\nexport interface SymbolicateStackOptions {\n maxFrames?: number;\n sourceKey?: string;\n target?: \"error\" | \"context\";\n key?: string;\n mode?: \"annotate\" | \"replace\";\n symbolicate: (frame: StackFrame, event: LogEvent) => StackFrame | undefined;\n}\n\nfunction frameListFromEvent(event: LogEvent, sourceKey: string): StackFrame[] {\n const existing = event.error?.[sourceKey];\n if (Array.isArray(existing)) return existing as StackFrame[];\n const stack = event.error?.stack;\n return stack ? parseStack(stack) : [];\n}\n\nfunction applySymbolication(\n frame: StackFrame,\n event: LogEvent,\n options: Required<Pick<SymbolicateStackOptions, \"mode\" | \"symbolicate\">>,\n): SymbolicatedStackFrame {\n const original = options.symbolicate(frame, event);\n if (!original) return frame;\n if (options.mode === \"replace\") return { ...original, raw: frame.raw };\n return { ...frame, original };\n}\n\nfunction writeFrames(\n event: LogEvent,\n target: \"error\" | \"context\",\n key: string,\n frames: readonly SymbolicatedStackFrame[],\n): LogEvent {\n if (target === \"context\") {\n return { ...event, context: { ...event.context, [key]: frames } };\n }\n return {\n ...event,\n error: {\n message: event.error?.message ?? event.message,\n ...event.error,\n [key]: frames,\n },\n };\n}\n\nexport function symbolicateStackProcessor(options: SymbolicateStackOptions): Processor {\n const maxFrames = Math.max(0, Math.floor(options.maxFrames ?? 20));\n const sourceKey = options.sourceKey ?? \"frames\";\n const target = options.target ?? \"error\";\n const key = options.key ?? \"symbolicatedFrames\";\n const mode = options.mode ?? \"annotate\";\n\n return (event) => {\n if (maxFrames === 0) return event;\n const frames = frameListFromEvent(event, sourceKey).slice(0, maxFrames);\n if (frames.length === 0) return event;\n return writeFrames(\n event,\n target,\n key,\n frames.map((frame) =>\n applySymbolication(frame, event, { mode, symbolicate: options.symbolicate }),\n ),\n );\n };\n}\n","import type { LogEvent, Processor } from \"@loggerjs/core\";\n\nexport type PrivacyGuardMatcher =\n | string\n | RegExp\n | ((key: string, path: string, value: unknown) => boolean);\n\nexport type PrivacyGuardTarget = \"message\" | \"data\" | \"context\" | \"tags\" | \"error\";\n\nexport interface PrivacyPattern {\n name: string;\n pattern: RegExp;\n replacement?: string;\n validate?: (match: string) => boolean;\n}\n\nexport interface PrivacyGuardOptions {\n targets?: readonly PrivacyGuardTarget[];\n denyKeys?: readonly PrivacyGuardMatcher[];\n allowKeys?: readonly PrivacyGuardMatcher[];\n patterns?: readonly PrivacyPattern[];\n replacement?: string;\n maxDepth?: number;\n maxStringLength?: number;\n truncateSuffix?: string;\n onRedact?: (path: string, reason: string) => void;\n}\n\ninterface NormalizedPrivacyOptions {\n targets: ReadonlySet<PrivacyGuardTarget>;\n denyKeys: readonly PrivacyGuardMatcher[];\n allowKeys: readonly PrivacyGuardMatcher[];\n patterns: readonly PrivacyPattern[];\n replacement: string;\n maxDepth: number;\n maxStringLength: number;\n truncateSuffix: string;\n onRedact?: (path: string, reason: string) => void;\n}\n\ninterface GuardResult {\n value: unknown;\n changed: boolean;\n}\n\nconst DEFAULT_DENY_KEYS: readonly PrivacyGuardMatcher[] = [\n \"password\",\n \"passwd\",\n \"secret\",\n \"token\",\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"apiKey\",\n \"api_key\",\n /session/i,\n];\n\nfunction digitsOnly(input: string): string {\n return input.replace(/\\D/g, \"\");\n}\n\nfunction passesLuhn(input: string): boolean {\n const digits = digitsOnly(input);\n if (digits.length < 13 || digits.length > 19) return false;\n\n let sum = 0;\n let doubleDigit = false;\n for (let index = digits.length - 1; index >= 0; index -= 1) {\n let value = digits.charCodeAt(index) - 48;\n if (doubleDigit) {\n value *= 2;\n if (value > 9) value -= 9;\n }\n sum += value;\n doubleDigit = !doubleDigit;\n }\n return sum % 10 === 0;\n}\n\nconst DEFAULT_PATTERNS: readonly PrivacyPattern[] = [\n {\n name: \"email\",\n pattern: /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi,\n },\n {\n name: \"bearer-token\",\n pattern: /\\bBearer\\s+[A-Za-z0-9._~+/=-]+\\b/g,\n },\n {\n name: \"credit-card\",\n pattern: /\\b(?:\\d[ -]*?){13,19}\\b/g,\n validate: passesLuhn,\n },\n];\n\nfunction matcherMatches(\n matcher: PrivacyGuardMatcher,\n key: string,\n path: string,\n value: unknown,\n): boolean {\n if (typeof matcher === \"string\") return matcher.toLowerCase() === key.toLowerCase();\n if (matcher instanceof RegExp) {\n matcher.lastIndex = 0;\n return matcher.test(key) || matcher.test(path);\n }\n return matcher(key, path, value);\n}\n\nfunction matchesAny(\n matchers: readonly PrivacyGuardMatcher[],\n key: string,\n path: string,\n value: unknown,\n): boolean {\n return matchers.some((matcher) => matcherMatches(matcher, key, path, value));\n}\n\nfunction redact(path: string, reason: string, options: NormalizedPrivacyOptions): string {\n options.onRedact?.(path, reason);\n return options.replacement;\n}\n\nfunction guardString(input: string, path: string, options: NormalizedPrivacyOptions): GuardResult {\n let value = input;\n\n for (const item of options.patterns) {\n item.pattern.lastIndex = 0;\n value = value.replace(item.pattern, (match) => {\n if (item.validate && !item.validate(match)) return match;\n options.onRedact?.(path, item.name);\n return item.replacement ?? options.replacement;\n });\n }\n\n if (value.length > options.maxStringLength) {\n options.onRedact?.(path, \"max-string-length\");\n value = `${value.slice(0, options.maxStringLength)}${options.truncateSuffix}`;\n }\n\n return { value, changed: value !== input };\n}\n\nfunction guardValue(\n value: unknown,\n path: string,\n key: string,\n depth: number,\n options: NormalizedPrivacyOptions,\n seen: WeakMap<object, unknown>,\n): GuardResult {\n if (\n matchesAny(options.denyKeys, key, path, value) &&\n !matchesAny(options.allowKeys, key, path, value)\n ) {\n return { value: redact(path, \"deny-key\", options), changed: true };\n }\n\n if (typeof value === \"string\") return guardString(value, path, options);\n if (value === null || value === undefined || typeof value !== \"object\") {\n return { value, changed: false };\n }\n if (depth >= options.maxDepth) {\n return { value: redact(path, \"max-depth\", options), changed: true };\n }\n if (seen.has(value)) return { value: seen.get(value), changed: true };\n if (value instanceof Date || value instanceof Error) return { value, changed: false };\n\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n seen.set(value, out);\n let changed = false;\n for (let index = 0; index < value.length; index += 1) {\n const child = guardValue(\n value[index],\n `${path}[${index}]`,\n String(index),\n depth + 1,\n options,\n seen,\n );\n out[index] = child.value;\n changed ||= child.changed;\n }\n return { value: changed ? out : value, changed };\n }\n\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n seen.set(value, out);\n let changed = false;\n for (const [childKey, childValue] of Object.entries(input)) {\n const childPath = path ? `${path}.${childKey}` : childKey;\n const child = guardValue(childValue, childPath, childKey, depth + 1, options, seen);\n out[childKey] = child.value;\n changed ||= child.changed;\n }\n return { value: changed ? out : value, changed };\n}\n\nfunction guardField<T>(\n value: T,\n path: string,\n options: NormalizedPrivacyOptions,\n): { value: T; changed: boolean } {\n const guarded = guardValue(value, path, path, 0, options, new WeakMap<object, unknown>());\n return { value: guarded.value as T, changed: guarded.changed };\n}\n\nfunction maybeSet<T extends object, K extends keyof T>(\n target: T,\n key: K,\n value: T[K],\n changed: boolean,\n): T {\n if (!changed) return target;\n return { ...target, [key]: value };\n}\n\nexport function privacyGuardProcessor(options: PrivacyGuardOptions = {}): Processor {\n const normalized: NormalizedPrivacyOptions = {\n targets: new Set(options.targets ?? [\"message\", \"data\", \"context\", \"tags\", \"error\"]),\n denyKeys: options.denyKeys ?? DEFAULT_DENY_KEYS,\n allowKeys: options.allowKeys ?? [],\n patterns: options.patterns ?? DEFAULT_PATTERNS,\n replacement: options.replacement ?? \"[REDACTED]\",\n maxDepth: Math.max(0, Math.floor(options.maxDepth ?? 8)),\n maxStringLength: Math.max(1, Math.floor(options.maxStringLength ?? 8_192)),\n truncateSuffix: options.truncateSuffix ?? \"...\",\n onRedact: options.onRedact,\n };\n\n return (event) => {\n let next: LogEvent = event;\n\n if (normalized.targets.has(\"message\")) {\n const result = guardString(event.message, \"message\", normalized);\n next = maybeSet(next, \"message\", result.value as string, result.changed);\n }\n if (normalized.targets.has(\"data\")) {\n const result = guardField(event.data, \"data\", normalized);\n next = maybeSet(next, \"data\", result.value, result.changed);\n }\n if (normalized.targets.has(\"context\")) {\n const result = guardField(event.context, \"context\", normalized);\n next = maybeSet(next, \"context\", result.value, result.changed);\n }\n if (normalized.targets.has(\"tags\")) {\n const result = guardField(event.tags, \"tags\", normalized);\n next = maybeSet(next, \"tags\", result.value, result.changed);\n }\n if (normalized.targets.has(\"error\")) {\n const result = guardField(event.error, \"error\", normalized);\n next = maybeSet(next, \"error\", result.value, result.changed);\n }\n\n return next;\n };\n}\n","import type { LogEvent, Processor, ProcessorContext } from \"@loggerjs/core\";\n\nexport type SchemaCheckResult = true | false | string | readonly string[] | void;\nexport type SchemaValidator = (\n data: unknown,\n event: LogEvent,\n context: ProcessorContext,\n) => SchemaCheckResult;\n\nexport type SchemaDevCheckAction = \"report\" | \"tag\" | \"drop\";\n\nexport interface SchemaDevCheckOptions {\n enabled?: boolean;\n action?: SchemaDevCheckAction;\n validators?: Readonly<Record<string, SchemaValidator>>;\n validate?: SchemaValidator;\n select?: (event: LogEvent, context: ProcessorContext) => SchemaValidator | undefined;\n tagKey?: string;\n contextKey?: string;\n onInvalid?: (event: LogEvent, errors: readonly string[]) => void;\n}\n\nfunction resultToErrors(result: SchemaCheckResult): readonly string[] {\n if (result === undefined || result === true) return [];\n if (result === false) return [\"schema validation failed\"];\n if (typeof result === \"string\") return [result];\n return result;\n}\n\nfunction validatorFor(\n event: LogEvent,\n context: ProcessorContext,\n options: SchemaDevCheckOptions,\n): SchemaValidator | undefined {\n return (\n options.validate ??\n options.select?.(event, context) ??\n (event.type ? options.validators?.[event.type] : undefined)\n );\n}\n\nfunction tagInvalid(\n event: LogEvent,\n options: SchemaDevCheckOptions,\n errors: readonly string[],\n): LogEvent {\n return {\n ...event,\n tags: { ...event.tags, [options.tagKey ?? \"schemaInvalid\"]: true },\n context: { ...event.context, [options.contextKey ?? \"schemaErrors\"]: [...errors] },\n };\n}\n\nfunction reportInvalid(\n event: LogEvent,\n context: ProcessorContext,\n options: SchemaDevCheckOptions,\n errors: readonly string[],\n): void {\n options.onInvalid?.(event, errors);\n context.reportInternalError(\n new Error(`loggerjs schema validation failed: ${errors.join(\"; \")}`),\n {\n phase: \"processor\",\n processor: \"schema-dev-check\",\n eventType: event.type,\n logger: event.logger,\n },\n );\n}\n\nexport function schemaDevCheckProcessor(options: SchemaDevCheckOptions = {}): Processor {\n const enabled = options.enabled ?? true;\n const action = options.action ?? \"report\";\n\n return (event, context) => {\n if (!enabled) return event;\n\n const validator = validatorFor(event, context, options);\n if (!validator) return event;\n\n let errors: readonly string[];\n try {\n errors = resultToErrors(validator(event.data, event, context));\n } catch (error) {\n context.reportInternalError(error, {\n phase: \"processor\",\n processor: \"schema-dev-check\",\n eventType: event.type,\n logger: event.logger,\n });\n return event;\n }\n\n if (errors.length === 0) return event;\n if (action === \"drop\") {\n options.onInvalid?.(event, errors);\n return false;\n }\n if (action === \"tag\") {\n reportInvalid(event, context, options, errors);\n return tagInvalid(event, options, errors);\n }\n\n reportInvalid(event, context, options, errors);\n return event;\n };\n}\n","import {\n incrementLoggerMetaCounter,\n type EnabledLogLevelName,\n type LogEvent,\n type Processor,\n type ProcessorContext,\n} from \"@loggerjs/core\";\n\nexport interface DynamicSamplerStats {\n readonly key: string;\n readonly seen: number;\n readonly kept: number;\n readonly dropped: number;\n readonly lastSeenMs: number;\n}\n\nexport interface DynamicSamplerDecisionContext extends DynamicSamplerStats {\n readonly now: number;\n}\n\nexport type DynamicSampleRate =\n | number\n | ((event: LogEvent, state: DynamicSamplerDecisionContext) => number);\n\nexport interface DynamicSamplerRule {\n rate: DynamicSampleRate;\n when?: (event: LogEvent, context: ProcessorContext) => boolean;\n key?: (event: LogEvent) => string;\n stickyBy?: (event: LogEvent) => string | undefined;\n}\n\nexport interface DynamicSamplerProcessor extends Processor {\n stats(): readonly DynamicSamplerStats[];\n reset(key?: string): void;\n}\n\nexport interface DynamicSamplerOptions {\n defaultRate?: DynamicSampleRate;\n rules?: readonly DynamicSamplerRule[];\n key?: (event: LogEvent) => string;\n stickyBy?: (event: LogEvent) => string | undefined;\n random?: () => number;\n exemptLevels?: readonly EnabledLogLevelName[];\n maxKeys?: number;\n onDrop?: (event: LogEvent, key: string, rate: number) => void;\n}\n\ninterface MutableStats {\n key: string;\n seen: number;\n kept: number;\n dropped: number;\n lastSeenMs: number;\n}\n\nconst DEFAULT_EXEMPT_LEVELS = new Set<EnabledLogLevelName>([\"error\", \"fatal\"]);\n\nfunction defaultKey(event: LogEvent): string {\n return event.trace?.traceId ?? `${event.logger}:${event.levelName}:${event.type ?? \"manual\"}`;\n}\n\nfunction clampRate(rate: number): number {\n if (!Number.isFinite(rate) || Number.isNaN(rate)) return 1;\n return Math.max(0, Math.min(1, rate));\n}\n\nfunction hashRatio(input: string): number {\n let hash = 0x811c9dc5;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0) / 0x100000000;\n}\n\nfunction snapshot(stats: MutableStats): DynamicSamplerStats {\n return {\n key: stats.key,\n seen: stats.seen,\n kept: stats.kept,\n dropped: stats.dropped,\n lastSeenMs: stats.lastSeenMs,\n };\n}\n\nfunction decisionContext(stats: MutableStats, now: number): DynamicSamplerDecisionContext {\n return { ...snapshot(stats), now };\n}\n\nfunction resolveRule(\n event: LogEvent,\n context: ProcessorContext,\n options: DynamicSamplerOptions,\n): DynamicSamplerRule {\n const rule = options.rules?.find((item) => !item.when || item.when(event, context));\n return {\n rate: rule?.rate ?? options.defaultRate ?? 1,\n key: rule?.key ?? options.key ?? defaultKey,\n stickyBy: rule?.stickyBy ?? options.stickyBy,\n };\n}\n\nfunction prune(statsByKey: Map<string, MutableStats>, maxKeys: number): void {\n while (statsByKey.size > maxKeys) {\n let oldest: MutableStats | undefined;\n for (const item of statsByKey.values()) {\n if (!oldest || item.lastSeenMs < oldest.lastSeenMs) oldest = item;\n }\n if (!oldest) return;\n statsByKey.delete(oldest.key);\n }\n}\n\nfunction shouldKeep(\n event: LogEvent,\n rule: DynamicSamplerRule,\n rate: number,\n random: () => number,\n): boolean {\n if (rate >= 1) return true;\n if (rate <= 0) return false;\n\n const stickyKey = rule.stickyBy?.(event);\n return (stickyKey ? hashRatio(stickyKey) : random()) < rate;\n}\n\nexport function dynamicSamplerProcessor(\n options: DynamicSamplerOptions = {},\n): DynamicSamplerProcessor {\n const random = options.random ?? Math.random;\n const exemptLevels = new Set(options.exemptLevels ?? DEFAULT_EXEMPT_LEVELS);\n const maxKeys = Math.max(1, Math.floor(options.maxKeys ?? 10_000));\n const statsByKey = new Map<string, MutableStats>();\n\n const processor = ((event, context) => {\n if (exemptLevels.has(event.levelName)) return event;\n\n const now = context.now();\n const rule = resolveRule(event, context, options);\n const key = (rule.key ?? defaultKey)(event);\n let stats = statsByKey.get(key);\n if (!stats) {\n stats = { key, seen: 0, kept: 0, dropped: 0, lastSeenMs: now };\n statsByKey.set(key, stats);\n prune(statsByKey, maxKeys);\n }\n\n stats.seen += 1;\n stats.lastSeenMs = now;\n\n const rateValue =\n typeof rule.rate === \"function\" ? rule.rate(event, decisionContext(stats, now)) : rule.rate;\n const rate = clampRate(rateValue);\n\n if (shouldKeep(event, rule, rate, random)) {\n stats.kept += 1;\n return event;\n }\n\n stats.dropped += 1;\n incrementLoggerMetaCounter(\"processor.dynamicSampler.dropped\");\n incrementLoggerMetaCounter(`processor.dynamicSampler.dropped.${event.levelName}`);\n options.onDrop?.(event, key, rate);\n return false;\n }) as DynamicSamplerProcessor;\n\n processor.stats = () => [...statsByKey.values()].map(snapshot);\n processor.reset = (key?: string) => {\n if (key) statsByKey.delete(key);\n else statsByKey.clear();\n };\n\n return processor;\n}\n","import { toLevelValue, type LogEvent, type LoggerLevel, type Processor } from \"@loggerjs/core\";\n\nexport interface Breadcrumb {\n time: number;\n levelName: LogEvent[\"levelName\"];\n logger: string;\n message: string;\n type?: string;\n tags?: LogEvent[\"tags\"];\n source?: LogEvent[\"source\"];\n}\n\nexport interface BreadcrumbBufferState {\n readonly key: string;\n readonly buffered: number;\n readonly lastSeenMs: number;\n}\n\nexport interface BreadcrumbBufferProcessor extends Processor {\n states(): readonly BreadcrumbBufferState[];\n reset(key?: string): void;\n}\n\nexport interface BreadcrumbBufferOptions<TBreadcrumb = Breadcrumb> {\n triggerLevel?: LoggerLevel;\n shouldAttach?: (event: LogEvent) => boolean;\n shouldBuffer?: (event: LogEvent) => boolean;\n bufferSize?: number;\n maxBuckets?: number;\n key?: (event: LogEvent) => string;\n map?: (event: LogEvent) => TBreadcrumb;\n target?: \"context\" | \"data\";\n field?: string;\n includeTrigger?: boolean;\n clearOnTrigger?: boolean;\n}\n\ninterface MutableState<TBreadcrumb> {\n key: string;\n buffer: TBreadcrumb[];\n lastSeenMs: number;\n}\n\nfunction defaultKey(event: LogEvent): string {\n const contextKey = event.context?.sessionId ?? event.context?.userId;\n return event.trace?.traceId ?? (contextKey === undefined ? event.logger : String(contextKey));\n}\n\nfunction defaultBreadcrumb(event: LogEvent): Breadcrumb {\n return {\n time: event.time,\n levelName: event.levelName,\n logger: event.logger,\n message: event.message,\n type: event.type,\n tags: event.tags,\n source: event.source,\n };\n}\n\nfunction normalizeCount(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeBucketCount(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) return 1024;\n return Math.max(1, Math.floor(value));\n}\n\nfunction snapshot<TBreadcrumb>(state: MutableState<TBreadcrumb>): BreadcrumbBufferState {\n return {\n key: state.key,\n buffered: state.buffer.length,\n lastSeenMs: state.lastSeenMs,\n };\n}\n\nfunction prune<TBreadcrumb>(\n states: Map<string, MutableState<TBreadcrumb>>,\n maxBuckets: number,\n): void {\n while (states.size > maxBuckets) {\n let oldest: MutableState<TBreadcrumb> | undefined;\n for (const state of states.values()) {\n if (!oldest || state.lastSeenMs < oldest.lastSeenMs) oldest = state;\n }\n if (!oldest) return;\n states.delete(oldest.key);\n }\n}\n\nfunction attachBreadcrumbs<TBreadcrumb>(\n event: LogEvent,\n target: \"context\" | \"data\",\n field: string,\n breadcrumbs: readonly TBreadcrumb[],\n): LogEvent {\n if (breadcrumbs.length === 0) return event;\n if (\n target === \"data\" &&\n event.data &&\n typeof event.data === \"object\" &&\n !Array.isArray(event.data)\n ) {\n return { ...event, data: { ...(event.data as Record<string, unknown>), [field]: breadcrumbs } };\n }\n if (target === \"data\") {\n return { ...event, data: { value: event.data, [field]: breadcrumbs } };\n }\n return { ...event, context: { ...event.context, [field]: breadcrumbs } };\n}\n\nexport function breadcrumbBufferProcessor<TBreadcrumb = Breadcrumb>(\n options: BreadcrumbBufferOptions<TBreadcrumb> = {},\n): BreadcrumbBufferProcessor {\n const triggerLevel = toLevelValue(options.triggerLevel ?? \"error\");\n const shouldAttach = options.shouldAttach ?? ((event: LogEvent) => event.level >= triggerLevel);\n const shouldBuffer = options.shouldBuffer ?? ((event: LogEvent) => event.level < triggerLevel);\n const bufferSize = normalizeCount(options.bufferSize, 50);\n const maxBuckets = normalizeBucketCount(options.maxBuckets);\n const keyFor = options.key ?? defaultKey;\n const map = options.map ?? (defaultBreadcrumb as (event: LogEvent) => TBreadcrumb);\n const target = options.target ?? \"context\";\n const field = options.field ?? \"breadcrumbs\";\n const includeTrigger = options.includeTrigger ?? false;\n const clearOnTrigger = options.clearOnTrigger ?? false;\n const states = new Map<string, MutableState<TBreadcrumb>>();\n\n const getState = (key: string, now: number): MutableState<TBreadcrumb> => {\n let state = states.get(key);\n if (!state) {\n state = { key, buffer: [], lastSeenMs: now };\n states.set(key, state);\n prune(states, maxBuckets);\n }\n state.lastSeenMs = now;\n return state;\n };\n\n const processor = ((event: LogEvent) => {\n const state = getState(keyFor(event), event.time);\n\n if (shouldAttach(event)) {\n const breadcrumbs = includeTrigger ? [...state.buffer, map(event)] : [...state.buffer];\n const next = attachBreadcrumbs(event, target, field, breadcrumbs);\n if (clearOnTrigger) state.buffer.splice(0, state.buffer.length);\n return next;\n }\n\n if (bufferSize > 0 && shouldBuffer(event)) {\n state.buffer.push(map(event));\n if (state.buffer.length > bufferSize) {\n state.buffer.splice(0, state.buffer.length - bufferSize);\n }\n }\n\n return event;\n }) as unknown as BreadcrumbBufferProcessor;\n\n processor.states = () => [...states.values()].map(snapshot);\n processor.reset = (key?: string) => {\n if (key) states.delete(key);\n else states.clear();\n };\n\n return processor;\n}\n"],"mappings":"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"}
package/dist/redact.d.ts CHANGED
@@ -4,6 +4,8 @@ export interface RedactOptions {
4
4
  keys?: RedactMatcher[];
5
5
  paths?: string[];
6
6
  replacement?: string;
7
+ censor?: string;
8
+ remove?: boolean;
7
9
  maxDepth?: number;
8
10
  }
9
11
  export declare function redactProcessor(options?: RedactOptions): Processor;
@@ -1 +1 @@
1
- {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAwDD,wBAAgB,eAAe,CAAC,OAAO,GAAE,aAAkB,GAAG,SAAS,CAyBtE"}
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,MAAM,GACN,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA8DD,wBAAgB,eAAe,CAAC,OAAO,GAAE,aAAkB,GAAG,SAAS,CA0BtE"}
@@ -0,0 +1,15 @@
1
+ import type { LogEvent, Processor } from "@loggerjs/core";
2
+ import { type StackFrame } from "./stack-parser.js";
3
+ export interface SymbolicatedStackFrame extends StackFrame {
4
+ original?: StackFrame;
5
+ }
6
+ export interface SymbolicateStackOptions {
7
+ maxFrames?: number;
8
+ sourceKey?: string;
9
+ target?: "error" | "context";
10
+ key?: string;
11
+ mode?: "annotate" | "replace";
12
+ symbolicate: (frame: StackFrame, event: LogEvent) => StackFrame | undefined;
13
+ }
14
+ export declare function symbolicateStackProcessor(options: SymbolicateStackOptions): Processor;
15
+ //# sourceMappingURL=symbolicate-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbolicate-stack.d.ts","sourceRoot":"","sources":["../src/symbolicate-stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,sBAAuB,SAAQ,UAAU;IACxD,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,KAAK,UAAU,GAAG,SAAS,CAAC;CAC7E;AAuCD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,uBAAuB,GAAG,SAAS,CAoBrF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loggerjs/processors",
3
- "version": "0.0.2",
3
+ "version": "0.3.0",
4
4
  "description": "Reusable loggerjs event processors.",
5
5
  "homepage": "https://github.com/jskits/loggerjs/tree/main/packages/processors#readme",
6
6
  "bugs": {
@@ -34,7 +34,7 @@
34
34
  "provenance": true
35
35
  },
36
36
  "dependencies": {
37
- "@loggerjs/core": "0.0.2"
37
+ "@loggerjs/core": "0.3.0"
38
38
  },
39
39
  "scripts": {
40
40
  "build": "pnpm run clean && pnpm run build:js && pnpm run build:types",