@loggerjs/codecs 0.5.1 → 0.5.3
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/fast-event-json.d.ts.map +1 -1
- package/dist/index.cjs +61 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +62 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-event-json.d.ts","sourceRoot":"","sources":["../src/fast-event-json.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"fast-event-json.d.ts","sourceRoot":"","sources":["../src/fast-event-json.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,KAAK,EAMV,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;GAUG;AACH,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAgcD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,KAAK,CAAC,MAAM,CAAC,CAiEzF"}
|
package/dist/index.cjs
CHANGED
|
@@ -2,6 +2,66 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
let _loggerjs_core = require("@loggerjs/core");
|
|
3
3
|
let msgpackr = require("msgpackr");
|
|
4
4
|
//#region src/fast-event-json.ts
|
|
5
|
+
const levelNameSet = new Set(_loggerjs_core.enabledLevelNames);
|
|
6
|
+
function invalidLogEvent(path, expected) {
|
|
7
|
+
throw new TypeError(`Invalid LoggerJS log event payload at ${path}: expected ${expected}`);
|
|
8
|
+
}
|
|
9
|
+
function isRecord$1(value) {
|
|
10
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function requireString(value, path) {
|
|
13
|
+
if (typeof value !== "string") invalidLogEvent(path, "string");
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function requireFiniteNumber(value, path) {
|
|
17
|
+
if (typeof value !== "number" || !Number.isFinite(value)) invalidLogEvent(path, "finite number");
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function assertOptionalString(value, path) {
|
|
21
|
+
if (value !== void 0 && typeof value !== "string") invalidLogEvent(path, "string");
|
|
22
|
+
}
|
|
23
|
+
function assertOptionalObject(value, path) {
|
|
24
|
+
if (value !== void 0 && !isRecord$1(value)) invalidLogEvent(path, "object");
|
|
25
|
+
}
|
|
26
|
+
function assertTags(value, path) {
|
|
27
|
+
if (value === void 0) return;
|
|
28
|
+
if (!isRecord$1(value)) invalidLogEvent(path, "object");
|
|
29
|
+
for (const [key, item] of Object.entries(value)) {
|
|
30
|
+
const type = typeof item;
|
|
31
|
+
if (item !== null && type !== "string" && type !== "number" && type !== "boolean") invalidLogEvent(`${path}.${key}`, "string, number, boolean, or null");
|
|
32
|
+
if (type === "number" && !Number.isFinite(item)) invalidLogEvent(`${path}.${key}`, "finite number");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function assertSerializedError(value, path) {
|
|
36
|
+
if (value === void 0) return;
|
|
37
|
+
if (!isRecord$1(value)) invalidLogEvent(path, "object");
|
|
38
|
+
requireString(value.message, `${path}.message`);
|
|
39
|
+
assertOptionalString(value.name, `${path}.name`);
|
|
40
|
+
assertOptionalString(value.stack, `${path}.stack`);
|
|
41
|
+
if (value.code !== void 0 && typeof value.code !== "string" && typeof value.code !== "number") invalidLogEvent(`${path}.code`, "string or number");
|
|
42
|
+
}
|
|
43
|
+
function validateLogEvent(value, path) {
|
|
44
|
+
if (!isRecord$1(value)) invalidLogEvent(path, "object");
|
|
45
|
+
requireString(value.id, `${path}.id`);
|
|
46
|
+
requireFiniteNumber(value.time, `${path}.time`);
|
|
47
|
+
requireFiniteNumber(value.seq, `${path}.seq`);
|
|
48
|
+
requireFiniteNumber(value.level, `${path}.level`);
|
|
49
|
+
const levelName = requireString(value.levelName, `${path}.levelName`);
|
|
50
|
+
if (!levelNameSet.has(levelName)) invalidLogEvent(`${path}.levelName`, "enabled log level name");
|
|
51
|
+
requireString(value.logger, `${path}.logger`);
|
|
52
|
+
requireString(value.message, `${path}.message`);
|
|
53
|
+
assertOptionalString(value.type, `${path}.type`);
|
|
54
|
+
assertTags(value.tags, `${path}.tags`);
|
|
55
|
+
assertSerializedError(value.error, `${path}.error`);
|
|
56
|
+
assertOptionalObject(value.context, `${path}.context`);
|
|
57
|
+
assertOptionalObject(value.trace, `${path}.trace`);
|
|
58
|
+
assertOptionalObject(value.source, `${path}.source`);
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function validateLogEventPayload(value) {
|
|
62
|
+
if (!Array.isArray(value)) return validateLogEvent(value, "payload");
|
|
63
|
+
return value.map((item, index) => validateLogEvent(item, `payload[${index}]`));
|
|
64
|
+
}
|
|
5
65
|
function hasSafeOptions$1(options) {
|
|
6
66
|
return options.maxDepth !== void 0 || options.maxArrayLength !== void 0 || options.maxObjectKeys !== void 0 || options.includeStack !== void 0 || options.stable !== void 0 || options.space !== void 0;
|
|
7
67
|
}
|
|
@@ -226,7 +286,7 @@ function fastEventJsonCodec(options = {}) {
|
|
|
226
286
|
return encodeItem(input, flags, safeStringify, safeTagsFragment);
|
|
227
287
|
},
|
|
228
288
|
decode(payload) {
|
|
229
|
-
return JSON.parse(payload);
|
|
289
|
+
return validateLogEventPayload(JSON.parse(payload));
|
|
230
290
|
},
|
|
231
291
|
prepareRecordEncoder(hints) {
|
|
232
292
|
const prepared = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["hasSafeOptions","Packr"],"sources":["../src/fast-event-json.ts","../src/msgpackr.ts","../src/pino-compat.ts","../src/projector.ts"],"sourcesContent":["import {\n defaultRecordId,\n incrementLoggerMetaCounter,\n isLogRecord,\n normalizeError,\n resolveMessage,\n toLevelName,\n safeJsonStringify,\n type Codec,\n type CodecInput,\n type PreparedRecordEncoder,\n type LogEvent,\n type LogRecord,\n type RecordEncoderHints,\n type SafeStringifyOptions,\n} from \"@loggerjs/core\";\n\n/**\n * Without any option set, encode runs on a native `JSON.stringify` fast path: nested\n * `Error` values serialize as `{}` and circular or BigInt payloads trigger a safe\n * re-encode of the whole input (circular refs become \"[Circular]\", BigInt becomes a\n * string). Setting any {@link SafeStringifyOptions} field opts into the safe encoder\n * everywhere, which also preserves `Error` name/message/stack inside data payloads.\n *\n * `includeId`, `includeSeq`, and `includeLevelName` trim the envelope for\n * lean comparable JSON output; turning `includeId` off also skips id\n * computation entirely on the record path.\n */\nexport interface FastEventJsonCodecOptions extends SafeStringifyOptions {\n includeContext?: boolean;\n includeData?: boolean;\n includeError?: boolean;\n includeTrace?: boolean;\n includeSource?: boolean;\n includeId?: boolean;\n includeSeq?: boolean;\n includeLevelName?: boolean;\n}\n\ntype JsonStringify = (value: unknown) => string | undefined;\n\nfunction hasSafeOptions(options: SafeStringifyOptions): boolean {\n return (\n options.maxDepth !== undefined ||\n options.maxArrayLength !== undefined ||\n options.maxObjectKeys !== undefined ||\n options.includeStack !== undefined ||\n options.stable !== undefined ||\n options.space !== undefined\n );\n}\n\nfunction canUseNativeEventJson(options: FastEventJsonCodecOptions): boolean {\n return (\n !hasSafeOptions(options) &&\n options.includeContext !== false &&\n options.includeData !== false &&\n options.includeError !== false &&\n options.includeTrace !== false &&\n options.includeSource !== false &&\n options.includeId !== false &&\n options.includeSeq !== false &&\n options.includeLevelName !== false\n );\n}\n\nfunction hasFullHeader(options: FastEventJsonCodecOptions): boolean {\n return (\n (options.includeId ?? true) &&\n (options.includeSeq ?? true) &&\n (options.includeLevelName ?? true)\n );\n}\n\n// Resolve every `includeX ?? true` toggle once per codec instead of on every\n// encode call. Threading these baked booleans through the encoders lets V8 keep\n// the hot path monomorphic and removes the per-call option lookups.\ninterface ResolvedFlags {\n fullHeader: boolean;\n includeId: boolean;\n includeSeq: boolean;\n includeLevelName: boolean;\n includeData: boolean;\n includeError: boolean;\n includeContext: boolean;\n includeTrace: boolean;\n includeSource: boolean;\n}\n\nfunction resolveFlags(options: FastEventJsonCodecOptions): ResolvedFlags {\n return {\n fullHeader: hasFullHeader(options),\n includeId: options.includeId ?? true,\n includeSeq: options.includeSeq ?? true,\n includeLevelName: options.includeLevelName ?? true,\n includeData: options.includeData ?? true,\n includeError: options.includeError ?? true,\n includeContext: options.includeContext ?? true,\n includeTrace: options.includeTrace ?? true,\n includeSource: options.includeSource ?? true,\n };\n}\n\nfunction createStringify(options: SafeStringifyOptions): JsonStringify {\n if (hasSafeOptions(options)) return (value) => safeJsonStringify(value, options);\n return JSON.stringify;\n}\n\nfunction appendField(\n output: string,\n name: string,\n value: unknown,\n stringify: JsonStringify,\n): string {\n if (value === undefined) return output;\n const encoded = stringify(value);\n return encoded === undefined ? output : `${output},\"${name}\":${encoded}`;\n}\n\n// JSON.stringify costs ~35ns per short string mostly in call overhead. Short\n// strings without quotes, backslashes, or control characters can be quoted\n// directly after a linear scan.\nfunction asJsonString(value: string): string {\n if (value.length > 256) return JSON.stringify(value);\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code === 34 || code === 92 || code < 32) return JSON.stringify(value);\n }\n return `\"${value}\"`;\n}\n\n// Data payloads are usually small flat objects of primitives. Writing them\n// directly skips the native JSON.stringify call overhead; any nested or\n// exotic value bails out so the caller can use the configured stringifier.\nfunction tryFlatObjectJson(value: Record<string, unknown>): string | undefined {\n // Class instances may carry toJSON or accessors; only plain objects take\n // the fast path so behavior matches JSON.stringify.\n const proto = Object.getPrototypeOf(value) as unknown;\n if (proto !== Object.prototype && proto !== null) return undefined;\n let output = \"{\";\n let first = true;\n // Object.keys (not for..in) on purpose: it returns only own enumerable keys,\n // so a polluted Object.prototype cannot leak inherited keys into log output.\n for (const key of Object.keys(value)) {\n const item = value[key];\n let encoded: string;\n switch (typeof item) {\n case \"string\":\n encoded = asJsonString(item);\n break;\n case \"number\":\n encoded = Number.isFinite(item) ? String(item) : \"null\";\n break;\n case \"boolean\":\n encoded = item ? \"true\" : \"false\";\n break;\n case \"object\":\n if (item !== null) return undefined;\n encoded = \"null\";\n break;\n case \"undefined\":\n continue;\n default:\n return undefined;\n }\n output += `${first ? \"\" : \",\"}${asJsonString(key)}:${encoded}`;\n first = false;\n }\n return `${output}}`;\n}\n\nfunction appendDataField(\n output: string,\n value: Record<string, unknown> | undefined,\n stringify: JsonStringify,\n): string {\n if (value === undefined) return output;\n const flat = tryFlatObjectJson(value);\n if (flat !== undefined) return `${output},\"data\":${flat}`;\n return appendField(output, \"data\", value, stringify);\n}\n\n// The timestamp changes once per millisecond while bursts of records share\n// it, so the rendered `\",\"time\":...,\"seq\":` fragment can be memoized the same\n// way the default id memoizes its time segment.\nlet lastFragmentTime = -1;\nlet lastTimeFragment = \"\";\n\nfunction timeFragment(time: number): string {\n if (time !== lastFragmentTime) {\n lastFragmentTime = time;\n lastTimeFragment = `\",\"time\":${time},\"seq\":`;\n }\n return lastTimeFragment;\n}\n\n// level -> ',\"level\":30,\"levelName\":\"info\",\"logger\":' — derived from the\n// numeric level alone, so a module-level cache is safe.\nconst levelFragments = new Map<number, string>();\n\nfunction levelFragment(level: number): string {\n let fragment = levelFragments.get(level);\n if (fragment === undefined) {\n fragment = `,\"level\":${level},\"levelName\":\"${toLevelName(level)}\",\"logger\":`;\n levelFragments.set(level, fragment);\n }\n return fragment;\n}\n\n// Loggers reuse one frozen category array for every record, so the joined and\n// escaped logger name can be cached per array identity.\nconst categoryFragments = new WeakMap<readonly string[], string>();\n\nfunction loggerFragment(category: readonly string[]): string {\n let fragment = categoryFragments.get(category);\n if (fragment === undefined) {\n fragment = asJsonString(category.join(\".\"));\n categoryFragments.set(category, fragment);\n }\n return fragment;\n}\n\nfunction errorForRecord(record: LogRecord): LogEvent[\"error\"] | undefined {\n if (record.err === null || record.err === undefined) return undefined;\n return normalizeError(record.err);\n}\n\ninterface PreparedRecordFragments {\n category: readonly string[];\n logger: string;\n tags: LogRecord[\"tags\"];\n tagsFragment?: string;\n}\n\nfunction tryPrepareTagsFragment(\n tags: LogRecord[\"tags\"],\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n): string | undefined {\n if (tags === null || !Object.isFrozen(tags)) return undefined;\n try {\n return tagsFragment(tags);\n } catch {\n return undefined;\n }\n}\n\nfunction loggerFragmentForRecord(\n record: LogRecord,\n prepared: PreparedRecordFragments | undefined,\n): string {\n if (prepared && record.category === prepared.category) return prepared.logger;\n return loggerFragment(record.category);\n}\n\nfunction tagsFragmentForRecord(\n record: LogRecord,\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n prepared: PreparedRecordFragments | undefined,\n): string {\n if (record.tags === null) return \"\";\n if (prepared && record.tags === prepared.tags && prepared.tagsFragment !== undefined) {\n return prepared.tagsFragment;\n }\n return tagsFragment(record.tags);\n}\n\nfunction encodeEvent(\n event: LogEvent,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: (tags: NonNullable<LogEvent[\"tags\"]>) => string,\n): string {\n let output: string;\n if (flags.fullHeader) {\n output = `{\"id\":${asJsonString(event.id)},\"time\":${event.time},\"seq\":${event.seq},\"level\":${event.level},\"levelName\":${asJsonString(event.levelName)},\"logger\":${asJsonString(event.logger)},\"message\":${asJsonString(event.message)}`;\n } else {\n // Build the header in one template literal: empty conditional fragments cost\n // nothing, and a single concatenation avoids the chain of intermediate\n // strings the previous `+=` sequence allocated per call.\n const idPart = flags.includeId ? `\"id\":${asJsonString(event.id)},` : \"\";\n const seqPart = flags.includeSeq ? `,\"seq\":${event.seq}` : \"\";\n const levelNamePart = flags.includeLevelName\n ? `,\"levelName\":${asJsonString(event.levelName)}`\n : \"\";\n output = `{${idPart}\"time\":${event.time}${seqPart},\"level\":${event.level}${levelNamePart},\"logger\":${asJsonString(event.logger)},\"message\":${asJsonString(event.message)}`;\n }\n if (event.type !== undefined) output += `,\"type\":${asJsonString(event.type)}`;\n if (event.tags !== undefined) output += tagsFragment(event.tags);\n if (flags.includeData && event.data !== undefined)\n output = appendField(output, \"data\", event.data, stringify);\n if (flags.includeError && event.error !== undefined)\n output = appendField(output, \"error\", event.error, stringify);\n if (flags.includeContext && event.context !== undefined)\n output = appendField(output, \"context\", event.context, stringify);\n if (flags.includeTrace && event.trace !== undefined)\n output = appendField(output, \"trace\", event.trace, stringify);\n if (flags.includeSource && event.source !== undefined)\n output = appendField(output, \"source\", event.source, stringify);\n return `${output}}`;\n}\n\nfunction encodeRecord(\n record: LogRecord,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n prepared?: PreparedRecordFragments,\n): string {\n let output: string;\n if (flags.fullHeader) {\n // The default id only contains [0-9a-z-] and the level name, so it never\n // needs escaping.\n const levelName = toLevelName(record.level);\n output = `{\"id\":\"${defaultRecordId(record, levelName)}${timeFragment(record.time)}${record.seq}${levelFragment(record.level)}${loggerFragmentForRecord(record, prepared)},\"message\":${asJsonString(resolveMessage(record))}`;\n } else {\n // The header is built in one template literal so it costs a single\n // concatenation per record; empty conditional fragments cost nothing. The\n // level name is resolved only when the id or the levelName field needs it,\n // so the lean envelope (both off) skips the lookup. The \"info\" default is\n // never emitted in that case — both fragments stay empty.\n const levelName =\n flags.includeId || flags.includeLevelName ? toLevelName(record.level) : \"info\";\n const idPart = flags.includeId ? `\"id\":\"${defaultRecordId(record, levelName)}\",` : \"\";\n const seqPart = flags.includeSeq ? `,\"seq\":${record.seq}` : \"\";\n const levelNamePart = flags.includeLevelName ? `,\"levelName\":\"${levelName}\"` : \"\";\n output = `{${idPart}\"time\":${record.time}${seqPart},\"level\":${record.level}${levelNamePart},\"logger\":${loggerFragmentForRecord(record, prepared)},\"message\":${asJsonString(resolveMessage(record))}`;\n }\n if (record.type !== null) output += `,\"type\":${asJsonString(record.type)}`;\n output += tagsFragmentForRecord(record, tagsFragment, prepared);\n // Guard each optional tail on the record field directly so a null field skips\n // the helper call (and its argument evaluation) entirely, matching the prior\n // `?? undefined` no-op behavior without the per-call cost.\n if (flags.includeData && record.props != null)\n output = appendDataField(output, record.props, stringify);\n if (flags.includeError && record.err != null)\n output = appendField(output, \"error\", errorForRecord(record), stringify);\n if (flags.includeContext && record.ctx != null)\n output = appendField(output, \"context\", record.ctx, stringify);\n if (flags.includeTrace && record.trace != null)\n output = appendField(output, \"trace\", record.trace, stringify);\n if (flags.includeSource && record.source !== \"app\")\n output += `,\"source\":{\"integration\":${asJsonString(record.source)}}`;\n return `${output}}`;\n}\n\ntype TagsFragment = (tags: NonNullable<LogEvent[\"tags\"]>) => string;\n\nfunction encodeItem(\n item: LogEvent | LogRecord,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: TagsFragment,\n): string {\n return isLogRecord(item)\n ? encodeRecord(item, flags, stringify, tagsFragment)\n : encodeEvent(item, flags, stringify, tagsFragment);\n}\n\nfunction encodeArray(\n items: readonly (LogEvent | LogRecord)[],\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: TagsFragment,\n): string {\n let output = \"[\";\n for (let index = 0; index < items.length; index += 1) {\n if (index > 0) output += \",\";\n output += encodeItem(items[index]!, flags, stringify, tagsFragment);\n }\n return `${output}]`;\n}\n\nfunction isCodecArray(input: CodecInput): input is readonly (LogEvent | LogRecord)[] {\n return Array.isArray(input);\n}\n\nfunction hasLogRecord(items: readonly (LogEvent | LogRecord)[]): boolean {\n for (const item of items) {\n if (isLogRecord(item)) return true;\n }\n return false;\n}\n\n// Loggers share one frozen tags object across records, so the encoded\n// fragment can be cached per object identity. Mutable tags objects are\n// re-encoded every time. Callers create one fragment encoder per codec\n// because it bakes in that codec's stringify options.\nfunction createTagsFragment(encoder: JsonStringify, cached: boolean): TagsFragment {\n const fragments = cached ? new WeakMap<object, string>() : undefined;\n return (tags) => {\n if (fragments && Object.isFrozen(tags)) {\n let fragment = fragments.get(tags);\n if (fragment === undefined) {\n const encoded = encoder(tags);\n fragment = encoded === undefined ? \"\" : `,\"tags\":${encoded}`;\n fragments.set(tags, fragment);\n }\n return fragment;\n }\n const encoded = encoder(tags);\n return encoded === undefined ? \"\" : `,\"tags\":${encoded}`;\n };\n}\n\nexport function fastEventJsonCodec(options: FastEventJsonCodecOptions = {}): Codec<string> {\n const stringify = createStringify(options);\n const safeStringify: JsonStringify = (value) => safeJsonStringify(value, options);\n const useNativeEventJson = canUseNativeEventJson(options);\n // Bake the envelope toggles once so neither the fast nor the safe encoder\n // re-derives them per call.\n const flags = resolveFlags(options);\n const tagsFragment = createTagsFragment(stringify, true);\n // The fallback must not reuse the fast fragments: a cached entry or the\n // fast stringify could throw on the exact payload that triggered fallback.\n const safeTagsFragment = createTagsFragment(safeStringify, false);\n const fastEncode = (input: CodecInput): string => {\n if (isCodecArray(input)) {\n if (useNativeEventJson && !hasLogRecord(input)) return JSON.stringify(input);\n return encodeArray(input, flags, stringify, tagsFragment);\n }\n // Dispatch the single-item case directly to the concrete encoder, skipping\n // the encodeItem indirection and resolving the record/event branch once.\n if (isLogRecord(input)) return encodeRecord(input, flags, stringify, tagsFragment);\n if (useNativeEventJson) return JSON.stringify(input);\n return encodeEvent(input, flags, stringify, tagsFragment);\n };\n return {\n name: \"fast-event-json\",\n contentType: \"application/json\",\n encode(input: CodecInput) {\n // Circular references and BigInt values throw on the native fast path. Logs\n // must never be lost to encoding, so re-encode the input with the safe\n // stringifier instead of surfacing the error as a transport failure.\n try {\n return fastEncode(input);\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.fast-event-json\");\n }\n if (isCodecArray(input)) return encodeArray(input, flags, safeStringify, safeTagsFragment);\n return encodeItem(input, flags, safeStringify, safeTagsFragment);\n },\n decode(payload) {\n return JSON.parse(payload) as LogEvent | LogEvent[];\n },\n prepareRecordEncoder(hints: RecordEncoderHints): PreparedRecordEncoder<string> {\n const prepared: PreparedRecordFragments = {\n category: hints.category,\n logger: loggerFragment(hints.category),\n tags: hints.tags,\n tagsFragment: tryPrepareTagsFragment(hints.tags, tagsFragment),\n };\n return {\n encode(record: LogRecord) {\n try {\n return encodeRecord(record, flags, stringify, tagsFragment, prepared);\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.fast-event-json\");\n }\n return encodeRecord(record, flags, safeStringify, safeTagsFragment, {\n category: prepared.category,\n logger: prepared.logger,\n tags: prepared.tags,\n });\n },\n };\n },\n };\n}\n","import { normalizeCodecInput, type Codec, type CodecInput, type LogEvent } from \"@loggerjs/core\";\nimport { Packr, type Options as MsgpackrOptions } from \"msgpackr\";\n\nexport interface MsgpackRuntime {\n pack: (input: unknown) => Uint8Array;\n unpack: (payload: Uint8Array) => unknown;\n}\n\nexport type MsgpackrCodecOptions = MsgpackrOptions;\n\nfunction isMsgpackRuntime(value: MsgpackRuntime | MsgpackrCodecOptions): value is MsgpackRuntime {\n return (\n typeof (value as MsgpackRuntime).pack === \"function\" &&\n typeof (value as MsgpackRuntime).unpack === \"function\"\n );\n}\n\nexport function msgpackrCodec(\n options: MsgpackRuntime | MsgpackrCodecOptions = {},\n): Codec<Uint8Array> {\n const runtime = isMsgpackRuntime(options) ? options : new Packr({ useRecords: true, ...options });\n return {\n name: \"msgpackr\",\n contentType: \"application/msgpack\",\n encode(input: CodecInput) {\n return runtime.pack(normalizeCodecInput(input));\n },\n decode(payload: Uint8Array) {\n return runtime.unpack(payload) as LogEvent | LogEvent[];\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n normalizeCodecInput,\n safeJsonStringify,\n type Codec,\n type CodecInput,\n type LogEvent,\n type SafeStringifyOptions,\n type SerializedError,\n} from \"@loggerjs/core\";\n\nexport type PinoCompatCollisionPolicy = \"nest\" | \"drop\" | \"throw\";\n\nexport interface PinoCompatCodecOptions extends SafeStringifyOptions {\n base?: Record<string, unknown>;\n dataKey?: string;\n errorKey?: string;\n includeLogger?: boolean;\n mergeData?: boolean;\n collision?: PinoCompatCollisionPolicy;\n}\n\nconst baseReservedRootKeys = new Set([\"time\", \"level\", \"msg\", \"err\", \"logger\", \"data\"]);\nconst dataReservedRootKeys = new Set([\n \"time\",\n \"level\",\n \"msg\",\n \"pid\",\n \"hostname\",\n \"err\",\n \"logger\",\n \"data\",\n]);\n\nfunction hasSafeOptions(options: SafeStringifyOptions): boolean {\n return (\n options.maxDepth !== undefined ||\n options.maxArrayLength !== undefined ||\n options.maxObjectKeys !== undefined ||\n options.includeStack !== undefined ||\n options.stable !== undefined ||\n options.space !== undefined\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction pinoError(error: SerializedError): Record<string, unknown> {\n return {\n type: error.name ?? \"Error\",\n message: error.message,\n stack: error.stack,\n code: error.code,\n cause: error.cause,\n };\n}\n\nfunction assignWithCollision(\n output: Record<string, unknown>,\n nested: Record<string, unknown>,\n key: string,\n value: unknown,\n policy: PinoCompatCollisionPolicy,\n reservedKeys = dataReservedRootKeys,\n) {\n if (!reservedKeys.has(key) && !(key in output)) {\n output[key] = value;\n return;\n }\n\n if (policy === \"throw\") {\n throw new Error(`pinoCompatCodec cannot merge reserved key \"${key}\"`);\n }\n if (policy === \"nest\") nested[key] = value;\n}\n\nfunction mergeNestedData(\n existing: unknown,\n nested: Record<string, unknown>,\n): Record<string, unknown> {\n if (isRecord(existing)) return { ...nested, ...existing };\n if (existing !== undefined) return { ...nested, value: existing };\n return nested;\n}\n\nfunction projectEvent(event: LogEvent, options: PinoCompatCodecOptions): Record<string, unknown> {\n const dataKey = options.dataKey ?? \"data\";\n const errorKey = options.errorKey ?? \"err\";\n const collision = options.collision ?? \"nest\";\n const output: Record<string, unknown> = {\n level: event.level,\n time: event.time,\n };\n const nested: Record<string, unknown> = {};\n\n const baseReservedKeys = new Set(baseReservedRootKeys);\n baseReservedKeys.add(dataKey);\n baseReservedKeys.add(errorKey);\n for (const [key, value] of Object.entries(options.base ?? {})) {\n assignWithCollision(output, nested, key, value, collision, baseReservedKeys);\n }\n\n if (options.includeLogger) output.logger = event.logger;\n if (event.error) output[errorKey] = pinoError(event.error);\n\n if (event.data !== undefined) {\n if (options.mergeData && isRecord(event.data)) {\n const dataReservedKeys = new Set(dataReservedRootKeys);\n dataReservedKeys.add(dataKey);\n dataReservedKeys.add(errorKey);\n for (const [key, value] of Object.entries(event.data)) {\n assignWithCollision(output, nested, key, value, collision, dataReservedKeys);\n }\n } else {\n output[dataKey] = event.data;\n }\n }\n\n if (Object.keys(nested).length > 0) {\n output[dataKey] = mergeNestedData(output[dataKey], nested);\n }\n\n output.msg = event.message;\n\n return output;\n}\n\nfunction encodeLine(event: LogEvent, options: PinoCompatCodecOptions, safeMode: boolean): string {\n const projected = projectEvent(event, options);\n if (safeMode) return safeJsonStringify(projected, options);\n try {\n const encoded = JSON.stringify(projected);\n return encoded ?? \"{}\";\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.pino-compat\");\n return safeJsonStringify(projected, options);\n }\n}\n\nfunction encodeEvents(\n input: LogEvent | LogEvent[],\n options: PinoCompatCodecOptions,\n safeMode: boolean,\n): string {\n if (!Array.isArray(input)) return `${encodeLine(input, options, safeMode)}\\n`;\n let output = \"\";\n for (const event of input) output += `${encodeLine(event, options, safeMode)}\\n`;\n return output;\n}\n\nexport function pinoCompatCodec(options: PinoCompatCodecOptions = {}): Codec<string> {\n const safeMode = hasSafeOptions(options);\n return {\n name: \"pino-compat\",\n contentType: \"application/x-ndjson\",\n encode(input: CodecInput) {\n return encodeEvents(normalizeCodecInput(input), options, safeMode);\n },\n };\n}\n\nexport const pinoNdjsonProjector = pinoCompatCodec;\n","import { normalizeCodecInput, type Codec, type CodecInput, type LogEvent } from \"@loggerjs/core\";\n\nexport interface ProjectorCodecOptions<TWire> {\n name: string;\n contentType: string;\n project: (input: LogEvent | LogEvent[]) => TWire;\n serialize: (wire: TWire) => string | Uint8Array;\n parse?: (payload: string | Uint8Array) => TWire;\n unproject?: (wire: TWire) => LogEvent | LogEvent[];\n}\n\nexport function projectorCodec<TWire>(\n options: ProjectorCodecOptions<TWire>,\n): Codec<string | Uint8Array> {\n return {\n name: options.name,\n contentType: options.contentType,\n encode(input: CodecInput) {\n return options.serialize(options.project(normalizeCodecInput(input)));\n },\n decode:\n options.parse && options.unproject\n ? (payload) => options.unproject!(options.parse!(payload))\n : undefined,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["enabledLevelNames","isRecord","hasSafeOptions","Packr"],"sources":["../src/fast-event-json.ts","../src/msgpackr.ts","../src/pino-compat.ts","../src/projector.ts"],"sourcesContent":["import {\n defaultRecordId,\n enabledLevelNames,\n incrementLoggerMetaCounter,\n isLogRecord,\n normalizeError,\n resolveMessage,\n toLevelName,\n safeJsonStringify,\n type Codec,\n type CodecInput,\n type PreparedRecordEncoder,\n type LogEvent,\n type LogRecord,\n type RecordEncoderHints,\n type SafeStringifyOptions,\n} from \"@loggerjs/core\";\n\n/**\n * Without any option set, encode runs on a native `JSON.stringify` fast path: nested\n * `Error` values serialize as `{}` and circular or BigInt payloads trigger a safe\n * re-encode of the whole input (circular refs become \"[Circular]\", BigInt becomes a\n * string). Setting any {@link SafeStringifyOptions} field opts into the safe encoder\n * everywhere, which also preserves `Error` name/message/stack inside data payloads.\n *\n * `includeId`, `includeSeq`, and `includeLevelName` trim the envelope for\n * lean comparable JSON output; turning `includeId` off also skips id\n * computation entirely on the record path.\n */\nexport interface FastEventJsonCodecOptions extends SafeStringifyOptions {\n includeContext?: boolean;\n includeData?: boolean;\n includeError?: boolean;\n includeTrace?: boolean;\n includeSource?: boolean;\n includeId?: boolean;\n includeSeq?: boolean;\n includeLevelName?: boolean;\n}\n\ntype JsonStringify = (value: unknown) => string | undefined;\n\nconst levelNameSet = new Set<string>(enabledLevelNames);\n\nfunction invalidLogEvent(path: string, expected: string): never {\n throw new TypeError(`Invalid LoggerJS log event payload at ${path}: expected ${expected}`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction requireString(value: unknown, path: string): string {\n if (typeof value !== \"string\") invalidLogEvent(path, \"string\");\n return value;\n}\n\nfunction requireFiniteNumber(value: unknown, path: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) invalidLogEvent(path, \"finite number\");\n return value;\n}\n\nfunction assertOptionalString(value: unknown, path: string): void {\n if (value !== undefined && typeof value !== \"string\") invalidLogEvent(path, \"string\");\n}\n\nfunction assertOptionalObject(value: unknown, path: string): void {\n if (value !== undefined && !isRecord(value)) invalidLogEvent(path, \"object\");\n}\n\nfunction assertTags(value: unknown, path: string): void {\n if (value === undefined) return;\n if (!isRecord(value)) invalidLogEvent(path, \"object\");\n for (const [key, item] of Object.entries(value)) {\n const type = typeof item;\n if (item !== null && type !== \"string\" && type !== \"number\" && type !== \"boolean\") {\n invalidLogEvent(`${path}.${key}`, \"string, number, boolean, or null\");\n }\n if (type === \"number\" && !Number.isFinite(item)) {\n invalidLogEvent(`${path}.${key}`, \"finite number\");\n }\n }\n}\n\nfunction assertSerializedError(value: unknown, path: string): void {\n if (value === undefined) return;\n if (!isRecord(value)) invalidLogEvent(path, \"object\");\n requireString(value.message, `${path}.message`);\n assertOptionalString(value.name, `${path}.name`);\n assertOptionalString(value.stack, `${path}.stack`);\n if (\n value.code !== undefined &&\n typeof value.code !== \"string\" &&\n typeof value.code !== \"number\"\n ) {\n invalidLogEvent(`${path}.code`, \"string or number\");\n }\n}\n\nfunction validateLogEvent(value: unknown, path: string): LogEvent {\n if (!isRecord(value)) invalidLogEvent(path, \"object\");\n requireString(value.id, `${path}.id`);\n requireFiniteNumber(value.time, `${path}.time`);\n requireFiniteNumber(value.seq, `${path}.seq`);\n requireFiniteNumber(value.level, `${path}.level`);\n const levelName = requireString(value.levelName, `${path}.levelName`);\n if (!levelNameSet.has(levelName)) invalidLogEvent(`${path}.levelName`, \"enabled log level name\");\n requireString(value.logger, `${path}.logger`);\n requireString(value.message, `${path}.message`);\n assertOptionalString(value.type, `${path}.type`);\n assertTags(value.tags, `${path}.tags`);\n assertSerializedError(value.error, `${path}.error`);\n assertOptionalObject(value.context, `${path}.context`);\n assertOptionalObject(value.trace, `${path}.trace`);\n assertOptionalObject(value.source, `${path}.source`);\n return value as unknown as LogEvent;\n}\n\nfunction validateLogEventPayload(value: unknown): LogEvent | LogEvent[] {\n if (!Array.isArray(value)) return validateLogEvent(value, \"payload\");\n return value.map((item, index) => validateLogEvent(item, `payload[${index}]`));\n}\n\nfunction hasSafeOptions(options: SafeStringifyOptions): boolean {\n return (\n options.maxDepth !== undefined ||\n options.maxArrayLength !== undefined ||\n options.maxObjectKeys !== undefined ||\n options.includeStack !== undefined ||\n options.stable !== undefined ||\n options.space !== undefined\n );\n}\n\nfunction canUseNativeEventJson(options: FastEventJsonCodecOptions): boolean {\n return (\n !hasSafeOptions(options) &&\n options.includeContext !== false &&\n options.includeData !== false &&\n options.includeError !== false &&\n options.includeTrace !== false &&\n options.includeSource !== false &&\n options.includeId !== false &&\n options.includeSeq !== false &&\n options.includeLevelName !== false\n );\n}\n\nfunction hasFullHeader(options: FastEventJsonCodecOptions): boolean {\n return (\n (options.includeId ?? true) &&\n (options.includeSeq ?? true) &&\n (options.includeLevelName ?? true)\n );\n}\n\n// Resolve every `includeX ?? true` toggle once per codec instead of on every\n// encode call. Threading these baked booleans through the encoders lets V8 keep\n// the hot path monomorphic and removes the per-call option lookups.\ninterface ResolvedFlags {\n fullHeader: boolean;\n includeId: boolean;\n includeSeq: boolean;\n includeLevelName: boolean;\n includeData: boolean;\n includeError: boolean;\n includeContext: boolean;\n includeTrace: boolean;\n includeSource: boolean;\n}\n\nfunction resolveFlags(options: FastEventJsonCodecOptions): ResolvedFlags {\n return {\n fullHeader: hasFullHeader(options),\n includeId: options.includeId ?? true,\n includeSeq: options.includeSeq ?? true,\n includeLevelName: options.includeLevelName ?? true,\n includeData: options.includeData ?? true,\n includeError: options.includeError ?? true,\n includeContext: options.includeContext ?? true,\n includeTrace: options.includeTrace ?? true,\n includeSource: options.includeSource ?? true,\n };\n}\n\nfunction createStringify(options: SafeStringifyOptions): JsonStringify {\n if (hasSafeOptions(options)) return (value) => safeJsonStringify(value, options);\n return JSON.stringify;\n}\n\nfunction appendField(\n output: string,\n name: string,\n value: unknown,\n stringify: JsonStringify,\n): string {\n if (value === undefined) return output;\n const encoded = stringify(value);\n return encoded === undefined ? output : `${output},\"${name}\":${encoded}`;\n}\n\n// JSON.stringify costs ~35ns per short string mostly in call overhead. Short\n// strings without quotes, backslashes, or control characters can be quoted\n// directly after a linear scan.\nfunction asJsonString(value: string): string {\n if (value.length > 256) return JSON.stringify(value);\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code === 34 || code === 92 || code < 32) return JSON.stringify(value);\n }\n return `\"${value}\"`;\n}\n\n// Data payloads are usually small flat objects of primitives. Writing them\n// directly skips the native JSON.stringify call overhead; any nested or\n// exotic value bails out so the caller can use the configured stringifier.\nfunction tryFlatObjectJson(value: Record<string, unknown>): string | undefined {\n // Class instances may carry toJSON or accessors; only plain objects take\n // the fast path so behavior matches JSON.stringify.\n const proto = Object.getPrototypeOf(value) as unknown;\n if (proto !== Object.prototype && proto !== null) return undefined;\n let output = \"{\";\n let first = true;\n // Object.keys (not for..in) on purpose: it returns only own enumerable keys,\n // so a polluted Object.prototype cannot leak inherited keys into log output.\n for (const key of Object.keys(value)) {\n const item = value[key];\n let encoded: string;\n switch (typeof item) {\n case \"string\":\n encoded = asJsonString(item);\n break;\n case \"number\":\n encoded = Number.isFinite(item) ? String(item) : \"null\";\n break;\n case \"boolean\":\n encoded = item ? \"true\" : \"false\";\n break;\n case \"object\":\n if (item !== null) return undefined;\n encoded = \"null\";\n break;\n case \"undefined\":\n continue;\n default:\n return undefined;\n }\n output += `${first ? \"\" : \",\"}${asJsonString(key)}:${encoded}`;\n first = false;\n }\n return `${output}}`;\n}\n\nfunction appendDataField(\n output: string,\n value: Record<string, unknown> | undefined,\n stringify: JsonStringify,\n): string {\n if (value === undefined) return output;\n const flat = tryFlatObjectJson(value);\n if (flat !== undefined) return `${output},\"data\":${flat}`;\n return appendField(output, \"data\", value, stringify);\n}\n\n// The timestamp changes once per millisecond while bursts of records share\n// it, so the rendered `\",\"time\":...,\"seq\":` fragment can be memoized the same\n// way the default id memoizes its time segment.\nlet lastFragmentTime = -1;\nlet lastTimeFragment = \"\";\n\nfunction timeFragment(time: number): string {\n if (time !== lastFragmentTime) {\n lastFragmentTime = time;\n lastTimeFragment = `\",\"time\":${time},\"seq\":`;\n }\n return lastTimeFragment;\n}\n\n// level -> ',\"level\":30,\"levelName\":\"info\",\"logger\":' — derived from the\n// numeric level alone, so a module-level cache is safe.\nconst levelFragments = new Map<number, string>();\n\nfunction levelFragment(level: number): string {\n let fragment = levelFragments.get(level);\n if (fragment === undefined) {\n fragment = `,\"level\":${level},\"levelName\":\"${toLevelName(level)}\",\"logger\":`;\n levelFragments.set(level, fragment);\n }\n return fragment;\n}\n\n// Loggers reuse one frozen category array for every record, so the joined and\n// escaped logger name can be cached per array identity.\nconst categoryFragments = new WeakMap<readonly string[], string>();\n\nfunction loggerFragment(category: readonly string[]): string {\n let fragment = categoryFragments.get(category);\n if (fragment === undefined) {\n fragment = asJsonString(category.join(\".\"));\n categoryFragments.set(category, fragment);\n }\n return fragment;\n}\n\nfunction errorForRecord(record: LogRecord): LogEvent[\"error\"] | undefined {\n if (record.err === null || record.err === undefined) return undefined;\n return normalizeError(record.err);\n}\n\ninterface PreparedRecordFragments {\n category: readonly string[];\n logger: string;\n tags: LogRecord[\"tags\"];\n tagsFragment?: string;\n}\n\nfunction tryPrepareTagsFragment(\n tags: LogRecord[\"tags\"],\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n): string | undefined {\n if (tags === null || !Object.isFrozen(tags)) return undefined;\n try {\n return tagsFragment(tags);\n } catch {\n return undefined;\n }\n}\n\nfunction loggerFragmentForRecord(\n record: LogRecord,\n prepared: PreparedRecordFragments | undefined,\n): string {\n if (prepared && record.category === prepared.category) return prepared.logger;\n return loggerFragment(record.category);\n}\n\nfunction tagsFragmentForRecord(\n record: LogRecord,\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n prepared: PreparedRecordFragments | undefined,\n): string {\n if (record.tags === null) return \"\";\n if (prepared && record.tags === prepared.tags && prepared.tagsFragment !== undefined) {\n return prepared.tagsFragment;\n }\n return tagsFragment(record.tags);\n}\n\nfunction encodeEvent(\n event: LogEvent,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: (tags: NonNullable<LogEvent[\"tags\"]>) => string,\n): string {\n let output: string;\n if (flags.fullHeader) {\n output = `{\"id\":${asJsonString(event.id)},\"time\":${event.time},\"seq\":${event.seq},\"level\":${event.level},\"levelName\":${asJsonString(event.levelName)},\"logger\":${asJsonString(event.logger)},\"message\":${asJsonString(event.message)}`;\n } else {\n // Build the header in one template literal: empty conditional fragments cost\n // nothing, and a single concatenation avoids the chain of intermediate\n // strings the previous `+=` sequence allocated per call.\n const idPart = flags.includeId ? `\"id\":${asJsonString(event.id)},` : \"\";\n const seqPart = flags.includeSeq ? `,\"seq\":${event.seq}` : \"\";\n const levelNamePart = flags.includeLevelName\n ? `,\"levelName\":${asJsonString(event.levelName)}`\n : \"\";\n output = `{${idPart}\"time\":${event.time}${seqPart},\"level\":${event.level}${levelNamePart},\"logger\":${asJsonString(event.logger)},\"message\":${asJsonString(event.message)}`;\n }\n if (event.type !== undefined) output += `,\"type\":${asJsonString(event.type)}`;\n if (event.tags !== undefined) output += tagsFragment(event.tags);\n if (flags.includeData && event.data !== undefined)\n output = appendField(output, \"data\", event.data, stringify);\n if (flags.includeError && event.error !== undefined)\n output = appendField(output, \"error\", event.error, stringify);\n if (flags.includeContext && event.context !== undefined)\n output = appendField(output, \"context\", event.context, stringify);\n if (flags.includeTrace && event.trace !== undefined)\n output = appendField(output, \"trace\", event.trace, stringify);\n if (flags.includeSource && event.source !== undefined)\n output = appendField(output, \"source\", event.source, stringify);\n return `${output}}`;\n}\n\nfunction encodeRecord(\n record: LogRecord,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n prepared?: PreparedRecordFragments,\n): string {\n let output: string;\n if (flags.fullHeader) {\n // The default id only contains [0-9a-z-] and the level name, so it never\n // needs escaping.\n const levelName = toLevelName(record.level);\n output = `{\"id\":\"${defaultRecordId(record, levelName)}${timeFragment(record.time)}${record.seq}${levelFragment(record.level)}${loggerFragmentForRecord(record, prepared)},\"message\":${asJsonString(resolveMessage(record))}`;\n } else {\n // The header is built in one template literal so it costs a single\n // concatenation per record; empty conditional fragments cost nothing. The\n // level name is resolved only when the id or the levelName field needs it,\n // so the lean envelope (both off) skips the lookup. The \"info\" default is\n // never emitted in that case — both fragments stay empty.\n const levelName =\n flags.includeId || flags.includeLevelName ? toLevelName(record.level) : \"info\";\n const idPart = flags.includeId ? `\"id\":\"${defaultRecordId(record, levelName)}\",` : \"\";\n const seqPart = flags.includeSeq ? `,\"seq\":${record.seq}` : \"\";\n const levelNamePart = flags.includeLevelName ? `,\"levelName\":\"${levelName}\"` : \"\";\n output = `{${idPart}\"time\":${record.time}${seqPart},\"level\":${record.level}${levelNamePart},\"logger\":${loggerFragmentForRecord(record, prepared)},\"message\":${asJsonString(resolveMessage(record))}`;\n }\n if (record.type !== null) output += `,\"type\":${asJsonString(record.type)}`;\n output += tagsFragmentForRecord(record, tagsFragment, prepared);\n // Guard each optional tail on the record field directly so a null field skips\n // the helper call (and its argument evaluation) entirely, matching the prior\n // `?? undefined` no-op behavior without the per-call cost.\n if (flags.includeData && record.props != null)\n output = appendDataField(output, record.props, stringify);\n if (flags.includeError && record.err != null)\n output = appendField(output, \"error\", errorForRecord(record), stringify);\n if (flags.includeContext && record.ctx != null)\n output = appendField(output, \"context\", record.ctx, stringify);\n if (flags.includeTrace && record.trace != null)\n output = appendField(output, \"trace\", record.trace, stringify);\n if (flags.includeSource && record.source !== \"app\")\n output += `,\"source\":{\"integration\":${asJsonString(record.source)}}`;\n return `${output}}`;\n}\n\ntype TagsFragment = (tags: NonNullable<LogEvent[\"tags\"]>) => string;\n\nfunction encodeItem(\n item: LogEvent | LogRecord,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: TagsFragment,\n): string {\n return isLogRecord(item)\n ? encodeRecord(item, flags, stringify, tagsFragment)\n : encodeEvent(item, flags, stringify, tagsFragment);\n}\n\nfunction encodeArray(\n items: readonly (LogEvent | LogRecord)[],\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: TagsFragment,\n): string {\n let output = \"[\";\n for (let index = 0; index < items.length; index += 1) {\n if (index > 0) output += \",\";\n output += encodeItem(items[index]!, flags, stringify, tagsFragment);\n }\n return `${output}]`;\n}\n\nfunction isCodecArray(input: CodecInput): input is readonly (LogEvent | LogRecord)[] {\n return Array.isArray(input);\n}\n\nfunction hasLogRecord(items: readonly (LogEvent | LogRecord)[]): boolean {\n for (const item of items) {\n if (isLogRecord(item)) return true;\n }\n return false;\n}\n\n// Loggers share one frozen tags object across records, so the encoded\n// fragment can be cached per object identity. Mutable tags objects are\n// re-encoded every time. Callers create one fragment encoder per codec\n// because it bakes in that codec's stringify options.\nfunction createTagsFragment(encoder: JsonStringify, cached: boolean): TagsFragment {\n const fragments = cached ? new WeakMap<object, string>() : undefined;\n return (tags) => {\n if (fragments && Object.isFrozen(tags)) {\n let fragment = fragments.get(tags);\n if (fragment === undefined) {\n const encoded = encoder(tags);\n fragment = encoded === undefined ? \"\" : `,\"tags\":${encoded}`;\n fragments.set(tags, fragment);\n }\n return fragment;\n }\n const encoded = encoder(tags);\n return encoded === undefined ? \"\" : `,\"tags\":${encoded}`;\n };\n}\n\nexport function fastEventJsonCodec(options: FastEventJsonCodecOptions = {}): Codec<string> {\n const stringify = createStringify(options);\n const safeStringify: JsonStringify = (value) => safeJsonStringify(value, options);\n const useNativeEventJson = canUseNativeEventJson(options);\n // Bake the envelope toggles once so neither the fast nor the safe encoder\n // re-derives them per call.\n const flags = resolveFlags(options);\n const tagsFragment = createTagsFragment(stringify, true);\n // The fallback must not reuse the fast fragments: a cached entry or the\n // fast stringify could throw on the exact payload that triggered fallback.\n const safeTagsFragment = createTagsFragment(safeStringify, false);\n const fastEncode = (input: CodecInput): string => {\n if (isCodecArray(input)) {\n if (useNativeEventJson && !hasLogRecord(input)) return JSON.stringify(input);\n return encodeArray(input, flags, stringify, tagsFragment);\n }\n // Dispatch the single-item case directly to the concrete encoder, skipping\n // the encodeItem indirection and resolving the record/event branch once.\n if (isLogRecord(input)) return encodeRecord(input, flags, stringify, tagsFragment);\n if (useNativeEventJson) return JSON.stringify(input);\n return encodeEvent(input, flags, stringify, tagsFragment);\n };\n return {\n name: \"fast-event-json\",\n contentType: \"application/json\",\n encode(input: CodecInput) {\n // Circular references and BigInt values throw on the native fast path. Logs\n // must never be lost to encoding, so re-encode the input with the safe\n // stringifier instead of surfacing the error as a transport failure.\n try {\n return fastEncode(input);\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.fast-event-json\");\n }\n if (isCodecArray(input)) return encodeArray(input, flags, safeStringify, safeTagsFragment);\n return encodeItem(input, flags, safeStringify, safeTagsFragment);\n },\n decode(payload) {\n return validateLogEventPayload(JSON.parse(payload));\n },\n prepareRecordEncoder(hints: RecordEncoderHints): PreparedRecordEncoder<string> {\n const prepared: PreparedRecordFragments = {\n category: hints.category,\n logger: loggerFragment(hints.category),\n tags: hints.tags,\n tagsFragment: tryPrepareTagsFragment(hints.tags, tagsFragment),\n };\n return {\n encode(record: LogRecord) {\n try {\n return encodeRecord(record, flags, stringify, tagsFragment, prepared);\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.fast-event-json\");\n }\n return encodeRecord(record, flags, safeStringify, safeTagsFragment, {\n category: prepared.category,\n logger: prepared.logger,\n tags: prepared.tags,\n });\n },\n };\n },\n };\n}\n","import { normalizeCodecInput, type Codec, type CodecInput, type LogEvent } from \"@loggerjs/core\";\nimport { Packr, type Options as MsgpackrOptions } from \"msgpackr\";\n\nexport interface MsgpackRuntime {\n pack: (input: unknown) => Uint8Array;\n unpack: (payload: Uint8Array) => unknown;\n}\n\nexport type MsgpackrCodecOptions = MsgpackrOptions;\n\nfunction isMsgpackRuntime(value: MsgpackRuntime | MsgpackrCodecOptions): value is MsgpackRuntime {\n return (\n typeof (value as MsgpackRuntime).pack === \"function\" &&\n typeof (value as MsgpackRuntime).unpack === \"function\"\n );\n}\n\nexport function msgpackrCodec(\n options: MsgpackRuntime | MsgpackrCodecOptions = {},\n): Codec<Uint8Array> {\n const runtime = isMsgpackRuntime(options) ? options : new Packr({ useRecords: true, ...options });\n return {\n name: \"msgpackr\",\n contentType: \"application/msgpack\",\n encode(input: CodecInput) {\n return runtime.pack(normalizeCodecInput(input));\n },\n decode(payload: Uint8Array) {\n return runtime.unpack(payload) as LogEvent | LogEvent[];\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n normalizeCodecInput,\n safeJsonStringify,\n type Codec,\n type CodecInput,\n type LogEvent,\n type SafeStringifyOptions,\n type SerializedError,\n} from \"@loggerjs/core\";\n\nexport type PinoCompatCollisionPolicy = \"nest\" | \"drop\" | \"throw\";\n\nexport interface PinoCompatCodecOptions extends SafeStringifyOptions {\n base?: Record<string, unknown>;\n dataKey?: string;\n errorKey?: string;\n includeLogger?: boolean;\n mergeData?: boolean;\n collision?: PinoCompatCollisionPolicy;\n}\n\nconst baseReservedRootKeys = new Set([\"time\", \"level\", \"msg\", \"err\", \"logger\", \"data\"]);\nconst dataReservedRootKeys = new Set([\n \"time\",\n \"level\",\n \"msg\",\n \"pid\",\n \"hostname\",\n \"err\",\n \"logger\",\n \"data\",\n]);\n\nfunction hasSafeOptions(options: SafeStringifyOptions): boolean {\n return (\n options.maxDepth !== undefined ||\n options.maxArrayLength !== undefined ||\n options.maxObjectKeys !== undefined ||\n options.includeStack !== undefined ||\n options.stable !== undefined ||\n options.space !== undefined\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction pinoError(error: SerializedError): Record<string, unknown> {\n return {\n type: error.name ?? \"Error\",\n message: error.message,\n stack: error.stack,\n code: error.code,\n cause: error.cause,\n };\n}\n\nfunction assignWithCollision(\n output: Record<string, unknown>,\n nested: Record<string, unknown>,\n key: string,\n value: unknown,\n policy: PinoCompatCollisionPolicy,\n reservedKeys = dataReservedRootKeys,\n) {\n if (!reservedKeys.has(key) && !(key in output)) {\n output[key] = value;\n return;\n }\n\n if (policy === \"throw\") {\n throw new Error(`pinoCompatCodec cannot merge reserved key \"${key}\"`);\n }\n if (policy === \"nest\") nested[key] = value;\n}\n\nfunction mergeNestedData(\n existing: unknown,\n nested: Record<string, unknown>,\n): Record<string, unknown> {\n if (isRecord(existing)) return { ...nested, ...existing };\n if (existing !== undefined) return { ...nested, value: existing };\n return nested;\n}\n\nfunction projectEvent(event: LogEvent, options: PinoCompatCodecOptions): Record<string, unknown> {\n const dataKey = options.dataKey ?? \"data\";\n const errorKey = options.errorKey ?? \"err\";\n const collision = options.collision ?? \"nest\";\n const output: Record<string, unknown> = {\n level: event.level,\n time: event.time,\n };\n const nested: Record<string, unknown> = {};\n\n const baseReservedKeys = new Set(baseReservedRootKeys);\n baseReservedKeys.add(dataKey);\n baseReservedKeys.add(errorKey);\n for (const [key, value] of Object.entries(options.base ?? {})) {\n assignWithCollision(output, nested, key, value, collision, baseReservedKeys);\n }\n\n if (options.includeLogger) output.logger = event.logger;\n if (event.error) output[errorKey] = pinoError(event.error);\n\n if (event.data !== undefined) {\n if (options.mergeData && isRecord(event.data)) {\n const dataReservedKeys = new Set(dataReservedRootKeys);\n dataReservedKeys.add(dataKey);\n dataReservedKeys.add(errorKey);\n for (const [key, value] of Object.entries(event.data)) {\n assignWithCollision(output, nested, key, value, collision, dataReservedKeys);\n }\n } else {\n output[dataKey] = event.data;\n }\n }\n\n if (Object.keys(nested).length > 0) {\n output[dataKey] = mergeNestedData(output[dataKey], nested);\n }\n\n output.msg = event.message;\n\n return output;\n}\n\nfunction encodeLine(event: LogEvent, options: PinoCompatCodecOptions, safeMode: boolean): string {\n const projected = projectEvent(event, options);\n if (safeMode) return safeJsonStringify(projected, options);\n try {\n const encoded = JSON.stringify(projected);\n return encoded ?? \"{}\";\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.pino-compat\");\n return safeJsonStringify(projected, options);\n }\n}\n\nfunction encodeEvents(\n input: LogEvent | LogEvent[],\n options: PinoCompatCodecOptions,\n safeMode: boolean,\n): string {\n if (!Array.isArray(input)) return `${encodeLine(input, options, safeMode)}\\n`;\n let output = \"\";\n for (const event of input) output += `${encodeLine(event, options, safeMode)}\\n`;\n return output;\n}\n\nexport function pinoCompatCodec(options: PinoCompatCodecOptions = {}): Codec<string> {\n const safeMode = hasSafeOptions(options);\n return {\n name: \"pino-compat\",\n contentType: \"application/x-ndjson\",\n encode(input: CodecInput) {\n return encodeEvents(normalizeCodecInput(input), options, safeMode);\n },\n };\n}\n\nexport const pinoNdjsonProjector = pinoCompatCodec;\n","import { normalizeCodecInput, type Codec, type CodecInput, type LogEvent } from \"@loggerjs/core\";\n\nexport interface ProjectorCodecOptions<TWire> {\n name: string;\n contentType: string;\n project: (input: LogEvent | LogEvent[]) => TWire;\n serialize: (wire: TWire) => string | Uint8Array;\n parse?: (payload: string | Uint8Array) => TWire;\n unproject?: (wire: TWire) => LogEvent | LogEvent[];\n}\n\nexport function projectorCodec<TWire>(\n options: ProjectorCodecOptions<TWire>,\n): Codec<string | Uint8Array> {\n return {\n name: options.name,\n contentType: options.contentType,\n encode(input: CodecInput) {\n return options.serialize(options.project(normalizeCodecInput(input)));\n },\n decode:\n options.parse && options.unproject\n ? (payload) => options.unproject!(options.parse!(payload))\n : undefined,\n };\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,67 @@
|
|
|
1
|
-
import { defaultRecordId, incrementLoggerMetaCounter, isLogRecord, normalizeCodecInput, normalizeError, resolveMessage, safeJsonStringify, toLevelName } from "@loggerjs/core";
|
|
1
|
+
import { defaultRecordId, enabledLevelNames, incrementLoggerMetaCounter, isLogRecord, normalizeCodecInput, normalizeError, resolveMessage, safeJsonStringify, toLevelName } from "@loggerjs/core";
|
|
2
2
|
import { Packr } from "msgpackr";
|
|
3
3
|
export * from "@loggerjs/core";
|
|
4
4
|
//#region src/fast-event-json.ts
|
|
5
|
+
const levelNameSet = new Set(enabledLevelNames);
|
|
6
|
+
function invalidLogEvent(path, expected) {
|
|
7
|
+
throw new TypeError(`Invalid LoggerJS log event payload at ${path}: expected ${expected}`);
|
|
8
|
+
}
|
|
9
|
+
function isRecord$1(value) {
|
|
10
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function requireString(value, path) {
|
|
13
|
+
if (typeof value !== "string") invalidLogEvent(path, "string");
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function requireFiniteNumber(value, path) {
|
|
17
|
+
if (typeof value !== "number" || !Number.isFinite(value)) invalidLogEvent(path, "finite number");
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function assertOptionalString(value, path) {
|
|
21
|
+
if (value !== void 0 && typeof value !== "string") invalidLogEvent(path, "string");
|
|
22
|
+
}
|
|
23
|
+
function assertOptionalObject(value, path) {
|
|
24
|
+
if (value !== void 0 && !isRecord$1(value)) invalidLogEvent(path, "object");
|
|
25
|
+
}
|
|
26
|
+
function assertTags(value, path) {
|
|
27
|
+
if (value === void 0) return;
|
|
28
|
+
if (!isRecord$1(value)) invalidLogEvent(path, "object");
|
|
29
|
+
for (const [key, item] of Object.entries(value)) {
|
|
30
|
+
const type = typeof item;
|
|
31
|
+
if (item !== null && type !== "string" && type !== "number" && type !== "boolean") invalidLogEvent(`${path}.${key}`, "string, number, boolean, or null");
|
|
32
|
+
if (type === "number" && !Number.isFinite(item)) invalidLogEvent(`${path}.${key}`, "finite number");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function assertSerializedError(value, path) {
|
|
36
|
+
if (value === void 0) return;
|
|
37
|
+
if (!isRecord$1(value)) invalidLogEvent(path, "object");
|
|
38
|
+
requireString(value.message, `${path}.message`);
|
|
39
|
+
assertOptionalString(value.name, `${path}.name`);
|
|
40
|
+
assertOptionalString(value.stack, `${path}.stack`);
|
|
41
|
+
if (value.code !== void 0 && typeof value.code !== "string" && typeof value.code !== "number") invalidLogEvent(`${path}.code`, "string or number");
|
|
42
|
+
}
|
|
43
|
+
function validateLogEvent(value, path) {
|
|
44
|
+
if (!isRecord$1(value)) invalidLogEvent(path, "object");
|
|
45
|
+
requireString(value.id, `${path}.id`);
|
|
46
|
+
requireFiniteNumber(value.time, `${path}.time`);
|
|
47
|
+
requireFiniteNumber(value.seq, `${path}.seq`);
|
|
48
|
+
requireFiniteNumber(value.level, `${path}.level`);
|
|
49
|
+
const levelName = requireString(value.levelName, `${path}.levelName`);
|
|
50
|
+
if (!levelNameSet.has(levelName)) invalidLogEvent(`${path}.levelName`, "enabled log level name");
|
|
51
|
+
requireString(value.logger, `${path}.logger`);
|
|
52
|
+
requireString(value.message, `${path}.message`);
|
|
53
|
+
assertOptionalString(value.type, `${path}.type`);
|
|
54
|
+
assertTags(value.tags, `${path}.tags`);
|
|
55
|
+
assertSerializedError(value.error, `${path}.error`);
|
|
56
|
+
assertOptionalObject(value.context, `${path}.context`);
|
|
57
|
+
assertOptionalObject(value.trace, `${path}.trace`);
|
|
58
|
+
assertOptionalObject(value.source, `${path}.source`);
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function validateLogEventPayload(value) {
|
|
62
|
+
if (!Array.isArray(value)) return validateLogEvent(value, "payload");
|
|
63
|
+
return value.map((item, index) => validateLogEvent(item, `payload[${index}]`));
|
|
64
|
+
}
|
|
5
65
|
function hasSafeOptions$1(options) {
|
|
6
66
|
return options.maxDepth !== void 0 || options.maxArrayLength !== void 0 || options.maxObjectKeys !== void 0 || options.includeStack !== void 0 || options.stable !== void 0 || options.space !== void 0;
|
|
7
67
|
}
|
|
@@ -226,7 +286,7 @@ function fastEventJsonCodec(options = {}) {
|
|
|
226
286
|
return encodeItem(input, flags, safeStringify, safeTagsFragment);
|
|
227
287
|
},
|
|
228
288
|
decode(payload) {
|
|
229
|
-
return JSON.parse(payload);
|
|
289
|
+
return validateLogEventPayload(JSON.parse(payload));
|
|
230
290
|
},
|
|
231
291
|
prepareRecordEncoder(hints) {
|
|
232
292
|
const prepared = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["hasSafeOptions"],"sources":["../src/fast-event-json.ts","../src/msgpackr.ts","../src/pino-compat.ts","../src/projector.ts"],"sourcesContent":["import {\n defaultRecordId,\n incrementLoggerMetaCounter,\n isLogRecord,\n normalizeError,\n resolveMessage,\n toLevelName,\n safeJsonStringify,\n type Codec,\n type CodecInput,\n type PreparedRecordEncoder,\n type LogEvent,\n type LogRecord,\n type RecordEncoderHints,\n type SafeStringifyOptions,\n} from \"@loggerjs/core\";\n\n/**\n * Without any option set, encode runs on a native `JSON.stringify` fast path: nested\n * `Error` values serialize as `{}` and circular or BigInt payloads trigger a safe\n * re-encode of the whole input (circular refs become \"[Circular]\", BigInt becomes a\n * string). Setting any {@link SafeStringifyOptions} field opts into the safe encoder\n * everywhere, which also preserves `Error` name/message/stack inside data payloads.\n *\n * `includeId`, `includeSeq`, and `includeLevelName` trim the envelope for\n * lean comparable JSON output; turning `includeId` off also skips id\n * computation entirely on the record path.\n */\nexport interface FastEventJsonCodecOptions extends SafeStringifyOptions {\n includeContext?: boolean;\n includeData?: boolean;\n includeError?: boolean;\n includeTrace?: boolean;\n includeSource?: boolean;\n includeId?: boolean;\n includeSeq?: boolean;\n includeLevelName?: boolean;\n}\n\ntype JsonStringify = (value: unknown) => string | undefined;\n\nfunction hasSafeOptions(options: SafeStringifyOptions): boolean {\n return (\n options.maxDepth !== undefined ||\n options.maxArrayLength !== undefined ||\n options.maxObjectKeys !== undefined ||\n options.includeStack !== undefined ||\n options.stable !== undefined ||\n options.space !== undefined\n );\n}\n\nfunction canUseNativeEventJson(options: FastEventJsonCodecOptions): boolean {\n return (\n !hasSafeOptions(options) &&\n options.includeContext !== false &&\n options.includeData !== false &&\n options.includeError !== false &&\n options.includeTrace !== false &&\n options.includeSource !== false &&\n options.includeId !== false &&\n options.includeSeq !== false &&\n options.includeLevelName !== false\n );\n}\n\nfunction hasFullHeader(options: FastEventJsonCodecOptions): boolean {\n return (\n (options.includeId ?? true) &&\n (options.includeSeq ?? true) &&\n (options.includeLevelName ?? true)\n );\n}\n\n// Resolve every `includeX ?? true` toggle once per codec instead of on every\n// encode call. Threading these baked booleans through the encoders lets V8 keep\n// the hot path monomorphic and removes the per-call option lookups.\ninterface ResolvedFlags {\n fullHeader: boolean;\n includeId: boolean;\n includeSeq: boolean;\n includeLevelName: boolean;\n includeData: boolean;\n includeError: boolean;\n includeContext: boolean;\n includeTrace: boolean;\n includeSource: boolean;\n}\n\nfunction resolveFlags(options: FastEventJsonCodecOptions): ResolvedFlags {\n return {\n fullHeader: hasFullHeader(options),\n includeId: options.includeId ?? true,\n includeSeq: options.includeSeq ?? true,\n includeLevelName: options.includeLevelName ?? true,\n includeData: options.includeData ?? true,\n includeError: options.includeError ?? true,\n includeContext: options.includeContext ?? true,\n includeTrace: options.includeTrace ?? true,\n includeSource: options.includeSource ?? true,\n };\n}\n\nfunction createStringify(options: SafeStringifyOptions): JsonStringify {\n if (hasSafeOptions(options)) return (value) => safeJsonStringify(value, options);\n return JSON.stringify;\n}\n\nfunction appendField(\n output: string,\n name: string,\n value: unknown,\n stringify: JsonStringify,\n): string {\n if (value === undefined) return output;\n const encoded = stringify(value);\n return encoded === undefined ? output : `${output},\"${name}\":${encoded}`;\n}\n\n// JSON.stringify costs ~35ns per short string mostly in call overhead. Short\n// strings without quotes, backslashes, or control characters can be quoted\n// directly after a linear scan.\nfunction asJsonString(value: string): string {\n if (value.length > 256) return JSON.stringify(value);\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code === 34 || code === 92 || code < 32) return JSON.stringify(value);\n }\n return `\"${value}\"`;\n}\n\n// Data payloads are usually small flat objects of primitives. Writing them\n// directly skips the native JSON.stringify call overhead; any nested or\n// exotic value bails out so the caller can use the configured stringifier.\nfunction tryFlatObjectJson(value: Record<string, unknown>): string | undefined {\n // Class instances may carry toJSON or accessors; only plain objects take\n // the fast path so behavior matches JSON.stringify.\n const proto = Object.getPrototypeOf(value) as unknown;\n if (proto !== Object.prototype && proto !== null) return undefined;\n let output = \"{\";\n let first = true;\n // Object.keys (not for..in) on purpose: it returns only own enumerable keys,\n // so a polluted Object.prototype cannot leak inherited keys into log output.\n for (const key of Object.keys(value)) {\n const item = value[key];\n let encoded: string;\n switch (typeof item) {\n case \"string\":\n encoded = asJsonString(item);\n break;\n case \"number\":\n encoded = Number.isFinite(item) ? String(item) : \"null\";\n break;\n case \"boolean\":\n encoded = item ? \"true\" : \"false\";\n break;\n case \"object\":\n if (item !== null) return undefined;\n encoded = \"null\";\n break;\n case \"undefined\":\n continue;\n default:\n return undefined;\n }\n output += `${first ? \"\" : \",\"}${asJsonString(key)}:${encoded}`;\n first = false;\n }\n return `${output}}`;\n}\n\nfunction appendDataField(\n output: string,\n value: Record<string, unknown> | undefined,\n stringify: JsonStringify,\n): string {\n if (value === undefined) return output;\n const flat = tryFlatObjectJson(value);\n if (flat !== undefined) return `${output},\"data\":${flat}`;\n return appendField(output, \"data\", value, stringify);\n}\n\n// The timestamp changes once per millisecond while bursts of records share\n// it, so the rendered `\",\"time\":...,\"seq\":` fragment can be memoized the same\n// way the default id memoizes its time segment.\nlet lastFragmentTime = -1;\nlet lastTimeFragment = \"\";\n\nfunction timeFragment(time: number): string {\n if (time !== lastFragmentTime) {\n lastFragmentTime = time;\n lastTimeFragment = `\",\"time\":${time},\"seq\":`;\n }\n return lastTimeFragment;\n}\n\n// level -> ',\"level\":30,\"levelName\":\"info\",\"logger\":' — derived from the\n// numeric level alone, so a module-level cache is safe.\nconst levelFragments = new Map<number, string>();\n\nfunction levelFragment(level: number): string {\n let fragment = levelFragments.get(level);\n if (fragment === undefined) {\n fragment = `,\"level\":${level},\"levelName\":\"${toLevelName(level)}\",\"logger\":`;\n levelFragments.set(level, fragment);\n }\n return fragment;\n}\n\n// Loggers reuse one frozen category array for every record, so the joined and\n// escaped logger name can be cached per array identity.\nconst categoryFragments = new WeakMap<readonly string[], string>();\n\nfunction loggerFragment(category: readonly string[]): string {\n let fragment = categoryFragments.get(category);\n if (fragment === undefined) {\n fragment = asJsonString(category.join(\".\"));\n categoryFragments.set(category, fragment);\n }\n return fragment;\n}\n\nfunction errorForRecord(record: LogRecord): LogEvent[\"error\"] | undefined {\n if (record.err === null || record.err === undefined) return undefined;\n return normalizeError(record.err);\n}\n\ninterface PreparedRecordFragments {\n category: readonly string[];\n logger: string;\n tags: LogRecord[\"tags\"];\n tagsFragment?: string;\n}\n\nfunction tryPrepareTagsFragment(\n tags: LogRecord[\"tags\"],\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n): string | undefined {\n if (tags === null || !Object.isFrozen(tags)) return undefined;\n try {\n return tagsFragment(tags);\n } catch {\n return undefined;\n }\n}\n\nfunction loggerFragmentForRecord(\n record: LogRecord,\n prepared: PreparedRecordFragments | undefined,\n): string {\n if (prepared && record.category === prepared.category) return prepared.logger;\n return loggerFragment(record.category);\n}\n\nfunction tagsFragmentForRecord(\n record: LogRecord,\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n prepared: PreparedRecordFragments | undefined,\n): string {\n if (record.tags === null) return \"\";\n if (prepared && record.tags === prepared.tags && prepared.tagsFragment !== undefined) {\n return prepared.tagsFragment;\n }\n return tagsFragment(record.tags);\n}\n\nfunction encodeEvent(\n event: LogEvent,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: (tags: NonNullable<LogEvent[\"tags\"]>) => string,\n): string {\n let output: string;\n if (flags.fullHeader) {\n output = `{\"id\":${asJsonString(event.id)},\"time\":${event.time},\"seq\":${event.seq},\"level\":${event.level},\"levelName\":${asJsonString(event.levelName)},\"logger\":${asJsonString(event.logger)},\"message\":${asJsonString(event.message)}`;\n } else {\n // Build the header in one template literal: empty conditional fragments cost\n // nothing, and a single concatenation avoids the chain of intermediate\n // strings the previous `+=` sequence allocated per call.\n const idPart = flags.includeId ? `\"id\":${asJsonString(event.id)},` : \"\";\n const seqPart = flags.includeSeq ? `,\"seq\":${event.seq}` : \"\";\n const levelNamePart = flags.includeLevelName\n ? `,\"levelName\":${asJsonString(event.levelName)}`\n : \"\";\n output = `{${idPart}\"time\":${event.time}${seqPart},\"level\":${event.level}${levelNamePart},\"logger\":${asJsonString(event.logger)},\"message\":${asJsonString(event.message)}`;\n }\n if (event.type !== undefined) output += `,\"type\":${asJsonString(event.type)}`;\n if (event.tags !== undefined) output += tagsFragment(event.tags);\n if (flags.includeData && event.data !== undefined)\n output = appendField(output, \"data\", event.data, stringify);\n if (flags.includeError && event.error !== undefined)\n output = appendField(output, \"error\", event.error, stringify);\n if (flags.includeContext && event.context !== undefined)\n output = appendField(output, \"context\", event.context, stringify);\n if (flags.includeTrace && event.trace !== undefined)\n output = appendField(output, \"trace\", event.trace, stringify);\n if (flags.includeSource && event.source !== undefined)\n output = appendField(output, \"source\", event.source, stringify);\n return `${output}}`;\n}\n\nfunction encodeRecord(\n record: LogRecord,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n prepared?: PreparedRecordFragments,\n): string {\n let output: string;\n if (flags.fullHeader) {\n // The default id only contains [0-9a-z-] and the level name, so it never\n // needs escaping.\n const levelName = toLevelName(record.level);\n output = `{\"id\":\"${defaultRecordId(record, levelName)}${timeFragment(record.time)}${record.seq}${levelFragment(record.level)}${loggerFragmentForRecord(record, prepared)},\"message\":${asJsonString(resolveMessage(record))}`;\n } else {\n // The header is built in one template literal so it costs a single\n // concatenation per record; empty conditional fragments cost nothing. The\n // level name is resolved only when the id or the levelName field needs it,\n // so the lean envelope (both off) skips the lookup. The \"info\" default is\n // never emitted in that case — both fragments stay empty.\n const levelName =\n flags.includeId || flags.includeLevelName ? toLevelName(record.level) : \"info\";\n const idPart = flags.includeId ? `\"id\":\"${defaultRecordId(record, levelName)}\",` : \"\";\n const seqPart = flags.includeSeq ? `,\"seq\":${record.seq}` : \"\";\n const levelNamePart = flags.includeLevelName ? `,\"levelName\":\"${levelName}\"` : \"\";\n output = `{${idPart}\"time\":${record.time}${seqPart},\"level\":${record.level}${levelNamePart},\"logger\":${loggerFragmentForRecord(record, prepared)},\"message\":${asJsonString(resolveMessage(record))}`;\n }\n if (record.type !== null) output += `,\"type\":${asJsonString(record.type)}`;\n output += tagsFragmentForRecord(record, tagsFragment, prepared);\n // Guard each optional tail on the record field directly so a null field skips\n // the helper call (and its argument evaluation) entirely, matching the prior\n // `?? undefined` no-op behavior without the per-call cost.\n if (flags.includeData && record.props != null)\n output = appendDataField(output, record.props, stringify);\n if (flags.includeError && record.err != null)\n output = appendField(output, \"error\", errorForRecord(record), stringify);\n if (flags.includeContext && record.ctx != null)\n output = appendField(output, \"context\", record.ctx, stringify);\n if (flags.includeTrace && record.trace != null)\n output = appendField(output, \"trace\", record.trace, stringify);\n if (flags.includeSource && record.source !== \"app\")\n output += `,\"source\":{\"integration\":${asJsonString(record.source)}}`;\n return `${output}}`;\n}\n\ntype TagsFragment = (tags: NonNullable<LogEvent[\"tags\"]>) => string;\n\nfunction encodeItem(\n item: LogEvent | LogRecord,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: TagsFragment,\n): string {\n return isLogRecord(item)\n ? encodeRecord(item, flags, stringify, tagsFragment)\n : encodeEvent(item, flags, stringify, tagsFragment);\n}\n\nfunction encodeArray(\n items: readonly (LogEvent | LogRecord)[],\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: TagsFragment,\n): string {\n let output = \"[\";\n for (let index = 0; index < items.length; index += 1) {\n if (index > 0) output += \",\";\n output += encodeItem(items[index]!, flags, stringify, tagsFragment);\n }\n return `${output}]`;\n}\n\nfunction isCodecArray(input: CodecInput): input is readonly (LogEvent | LogRecord)[] {\n return Array.isArray(input);\n}\n\nfunction hasLogRecord(items: readonly (LogEvent | LogRecord)[]): boolean {\n for (const item of items) {\n if (isLogRecord(item)) return true;\n }\n return false;\n}\n\n// Loggers share one frozen tags object across records, so the encoded\n// fragment can be cached per object identity. Mutable tags objects are\n// re-encoded every time. Callers create one fragment encoder per codec\n// because it bakes in that codec's stringify options.\nfunction createTagsFragment(encoder: JsonStringify, cached: boolean): TagsFragment {\n const fragments = cached ? new WeakMap<object, string>() : undefined;\n return (tags) => {\n if (fragments && Object.isFrozen(tags)) {\n let fragment = fragments.get(tags);\n if (fragment === undefined) {\n const encoded = encoder(tags);\n fragment = encoded === undefined ? \"\" : `,\"tags\":${encoded}`;\n fragments.set(tags, fragment);\n }\n return fragment;\n }\n const encoded = encoder(tags);\n return encoded === undefined ? \"\" : `,\"tags\":${encoded}`;\n };\n}\n\nexport function fastEventJsonCodec(options: FastEventJsonCodecOptions = {}): Codec<string> {\n const stringify = createStringify(options);\n const safeStringify: JsonStringify = (value) => safeJsonStringify(value, options);\n const useNativeEventJson = canUseNativeEventJson(options);\n // Bake the envelope toggles once so neither the fast nor the safe encoder\n // re-derives them per call.\n const flags = resolveFlags(options);\n const tagsFragment = createTagsFragment(stringify, true);\n // The fallback must not reuse the fast fragments: a cached entry or the\n // fast stringify could throw on the exact payload that triggered fallback.\n const safeTagsFragment = createTagsFragment(safeStringify, false);\n const fastEncode = (input: CodecInput): string => {\n if (isCodecArray(input)) {\n if (useNativeEventJson && !hasLogRecord(input)) return JSON.stringify(input);\n return encodeArray(input, flags, stringify, tagsFragment);\n }\n // Dispatch the single-item case directly to the concrete encoder, skipping\n // the encodeItem indirection and resolving the record/event branch once.\n if (isLogRecord(input)) return encodeRecord(input, flags, stringify, tagsFragment);\n if (useNativeEventJson) return JSON.stringify(input);\n return encodeEvent(input, flags, stringify, tagsFragment);\n };\n return {\n name: \"fast-event-json\",\n contentType: \"application/json\",\n encode(input: CodecInput) {\n // Circular references and BigInt values throw on the native fast path. Logs\n // must never be lost to encoding, so re-encode the input with the safe\n // stringifier instead of surfacing the error as a transport failure.\n try {\n return fastEncode(input);\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.fast-event-json\");\n }\n if (isCodecArray(input)) return encodeArray(input, flags, safeStringify, safeTagsFragment);\n return encodeItem(input, flags, safeStringify, safeTagsFragment);\n },\n decode(payload) {\n return JSON.parse(payload) as LogEvent | LogEvent[];\n },\n prepareRecordEncoder(hints: RecordEncoderHints): PreparedRecordEncoder<string> {\n const prepared: PreparedRecordFragments = {\n category: hints.category,\n logger: loggerFragment(hints.category),\n tags: hints.tags,\n tagsFragment: tryPrepareTagsFragment(hints.tags, tagsFragment),\n };\n return {\n encode(record: LogRecord) {\n try {\n return encodeRecord(record, flags, stringify, tagsFragment, prepared);\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.fast-event-json\");\n }\n return encodeRecord(record, flags, safeStringify, safeTagsFragment, {\n category: prepared.category,\n logger: prepared.logger,\n tags: prepared.tags,\n });\n },\n };\n },\n };\n}\n","import { normalizeCodecInput, type Codec, type CodecInput, type LogEvent } from \"@loggerjs/core\";\nimport { Packr, type Options as MsgpackrOptions } from \"msgpackr\";\n\nexport interface MsgpackRuntime {\n pack: (input: unknown) => Uint8Array;\n unpack: (payload: Uint8Array) => unknown;\n}\n\nexport type MsgpackrCodecOptions = MsgpackrOptions;\n\nfunction isMsgpackRuntime(value: MsgpackRuntime | MsgpackrCodecOptions): value is MsgpackRuntime {\n return (\n typeof (value as MsgpackRuntime).pack === \"function\" &&\n typeof (value as MsgpackRuntime).unpack === \"function\"\n );\n}\n\nexport function msgpackrCodec(\n options: MsgpackRuntime | MsgpackrCodecOptions = {},\n): Codec<Uint8Array> {\n const runtime = isMsgpackRuntime(options) ? options : new Packr({ useRecords: true, ...options });\n return {\n name: \"msgpackr\",\n contentType: \"application/msgpack\",\n encode(input: CodecInput) {\n return runtime.pack(normalizeCodecInput(input));\n },\n decode(payload: Uint8Array) {\n return runtime.unpack(payload) as LogEvent | LogEvent[];\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n normalizeCodecInput,\n safeJsonStringify,\n type Codec,\n type CodecInput,\n type LogEvent,\n type SafeStringifyOptions,\n type SerializedError,\n} from \"@loggerjs/core\";\n\nexport type PinoCompatCollisionPolicy = \"nest\" | \"drop\" | \"throw\";\n\nexport interface PinoCompatCodecOptions extends SafeStringifyOptions {\n base?: Record<string, unknown>;\n dataKey?: string;\n errorKey?: string;\n includeLogger?: boolean;\n mergeData?: boolean;\n collision?: PinoCompatCollisionPolicy;\n}\n\nconst baseReservedRootKeys = new Set([\"time\", \"level\", \"msg\", \"err\", \"logger\", \"data\"]);\nconst dataReservedRootKeys = new Set([\n \"time\",\n \"level\",\n \"msg\",\n \"pid\",\n \"hostname\",\n \"err\",\n \"logger\",\n \"data\",\n]);\n\nfunction hasSafeOptions(options: SafeStringifyOptions): boolean {\n return (\n options.maxDepth !== undefined ||\n options.maxArrayLength !== undefined ||\n options.maxObjectKeys !== undefined ||\n options.includeStack !== undefined ||\n options.stable !== undefined ||\n options.space !== undefined\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction pinoError(error: SerializedError): Record<string, unknown> {\n return {\n type: error.name ?? \"Error\",\n message: error.message,\n stack: error.stack,\n code: error.code,\n cause: error.cause,\n };\n}\n\nfunction assignWithCollision(\n output: Record<string, unknown>,\n nested: Record<string, unknown>,\n key: string,\n value: unknown,\n policy: PinoCompatCollisionPolicy,\n reservedKeys = dataReservedRootKeys,\n) {\n if (!reservedKeys.has(key) && !(key in output)) {\n output[key] = value;\n return;\n }\n\n if (policy === \"throw\") {\n throw new Error(`pinoCompatCodec cannot merge reserved key \"${key}\"`);\n }\n if (policy === \"nest\") nested[key] = value;\n}\n\nfunction mergeNestedData(\n existing: unknown,\n nested: Record<string, unknown>,\n): Record<string, unknown> {\n if (isRecord(existing)) return { ...nested, ...existing };\n if (existing !== undefined) return { ...nested, value: existing };\n return nested;\n}\n\nfunction projectEvent(event: LogEvent, options: PinoCompatCodecOptions): Record<string, unknown> {\n const dataKey = options.dataKey ?? \"data\";\n const errorKey = options.errorKey ?? \"err\";\n const collision = options.collision ?? \"nest\";\n const output: Record<string, unknown> = {\n level: event.level,\n time: event.time,\n };\n const nested: Record<string, unknown> = {};\n\n const baseReservedKeys = new Set(baseReservedRootKeys);\n baseReservedKeys.add(dataKey);\n baseReservedKeys.add(errorKey);\n for (const [key, value] of Object.entries(options.base ?? {})) {\n assignWithCollision(output, nested, key, value, collision, baseReservedKeys);\n }\n\n if (options.includeLogger) output.logger = event.logger;\n if (event.error) output[errorKey] = pinoError(event.error);\n\n if (event.data !== undefined) {\n if (options.mergeData && isRecord(event.data)) {\n const dataReservedKeys = new Set(dataReservedRootKeys);\n dataReservedKeys.add(dataKey);\n dataReservedKeys.add(errorKey);\n for (const [key, value] of Object.entries(event.data)) {\n assignWithCollision(output, nested, key, value, collision, dataReservedKeys);\n }\n } else {\n output[dataKey] = event.data;\n }\n }\n\n if (Object.keys(nested).length > 0) {\n output[dataKey] = mergeNestedData(output[dataKey], nested);\n }\n\n output.msg = event.message;\n\n return output;\n}\n\nfunction encodeLine(event: LogEvent, options: PinoCompatCodecOptions, safeMode: boolean): string {\n const projected = projectEvent(event, options);\n if (safeMode) return safeJsonStringify(projected, options);\n try {\n const encoded = JSON.stringify(projected);\n return encoded ?? \"{}\";\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.pino-compat\");\n return safeJsonStringify(projected, options);\n }\n}\n\nfunction encodeEvents(\n input: LogEvent | LogEvent[],\n options: PinoCompatCodecOptions,\n safeMode: boolean,\n): string {\n if (!Array.isArray(input)) return `${encodeLine(input, options, safeMode)}\\n`;\n let output = \"\";\n for (const event of input) output += `${encodeLine(event, options, safeMode)}\\n`;\n return output;\n}\n\nexport function pinoCompatCodec(options: PinoCompatCodecOptions = {}): Codec<string> {\n const safeMode = hasSafeOptions(options);\n return {\n name: \"pino-compat\",\n contentType: \"application/x-ndjson\",\n encode(input: CodecInput) {\n return encodeEvents(normalizeCodecInput(input), options, safeMode);\n },\n };\n}\n\nexport const pinoNdjsonProjector = pinoCompatCodec;\n","import { normalizeCodecInput, type Codec, type CodecInput, type LogEvent } from \"@loggerjs/core\";\n\nexport interface ProjectorCodecOptions<TWire> {\n name: string;\n contentType: string;\n project: (input: LogEvent | LogEvent[]) => TWire;\n serialize: (wire: TWire) => string | Uint8Array;\n parse?: (payload: string | Uint8Array) => TWire;\n unproject?: (wire: TWire) => LogEvent | LogEvent[];\n}\n\nexport function projectorCodec<TWire>(\n options: ProjectorCodecOptions<TWire>,\n): Codec<string | Uint8Array> {\n return {\n name: options.name,\n contentType: options.contentType,\n encode(input: CodecInput) {\n return options.serialize(options.project(normalizeCodecInput(input)));\n },\n decode:\n options.parse && options.unproject\n ? (payload) => options.unproject!(options.parse!(payload))\n : undefined,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["isRecord","hasSafeOptions"],"sources":["../src/fast-event-json.ts","../src/msgpackr.ts","../src/pino-compat.ts","../src/projector.ts"],"sourcesContent":["import {\n defaultRecordId,\n enabledLevelNames,\n incrementLoggerMetaCounter,\n isLogRecord,\n normalizeError,\n resolveMessage,\n toLevelName,\n safeJsonStringify,\n type Codec,\n type CodecInput,\n type PreparedRecordEncoder,\n type LogEvent,\n type LogRecord,\n type RecordEncoderHints,\n type SafeStringifyOptions,\n} from \"@loggerjs/core\";\n\n/**\n * Without any option set, encode runs on a native `JSON.stringify` fast path: nested\n * `Error` values serialize as `{}` and circular or BigInt payloads trigger a safe\n * re-encode of the whole input (circular refs become \"[Circular]\", BigInt becomes a\n * string). Setting any {@link SafeStringifyOptions} field opts into the safe encoder\n * everywhere, which also preserves `Error` name/message/stack inside data payloads.\n *\n * `includeId`, `includeSeq`, and `includeLevelName` trim the envelope for\n * lean comparable JSON output; turning `includeId` off also skips id\n * computation entirely on the record path.\n */\nexport interface FastEventJsonCodecOptions extends SafeStringifyOptions {\n includeContext?: boolean;\n includeData?: boolean;\n includeError?: boolean;\n includeTrace?: boolean;\n includeSource?: boolean;\n includeId?: boolean;\n includeSeq?: boolean;\n includeLevelName?: boolean;\n}\n\ntype JsonStringify = (value: unknown) => string | undefined;\n\nconst levelNameSet = new Set<string>(enabledLevelNames);\n\nfunction invalidLogEvent(path: string, expected: string): never {\n throw new TypeError(`Invalid LoggerJS log event payload at ${path}: expected ${expected}`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction requireString(value: unknown, path: string): string {\n if (typeof value !== \"string\") invalidLogEvent(path, \"string\");\n return value;\n}\n\nfunction requireFiniteNumber(value: unknown, path: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) invalidLogEvent(path, \"finite number\");\n return value;\n}\n\nfunction assertOptionalString(value: unknown, path: string): void {\n if (value !== undefined && typeof value !== \"string\") invalidLogEvent(path, \"string\");\n}\n\nfunction assertOptionalObject(value: unknown, path: string): void {\n if (value !== undefined && !isRecord(value)) invalidLogEvent(path, \"object\");\n}\n\nfunction assertTags(value: unknown, path: string): void {\n if (value === undefined) return;\n if (!isRecord(value)) invalidLogEvent(path, \"object\");\n for (const [key, item] of Object.entries(value)) {\n const type = typeof item;\n if (item !== null && type !== \"string\" && type !== \"number\" && type !== \"boolean\") {\n invalidLogEvent(`${path}.${key}`, \"string, number, boolean, or null\");\n }\n if (type === \"number\" && !Number.isFinite(item)) {\n invalidLogEvent(`${path}.${key}`, \"finite number\");\n }\n }\n}\n\nfunction assertSerializedError(value: unknown, path: string): void {\n if (value === undefined) return;\n if (!isRecord(value)) invalidLogEvent(path, \"object\");\n requireString(value.message, `${path}.message`);\n assertOptionalString(value.name, `${path}.name`);\n assertOptionalString(value.stack, `${path}.stack`);\n if (\n value.code !== undefined &&\n typeof value.code !== \"string\" &&\n typeof value.code !== \"number\"\n ) {\n invalidLogEvent(`${path}.code`, \"string or number\");\n }\n}\n\nfunction validateLogEvent(value: unknown, path: string): LogEvent {\n if (!isRecord(value)) invalidLogEvent(path, \"object\");\n requireString(value.id, `${path}.id`);\n requireFiniteNumber(value.time, `${path}.time`);\n requireFiniteNumber(value.seq, `${path}.seq`);\n requireFiniteNumber(value.level, `${path}.level`);\n const levelName = requireString(value.levelName, `${path}.levelName`);\n if (!levelNameSet.has(levelName)) invalidLogEvent(`${path}.levelName`, \"enabled log level name\");\n requireString(value.logger, `${path}.logger`);\n requireString(value.message, `${path}.message`);\n assertOptionalString(value.type, `${path}.type`);\n assertTags(value.tags, `${path}.tags`);\n assertSerializedError(value.error, `${path}.error`);\n assertOptionalObject(value.context, `${path}.context`);\n assertOptionalObject(value.trace, `${path}.trace`);\n assertOptionalObject(value.source, `${path}.source`);\n return value as unknown as LogEvent;\n}\n\nfunction validateLogEventPayload(value: unknown): LogEvent | LogEvent[] {\n if (!Array.isArray(value)) return validateLogEvent(value, \"payload\");\n return value.map((item, index) => validateLogEvent(item, `payload[${index}]`));\n}\n\nfunction hasSafeOptions(options: SafeStringifyOptions): boolean {\n return (\n options.maxDepth !== undefined ||\n options.maxArrayLength !== undefined ||\n options.maxObjectKeys !== undefined ||\n options.includeStack !== undefined ||\n options.stable !== undefined ||\n options.space !== undefined\n );\n}\n\nfunction canUseNativeEventJson(options: FastEventJsonCodecOptions): boolean {\n return (\n !hasSafeOptions(options) &&\n options.includeContext !== false &&\n options.includeData !== false &&\n options.includeError !== false &&\n options.includeTrace !== false &&\n options.includeSource !== false &&\n options.includeId !== false &&\n options.includeSeq !== false &&\n options.includeLevelName !== false\n );\n}\n\nfunction hasFullHeader(options: FastEventJsonCodecOptions): boolean {\n return (\n (options.includeId ?? true) &&\n (options.includeSeq ?? true) &&\n (options.includeLevelName ?? true)\n );\n}\n\n// Resolve every `includeX ?? true` toggle once per codec instead of on every\n// encode call. Threading these baked booleans through the encoders lets V8 keep\n// the hot path monomorphic and removes the per-call option lookups.\ninterface ResolvedFlags {\n fullHeader: boolean;\n includeId: boolean;\n includeSeq: boolean;\n includeLevelName: boolean;\n includeData: boolean;\n includeError: boolean;\n includeContext: boolean;\n includeTrace: boolean;\n includeSource: boolean;\n}\n\nfunction resolveFlags(options: FastEventJsonCodecOptions): ResolvedFlags {\n return {\n fullHeader: hasFullHeader(options),\n includeId: options.includeId ?? true,\n includeSeq: options.includeSeq ?? true,\n includeLevelName: options.includeLevelName ?? true,\n includeData: options.includeData ?? true,\n includeError: options.includeError ?? true,\n includeContext: options.includeContext ?? true,\n includeTrace: options.includeTrace ?? true,\n includeSource: options.includeSource ?? true,\n };\n}\n\nfunction createStringify(options: SafeStringifyOptions): JsonStringify {\n if (hasSafeOptions(options)) return (value) => safeJsonStringify(value, options);\n return JSON.stringify;\n}\n\nfunction appendField(\n output: string,\n name: string,\n value: unknown,\n stringify: JsonStringify,\n): string {\n if (value === undefined) return output;\n const encoded = stringify(value);\n return encoded === undefined ? output : `${output},\"${name}\":${encoded}`;\n}\n\n// JSON.stringify costs ~35ns per short string mostly in call overhead. Short\n// strings without quotes, backslashes, or control characters can be quoted\n// directly after a linear scan.\nfunction asJsonString(value: string): string {\n if (value.length > 256) return JSON.stringify(value);\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code === 34 || code === 92 || code < 32) return JSON.stringify(value);\n }\n return `\"${value}\"`;\n}\n\n// Data payloads are usually small flat objects of primitives. Writing them\n// directly skips the native JSON.stringify call overhead; any nested or\n// exotic value bails out so the caller can use the configured stringifier.\nfunction tryFlatObjectJson(value: Record<string, unknown>): string | undefined {\n // Class instances may carry toJSON or accessors; only plain objects take\n // the fast path so behavior matches JSON.stringify.\n const proto = Object.getPrototypeOf(value) as unknown;\n if (proto !== Object.prototype && proto !== null) return undefined;\n let output = \"{\";\n let first = true;\n // Object.keys (not for..in) on purpose: it returns only own enumerable keys,\n // so a polluted Object.prototype cannot leak inherited keys into log output.\n for (const key of Object.keys(value)) {\n const item = value[key];\n let encoded: string;\n switch (typeof item) {\n case \"string\":\n encoded = asJsonString(item);\n break;\n case \"number\":\n encoded = Number.isFinite(item) ? String(item) : \"null\";\n break;\n case \"boolean\":\n encoded = item ? \"true\" : \"false\";\n break;\n case \"object\":\n if (item !== null) return undefined;\n encoded = \"null\";\n break;\n case \"undefined\":\n continue;\n default:\n return undefined;\n }\n output += `${first ? \"\" : \",\"}${asJsonString(key)}:${encoded}`;\n first = false;\n }\n return `${output}}`;\n}\n\nfunction appendDataField(\n output: string,\n value: Record<string, unknown> | undefined,\n stringify: JsonStringify,\n): string {\n if (value === undefined) return output;\n const flat = tryFlatObjectJson(value);\n if (flat !== undefined) return `${output},\"data\":${flat}`;\n return appendField(output, \"data\", value, stringify);\n}\n\n// The timestamp changes once per millisecond while bursts of records share\n// it, so the rendered `\",\"time\":...,\"seq\":` fragment can be memoized the same\n// way the default id memoizes its time segment.\nlet lastFragmentTime = -1;\nlet lastTimeFragment = \"\";\n\nfunction timeFragment(time: number): string {\n if (time !== lastFragmentTime) {\n lastFragmentTime = time;\n lastTimeFragment = `\",\"time\":${time},\"seq\":`;\n }\n return lastTimeFragment;\n}\n\n// level -> ',\"level\":30,\"levelName\":\"info\",\"logger\":' — derived from the\n// numeric level alone, so a module-level cache is safe.\nconst levelFragments = new Map<number, string>();\n\nfunction levelFragment(level: number): string {\n let fragment = levelFragments.get(level);\n if (fragment === undefined) {\n fragment = `,\"level\":${level},\"levelName\":\"${toLevelName(level)}\",\"logger\":`;\n levelFragments.set(level, fragment);\n }\n return fragment;\n}\n\n// Loggers reuse one frozen category array for every record, so the joined and\n// escaped logger name can be cached per array identity.\nconst categoryFragments = new WeakMap<readonly string[], string>();\n\nfunction loggerFragment(category: readonly string[]): string {\n let fragment = categoryFragments.get(category);\n if (fragment === undefined) {\n fragment = asJsonString(category.join(\".\"));\n categoryFragments.set(category, fragment);\n }\n return fragment;\n}\n\nfunction errorForRecord(record: LogRecord): LogEvent[\"error\"] | undefined {\n if (record.err === null || record.err === undefined) return undefined;\n return normalizeError(record.err);\n}\n\ninterface PreparedRecordFragments {\n category: readonly string[];\n logger: string;\n tags: LogRecord[\"tags\"];\n tagsFragment?: string;\n}\n\nfunction tryPrepareTagsFragment(\n tags: LogRecord[\"tags\"],\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n): string | undefined {\n if (tags === null || !Object.isFrozen(tags)) return undefined;\n try {\n return tagsFragment(tags);\n } catch {\n return undefined;\n }\n}\n\nfunction loggerFragmentForRecord(\n record: LogRecord,\n prepared: PreparedRecordFragments | undefined,\n): string {\n if (prepared && record.category === prepared.category) return prepared.logger;\n return loggerFragment(record.category);\n}\n\nfunction tagsFragmentForRecord(\n record: LogRecord,\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n prepared: PreparedRecordFragments | undefined,\n): string {\n if (record.tags === null) return \"\";\n if (prepared && record.tags === prepared.tags && prepared.tagsFragment !== undefined) {\n return prepared.tagsFragment;\n }\n return tagsFragment(record.tags);\n}\n\nfunction encodeEvent(\n event: LogEvent,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: (tags: NonNullable<LogEvent[\"tags\"]>) => string,\n): string {\n let output: string;\n if (flags.fullHeader) {\n output = `{\"id\":${asJsonString(event.id)},\"time\":${event.time},\"seq\":${event.seq},\"level\":${event.level},\"levelName\":${asJsonString(event.levelName)},\"logger\":${asJsonString(event.logger)},\"message\":${asJsonString(event.message)}`;\n } else {\n // Build the header in one template literal: empty conditional fragments cost\n // nothing, and a single concatenation avoids the chain of intermediate\n // strings the previous `+=` sequence allocated per call.\n const idPart = flags.includeId ? `\"id\":${asJsonString(event.id)},` : \"\";\n const seqPart = flags.includeSeq ? `,\"seq\":${event.seq}` : \"\";\n const levelNamePart = flags.includeLevelName\n ? `,\"levelName\":${asJsonString(event.levelName)}`\n : \"\";\n output = `{${idPart}\"time\":${event.time}${seqPart},\"level\":${event.level}${levelNamePart},\"logger\":${asJsonString(event.logger)},\"message\":${asJsonString(event.message)}`;\n }\n if (event.type !== undefined) output += `,\"type\":${asJsonString(event.type)}`;\n if (event.tags !== undefined) output += tagsFragment(event.tags);\n if (flags.includeData && event.data !== undefined)\n output = appendField(output, \"data\", event.data, stringify);\n if (flags.includeError && event.error !== undefined)\n output = appendField(output, \"error\", event.error, stringify);\n if (flags.includeContext && event.context !== undefined)\n output = appendField(output, \"context\", event.context, stringify);\n if (flags.includeTrace && event.trace !== undefined)\n output = appendField(output, \"trace\", event.trace, stringify);\n if (flags.includeSource && event.source !== undefined)\n output = appendField(output, \"source\", event.source, stringify);\n return `${output}}`;\n}\n\nfunction encodeRecord(\n record: LogRecord,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: (tags: NonNullable<LogRecord[\"tags\"]>) => string,\n prepared?: PreparedRecordFragments,\n): string {\n let output: string;\n if (flags.fullHeader) {\n // The default id only contains [0-9a-z-] and the level name, so it never\n // needs escaping.\n const levelName = toLevelName(record.level);\n output = `{\"id\":\"${defaultRecordId(record, levelName)}${timeFragment(record.time)}${record.seq}${levelFragment(record.level)}${loggerFragmentForRecord(record, prepared)},\"message\":${asJsonString(resolveMessage(record))}`;\n } else {\n // The header is built in one template literal so it costs a single\n // concatenation per record; empty conditional fragments cost nothing. The\n // level name is resolved only when the id or the levelName field needs it,\n // so the lean envelope (both off) skips the lookup. The \"info\" default is\n // never emitted in that case — both fragments stay empty.\n const levelName =\n flags.includeId || flags.includeLevelName ? toLevelName(record.level) : \"info\";\n const idPart = flags.includeId ? `\"id\":\"${defaultRecordId(record, levelName)}\",` : \"\";\n const seqPart = flags.includeSeq ? `,\"seq\":${record.seq}` : \"\";\n const levelNamePart = flags.includeLevelName ? `,\"levelName\":\"${levelName}\"` : \"\";\n output = `{${idPart}\"time\":${record.time}${seqPart},\"level\":${record.level}${levelNamePart},\"logger\":${loggerFragmentForRecord(record, prepared)},\"message\":${asJsonString(resolveMessage(record))}`;\n }\n if (record.type !== null) output += `,\"type\":${asJsonString(record.type)}`;\n output += tagsFragmentForRecord(record, tagsFragment, prepared);\n // Guard each optional tail on the record field directly so a null field skips\n // the helper call (and its argument evaluation) entirely, matching the prior\n // `?? undefined` no-op behavior without the per-call cost.\n if (flags.includeData && record.props != null)\n output = appendDataField(output, record.props, stringify);\n if (flags.includeError && record.err != null)\n output = appendField(output, \"error\", errorForRecord(record), stringify);\n if (flags.includeContext && record.ctx != null)\n output = appendField(output, \"context\", record.ctx, stringify);\n if (flags.includeTrace && record.trace != null)\n output = appendField(output, \"trace\", record.trace, stringify);\n if (flags.includeSource && record.source !== \"app\")\n output += `,\"source\":{\"integration\":${asJsonString(record.source)}}`;\n return `${output}}`;\n}\n\ntype TagsFragment = (tags: NonNullable<LogEvent[\"tags\"]>) => string;\n\nfunction encodeItem(\n item: LogEvent | LogRecord,\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: TagsFragment,\n): string {\n return isLogRecord(item)\n ? encodeRecord(item, flags, stringify, tagsFragment)\n : encodeEvent(item, flags, stringify, tagsFragment);\n}\n\nfunction encodeArray(\n items: readonly (LogEvent | LogRecord)[],\n flags: ResolvedFlags,\n stringify: JsonStringify,\n tagsFragment: TagsFragment,\n): string {\n let output = \"[\";\n for (let index = 0; index < items.length; index += 1) {\n if (index > 0) output += \",\";\n output += encodeItem(items[index]!, flags, stringify, tagsFragment);\n }\n return `${output}]`;\n}\n\nfunction isCodecArray(input: CodecInput): input is readonly (LogEvent | LogRecord)[] {\n return Array.isArray(input);\n}\n\nfunction hasLogRecord(items: readonly (LogEvent | LogRecord)[]): boolean {\n for (const item of items) {\n if (isLogRecord(item)) return true;\n }\n return false;\n}\n\n// Loggers share one frozen tags object across records, so the encoded\n// fragment can be cached per object identity. Mutable tags objects are\n// re-encoded every time. Callers create one fragment encoder per codec\n// because it bakes in that codec's stringify options.\nfunction createTagsFragment(encoder: JsonStringify, cached: boolean): TagsFragment {\n const fragments = cached ? new WeakMap<object, string>() : undefined;\n return (tags) => {\n if (fragments && Object.isFrozen(tags)) {\n let fragment = fragments.get(tags);\n if (fragment === undefined) {\n const encoded = encoder(tags);\n fragment = encoded === undefined ? \"\" : `,\"tags\":${encoded}`;\n fragments.set(tags, fragment);\n }\n return fragment;\n }\n const encoded = encoder(tags);\n return encoded === undefined ? \"\" : `,\"tags\":${encoded}`;\n };\n}\n\nexport function fastEventJsonCodec(options: FastEventJsonCodecOptions = {}): Codec<string> {\n const stringify = createStringify(options);\n const safeStringify: JsonStringify = (value) => safeJsonStringify(value, options);\n const useNativeEventJson = canUseNativeEventJson(options);\n // Bake the envelope toggles once so neither the fast nor the safe encoder\n // re-derives them per call.\n const flags = resolveFlags(options);\n const tagsFragment = createTagsFragment(stringify, true);\n // The fallback must not reuse the fast fragments: a cached entry or the\n // fast stringify could throw on the exact payload that triggered fallback.\n const safeTagsFragment = createTagsFragment(safeStringify, false);\n const fastEncode = (input: CodecInput): string => {\n if (isCodecArray(input)) {\n if (useNativeEventJson && !hasLogRecord(input)) return JSON.stringify(input);\n return encodeArray(input, flags, stringify, tagsFragment);\n }\n // Dispatch the single-item case directly to the concrete encoder, skipping\n // the encodeItem indirection and resolving the record/event branch once.\n if (isLogRecord(input)) return encodeRecord(input, flags, stringify, tagsFragment);\n if (useNativeEventJson) return JSON.stringify(input);\n return encodeEvent(input, flags, stringify, tagsFragment);\n };\n return {\n name: \"fast-event-json\",\n contentType: \"application/json\",\n encode(input: CodecInput) {\n // Circular references and BigInt values throw on the native fast path. Logs\n // must never be lost to encoding, so re-encode the input with the safe\n // stringifier instead of surfacing the error as a transport failure.\n try {\n return fastEncode(input);\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.fast-event-json\");\n }\n if (isCodecArray(input)) return encodeArray(input, flags, safeStringify, safeTagsFragment);\n return encodeItem(input, flags, safeStringify, safeTagsFragment);\n },\n decode(payload) {\n return validateLogEventPayload(JSON.parse(payload));\n },\n prepareRecordEncoder(hints: RecordEncoderHints): PreparedRecordEncoder<string> {\n const prepared: PreparedRecordFragments = {\n category: hints.category,\n logger: loggerFragment(hints.category),\n tags: hints.tags,\n tagsFragment: tryPrepareTagsFragment(hints.tags, tagsFragment),\n };\n return {\n encode(record: LogRecord) {\n try {\n return encodeRecord(record, flags, stringify, tagsFragment, prepared);\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.fast-event-json\");\n }\n return encodeRecord(record, flags, safeStringify, safeTagsFragment, {\n category: prepared.category,\n logger: prepared.logger,\n tags: prepared.tags,\n });\n },\n };\n },\n };\n}\n","import { normalizeCodecInput, type Codec, type CodecInput, type LogEvent } from \"@loggerjs/core\";\nimport { Packr, type Options as MsgpackrOptions } from \"msgpackr\";\n\nexport interface MsgpackRuntime {\n pack: (input: unknown) => Uint8Array;\n unpack: (payload: Uint8Array) => unknown;\n}\n\nexport type MsgpackrCodecOptions = MsgpackrOptions;\n\nfunction isMsgpackRuntime(value: MsgpackRuntime | MsgpackrCodecOptions): value is MsgpackRuntime {\n return (\n typeof (value as MsgpackRuntime).pack === \"function\" &&\n typeof (value as MsgpackRuntime).unpack === \"function\"\n );\n}\n\nexport function msgpackrCodec(\n options: MsgpackRuntime | MsgpackrCodecOptions = {},\n): Codec<Uint8Array> {\n const runtime = isMsgpackRuntime(options) ? options : new Packr({ useRecords: true, ...options });\n return {\n name: \"msgpackr\",\n contentType: \"application/msgpack\",\n encode(input: CodecInput) {\n return runtime.pack(normalizeCodecInput(input));\n },\n decode(payload: Uint8Array) {\n return runtime.unpack(payload) as LogEvent | LogEvent[];\n },\n };\n}\n","import {\n incrementLoggerMetaCounter,\n normalizeCodecInput,\n safeJsonStringify,\n type Codec,\n type CodecInput,\n type LogEvent,\n type SafeStringifyOptions,\n type SerializedError,\n} from \"@loggerjs/core\";\n\nexport type PinoCompatCollisionPolicy = \"nest\" | \"drop\" | \"throw\";\n\nexport interface PinoCompatCodecOptions extends SafeStringifyOptions {\n base?: Record<string, unknown>;\n dataKey?: string;\n errorKey?: string;\n includeLogger?: boolean;\n mergeData?: boolean;\n collision?: PinoCompatCollisionPolicy;\n}\n\nconst baseReservedRootKeys = new Set([\"time\", \"level\", \"msg\", \"err\", \"logger\", \"data\"]);\nconst dataReservedRootKeys = new Set([\n \"time\",\n \"level\",\n \"msg\",\n \"pid\",\n \"hostname\",\n \"err\",\n \"logger\",\n \"data\",\n]);\n\nfunction hasSafeOptions(options: SafeStringifyOptions): boolean {\n return (\n options.maxDepth !== undefined ||\n options.maxArrayLength !== undefined ||\n options.maxObjectKeys !== undefined ||\n options.includeStack !== undefined ||\n options.stable !== undefined ||\n options.space !== undefined\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction pinoError(error: SerializedError): Record<string, unknown> {\n return {\n type: error.name ?? \"Error\",\n message: error.message,\n stack: error.stack,\n code: error.code,\n cause: error.cause,\n };\n}\n\nfunction assignWithCollision(\n output: Record<string, unknown>,\n nested: Record<string, unknown>,\n key: string,\n value: unknown,\n policy: PinoCompatCollisionPolicy,\n reservedKeys = dataReservedRootKeys,\n) {\n if (!reservedKeys.has(key) && !(key in output)) {\n output[key] = value;\n return;\n }\n\n if (policy === \"throw\") {\n throw new Error(`pinoCompatCodec cannot merge reserved key \"${key}\"`);\n }\n if (policy === \"nest\") nested[key] = value;\n}\n\nfunction mergeNestedData(\n existing: unknown,\n nested: Record<string, unknown>,\n): Record<string, unknown> {\n if (isRecord(existing)) return { ...nested, ...existing };\n if (existing !== undefined) return { ...nested, value: existing };\n return nested;\n}\n\nfunction projectEvent(event: LogEvent, options: PinoCompatCodecOptions): Record<string, unknown> {\n const dataKey = options.dataKey ?? \"data\";\n const errorKey = options.errorKey ?? \"err\";\n const collision = options.collision ?? \"nest\";\n const output: Record<string, unknown> = {\n level: event.level,\n time: event.time,\n };\n const nested: Record<string, unknown> = {};\n\n const baseReservedKeys = new Set(baseReservedRootKeys);\n baseReservedKeys.add(dataKey);\n baseReservedKeys.add(errorKey);\n for (const [key, value] of Object.entries(options.base ?? {})) {\n assignWithCollision(output, nested, key, value, collision, baseReservedKeys);\n }\n\n if (options.includeLogger) output.logger = event.logger;\n if (event.error) output[errorKey] = pinoError(event.error);\n\n if (event.data !== undefined) {\n if (options.mergeData && isRecord(event.data)) {\n const dataReservedKeys = new Set(dataReservedRootKeys);\n dataReservedKeys.add(dataKey);\n dataReservedKeys.add(errorKey);\n for (const [key, value] of Object.entries(event.data)) {\n assignWithCollision(output, nested, key, value, collision, dataReservedKeys);\n }\n } else {\n output[dataKey] = event.data;\n }\n }\n\n if (Object.keys(nested).length > 0) {\n output[dataKey] = mergeNestedData(output[dataKey], nested);\n }\n\n output.msg = event.message;\n\n return output;\n}\n\nfunction encodeLine(event: LogEvent, options: PinoCompatCodecOptions, safeMode: boolean): string {\n const projected = projectEvent(event, options);\n if (safeMode) return safeJsonStringify(projected, options);\n try {\n const encoded = JSON.stringify(projected);\n return encoded ?? \"{}\";\n } catch {\n incrementLoggerMetaCounter(\"codec.fallback\");\n incrementLoggerMetaCounter(\"codec.fallback.pino-compat\");\n return safeJsonStringify(projected, options);\n }\n}\n\nfunction encodeEvents(\n input: LogEvent | LogEvent[],\n options: PinoCompatCodecOptions,\n safeMode: boolean,\n): string {\n if (!Array.isArray(input)) return `${encodeLine(input, options, safeMode)}\\n`;\n let output = \"\";\n for (const event of input) output += `${encodeLine(event, options, safeMode)}\\n`;\n return output;\n}\n\nexport function pinoCompatCodec(options: PinoCompatCodecOptions = {}): Codec<string> {\n const safeMode = hasSafeOptions(options);\n return {\n name: \"pino-compat\",\n contentType: \"application/x-ndjson\",\n encode(input: CodecInput) {\n return encodeEvents(normalizeCodecInput(input), options, safeMode);\n },\n };\n}\n\nexport const pinoNdjsonProjector = pinoCompatCodec;\n","import { normalizeCodecInput, type Codec, type CodecInput, type LogEvent } from \"@loggerjs/core\";\n\nexport interface ProjectorCodecOptions<TWire> {\n name: string;\n contentType: string;\n project: (input: LogEvent | LogEvent[]) => TWire;\n serialize: (wire: TWire) => string | Uint8Array;\n parse?: (payload: string | Uint8Array) => TWire;\n unproject?: (wire: TWire) => LogEvent | LogEvent[];\n}\n\nexport function projectorCodec<TWire>(\n options: ProjectorCodecOptions<TWire>,\n): Codec<string | Uint8Array> {\n return {\n name: options.name,\n contentType: options.contentType,\n encode(input: CodecInput) {\n return options.serialize(options.project(normalizeCodecInput(input)));\n },\n decode:\n options.parse && options.unproject\n ? (payload) => options.unproject!(options.parse!(payload))\n : undefined,\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loggerjs/codecs",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"description": "Serialization codecs for loggerjs.",
|
|
5
5
|
"homepage": "https://github.com/jskits/loggerjs/tree/main/packages/codecs#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"msgpackr": "^2.0.4",
|
|
38
|
-
"@loggerjs/core": "0.5.
|
|
38
|
+
"@loggerjs/core": "0.5.3"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "pnpm run clean && pnpm run build:js && pnpm run build:types",
|