logixia 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +2 -2
  2. package/dist/{async-context-fBqC5lNc.mjs → async-context-1YMPGgJZ.mjs} +2 -2
  3. package/dist/{async-context-fBqC5lNc.mjs.map → async-context-1YMPGgJZ.mjs.map} +1 -1
  4. package/dist/{async-context-Dgl3ZLyb.js → async-context-CoPhbRG0.js} +2 -2
  5. package/dist/{async-context-Dgl3ZLyb.js.map → async-context-CoPhbRG0.js.map} +1 -1
  6. package/dist/{azure-monitor.transport-DGiacfvT.mjs → azure-monitor.transport-B_dqSV_o.mjs} +3 -3
  7. package/dist/{azure-monitor.transport-DGiacfvT.mjs.map → azure-monitor.transport-B_dqSV_o.mjs.map} +1 -1
  8. package/dist/{azure-monitor.transport-DX3fuK2t.js → azure-monitor.transport-Bl3xVvpN.js} +3 -3
  9. package/dist/{azure-monitor.transport-DX3fuK2t.js.map → azure-monitor.transport-Bl3xVvpN.js.map} +1 -1
  10. package/dist/azure.js +1 -1
  11. package/dist/azure.mjs +1 -1
  12. package/dist/{batch-buffer-CM-lK_Qy.mjs → batch-buffer-BnmVCCwI.mjs} +2 -2
  13. package/dist/{batch-buffer-CM-lK_Qy.mjs.map → batch-buffer-BnmVCCwI.mjs.map} +1 -1
  14. package/dist/{batch-buffer-BLmVvJAZ.js → batch-buffer-C-ETEX3Y.js} +2 -2
  15. package/dist/{batch-buffer-BLmVvJAZ.js.map → batch-buffer-C-ETEX3Y.js.map} +1 -1
  16. package/dist/browser.js +15 -11
  17. package/dist/browser.js.map +1 -1
  18. package/dist/browser.mjs +15 -11
  19. package/dist/browser.mjs.map +1 -1
  20. package/dist/{builder-CA_dokb4.mjs → builder-CbttbixM.mjs} +54 -222
  21. package/dist/builder-CbttbixM.mjs.map +1 -0
  22. package/dist/{builder-jMlVYaQa.js → builder-Ck1tsC5d.js} +57 -249
  23. package/dist/builder-Ck1tsC5d.js.map +1 -0
  24. package/dist/cloudwatch.js +1 -1
  25. package/dist/cloudwatch.mjs +1 -1
  26. package/dist/{cloudwatch.transport-Cr0fEpko.mjs → cloudwatch.transport-Brh5fmRN.mjs} +3 -3
  27. package/dist/{cloudwatch.transport-Cr0fEpko.mjs.map → cloudwatch.transport-Brh5fmRN.mjs.map} +1 -1
  28. package/dist/{cloudwatch.transport-Lst1Bbmr.js → cloudwatch.transport-DO9e__Z-.js} +3 -3
  29. package/dist/{cloudwatch.transport-Lst1Bbmr.js.map → cloudwatch.transport-DO9e__Z-.js.map} +1 -1
  30. package/dist/correlation.js +2 -2
  31. package/dist/correlation.mjs +2 -2
  32. package/dist/error.utils-B8_CwESF.mjs +189 -0
  33. package/dist/error.utils-B8_CwESF.mjs.map +1 -0
  34. package/dist/error.utils-fZkRExam.js +212 -0
  35. package/dist/error.utils-fZkRExam.js.map +1 -0
  36. package/dist/fastify.d.mts +89 -0
  37. package/dist/fastify.d.mts.map +1 -0
  38. package/dist/fastify.d.ts +89 -0
  39. package/dist/fastify.d.ts.map +1 -0
  40. package/dist/fastify.js +265 -0
  41. package/dist/fastify.js.map +1 -0
  42. package/dist/fastify.mjs +263 -0
  43. package/dist/fastify.mjs.map +1 -0
  44. package/dist/gcp.js +1 -1
  45. package/dist/gcp.mjs +1 -1
  46. package/dist/{gcp.transport-Cw3Qke85.mjs → gcp.transport-BY1Z3cS0.mjs} +3 -3
  47. package/dist/{gcp.transport-Cw3Qke85.mjs.map → gcp.transport-BY1Z3cS0.mjs.map} +1 -1
  48. package/dist/{gcp.transport-5-ZIjN8r.js → gcp.transport-V9R4dwdT.js} +3 -3
  49. package/dist/{gcp.transport-5-ZIjN8r.js.map → gcp.transport-V9R4dwdT.js.map} +1 -1
  50. package/dist/hono.d.mts +66 -0
  51. package/dist/hono.d.mts.map +1 -0
  52. package/dist/hono.d.ts +66 -0
  53. package/dist/hono.d.ts.map +1 -0
  54. package/dist/hono.js +512 -0
  55. package/dist/hono.js.map +1 -0
  56. package/dist/hono.mjs +511 -0
  57. package/dist/hono.mjs.map +1 -0
  58. package/dist/index.js +12 -11
  59. package/dist/index.js.map +1 -1
  60. package/dist/index.mjs +6 -5
  61. package/dist/index.mjs.map +1 -1
  62. package/dist/logitron-logger-Csn3e6Qu.d.ts.map +1 -1
  63. package/dist/logitron-logger-fMOkXr8H.d.mts.map +1 -1
  64. package/dist/middleware.js +1 -1
  65. package/dist/middleware.mjs +1 -1
  66. package/dist/nest.js +5 -4
  67. package/dist/nest.js.map +1 -1
  68. package/dist/nest.mjs +4 -3
  69. package/dist/nest.mjs.map +1 -1
  70. package/dist/{otel-8ypFGG19.js → otel-BrgvxLDW.js} +3 -3
  71. package/dist/{otel-8ypFGG19.js.map → otel-BrgvxLDW.js.map} +1 -1
  72. package/dist/{otel-b-s2QbY4.mjs → otel-C5jBV_l_.mjs} +3 -3
  73. package/dist/{otel-b-s2QbY4.mjs.map → otel-C5jBV_l_.mjs.map} +1 -1
  74. package/dist/{request-trace-C7kXMjx5.js → request-trace-6NBSw5lt.js} +14 -3
  75. package/dist/{request-trace-C7kXMjx5.js.map → request-trace-6NBSw5lt.js.map} +1 -1
  76. package/dist/{request-trace-Dekcnenb.mjs → request-trace-txUhyyre.mjs} +9 -4
  77. package/dist/{request-trace-Dekcnenb.mjs.map → request-trace-txUhyyre.mjs.map} +1 -1
  78. package/dist/{secret-config-GKmb15Me.mjs → secret-config-Cng7XPLx.mjs} +16 -12
  79. package/dist/secret-config-Cng7XPLx.mjs.map +1 -0
  80. package/dist/{secret-config--cVTOWwp.js → secret-config-OqmIPmpV.js} +16 -12
  81. package/dist/secret-config-OqmIPmpV.js.map +1 -0
  82. package/dist/{slack.transport-Qwj9WkrJ.mjs → slack.transport-C6dzPJHX.mjs} +4 -4
  83. package/dist/{slack.transport-Qwj9WkrJ.mjs.map → slack.transport-C6dzPJHX.mjs.map} +1 -1
  84. package/dist/{slack.transport-Cpx5fKga.js → slack.transport-Ci0swStG.js} +4 -4
  85. package/dist/{slack.transport-Cpx5fKga.js.map → slack.transport-Ci0swStG.js.map} +1 -1
  86. package/dist/transports.d.mts +1 -1
  87. package/dist/transports.d.ts +1 -1
  88. package/dist/transports.js +6 -6
  89. package/dist/transports.mjs +6 -6
  90. package/dist/worker-entry.js +15 -11
  91. package/dist/worker.js +1 -1
  92. package/dist/worker.mjs +1 -1
  93. package/dist/{worker.transport-C7jNGhev.js → worker.transport-CZOutlxC.js} +2 -2
  94. package/dist/{worker.transport-C7jNGhev.js.map → worker.transport-CZOutlxC.js.map} +1 -1
  95. package/dist/{worker.transport-BHnWDXPH.mjs → worker.transport-CxFD8mvS.mjs} +2 -2
  96. package/dist/{worker.transport-BHnWDXPH.mjs.map → worker.transport-CxFD8mvS.mjs.map} +1 -1
  97. package/package.json +37 -2
  98. package/dist/builder-CA_dokb4.mjs.map +0 -1
  99. package/dist/builder-jMlVYaQa.js.map +0 -1
  100. package/dist/secret-config--cVTOWwp.js.map +0 -1
  101. package/dist/secret-config-GKmb15Me.mjs.map +0 -1
@@ -0,0 +1,212 @@
1
+ const require_own_property = require("./own-property-BWkibepN.js");
2
+ // src/utils/error.utils.ts
3
+ const EXTRA_FIELDS = [
4
+ "code",
5
+ "statusCode",
6
+ "status",
7
+ "errno",
8
+ "syscall",
9
+ "path",
10
+ "address",
11
+ "port",
12
+ "type"
13
+ ];
14
+ const SKIPPED_FIELDS = /* @__PURE__ */ new Set([
15
+ "name",
16
+ "message",
17
+ "stack",
18
+ "cause",
19
+ "errors",
20
+ ...EXTRA_FIELDS
21
+ ]);
22
+ const NO_OPTIONS = Object.freeze({});
23
+ const NO_FIELDS = [];
24
+ /**
25
+ * Serialize an Error into a plain JSON-safe object, including:
26
+ * - `name`, `message`, `stack`
27
+ * - `cause` (recursively serialized, full ES2022 chain)
28
+ * - `errors` (for AggregateError)
29
+ * - standard Node.js error fields (`code`, `statusCode`, `errno`, …)
30
+ * - any other enumerable own properties
31
+ */
32
+ function serializeError(error, options = NO_OPTIONS) {
33
+ const { includeStack = true, maxDepth = 5, excludeFields = NO_FIELDS } = options;
34
+ return _serializeError(error, includeStack, maxDepth, excludeFields, 0, /* @__PURE__ */ new WeakSet());
35
+ }
36
+ function _serializeError(error, includeStack, maxDepth, excludeFields, depth, seen) {
37
+ if (depth >= maxDepth) return {
38
+ name: error.name,
39
+ message: error.message,
40
+ _truncated: true
41
+ };
42
+ if (seen.has(error)) return {
43
+ name: error.name,
44
+ message: error.message,
45
+ _circular: true
46
+ };
47
+ seen.add(error);
48
+ const serialized = {
49
+ name: error.name,
50
+ message: error.message
51
+ };
52
+ if (includeStack && error.stack) serialized.stack = error.stack;
53
+ const errorWithCause = error;
54
+ if (errorWithCause.cause !== void 0) {
55
+ if (errorWithCause.cause instanceof Error) serialized.cause = _serializeError(errorWithCause.cause, includeStack, maxDepth, excludeFields, depth + 1, seen);
56
+ else serialized.cause = serializeValue(errorWithCause.cause, maxDepth - depth - 1, seen);
57
+ }
58
+ const aggregateError = error;
59
+ if (Array.isArray(aggregateError.errors)) serialized.errors = aggregateError.errors.map((e) => e instanceof Error ? _serializeError(e, includeStack, maxDepth, excludeFields, depth + 1, seen) : serializeValue(e, maxDepth - depth - 1, seen));
60
+ const errorRecord = error;
61
+ for (const field of EXTRA_FIELDS) if (!excludeFields.includes(field) && errorRecord[field] !== void 0) serialized[field] = errorRecord[field];
62
+ const skip = excludeFields.length === 0 ? SKIPPED_FIELDS : /* @__PURE__ */ new Set([...SKIPPED_FIELDS, ...excludeFields]);
63
+ for (const key of Object.getOwnPropertyNames(error)) {
64
+ if (skip.has(key)) continue;
65
+ try {
66
+ require_own_property.assignOwn(serialized, key, serializeValue(errorRecord[key], maxDepth - depth - 1, seen));
67
+ } catch {
68
+ require_own_property.assignOwn(serialized, key, "[Unserializable]");
69
+ }
70
+ }
71
+ return serialized;
72
+ }
73
+ /**
74
+ * Recursively serialize an arbitrary value to a JSON-safe representation.
75
+ *
76
+ * The `seen` guard is threaded through (not recreated) so cross-referencing
77
+ * errors nested inside plain objects/arrays are caught by the same circular
78
+ * check that protects the top-level error tree, rather than only relying on the
79
+ * depth limit.
80
+ */
81
+ function serializeValue(value, remainingDepth, seen) {
82
+ if (remainingDepth <= 0) return "[Max Depth]";
83
+ if (value === null || value === void 0) return value;
84
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") return value;
85
+ if (value instanceof Date) return value.toISOString();
86
+ if (value instanceof Error) {
87
+ if (seen.has(value)) return {
88
+ name: value.name,
89
+ message: value.message,
90
+ _circular: true
91
+ };
92
+ return _serializeError(value, true, remainingDepth, [], 0, seen);
93
+ }
94
+ if (Array.isArray(value)) {
95
+ if (seen.has(value)) return "[Circular]";
96
+ seen.add(value);
97
+ return value.map((item) => serializeValue(item, remainingDepth - 1, seen));
98
+ }
99
+ if (typeof value === "object") {
100
+ if (seen.has(value)) return "[Circular]";
101
+ seen.add(value);
102
+ const out = {};
103
+ for (const [k, v] of Object.entries(value)) try {
104
+ require_own_property.assignOwn(out, k, serializeValue(v, remainingDepth - 1, seen));
105
+ } catch {
106
+ require_own_property.assignOwn(out, k, "[Unserializable]");
107
+ }
108
+ return out;
109
+ }
110
+ return String(value);
111
+ }
112
+ /**
113
+ * Type guard: returns true if the value looks like an Error object.
114
+ */
115
+ function isError(value) {
116
+ return value instanceof Error || Boolean(value) && typeof value === "object" && "name" in value && "message" in value;
117
+ }
118
+ const MAX_ERROR_SEARCH_DEPTH = 3;
119
+ const MAX_ERROR_SEARCH_NODES = 2e3;
120
+ /**
121
+ * Replaces real Error instances inside a log payload with their serialized form,
122
+ * because JSON output drops an Error's non-enumerable `message` and `stack`. Runs on
123
+ * every log call, so its work is capped and it copies nothing until it finds one.
124
+ * Duck-typed objects are data, and an Error with its own toJSON has already chosen
125
+ * what to show. The caller's objects are never mutated.
126
+ */
127
+ function serializeNestedErrors(data) {
128
+ const outerBudget = errorSearchBudget;
129
+ errorSearchBudget = MAX_ERROR_SEARCH_NODES;
130
+ try {
131
+ return walkForErrors(data, MAX_ERROR_SEARCH_DEPTH, void 0, void 0);
132
+ } finally {
133
+ errorSearchBudget = outerBudget;
134
+ }
135
+ }
136
+ let errorSearchBudget = 0;
137
+ const hasOwn = Object.prototype.hasOwnProperty;
138
+ function walkForErrors(value, depth, parent, grandparent) {
139
+ if (value instanceof Error) return typeof value.toJSON === "function" ? value : serializeError(value);
140
+ if (depth === 0 || --errorSearchBudget < 0 || value === parent || value === grandparent) return value;
141
+ let copy;
142
+ if (Array.isArray(value)) for (let i = 0; i < value.length; i++) {
143
+ const item = value[i];
144
+ if (item === null || typeof item !== "object") continue;
145
+ const next = walkForErrors(item, depth - 1, value, parent);
146
+ if (next !== item) {
147
+ copy ??= value.slice();
148
+ copy[i] = next;
149
+ }
150
+ }
151
+ else {
152
+ const proto = Object.getPrototypeOf(value);
153
+ if (proto !== Object.prototype && proto !== null) return value;
154
+ const record = value;
155
+ for (const key in record) {
156
+ if (!hasOwn.call(record, key)) continue;
157
+ let item;
158
+ try {
159
+ item = record[key];
160
+ } catch {
161
+ continue;
162
+ }
163
+ if (item === null || typeof item !== "object") continue;
164
+ const next = walkForErrors(item, depth - 1, record, parent);
165
+ if (next !== item) {
166
+ copy ??= { ...record };
167
+ require_own_property.assignOwn(copy, key, next);
168
+ }
169
+ }
170
+ }
171
+ return copy ?? value;
172
+ }
173
+ /**
174
+ * Coerce any thrown value into a proper Error instance.
175
+ */
176
+ function normalizeError(error) {
177
+ if (isError(error)) return error;
178
+ if (typeof error === "string") return new Error(error);
179
+ if (typeof error === "object" && error !== null) {
180
+ const e = error;
181
+ const err = new Error(typeof e["message"] === "string" ? e["message"] : "Unknown error");
182
+ Object.assign(err, error);
183
+ return err;
184
+ }
185
+ return new Error(String(error));
186
+ }
187
+ Object.defineProperty(exports, "isError", {
188
+ enumerable: true,
189
+ get: function() {
190
+ return isError;
191
+ }
192
+ });
193
+ Object.defineProperty(exports, "normalizeError", {
194
+ enumerable: true,
195
+ get: function() {
196
+ return normalizeError;
197
+ }
198
+ });
199
+ Object.defineProperty(exports, "serializeError", {
200
+ enumerable: true,
201
+ get: function() {
202
+ return serializeError;
203
+ }
204
+ });
205
+ Object.defineProperty(exports, "serializeNestedErrors", {
206
+ enumerable: true,
207
+ get: function() {
208
+ return serializeNestedErrors;
209
+ }
210
+ });
211
+
212
+ //# sourceMappingURL=error.utils-fZkRExam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.utils-fZkRExam.js","names":[],"sources":["../src/utils/error.utils.ts"],"sourcesContent":["/**\n * Error serialization utilities for Logixia\n *\n * v1.1 improvements:\n * - Full ES2022 `cause` chain serialization (recursive)\n * - AggregateError.errors array serialization\n * - Standard extra fields: code, statusCode, status, errno, syscall, path\n * - Circular-reference safe via a WeakSet seen guard\n */\n\nimport type { ErrorSerializationOptions } from '../types';\nimport { assignOwn } from './own-property';\n\n// Well-known extra fields to always capture when present on an error\nconst EXTRA_FIELDS = [\n 'code',\n 'statusCode',\n 'status',\n 'errno',\n 'syscall',\n 'path',\n 'address',\n 'port',\n 'type',\n] as const;\n\n// Fields the own-property pass skips, built once instead of per error.\nconst SKIPPED_FIELDS = new Set<string>([\n 'name',\n 'message',\n 'stack',\n 'cause',\n 'errors',\n ...EXTRA_FIELDS,\n]);\nconst NO_OPTIONS: ErrorSerializationOptions = Object.freeze({});\nconst NO_FIELDS: string[] = [];\n\n/**\n * Serialize an Error into a plain JSON-safe object, including:\n * - `name`, `message`, `stack`\n * - `cause` (recursively serialized, full ES2022 chain)\n * - `errors` (for AggregateError)\n * - standard Node.js error fields (`code`, `statusCode`, `errno`, …)\n * - any other enumerable own properties\n */\nexport function serializeError(\n error: Error,\n options: ErrorSerializationOptions = NO_OPTIONS\n): Record<string, unknown> {\n const { includeStack = true, maxDepth = 5, excludeFields = NO_FIELDS } = options;\n const seen = new WeakSet<object>();\n return _serializeError(error, includeStack, maxDepth, excludeFields, 0, seen);\n}\n\nfunction _serializeError(\n error: Error,\n includeStack: boolean,\n maxDepth: number,\n excludeFields: string[],\n depth: number,\n seen: WeakSet<object>\n): Record<string, unknown> {\n if (depth >= maxDepth) {\n return { name: error.name, message: error.message, _truncated: true };\n }\n\n if (seen.has(error)) {\n return { name: error.name, message: error.message, _circular: true };\n }\n seen.add(error);\n\n const serialized: Record<string, unknown> = {\n name: error.name,\n message: error.message,\n };\n\n if (includeStack && error.stack) {\n serialized.stack = error.stack;\n }\n\n // ── ES2022 cause chain ──────────────────────────────────────────────────────\n const errorWithCause = error as Error & { cause?: unknown };\n if (errorWithCause.cause !== undefined) {\n if (errorWithCause.cause instanceof Error) {\n serialized.cause = _serializeError(\n errorWithCause.cause,\n includeStack,\n maxDepth,\n excludeFields,\n depth + 1,\n seen\n );\n } else {\n serialized.cause = serializeValue(errorWithCause.cause, maxDepth - depth - 1, seen);\n }\n }\n\n // ── AggregateError.errors ───────────────────────────────────────────────────\n const aggregateError = error as Error & { errors?: unknown[] };\n if (Array.isArray(aggregateError.errors)) {\n serialized.errors = aggregateError.errors.map((e) =>\n e instanceof Error\n ? _serializeError(e, includeStack, maxDepth, excludeFields, depth + 1, seen)\n : serializeValue(e, maxDepth - depth - 1, seen)\n );\n }\n\n // ── Standard Node.js / HTTP error fields ───────────────────────────────────\n const errorRecord = error as unknown as Record<string, unknown>;\n for (const field of EXTRA_FIELDS) {\n if (!excludeFields.includes(field) && errorRecord[field] !== undefined) {\n serialized[field] = errorRecord[field];\n }\n }\n\n // ── All other own enumerable properties ────────────────────────────────────\n const skip =\n excludeFields.length === 0 ? SKIPPED_FIELDS : new Set([...SKIPPED_FIELDS, ...excludeFields]);\n\n for (const key of Object.getOwnPropertyNames(error)) {\n if (skip.has(key)) continue;\n try {\n assignOwn(serialized, key, serializeValue(errorRecord[key], maxDepth - depth - 1, seen));\n } catch {\n assignOwn(serialized, key, '[Unserializable]');\n }\n }\n\n return serialized;\n}\n\n/**\n * Recursively serialize an arbitrary value to a JSON-safe representation.\n *\n * The `seen` guard is threaded through (not recreated) so cross-referencing\n * errors nested inside plain objects/arrays are caught by the same circular\n * check that protects the top-level error tree, rather than only relying on the\n * depth limit.\n */\nfunction serializeValue(value: unknown, remainingDepth: number, seen: WeakSet<object>): unknown {\n if (remainingDepth <= 0) return '[Max Depth]';\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value instanceof Date) return value.toISOString();\n\n if (value instanceof Error) {\n if (seen.has(value)) {\n return { name: value.name, message: value.message, _circular: true };\n }\n return _serializeError(value, true, remainingDepth, [], 0, seen);\n }\n\n if (Array.isArray(value)) {\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n return value.map((item) => serializeValue(item, remainingDepth - 1, seen));\n }\n\n if (typeof value === 'object') {\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n try {\n assignOwn(out, k, serializeValue(v, remainingDepth - 1, seen));\n } catch {\n assignOwn(out, k, '[Unserializable]');\n }\n }\n return out;\n }\n\n return String(value);\n}\n\n/**\n * Type guard: returns true if the value looks like an Error object.\n */\nexport function isError(value: unknown): value is Error {\n return (\n value instanceof Error ||\n (Boolean(value) &&\n typeof value === 'object' &&\n 'name' in (value as object) &&\n 'message' in (value as object))\n );\n}\n\nconst MAX_ERROR_SEARCH_DEPTH = 3;\nconst MAX_ERROR_SEARCH_NODES = 2000;\n\n/**\n * Replaces real Error instances inside a log payload with their serialized form,\n * because JSON output drops an Error's non-enumerable `message` and `stack`. Runs on\n * every log call, so its work is capped and it copies nothing until it finds one.\n * Duck-typed objects are data, and an Error with its own toJSON has already chosen\n * what to show. The caller's objects are never mutated.\n */\nexport function serializeNestedErrors(data: Record<string, unknown>): Record<string, unknown> {\n // Saved and restored, because a getter read during the walk can log and re-enter.\n const outerBudget = errorSearchBudget;\n errorSearchBudget = MAX_ERROR_SEARCH_NODES;\n try {\n return walkForErrors(data, MAX_ERROR_SEARCH_DEPTH, undefined, undefined) as Record<\n string,\n unknown\n >;\n } finally {\n errorSearchBudget = outerBudget;\n }\n}\n\nlet errorSearchBudget = 0;\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n// Allocates nothing until it finds an Error. With the depth cap, a node has at most\n// two ancestors that can still recurse, so they are passed as arguments for the cycle check.\nfunction walkForErrors(\n value: object,\n depth: number,\n parent?: object,\n grandparent?: object\n): unknown {\n if (value instanceof Error) {\n return typeof (value as { toJSON?: unknown }).toJSON === 'function'\n ? value\n : serializeError(value);\n }\n if (depth === 0 || --errorSearchBudget < 0 || value === parent || value === grandparent) {\n return value;\n }\n\n let copy: unknown;\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const item: unknown = value[i];\n if (item === null || typeof item !== 'object') continue;\n const next = walkForErrors(item, depth - 1, value, parent);\n if (next !== item) {\n copy ??= value.slice();\n (copy as unknown[])[i] = next;\n }\n }\n } else {\n const proto: unknown = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) return value;\n const record = value as Record<string, unknown>;\n // for...in avoids the key array that Object.keys allocates on every call.\n for (const key in record) {\n if (!hasOwn.call(record, key)) continue;\n let item: unknown;\n try {\n item = record[key];\n } catch {\n continue;\n }\n if (item === null || typeof item !== 'object') continue;\n const next = walkForErrors(item, depth - 1, record, parent);\n if (next !== item) {\n copy ??= { ...record };\n assignOwn(copy as Record<string, unknown>, key, next);\n }\n }\n }\n return copy ?? value;\n}\n\n/**\n * Coerce any thrown value into a proper Error instance.\n */\nexport function normalizeError(error: unknown): Error {\n if (isError(error)) return error;\n\n if (typeof error === 'string') return new Error(error);\n\n if (typeof error === 'object' && error !== null) {\n const e = error as Record<string, unknown>;\n const err = new Error(typeof e['message'] === 'string' ? e['message'] : 'Unknown error');\n Object.assign(err, error);\n return err;\n }\n\n return new Error(String(error));\n}\n"],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { u as IBaseLogger } from "./index-B3ajtXJd.mjs";
2
+ type PinoLevelName = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
3
+ type SerializerFn = (value: unknown) => unknown;
4
+ /** pino's log function: `(obj, msg?, ...args)` or `(msg, ...args)`. Always returns `void`. */
5
+ interface PinoCompatibleLogFn {
6
+ <T extends object>(obj: T, msg?: string, ...args: unknown[]): void;
7
+ (obj: unknown, msg?: string, ...args: unknown[]): void;
8
+ (msg: string, ...args: unknown[]): void;
9
+ }
10
+ interface PinoChildOptions {
11
+ /** Level for the child: a pino level name, `silent`, or a logixia level name. */
12
+ level?: string | undefined;
13
+ /** Serializers added to (and overriding) the ones the parent already has. */
14
+ serializers?: Record<string, SerializerFn> | undefined;
15
+ }
16
+ /** The pino surface Fastify and its plugins use. Satisfies `FastifyBaseLogger` without importing it. */
17
+ interface PinoCompatibleLogger {
18
+ trace: PinoCompatibleLogFn;
19
+ debug: PinoCompatibleLogFn;
20
+ info: PinoCompatibleLogFn;
21
+ warn: PinoCompatibleLogFn;
22
+ error: PinoCompatibleLogFn;
23
+ fatal: PinoCompatibleLogFn;
24
+ /** Accepts the call and writes nothing, like pino's `silent`. */
25
+ silent: PinoCompatibleLogFn;
26
+ /** Current level: a pino level name, `silent`, or a logixia-only level such as `verbose`. */
27
+ level: string;
28
+ /** Numeric value of the current level (pino scale), `Infinity` when silent. */
29
+ readonly levelVal: number;
30
+ readonly levels: {
31
+ readonly values: Record<string, number>;
32
+ readonly labels: Record<number, string>;
33
+ };
34
+ /** Serializers Fastify merges over its own, so these win for `req`, `res` and `err`. */
35
+ readonly serializers: Record<string, SerializerFn>;
36
+ /** True when the configured level would let `level` through. */
37
+ isLevelEnabled(level: string): boolean;
38
+ /** The fields bound to this logger by `child()`. */
39
+ bindings(): Record<string, unknown>;
40
+ child(bindings: Record<string, unknown>, options?: PinoChildOptions): PinoCompatibleLogger;
41
+ }
42
+ interface FastifyLoggerOptions {
43
+ /**
44
+ * Serializers keyed by field name. They replace the defaults for `req`, `res` and
45
+ * `err` and apply to any other key you add.
46
+ */
47
+ serializers?: Record<string, SerializerFn>;
48
+ /**
49
+ * Query-string parameter names redacted from the `req` URL, merged with the defaults
50
+ * (token, access_token, refresh_token, code, password, secret, api_key, ...).
51
+ */
52
+ redactQueryParams?: string[];
53
+ /**
54
+ * Binding whose value becomes the trace ID of entries logged outside a trace scope.
55
+ * Default: `'reqId'` (Fastify's `requestIdLogLabel`). Counter IDs such as `req-1`
56
+ * are never used. Pass `false` to leave trace IDs alone.
57
+ */
58
+ traceIdBinding?: string | false;
59
+ }
60
+ interface FastifySerializerOptions {
61
+ redactQueryParams?: string[];
62
+ }
63
+ /**
64
+ * pino-std-like `req`, `res` and `err` serializers. `req` reads a Fastify request or a
65
+ * Node `IncomingMessage` and keeps only method, url (query secrets redacted), hostname,
66
+ * remote address and port, and the request ID; headers, body and sockets are dropped.
67
+ */
68
+ export declare function createFastifySerializers(options?: FastifySerializerOptions): Record<'req' | 'res' | 'err', SerializerFn>;
69
+ /**
70
+ * Wrap a logixia logger so Fastify accepts it as `loggerInstance`.
71
+ *
72
+ * - Call shapes: `(obj, msg?, ...args)`, `(msg, ...args)` with `%s %d %i %f %j %o %O`,
73
+ * and `(err)` / `(err, msg)`. An `Error` under `err` is logged under `error`, like
74
+ * `logger.error(err)` does, with its stack and `cause` chain.
75
+ * - `fatal` is logged at `error`. `silent` mutes the facade (and children made after).
76
+ * - `child(bindings)` creates a logixia child that carries the bindings as context data.
77
+ * It starts no transports and registers nothing for shutdown, so one per request is cheap.
78
+ * - Methods return `void`; rejected log calls are caught.
79
+ * - `req`, `res` and `err` serializers are supplied; Fastify gives them precedence over
80
+ * its own. Override or extend them with `options.serializers`.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const app = Fastify({ loggerInstance: createFastifyLogger(logger) });
85
+ * ```
86
+ */
87
+ export declare function createFastifyLogger(logger: IBaseLogger, options?: FastifyLoggerOptions): PinoCompatibleLogger;
88
+ export type { FastifyLoggerOptions, FastifySerializerOptions, PinoChildOptions, PinoCompatibleLogFn, PinoCompatibleLogger, PinoLevelName, SerializerFn };
89
+ //# sourceMappingURL=fastify.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.d.mts","names":[],"sources":["../src/fastify/pino-facade.ts"],"mappings":";KAkCY;KAEA,gBAAgB;;UAGX;GACd,kBAAkB,KAAK,GAAG,iBAAiB;GAC3C,cAAc,iBAAiB;GAC/B,gBAAgB;;UAGF;;EAEf;;EAEA,cAAc,eAAe;;;UAId;EACf,OAAO;EACP,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,OAAO;;EAEP,QAAQ;;EAER;;WAES;WACA;aACE,QAAQ;aACR,QAAQ;;;WAGV,aAAa,eAAe;;EAErC,eAAe;;EAEf,YAAY;EACZ,MAAM,UAAU,yBAAyB,UAAU,mBAAmB;;UAGvD;;;;;EAKf,cAAc,eAAe;;;;;EAK7B;;;;;;EAMA;;UAGe;EACf;;;;;;;wBAwDc,yBACd,UAAS,2BACR,8BAA8B;;;;;;;;;;;;;;;;;;;wBA0OjB,oBACd,QAAQ,aACR,UAAS,uBACR"}
@@ -0,0 +1,89 @@
1
+ import { u as IBaseLogger } from "./index-oqD3WNxf.js";
2
+ type PinoLevelName = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
3
+ type SerializerFn = (value: unknown) => unknown;
4
+ /** pino's log function: `(obj, msg?, ...args)` or `(msg, ...args)`. Always returns `void`. */
5
+ interface PinoCompatibleLogFn {
6
+ <T extends object>(obj: T, msg?: string, ...args: unknown[]): void;
7
+ (obj: unknown, msg?: string, ...args: unknown[]): void;
8
+ (msg: string, ...args: unknown[]): void;
9
+ }
10
+ interface PinoChildOptions {
11
+ /** Level for the child: a pino level name, `silent`, or a logixia level name. */
12
+ level?: string | undefined;
13
+ /** Serializers added to (and overriding) the ones the parent already has. */
14
+ serializers?: Record<string, SerializerFn> | undefined;
15
+ }
16
+ /** The pino surface Fastify and its plugins use. Satisfies `FastifyBaseLogger` without importing it. */
17
+ interface PinoCompatibleLogger {
18
+ trace: PinoCompatibleLogFn;
19
+ debug: PinoCompatibleLogFn;
20
+ info: PinoCompatibleLogFn;
21
+ warn: PinoCompatibleLogFn;
22
+ error: PinoCompatibleLogFn;
23
+ fatal: PinoCompatibleLogFn;
24
+ /** Accepts the call and writes nothing, like pino's `silent`. */
25
+ silent: PinoCompatibleLogFn;
26
+ /** Current level: a pino level name, `silent`, or a logixia-only level such as `verbose`. */
27
+ level: string;
28
+ /** Numeric value of the current level (pino scale), `Infinity` when silent. */
29
+ readonly levelVal: number;
30
+ readonly levels: {
31
+ readonly values: Record<string, number>;
32
+ readonly labels: Record<number, string>;
33
+ };
34
+ /** Serializers Fastify merges over its own, so these win for `req`, `res` and `err`. */
35
+ readonly serializers: Record<string, SerializerFn>;
36
+ /** True when the configured level would let `level` through. */
37
+ isLevelEnabled(level: string): boolean;
38
+ /** The fields bound to this logger by `child()`. */
39
+ bindings(): Record<string, unknown>;
40
+ child(bindings: Record<string, unknown>, options?: PinoChildOptions): PinoCompatibleLogger;
41
+ }
42
+ interface FastifyLoggerOptions {
43
+ /**
44
+ * Serializers keyed by field name. They replace the defaults for `req`, `res` and
45
+ * `err` and apply to any other key you add.
46
+ */
47
+ serializers?: Record<string, SerializerFn>;
48
+ /**
49
+ * Query-string parameter names redacted from the `req` URL, merged with the defaults
50
+ * (token, access_token, refresh_token, code, password, secret, api_key, ...).
51
+ */
52
+ redactQueryParams?: string[];
53
+ /**
54
+ * Binding whose value becomes the trace ID of entries logged outside a trace scope.
55
+ * Default: `'reqId'` (Fastify's `requestIdLogLabel`). Counter IDs such as `req-1`
56
+ * are never used. Pass `false` to leave trace IDs alone.
57
+ */
58
+ traceIdBinding?: string | false;
59
+ }
60
+ interface FastifySerializerOptions {
61
+ redactQueryParams?: string[];
62
+ }
63
+ /**
64
+ * pino-std-like `req`, `res` and `err` serializers. `req` reads a Fastify request or a
65
+ * Node `IncomingMessage` and keeps only method, url (query secrets redacted), hostname,
66
+ * remote address and port, and the request ID; headers, body and sockets are dropped.
67
+ */
68
+ export declare function createFastifySerializers(options?: FastifySerializerOptions): Record<'req' | 'res' | 'err', SerializerFn>;
69
+ /**
70
+ * Wrap a logixia logger so Fastify accepts it as `loggerInstance`.
71
+ *
72
+ * - Call shapes: `(obj, msg?, ...args)`, `(msg, ...args)` with `%s %d %i %f %j %o %O`,
73
+ * and `(err)` / `(err, msg)`. An `Error` under `err` is logged under `error`, like
74
+ * `logger.error(err)` does, with its stack and `cause` chain.
75
+ * - `fatal` is logged at `error`. `silent` mutes the facade (and children made after).
76
+ * - `child(bindings)` creates a logixia child that carries the bindings as context data.
77
+ * It starts no transports and registers nothing for shutdown, so one per request is cheap.
78
+ * - Methods return `void`; rejected log calls are caught.
79
+ * - `req`, `res` and `err` serializers are supplied; Fastify gives them precedence over
80
+ * its own. Override or extend them with `options.serializers`.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const app = Fastify({ loggerInstance: createFastifyLogger(logger) });
85
+ * ```
86
+ */
87
+ export declare function createFastifyLogger(logger: IBaseLogger, options?: FastifyLoggerOptions): PinoCompatibleLogger;
88
+ export type { FastifyLoggerOptions, FastifySerializerOptions, PinoChildOptions, PinoCompatibleLogFn, PinoCompatibleLogger, PinoLevelName, SerializerFn };
89
+ //# sourceMappingURL=fastify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.d.ts","names":[],"sources":["../src/fastify/pino-facade.ts"],"mappings":";KAkCY;KAEA,gBAAgB;;UAGX;GACd,kBAAkB,KAAK,GAAG,iBAAiB;GAC3C,cAAc,iBAAiB;GAC/B,gBAAgB;;UAGF;;EAEf;;EAEA,cAAc,eAAe;;;UAId;EACf,OAAO;EACP,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,OAAO;;EAEP,QAAQ;;EAER;;WAES;WACA;aACE,QAAQ;aACR,QAAQ;;;WAGV,aAAa,eAAe;;EAErC,eAAe;;EAEf,YAAY;EACZ,MAAM,UAAU,yBAAyB,UAAU,mBAAmB;;UAGvD;;;;;EAKf,cAAc,eAAe;;;;;EAK7B;;;;;;EAMA;;UAGe;EACf;;;;;;;wBAwDc,yBACd,UAAS,2BACR,8BAA8B;;;;;;;;;;;;;;;;;;;wBA0OjB,oBACd,QAAQ,aACR,UAAS,uBACR"}