logixia 2.0.11 → 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 (203) hide show
  1. package/README.md +4 -3
  2. package/dist/{async-context-BGUCdYAa.mjs → async-context-1YMPGgJZ.mjs} +3 -3
  3. package/dist/{async-context-BGUCdYAa.mjs.map → async-context-1YMPGgJZ.mjs.map} +1 -1
  4. package/dist/{async-context-D8um9I5V.js → async-context-CoPhbRG0.js} +4 -4
  5. package/dist/{async-context-D8um9I5V.js.map → async-context-CoPhbRG0.js.map} +1 -1
  6. package/dist/{azure-monitor.transport-CTnfwA0F.mjs → azure-monitor.transport-B_dqSV_o.mjs} +4 -4
  7. package/dist/{azure-monitor.transport-CTnfwA0F.mjs.map → azure-monitor.transport-B_dqSV_o.mjs.map} +1 -1
  8. package/dist/{azure-monitor.transport-C8KdmsSw.js → azure-monitor.transport-Bl3xVvpN.js} +4 -4
  9. package/dist/{azure-monitor.transport-C8KdmsSw.js.map → azure-monitor.transport-Bl3xVvpN.js.map} +1 -1
  10. package/dist/{azure-monitor.transport-CbSHOnNX.d.mts → azure-monitor.transport-C5VjvREZ.d.mts} +2 -2
  11. package/dist/{azure-monitor.transport-CbSHOnNX.d.mts.map → azure-monitor.transport-C5VjvREZ.d.mts.map} +1 -1
  12. package/dist/{azure-monitor.transport-Bvf7Xegt.d.ts → azure-monitor.transport-CyHDjHS-.d.ts} +2 -2
  13. package/dist/{azure-monitor.transport-Bvf7Xegt.d.ts.map → azure-monitor.transport-CyHDjHS-.d.ts.map} +1 -1
  14. package/dist/azure.d.mts +1 -1
  15. package/dist/azure.d.ts +1 -1
  16. package/dist/azure.js +1 -1
  17. package/dist/azure.mjs +1 -1
  18. package/dist/{batch-buffer-BJqzpfpT.mjs → batch-buffer-BnmVCCwI.mjs} +2 -2
  19. package/dist/{batch-buffer-BJqzpfpT.mjs.map → batch-buffer-BnmVCCwI.mjs.map} +1 -1
  20. package/dist/{batch-buffer-BTQdAXwC.js → batch-buffer-C-ETEX3Y.js} +2 -2
  21. package/dist/{batch-buffer-BTQdAXwC.js.map → batch-buffer-C-ETEX3Y.js.map} +1 -1
  22. package/dist/browser.d.mts +2 -0
  23. package/dist/browser.d.mts.map +1 -1
  24. package/dist/browser.d.ts +2 -0
  25. package/dist/browser.d.ts.map +1 -1
  26. package/dist/browser.js +33 -15
  27. package/dist/browser.js.map +1 -1
  28. package/dist/browser.mjs +33 -15
  29. package/dist/browser.mjs.map +1 -1
  30. package/dist/{builder-C6kKEVrU.mjs → builder-CbttbixM.mjs} +158 -279
  31. package/dist/builder-CbttbixM.mjs.map +1 -0
  32. package/dist/{builder-Up4YxX7l.js → builder-Ck1tsC5d.js} +160 -305
  33. package/dist/builder-Ck1tsC5d.js.map +1 -0
  34. package/dist/cloudwatch.d.mts +1 -1
  35. package/dist/cloudwatch.d.ts +1 -1
  36. package/dist/cloudwatch.js +1 -1
  37. package/dist/cloudwatch.mjs +1 -1
  38. package/dist/{cloudwatch.transport-Bl1qzdBx.mjs → cloudwatch.transport-Brh5fmRN.mjs} +5 -5
  39. package/dist/{cloudwatch.transport-Bl1qzdBx.mjs.map → cloudwatch.transport-Brh5fmRN.mjs.map} +1 -1
  40. package/dist/{cloudwatch.transport-BoCyxNKO.js → cloudwatch.transport-DO9e__Z-.js} +5 -5
  41. package/dist/{cloudwatch.transport-BoCyxNKO.js.map → cloudwatch.transport-DO9e__Z-.js.map} +1 -1
  42. package/dist/{cloudwatch.transport-CQyT6U91.d.ts → cloudwatch.transport-DdSjUWvu.d.ts} +2 -2
  43. package/dist/{cloudwatch.transport-CQyT6U91.d.ts.map → cloudwatch.transport-DdSjUWvu.d.ts.map} +1 -1
  44. package/dist/{cloudwatch.transport-CjVrI6S4.d.mts → cloudwatch.transport-_hS7Mcc5.d.mts} +2 -2
  45. package/dist/{cloudwatch.transport-CjVrI6S4.d.mts.map → cloudwatch.transport-_hS7Mcc5.d.mts.map} +1 -1
  46. package/dist/correlation.js +3 -3
  47. package/dist/correlation.mjs +3 -3
  48. package/dist/{entry-fields-CJbeaoBs.js → entry-fields-BSLkzw18.js} +3 -3
  49. package/dist/{entry-fields-CJbeaoBs.js.map → entry-fields-BSLkzw18.js.map} +1 -1
  50. package/dist/{entry-fields-D_aNnjg0.mjs → entry-fields-J1OBi24o.mjs} +2 -2
  51. package/dist/{entry-fields-D_aNnjg0.mjs.map → entry-fields-J1OBi24o.mjs.map} +1 -1
  52. package/dist/error.utils-B8_CwESF.mjs +189 -0
  53. package/dist/error.utils-B8_CwESF.mjs.map +1 -0
  54. package/dist/error.utils-fZkRExam.js +212 -0
  55. package/dist/error.utils-fZkRExam.js.map +1 -0
  56. package/dist/fastify.d.mts +89 -0
  57. package/dist/fastify.d.mts.map +1 -0
  58. package/dist/fastify.d.ts +89 -0
  59. package/dist/fastify.d.ts.map +1 -0
  60. package/dist/fastify.js +265 -0
  61. package/dist/fastify.js.map +1 -0
  62. package/dist/fastify.mjs +263 -0
  63. package/dist/fastify.mjs.map +1 -0
  64. package/dist/gcp.d.mts +1 -1
  65. package/dist/gcp.d.ts +1 -1
  66. package/dist/gcp.js +1 -1
  67. package/dist/gcp.mjs +1 -1
  68. package/dist/{gcp.transport-DOH4bpWM.mjs → gcp.transport-BY1Z3cS0.mjs} +5 -5
  69. package/dist/{gcp.transport-DOH4bpWM.mjs.map → gcp.transport-BY1Z3cS0.mjs.map} +1 -1
  70. package/dist/{gcp.transport-D9SdLPwP.d.mts → gcp.transport-C8VJiEM7.d.mts} +2 -2
  71. package/dist/{gcp.transport-D9SdLPwP.d.mts.map → gcp.transport-C8VJiEM7.d.mts.map} +1 -1
  72. package/dist/{gcp.transport-BCIvdFV-.d.ts → gcp.transport-Ct0BtKFo.d.ts} +2 -2
  73. package/dist/{gcp.transport-BCIvdFV-.d.ts.map → gcp.transport-Ct0BtKFo.d.ts.map} +1 -1
  74. package/dist/{gcp.transport-D_NHVZrw.js → gcp.transport-V9R4dwdT.js} +5 -5
  75. package/dist/{gcp.transport-D_NHVZrw.js.map → gcp.transport-V9R4dwdT.js.map} +1 -1
  76. package/dist/hono.d.mts +66 -0
  77. package/dist/hono.d.mts.map +1 -0
  78. package/dist/hono.d.ts +66 -0
  79. package/dist/hono.d.ts.map +1 -0
  80. package/dist/hono.js +512 -0
  81. package/dist/hono.js.map +1 -0
  82. package/dist/hono.mjs +511 -0
  83. package/dist/hono.mjs.map +1 -0
  84. package/dist/{index-BAkPHp5D.d.mts → index-B3ajtXJd.d.mts} +2 -2
  85. package/dist/{index-BAkPHp5D.d.mts.map → index-B3ajtXJd.d.mts.map} +1 -1
  86. package/dist/{index-e7LowmAu.d.ts → index-oqD3WNxf.d.ts} +2 -2
  87. package/dist/{index-e7LowmAu.d.ts.map → index-oqD3WNxf.d.ts.map} +1 -1
  88. package/dist/index.d.mts +8 -7
  89. package/dist/index.d.mts.map +1 -1
  90. package/dist/index.d.ts +8 -7
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +23 -20
  93. package/dist/index.js.map +1 -1
  94. package/dist/index.mjs +11 -9
  95. package/dist/index.mjs.map +1 -1
  96. package/dist/{logitron-logger-DVUdgmBY.d.ts → logitron-logger-Csn3e6Qu.d.ts} +2 -2
  97. package/dist/{logitron-logger-DVUdgmBY.d.ts.map → logitron-logger-Csn3e6Qu.d.ts.map} +1 -1
  98. package/dist/{logitron-logger-DoWmMjYB.d.mts → logitron-logger-fMOkXr8H.d.mts} +2 -2
  99. package/dist/{logitron-logger-DoWmMjYB.d.mts.map → logitron-logger-fMOkXr8H.d.mts.map} +1 -1
  100. package/dist/middleware.d.mts +1 -1
  101. package/dist/middleware.d.ts +1 -1
  102. package/dist/middleware.js +6 -5
  103. package/dist/middleware.js.map +1 -1
  104. package/dist/middleware.mjs +4 -3
  105. package/dist/middleware.mjs.map +1 -1
  106. package/dist/nest.d.mts +47 -15
  107. package/dist/nest.d.mts.map +1 -1
  108. package/dist/nest.d.ts +47 -15
  109. package/dist/nest.d.ts.map +1 -1
  110. package/dist/nest.js +172 -50
  111. package/dist/nest.js.map +1 -1
  112. package/dist/nest.mjs +168 -46
  113. package/dist/nest.mjs.map +1 -1
  114. package/dist/{otel-DH6-G6DR.js → otel-BrgvxLDW.js} +319 -66
  115. package/dist/otel-BrgvxLDW.js.map +1 -0
  116. package/dist/{otel-DAVxpArV.mjs → otel-C5jBV_l_.mjs} +319 -66
  117. package/dist/otel-C5jBV_l_.mjs.map +1 -0
  118. package/dist/own-property-BWkibepN.js +40 -0
  119. package/dist/own-property-BWkibepN.js.map +1 -0
  120. package/dist/own-property-CjFw9qwZ.mjs +29 -0
  121. package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
  122. package/dist/{request-trace-C7kXMjx5.js → request-trace-6NBSw5lt.js} +14 -3
  123. package/dist/{request-trace-C7kXMjx5.js.map → request-trace-6NBSw5lt.js.map} +1 -1
  124. package/dist/{request-trace-Dekcnenb.mjs → request-trace-txUhyyre.mjs} +9 -4
  125. package/dist/{request-trace-Dekcnenb.mjs.map → request-trace-txUhyyre.mjs.map} +1 -1
  126. package/dist/{safe-stringify-pZOnzGRJ.mjs → safe-stringify-B5p5ktFe.mjs} +2 -2
  127. package/dist/{safe-stringify-pZOnzGRJ.mjs.map → safe-stringify-B5p5ktFe.mjs.map} +1 -1
  128. package/dist/{safe-stringify-CJisLyZ3.js → safe-stringify-J3sh-7YM.js} +5 -5
  129. package/dist/{safe-stringify-CJisLyZ3.js.map → safe-stringify-J3sh-7YM.js.map} +1 -1
  130. package/dist/{search-Crf2IEoA.d.mts → search-B-hJe2N-.d.mts} +7 -3
  131. package/dist/{search-Crf2IEoA.d.mts.map → search-B-hJe2N-.d.mts.map} +1 -1
  132. package/dist/{search-B4eEzrhM.d.ts → search-BlKBLm5D.d.ts} +7 -3
  133. package/dist/{search-B4eEzrhM.d.ts.map → search-BlKBLm5D.d.ts.map} +1 -1
  134. package/dist/{search-CjYl-mo5.mjs → search-CTR4XNHq.mjs} +52 -14
  135. package/dist/search-CTR4XNHq.mjs.map +1 -0
  136. package/dist/{search-CJw_xoQl.js → search-_qx4YzRP.js} +52 -14
  137. package/dist/search-_qx4YzRP.js.map +1 -0
  138. package/dist/search.d.mts +1 -1
  139. package/dist/search.d.ts +1 -1
  140. package/dist/search.js +1 -1
  141. package/dist/search.mjs +1 -1
  142. package/dist/{secret-config-D1F4MW69.mjs → secret-config-Cng7XPLx.mjs} +18 -13
  143. package/dist/secret-config-Cng7XPLx.mjs.map +1 -0
  144. package/dist/{secret-config-6hdODxBb.js → secret-config-OqmIPmpV.js} +21 -16
  145. package/dist/secret-config-OqmIPmpV.js.map +1 -0
  146. package/dist/{sensitive-names-wv27qBQC.mjs → sensitive-names-BiBM6R1X.mjs} +2 -28
  147. package/dist/sensitive-names-BiBM6R1X.mjs.map +1 -0
  148. package/dist/{sensitive-names-CNgHaqv9.js → sensitive-names-NiKIRhp5.js} +1 -39
  149. package/dist/sensitive-names-NiKIRhp5.js.map +1 -0
  150. package/dist/{slack.transport-C6E0l4kw.d.ts → slack.transport-5OPL7H3u.d.mts} +76 -3
  151. package/dist/slack.transport-5OPL7H3u.d.mts.map +1 -0
  152. package/dist/{slack.transport-BDyENuR0.d.mts → slack.transport-BFpBD_Ri.d.ts} +76 -3
  153. package/dist/slack.transport-BFpBD_Ri.d.ts.map +1 -0
  154. package/dist/{slack.transport-YvaLJxNv.mjs → slack.transport-C6dzPJHX.mjs} +226 -9
  155. package/dist/slack.transport-C6dzPJHX.mjs.map +1 -0
  156. package/dist/{slack.transport-CEYBVzUj.js → slack.transport-Ci0swStG.js} +231 -8
  157. package/dist/slack.transport-Ci0swStG.js.map +1 -0
  158. package/dist/testing.d.mts +1 -1
  159. package/dist/testing.d.ts +1 -1
  160. package/dist/{transport.types-CzJq4IrF.d.ts → transport.types-B1ejJJP6.d.mts} +6 -1
  161. package/dist/transport.types-B1ejJJP6.d.mts.map +1 -0
  162. package/dist/{transport.types-CzJq4IrF.d.mts → transport.types-B1ejJJP6.d.ts} +6 -1
  163. package/dist/transport.types-B1ejJJP6.d.ts.map +1 -0
  164. package/dist/transports.d.mts +61 -11
  165. package/dist/transports.d.mts.map +1 -1
  166. package/dist/transports.d.ts +61 -11
  167. package/dist/transports.d.ts.map +1 -1
  168. package/dist/transports.js +7 -6
  169. package/dist/transports.mjs +7 -7
  170. package/dist/worker-entry.js +106 -22
  171. package/dist/worker.d.mts +1 -1
  172. package/dist/worker.d.ts +1 -1
  173. package/dist/worker.js +1 -1
  174. package/dist/worker.mjs +1 -1
  175. package/dist/{worker.transport-B9mCQSM1.d.ts → worker.transport-B7olL1Uh.d.ts} +12 -2
  176. package/dist/worker.transport-B7olL1Uh.d.ts.map +1 -0
  177. package/dist/{worker.transport-CwNpH98o.js → worker.transport-CZOutlxC.js} +40 -2
  178. package/dist/worker.transport-CZOutlxC.js.map +1 -0
  179. package/dist/{worker.transport-DgK_ZXlB.mjs → worker.transport-CxFD8mvS.mjs} +40 -2
  180. package/dist/worker.transport-CxFD8mvS.mjs.map +1 -0
  181. package/dist/{worker.transport-Bl8lFRck.d.mts → worker.transport-DnU0_9Bd.d.mts} +12 -2
  182. package/dist/worker.transport-DnU0_9Bd.d.mts.map +1 -0
  183. package/package.json +37 -2
  184. package/dist/builder-C6kKEVrU.mjs.map +0 -1
  185. package/dist/builder-Up4YxX7l.js.map +0 -1
  186. package/dist/otel-DAVxpArV.mjs.map +0 -1
  187. package/dist/otel-DH6-G6DR.js.map +0 -1
  188. package/dist/search-CJw_xoQl.js.map +0 -1
  189. package/dist/search-CjYl-mo5.mjs.map +0 -1
  190. package/dist/secret-config-6hdODxBb.js.map +0 -1
  191. package/dist/secret-config-D1F4MW69.mjs.map +0 -1
  192. package/dist/sensitive-names-CNgHaqv9.js.map +0 -1
  193. package/dist/sensitive-names-wv27qBQC.mjs.map +0 -1
  194. package/dist/slack.transport-BDyENuR0.d.mts.map +0 -1
  195. package/dist/slack.transport-C6E0l4kw.d.ts.map +0 -1
  196. package/dist/slack.transport-CEYBVzUj.js.map +0 -1
  197. package/dist/slack.transport-YvaLJxNv.mjs.map +0 -1
  198. package/dist/transport.types-CzJq4IrF.d.mts.map +0 -1
  199. package/dist/transport.types-CzJq4IrF.d.ts.map +0 -1
  200. package/dist/worker.transport-B9mCQSM1.d.ts.map +0 -1
  201. package/dist/worker.transport-Bl8lFRck.d.mts.map +0 -1
  202. package/dist/worker.transport-CwNpH98o.js.map +0 -1
  203. package/dist/worker.transport-DgK_ZXlB.mjs.map +0 -1
@@ -0,0 +1,265 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_own_property = require("./own-property-BWkibepN.js");
3
+ const require_request_trace = require("./request-trace-6NBSw5lt.js");
4
+ const require_sensitive_names = require("./sensitive-names-NiKIRhp5.js");
5
+ const require_internal_log = require("./internal-log-DwqTjhpb.js");
6
+ const require_safe_stringify = require("./safe-stringify-J3sh-7YM.js");
7
+ const require_error_utils = require("./error.utils-fZkRExam.js");
8
+ // src/fastify/pino-facade.ts
9
+ const PINO_LEVEL_VALUES = {
10
+ trace: 10,
11
+ debug: 20,
12
+ info: 30,
13
+ warn: 40,
14
+ error: 50,
15
+ fatal: 60
16
+ };
17
+ const PINO_LEVEL_LABELS = {
18
+ 10: "trace",
19
+ 20: "debug",
20
+ 30: "info",
21
+ 40: "warn",
22
+ 50: "error",
23
+ 60: "fatal"
24
+ };
25
+ /** Severity rank in logixia's order: lower is more severe. */
26
+ const RANK = {
27
+ fatal: 0,
28
+ error: 0,
29
+ warn: 1,
30
+ info: 2,
31
+ debug: 3,
32
+ trace: 4,
33
+ verbose: 5
34
+ };
35
+ const asObject = (value) => typeof value === "object" && value !== null ? value : void 0;
36
+ const firstString = (value) => typeof value === "string" && value !== "" ? value : void 0;
37
+ /** The host without its port; an IPv6 literal keeps its brackets. */
38
+ function hostnameOf(host) {
39
+ if (host === void 0) return host;
40
+ return host.startsWith("[") ? host.slice(0, host.indexOf("]") + 1) : host.split(":", 1)[0];
41
+ }
42
+ /**
43
+ * pino-std-like `req`, `res` and `err` serializers. `req` reads a Fastify request or a
44
+ * Node `IncomingMessage` and keeps only method, url (query secrets redacted), hostname,
45
+ * remote address and port, and the request ID; headers, body and sockets are dropped.
46
+ */
47
+ function createFastifySerializers(options = {}) {
48
+ const params = require_sensitive_names.buildNameSet(require_sensitive_names.DEFAULT_REDACT_QUERY_PARAMS, options.redactQueryParams);
49
+ return {
50
+ req(value) {
51
+ const req = asObject(value);
52
+ if (!req) return value;
53
+ const raw = asObject(req["raw"]);
54
+ const headers = asObject(req["headers"]) ?? asObject(raw === null || raw === void 0 ? void 0 : raw["headers"]);
55
+ const socket = asObject(req["socket"]) ?? asObject(raw === null || raw === void 0 ? void 0 : raw["socket"]);
56
+ const url = firstString(req["originalUrl"]) ?? firstString(req["url"]);
57
+ const out = {
58
+ method: req["method"] ?? (raw === null || raw === void 0 ? void 0 : raw["method"]),
59
+ url: url === void 0 ? url : require_sensitive_names.redactUrlQuery(url, params),
60
+ hostname: hostnameOf(firstString(req["host"]) ?? firstString(headers === null || headers === void 0 ? void 0 : headers["host"])),
61
+ remoteAddress: req["ip"] ?? (socket === null || socket === void 0 ? void 0 : socket["remoteAddress"]),
62
+ remotePort: socket === null || socket === void 0 ? void 0 : socket["remotePort"]
63
+ };
64
+ if (typeof req["id"] === "string" || typeof req["id"] === "number") out["reqId"] = req["id"];
65
+ return out;
66
+ },
67
+ res(value) {
68
+ const res = asObject(value);
69
+ return res ? { statusCode: res["statusCode"] } : value;
70
+ },
71
+ err(value) {
72
+ return value instanceof Error ? require_error_utils.serializeError(value) : value;
73
+ }
74
+ };
75
+ }
76
+ function applySerializers(source, serializers) {
77
+ const out = {};
78
+ const renameErr = source["err"] instanceof Error && !("error" in source);
79
+ for (const key of Object.keys(source)) {
80
+ const value = source[key];
81
+ const serializer = serializers[key];
82
+ let result = value;
83
+ if (serializer !== void 0 && value !== void 0) try {
84
+ result = serializer(value);
85
+ } catch (error) {
86
+ require_internal_log.internalError(`fastify logger: '${key}' serializer failed`, error);
87
+ result = "[serializer failed]";
88
+ }
89
+ require_own_property.assignOwn(out, renameErr && key === "err" ? "error" : key, result);
90
+ }
91
+ return out;
92
+ }
93
+ const stringify = (value) => require_safe_stringify.stringifyForLog(value) ?? String(value);
94
+ function interpolate(format, args, start) {
95
+ if (args.length <= start || !format.includes("%")) return format;
96
+ let next = start;
97
+ return format.replace(/%([%sdifjoO])/g, (match, token) => {
98
+ if (token === "%") return "%";
99
+ if (next >= args.length) return match;
100
+ const arg = args[next++];
101
+ switch (token) {
102
+ case "s":
103
+ if (typeof arg === "string") return arg;
104
+ if (typeof arg === "function") return arg.name || "<anonymous>";
105
+ return typeof arg === "object" && arg !== null ? stringify(arg) : String(arg);
106
+ case "d": return String(Number(arg));
107
+ case "i": return String(Number.parseInt(String(arg), 10));
108
+ case "f": return String(Number.parseFloat(String(arg)));
109
+ default: return stringify(arg);
110
+ }
111
+ });
112
+ }
113
+ function parseCall(args, serializers) {
114
+ const first = args[0];
115
+ const second = args[1];
116
+ const describe = (fallback) => {
117
+ if (second === void 0) return fallback;
118
+ return typeof second === "string" ? interpolate(second, args, 2) : stringify(second);
119
+ };
120
+ if (first instanceof Error) {
121
+ const serialize = serializers["err"];
122
+ return {
123
+ message: describe(first.message),
124
+ data: { error: serialize ? serialize(first) : require_error_utils.serializeError(first) }
125
+ };
126
+ }
127
+ if (typeof first === "object" && first !== null && !Array.isArray(first)) {
128
+ const data = applySerializers(first, serializers);
129
+ const err = first["err"];
130
+ return {
131
+ message: describe(err instanceof Error ? err.message : ""),
132
+ data
133
+ };
134
+ }
135
+ return typeof first === "string" ? {
136
+ message: interpolate(first, args, 1),
137
+ data: void 0
138
+ } : {
139
+ message: stringify(first),
140
+ data: void 0
141
+ };
142
+ }
143
+ /** Fire-and-forget: a rejected log call must never become an unhandled rejection. */
144
+ function fire(result) {
145
+ if (result && typeof result.catch === "function") result.catch((error) => require_internal_log.internalError("fastify logger: log call failed", error));
146
+ }
147
+ function toLogixiaLevel(level) {
148
+ return level === "fatal" ? "error" : level;
149
+ }
150
+ var FastifyLoggerFacade = class FastifyLoggerFacade {
151
+ target;
152
+ serializers;
153
+ bound;
154
+ traceIdBinding;
155
+ traceId;
156
+ muted;
157
+ levels = {
158
+ values: PINO_LEVEL_VALUES,
159
+ labels: PINO_LEVEL_LABELS
160
+ };
161
+ constructor(target, serializers, bound, traceIdBinding, traceId, muted) {
162
+ this.target = target;
163
+ this.serializers = serializers;
164
+ this.bound = bound;
165
+ this.traceIdBinding = traceIdBinding;
166
+ this.traceId = traceId;
167
+ this.muted = muted;
168
+ }
169
+ trace(...args) {
170
+ this.write("trace", args);
171
+ }
172
+ debug(...args) {
173
+ this.write("debug", args);
174
+ }
175
+ info(...args) {
176
+ this.write("info", args);
177
+ }
178
+ warn(...args) {
179
+ this.write("warn", args);
180
+ }
181
+ error(...args) {
182
+ this.write("error", args);
183
+ }
184
+ fatal(...args) {
185
+ this.write("error", args);
186
+ }
187
+ silent(..._args) {}
188
+ get level() {
189
+ return this.muted ? "silent" : this.target.getLevel();
190
+ }
191
+ set level(level) {
192
+ if (level === "silent") {
193
+ this.muted = true;
194
+ return;
195
+ }
196
+ this.muted = false;
197
+ this.target.setLevel(toLogixiaLevel(level));
198
+ }
199
+ get levelVal() {
200
+ return this.muted ? Infinity : PINO_LEVEL_VALUES[this.level] ?? PINO_LEVEL_VALUES["info"];
201
+ }
202
+ isLevelEnabled(level) {
203
+ if (this.muted) return false;
204
+ const wanted = RANK[level];
205
+ const current = RANK[this.target.getLevel()];
206
+ return wanted === void 0 || current === void 0 || wanted <= current;
207
+ }
208
+ bindings() {
209
+ return { ...this.bound };
210
+ }
211
+ child(bindings, options = {}) {
212
+ const serializers = options.serializers ? {
213
+ ...this.serializers,
214
+ ...options.serializers
215
+ } : this.serializers;
216
+ const fields = applySerializers(bindings ?? {}, serializers);
217
+ const traceId = this.traceIdBinding ? require_request_trace.usableRequestId(fields[this.traceIdBinding]) : void 0;
218
+ const child = new FastifyLoggerFacade(this.target.child(this.target.getContext() ?? "", fields), serializers, {
219
+ ...this.bound,
220
+ ...fields
221
+ }, this.traceIdBinding, traceId ?? this.traceId, this.muted);
222
+ if (options.level) child.level = options.level;
223
+ return child;
224
+ }
225
+ write(method, args) {
226
+ if (this.muted) return;
227
+ try {
228
+ const { message, data } = parseCall(args, this.serializers);
229
+ const traceId = this.traceId;
230
+ const send = () => fire(this.target[method](message, data));
231
+ if (traceId !== void 0 && require_request_trace.getCurrentTraceId() === void 0) require_request_trace.runWithTraceId(traceId, send);
232
+ else send();
233
+ } catch (error) {
234
+ require_internal_log.internalError("fastify logger: log call failed", error);
235
+ }
236
+ }
237
+ };
238
+ /**
239
+ * Wrap a logixia logger so Fastify accepts it as `loggerInstance`.
240
+ *
241
+ * - Call shapes: `(obj, msg?, ...args)`, `(msg, ...args)` with `%s %d %i %f %j %o %O`,
242
+ * and `(err)` / `(err, msg)`. An `Error` under `err` is logged under `error`, like
243
+ * `logger.error(err)` does, with its stack and `cause` chain.
244
+ * - `fatal` is logged at `error`. `silent` mutes the facade (and children made after).
245
+ * - `child(bindings)` creates a logixia child that carries the bindings as context data.
246
+ * It starts no transports and registers nothing for shutdown, so one per request is cheap.
247
+ * - Methods return `void`; rejected log calls are caught.
248
+ * - `req`, `res` and `err` serializers are supplied; Fastify gives them precedence over
249
+ * its own. Override or extend them with `options.serializers`.
250
+ *
251
+ * @example
252
+ * ```ts
253
+ * const app = Fastify({ loggerInstance: createFastifyLogger(logger) });
254
+ * ```
255
+ */
256
+ function createFastifyLogger(logger, options = {}) {
257
+ return new FastifyLoggerFacade(logger, {
258
+ ...createFastifySerializers(options.redactQueryParams ? { redactQueryParams: options.redactQueryParams } : {}),
259
+ ...options.serializers
260
+ }, {}, options.traceIdBinding ?? "reqId", void 0, false);
261
+ }
262
+ exports.createFastifyLogger = createFastifyLogger;
263
+ exports.createFastifySerializers = createFastifySerializers;
264
+
265
+ //# sourceMappingURL=fastify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.js","names":["buildNameSet","DEFAULT_REDACT_QUERY_PARAMS","redactUrlQuery","serializeError","stringifyForLog","internalError","usableRequestId","getCurrentTraceId"],"sources":["../src/fastify/pino-facade.ts"],"sourcesContent":["/**\n * Pino-shaped facade over a logixia logger, for Fastify's `loggerInstance` option.\n *\n * Fastify checks `info`, `error`, `debug`, `fatal`, `warn`, `trace` and `child`, then\n * calls `loggerInstance.child({}, { serializers })` once and `child({ reqId }, opts)`\n * for every request. The facade accepts pino's call shapes, applies serializers (so\n * a raw request or reply is never written out) and forwards to logixia's\n * `(message, data)` API.\n *\n * @example\n * ```ts\n * import Fastify from 'fastify';\n * import { createLogger } from 'logixia';\n * import { createFastifyLogger } from 'logixia/fastify';\n *\n * const app = Fastify({ loggerInstance: createFastifyLogger(createLogger({ appName: 'api' })) });\n * ```\n */\n\nimport type { IBaseLogger } from '../types';\nimport { serializeError } from '../utils/error.utils';\nimport { internalError } from '../utils/internal-log';\nimport { assignOwn } from '../utils/own-property';\nimport { usableRequestId } from '../utils/request-trace';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n buildNameSet,\n DEFAULT_REDACT_QUERY_PARAMS,\n redactUrlQuery,\n} from '../utils/sensitive-names';\nimport { getCurrentTraceId, runWithTraceId } from '../utils/trace.utils';\n\n// ── Public types ─────────────────────────────────────────────────────────────\n\nexport type PinoLevelName = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport type SerializerFn = (value: unknown) => unknown;\n\n/** pino's log function: `(obj, msg?, ...args)` or `(msg, ...args)`. Always returns `void`. */\nexport interface PinoCompatibleLogFn {\n <T extends object>(obj: T, msg?: string, ...args: unknown[]): void;\n (obj: unknown, msg?: string, ...args: unknown[]): void;\n (msg: string, ...args: unknown[]): void;\n}\n\nexport interface PinoChildOptions {\n /** Level for the child: a pino level name, `silent`, or a logixia level name. */\n level?: string | undefined;\n /** Serializers added to (and overriding) the ones the parent already has. */\n serializers?: Record<string, SerializerFn> | undefined;\n}\n\n/** The pino surface Fastify and its plugins use. Satisfies `FastifyBaseLogger` without importing it. */\nexport interface PinoCompatibleLogger {\n trace: PinoCompatibleLogFn;\n debug: PinoCompatibleLogFn;\n info: PinoCompatibleLogFn;\n warn: PinoCompatibleLogFn;\n error: PinoCompatibleLogFn;\n fatal: PinoCompatibleLogFn;\n /** Accepts the call and writes nothing, like pino's `silent`. */\n silent: PinoCompatibleLogFn;\n /** Current level: a pino level name, `silent`, or a logixia-only level such as `verbose`. */\n level: string;\n /** Numeric value of the current level (pino scale), `Infinity` when silent. */\n readonly levelVal: number;\n readonly levels: {\n readonly values: Record<string, number>;\n readonly labels: Record<number, string>;\n };\n /** Serializers Fastify merges over its own, so these win for `req`, `res` and `err`. */\n readonly serializers: Record<string, SerializerFn>;\n /** True when the configured level would let `level` through. */\n isLevelEnabled(level: string): boolean;\n /** The fields bound to this logger by `child()`. */\n bindings(): Record<string, unknown>;\n child(bindings: Record<string, unknown>, options?: PinoChildOptions): PinoCompatibleLogger;\n}\n\nexport interface FastifyLoggerOptions {\n /**\n * Serializers keyed by field name. They replace the defaults for `req`, `res` and\n * `err` and apply to any other key you add.\n */\n serializers?: Record<string, SerializerFn>;\n /**\n * Query-string parameter names redacted from the `req` URL, merged with the defaults\n * (token, access_token, refresh_token, code, password, secret, api_key, ...).\n */\n redactQueryParams?: string[];\n /**\n * Binding whose value becomes the trace ID of entries logged outside a trace scope.\n * Default: `'reqId'` (Fastify's `requestIdLogLabel`). Counter IDs such as `req-1`\n * are never used. Pass `false` to leave trace IDs alone.\n */\n traceIdBinding?: string | false;\n}\n\nexport interface FastifySerializerOptions {\n redactQueryParams?: string[];\n}\n\n// ── Levels ───────────────────────────────────────────────────────────────────\n\nconst PINO_LEVEL_VALUES: Record<string, number> = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n fatal: 60,\n};\nconst PINO_LEVEL_LABELS: Record<number, string> = {\n 10: 'trace',\n 20: 'debug',\n 30: 'info',\n 40: 'warn',\n 50: 'error',\n 60: 'fatal',\n};\n\n/** Severity rank in logixia's order: lower is more severe. */\nconst RANK: Record<string, number> = {\n fatal: 0,\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n verbose: 5,\n};\n\ntype Writer = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\n// ── Serializers ──────────────────────────────────────────────────────────────\n\ntype Obj = Record<string, unknown>;\n\nconst asObject = (value: unknown): Obj | undefined =>\n typeof value === 'object' && value !== null ? (value as Obj) : undefined;\n\nconst firstString = (value: unknown): string | undefined =>\n typeof value === 'string' && value !== '' ? value : undefined;\n\n/** The host without its port; an IPv6 literal keeps its brackets. */\nfunction hostnameOf(host: string | undefined): string | undefined {\n if (host === undefined) return host;\n return host.startsWith('[') ? host.slice(0, host.indexOf(']') + 1) : host.split(':', 1)[0];\n}\n\n/**\n * pino-std-like `req`, `res` and `err` serializers. `req` reads a Fastify request or a\n * Node `IncomingMessage` and keeps only method, url (query secrets redacted), hostname,\n * remote address and port, and the request ID; headers, body and sockets are dropped.\n */\nexport function createFastifySerializers(\n options: FastifySerializerOptions = {}\n): Record<'req' | 'res' | 'err', SerializerFn> {\n const params = buildNameSet(DEFAULT_REDACT_QUERY_PARAMS, options.redactQueryParams);\n\n return {\n req(value) {\n const req = asObject(value);\n if (!req) return value;\n const raw = asObject(req['raw']);\n const headers = asObject(req['headers']) ?? asObject(raw?.['headers']);\n const socket = asObject(req['socket']) ?? asObject(raw?.['socket']);\n const url = firstString(req['originalUrl']) ?? firstString(req['url']);\n const out: Obj = {\n method: req['method'] ?? raw?.['method'],\n url: url === undefined ? url : redactUrlQuery(url, params),\n hostname: hostnameOf(firstString(req['host']) ?? firstString(headers?.['host'])),\n remoteAddress: req['ip'] ?? socket?.['remoteAddress'],\n remotePort: socket?.['remotePort'],\n };\n if (typeof req['id'] === 'string' || typeof req['id'] === 'number') out['reqId'] = req['id'];\n return out;\n },\n res(value) {\n const res = asObject(value);\n return res ? { statusCode: res['statusCode'] } : value;\n },\n err(value) {\n return value instanceof Error ? serializeError(value) : value;\n },\n };\n}\n\nfunction applySerializers(source: Obj, serializers: Record<string, SerializerFn>): Obj {\n const out: Obj = {};\n const renameErr = source['err'] instanceof Error && !('error' in source);\n for (const key of Object.keys(source)) {\n const value = source[key];\n const serializer = serializers[key];\n let result = value;\n if (serializer !== undefined && value !== undefined) {\n try {\n result = serializer(value);\n } catch (error) {\n internalError(`fastify logger: '${key}' serializer failed`, error);\n result = '[serializer failed]';\n }\n }\n assignOwn(out, renameErr && key === 'err' ? 'error' : key, result);\n }\n return out;\n}\n\n// ── Argument parsing ─────────────────────────────────────────────────────────\n\nconst stringify = (value: unknown): string => stringifyForLog(value) ?? String(value);\n\nfunction interpolate(format: string, args: unknown[], start: number): string {\n if (args.length <= start || !format.includes('%')) return format;\n let next = start;\n return format.replace(/%([%sdifjoO])/g, (match, token: string) => {\n if (token === '%') return '%';\n if (next >= args.length) return match;\n const arg = args[next++];\n switch (token) {\n case 's':\n if (typeof arg === 'string') return arg;\n if (typeof arg === 'function') return arg.name || '<anonymous>';\n return typeof arg === 'object' && arg !== null ? stringify(arg) : String(arg);\n case 'd':\n return String(Number(arg));\n case 'i':\n return String(Number.parseInt(String(arg), 10));\n case 'f':\n return String(Number.parseFloat(String(arg)));\n default:\n return stringify(arg);\n }\n });\n}\n\ninterface ParsedCall {\n message: string;\n data: Obj | undefined;\n}\n\nfunction parseCall(args: unknown[], serializers: Record<string, SerializerFn>): ParsedCall {\n const first = args[0];\n const second = args[1];\n const describe = (fallback: string): string => {\n if (second === undefined) return fallback;\n return typeof second === 'string' ? interpolate(second, args, 2) : stringify(second);\n };\n\n if (first instanceof Error) {\n const serialize = serializers['err'];\n return {\n message: describe(first.message),\n data: { error: serialize ? serialize(first) : serializeError(first) },\n };\n }\n if (typeof first === 'object' && first !== null && !Array.isArray(first)) {\n const data = applySerializers(first as Obj, serializers);\n const err = (first as Obj)['err'];\n return { message: describe(err instanceof Error ? err.message : ''), data };\n }\n return typeof first === 'string'\n ? { message: interpolate(first, args, 1), data: undefined }\n : { message: stringify(first), data: undefined };\n}\n\n/** Fire-and-forget: a rejected log call must never become an unhandled rejection. */\nfunction fire(result: unknown): void {\n if (result && typeof (result as Promise<unknown>).catch === 'function') {\n (result as Promise<unknown>).catch((error: unknown) =>\n internalError('fastify logger: log call failed', error)\n );\n }\n}\n\n// ── Facade ───────────────────────────────────────────────────────────────────\n\nfunction toLogixiaLevel(level: string): string {\n return level === 'fatal' ? 'error' : level;\n}\n\nclass FastifyLoggerFacade implements PinoCompatibleLogger {\n readonly levels = { values: PINO_LEVEL_VALUES, labels: PINO_LEVEL_LABELS };\n\n constructor(\n private readonly target: IBaseLogger,\n readonly serializers: Record<string, SerializerFn>,\n private readonly bound: Obj,\n private readonly traceIdBinding: string | false,\n private readonly traceId: string | undefined,\n private muted: boolean\n ) {}\n\n trace(...args: unknown[]): void {\n this.write('trace', args);\n }\n debug(...args: unknown[]): void {\n this.write('debug', args);\n }\n info(...args: unknown[]): void {\n this.write('info', args);\n }\n warn(...args: unknown[]): void {\n this.write('warn', args);\n }\n error(...args: unknown[]): void {\n this.write('error', args);\n }\n fatal(...args: unknown[]): void {\n this.write('error', args);\n }\n silent(..._args: unknown[]): void {}\n\n get level(): string {\n return this.muted ? 'silent' : this.target.getLevel();\n }\n\n set level(level: string) {\n if (level === 'silent') {\n this.muted = true;\n return;\n }\n this.muted = false;\n this.target.setLevel(toLogixiaLevel(level));\n }\n\n get levelVal(): number {\n return this.muted ? Infinity : (PINO_LEVEL_VALUES[this.level] ?? PINO_LEVEL_VALUES['info']!);\n }\n\n isLevelEnabled(level: string): boolean {\n if (this.muted) return false;\n const wanted = RANK[level];\n const current = RANK[this.target.getLevel()];\n return wanted === undefined || current === undefined || wanted <= current;\n }\n\n bindings(): Record<string, unknown> {\n return { ...this.bound };\n }\n\n child(bindings: Record<string, unknown>, options: PinoChildOptions = {}): PinoCompatibleLogger {\n const serializers = options.serializers\n ? { ...this.serializers, ...options.serializers }\n : this.serializers;\n const fields = applySerializers(bindings ?? {}, serializers);\n const traceId = this.traceIdBinding ? usableRequestId(fields[this.traceIdBinding]) : undefined;\n const child = new FastifyLoggerFacade(\n this.target.child(this.target.getContext() ?? '', fields),\n serializers,\n { ...this.bound, ...fields },\n this.traceIdBinding,\n traceId ?? this.traceId,\n this.muted\n );\n if (options.level) child.level = options.level;\n return child;\n }\n\n private write(method: Writer, args: unknown[]): void {\n if (this.muted) return;\n try {\n const { message, data } = parseCall(args, this.serializers);\n const traceId = this.traceId;\n const send = (): void => fire(this.target[method](message, data));\n if (traceId !== undefined && getCurrentTraceId() === undefined) runWithTraceId(traceId, send);\n else send();\n } catch (error) {\n internalError('fastify logger: log call failed', error);\n }\n }\n}\n\n/**\n * Wrap a logixia logger so Fastify accepts it as `loggerInstance`.\n *\n * - Call shapes: `(obj, msg?, ...args)`, `(msg, ...args)` with `%s %d %i %f %j %o %O`,\n * and `(err)` / `(err, msg)`. An `Error` under `err` is logged under `error`, like\n * `logger.error(err)` does, with its stack and `cause` chain.\n * - `fatal` is logged at `error`. `silent` mutes the facade (and children made after).\n * - `child(bindings)` creates a logixia child that carries the bindings as context data.\n * It starts no transports and registers nothing for shutdown, so one per request is cheap.\n * - Methods return `void`; rejected log calls are caught.\n * - `req`, `res` and `err` serializers are supplied; Fastify gives them precedence over\n * its own. Override or extend them with `options.serializers`.\n *\n * @example\n * ```ts\n * const app = Fastify({ loggerInstance: createFastifyLogger(logger) });\n * ```\n */\nexport function createFastifyLogger(\n logger: IBaseLogger,\n options: FastifyLoggerOptions = {}\n): PinoCompatibleLogger {\n const serializers: Record<string, SerializerFn> = {\n ...createFastifySerializers(\n options.redactQueryParams ? { redactQueryParams: options.redactQueryParams } : {}\n ),\n ...options.serializers,\n };\n return new FastifyLoggerFacade(\n logger,\n serializers,\n {},\n options.traceIdBinding ?? 'reqId',\n undefined,\n false\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,263 @@
1
+ import { t as assignOwn } from "./own-property-CjFw9qwZ.mjs";
2
+ import { d as getCurrentTraceId, p as runWithTraceId, r as usableRequestId } from "./request-trace-txUhyyre.mjs";
3
+ import { a as buildNameSet, n as DEFAULT_REDACT_QUERY_PARAMS, o as redactUrlQuery } from "./sensitive-names-BiBM6R1X.mjs";
4
+ import { t as internalError } from "./internal-log-Cy5nF1ZL.mjs";
5
+ import { i as stringifyForLog } from "./safe-stringify-B5p5ktFe.mjs";
6
+ import { r as serializeError } from "./error.utils-B8_CwESF.mjs";
7
+ // src/fastify/pino-facade.ts
8
+ const PINO_LEVEL_VALUES = {
9
+ trace: 10,
10
+ debug: 20,
11
+ info: 30,
12
+ warn: 40,
13
+ error: 50,
14
+ fatal: 60
15
+ };
16
+ const PINO_LEVEL_LABELS = {
17
+ 10: "trace",
18
+ 20: "debug",
19
+ 30: "info",
20
+ 40: "warn",
21
+ 50: "error",
22
+ 60: "fatal"
23
+ };
24
+ /** Severity rank in logixia's order: lower is more severe. */
25
+ const RANK = {
26
+ fatal: 0,
27
+ error: 0,
28
+ warn: 1,
29
+ info: 2,
30
+ debug: 3,
31
+ trace: 4,
32
+ verbose: 5
33
+ };
34
+ const asObject = (value) => typeof value === "object" && value !== null ? value : void 0;
35
+ const firstString = (value) => typeof value === "string" && value !== "" ? value : void 0;
36
+ /** The host without its port; an IPv6 literal keeps its brackets. */
37
+ function hostnameOf(host) {
38
+ if (host === void 0) return host;
39
+ return host.startsWith("[") ? host.slice(0, host.indexOf("]") + 1) : host.split(":", 1)[0];
40
+ }
41
+ /**
42
+ * pino-std-like `req`, `res` and `err` serializers. `req` reads a Fastify request or a
43
+ * Node `IncomingMessage` and keeps only method, url (query secrets redacted), hostname,
44
+ * remote address and port, and the request ID; headers, body and sockets are dropped.
45
+ */
46
+ function createFastifySerializers(options = {}) {
47
+ const params = buildNameSet(DEFAULT_REDACT_QUERY_PARAMS, options.redactQueryParams);
48
+ return {
49
+ req(value) {
50
+ const req = asObject(value);
51
+ if (!req) return value;
52
+ const raw = asObject(req["raw"]);
53
+ const headers = asObject(req["headers"]) ?? asObject(raw === null || raw === void 0 ? void 0 : raw["headers"]);
54
+ const socket = asObject(req["socket"]) ?? asObject(raw === null || raw === void 0 ? void 0 : raw["socket"]);
55
+ const url = firstString(req["originalUrl"]) ?? firstString(req["url"]);
56
+ const out = {
57
+ method: req["method"] ?? (raw === null || raw === void 0 ? void 0 : raw["method"]),
58
+ url: url === void 0 ? url : redactUrlQuery(url, params),
59
+ hostname: hostnameOf(firstString(req["host"]) ?? firstString(headers === null || headers === void 0 ? void 0 : headers["host"])),
60
+ remoteAddress: req["ip"] ?? (socket === null || socket === void 0 ? void 0 : socket["remoteAddress"]),
61
+ remotePort: socket === null || socket === void 0 ? void 0 : socket["remotePort"]
62
+ };
63
+ if (typeof req["id"] === "string" || typeof req["id"] === "number") out["reqId"] = req["id"];
64
+ return out;
65
+ },
66
+ res(value) {
67
+ const res = asObject(value);
68
+ return res ? { statusCode: res["statusCode"] } : value;
69
+ },
70
+ err(value) {
71
+ return value instanceof Error ? serializeError(value) : value;
72
+ }
73
+ };
74
+ }
75
+ function applySerializers(source, serializers) {
76
+ const out = {};
77
+ const renameErr = source["err"] instanceof Error && !("error" in source);
78
+ for (const key of Object.keys(source)) {
79
+ const value = source[key];
80
+ const serializer = serializers[key];
81
+ let result = value;
82
+ if (serializer !== void 0 && value !== void 0) try {
83
+ result = serializer(value);
84
+ } catch (error) {
85
+ internalError(`fastify logger: '${key}' serializer failed`, error);
86
+ result = "[serializer failed]";
87
+ }
88
+ assignOwn(out, renameErr && key === "err" ? "error" : key, result);
89
+ }
90
+ return out;
91
+ }
92
+ const stringify = (value) => stringifyForLog(value) ?? String(value);
93
+ function interpolate(format, args, start) {
94
+ if (args.length <= start || !format.includes("%")) return format;
95
+ let next = start;
96
+ return format.replace(/%([%sdifjoO])/g, (match, token) => {
97
+ if (token === "%") return "%";
98
+ if (next >= args.length) return match;
99
+ const arg = args[next++];
100
+ switch (token) {
101
+ case "s":
102
+ if (typeof arg === "string") return arg;
103
+ if (typeof arg === "function") return arg.name || "<anonymous>";
104
+ return typeof arg === "object" && arg !== null ? stringify(arg) : String(arg);
105
+ case "d": return String(Number(arg));
106
+ case "i": return String(Number.parseInt(String(arg), 10));
107
+ case "f": return String(Number.parseFloat(String(arg)));
108
+ default: return stringify(arg);
109
+ }
110
+ });
111
+ }
112
+ function parseCall(args, serializers) {
113
+ const first = args[0];
114
+ const second = args[1];
115
+ const describe = (fallback) => {
116
+ if (second === void 0) return fallback;
117
+ return typeof second === "string" ? interpolate(second, args, 2) : stringify(second);
118
+ };
119
+ if (first instanceof Error) {
120
+ const serialize = serializers["err"];
121
+ return {
122
+ message: describe(first.message),
123
+ data: { error: serialize ? serialize(first) : serializeError(first) }
124
+ };
125
+ }
126
+ if (typeof first === "object" && first !== null && !Array.isArray(first)) {
127
+ const data = applySerializers(first, serializers);
128
+ const err = first["err"];
129
+ return {
130
+ message: describe(err instanceof Error ? err.message : ""),
131
+ data
132
+ };
133
+ }
134
+ return typeof first === "string" ? {
135
+ message: interpolate(first, args, 1),
136
+ data: void 0
137
+ } : {
138
+ message: stringify(first),
139
+ data: void 0
140
+ };
141
+ }
142
+ /** Fire-and-forget: a rejected log call must never become an unhandled rejection. */
143
+ function fire(result) {
144
+ if (result && typeof result.catch === "function") result.catch((error) => internalError("fastify logger: log call failed", error));
145
+ }
146
+ function toLogixiaLevel(level) {
147
+ return level === "fatal" ? "error" : level;
148
+ }
149
+ var FastifyLoggerFacade = class FastifyLoggerFacade {
150
+ target;
151
+ serializers;
152
+ bound;
153
+ traceIdBinding;
154
+ traceId;
155
+ muted;
156
+ levels = {
157
+ values: PINO_LEVEL_VALUES,
158
+ labels: PINO_LEVEL_LABELS
159
+ };
160
+ constructor(target, serializers, bound, traceIdBinding, traceId, muted) {
161
+ this.target = target;
162
+ this.serializers = serializers;
163
+ this.bound = bound;
164
+ this.traceIdBinding = traceIdBinding;
165
+ this.traceId = traceId;
166
+ this.muted = muted;
167
+ }
168
+ trace(...args) {
169
+ this.write("trace", args);
170
+ }
171
+ debug(...args) {
172
+ this.write("debug", args);
173
+ }
174
+ info(...args) {
175
+ this.write("info", args);
176
+ }
177
+ warn(...args) {
178
+ this.write("warn", args);
179
+ }
180
+ error(...args) {
181
+ this.write("error", args);
182
+ }
183
+ fatal(...args) {
184
+ this.write("error", args);
185
+ }
186
+ silent(..._args) {}
187
+ get level() {
188
+ return this.muted ? "silent" : this.target.getLevel();
189
+ }
190
+ set level(level) {
191
+ if (level === "silent") {
192
+ this.muted = true;
193
+ return;
194
+ }
195
+ this.muted = false;
196
+ this.target.setLevel(toLogixiaLevel(level));
197
+ }
198
+ get levelVal() {
199
+ return this.muted ? Infinity : PINO_LEVEL_VALUES[this.level] ?? PINO_LEVEL_VALUES["info"];
200
+ }
201
+ isLevelEnabled(level) {
202
+ if (this.muted) return false;
203
+ const wanted = RANK[level];
204
+ const current = RANK[this.target.getLevel()];
205
+ return wanted === void 0 || current === void 0 || wanted <= current;
206
+ }
207
+ bindings() {
208
+ return { ...this.bound };
209
+ }
210
+ child(bindings, options = {}) {
211
+ const serializers = options.serializers ? {
212
+ ...this.serializers,
213
+ ...options.serializers
214
+ } : this.serializers;
215
+ const fields = applySerializers(bindings ?? {}, serializers);
216
+ const traceId = this.traceIdBinding ? usableRequestId(fields[this.traceIdBinding]) : void 0;
217
+ const child = new FastifyLoggerFacade(this.target.child(this.target.getContext() ?? "", fields), serializers, {
218
+ ...this.bound,
219
+ ...fields
220
+ }, this.traceIdBinding, traceId ?? this.traceId, this.muted);
221
+ if (options.level) child.level = options.level;
222
+ return child;
223
+ }
224
+ write(method, args) {
225
+ if (this.muted) return;
226
+ try {
227
+ const { message, data } = parseCall(args, this.serializers);
228
+ const traceId = this.traceId;
229
+ const send = () => fire(this.target[method](message, data));
230
+ if (traceId !== void 0 && getCurrentTraceId() === void 0) runWithTraceId(traceId, send);
231
+ else send();
232
+ } catch (error) {
233
+ internalError("fastify logger: log call failed", error);
234
+ }
235
+ }
236
+ };
237
+ /**
238
+ * Wrap a logixia logger so Fastify accepts it as `loggerInstance`.
239
+ *
240
+ * - Call shapes: `(obj, msg?, ...args)`, `(msg, ...args)` with `%s %d %i %f %j %o %O`,
241
+ * and `(err)` / `(err, msg)`. An `Error` under `err` is logged under `error`, like
242
+ * `logger.error(err)` does, with its stack and `cause` chain.
243
+ * - `fatal` is logged at `error`. `silent` mutes the facade (and children made after).
244
+ * - `child(bindings)` creates a logixia child that carries the bindings as context data.
245
+ * It starts no transports and registers nothing for shutdown, so one per request is cheap.
246
+ * - Methods return `void`; rejected log calls are caught.
247
+ * - `req`, `res` and `err` serializers are supplied; Fastify gives them precedence over
248
+ * its own. Override or extend them with `options.serializers`.
249
+ *
250
+ * @example
251
+ * ```ts
252
+ * const app = Fastify({ loggerInstance: createFastifyLogger(logger) });
253
+ * ```
254
+ */
255
+ function createFastifyLogger(logger, options = {}) {
256
+ return new FastifyLoggerFacade(logger, {
257
+ ...createFastifySerializers(options.redactQueryParams ? { redactQueryParams: options.redactQueryParams } : {}),
258
+ ...options.serializers
259
+ }, {}, options.traceIdBinding ?? "reqId", void 0, false);
260
+ }
261
+ export { createFastifyLogger, createFastifySerializers };
262
+
263
+ //# sourceMappingURL=fastify.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.mjs","names":[],"sources":["../src/fastify/pino-facade.ts"],"sourcesContent":["/**\n * Pino-shaped facade over a logixia logger, for Fastify's `loggerInstance` option.\n *\n * Fastify checks `info`, `error`, `debug`, `fatal`, `warn`, `trace` and `child`, then\n * calls `loggerInstance.child({}, { serializers })` once and `child({ reqId }, opts)`\n * for every request. The facade accepts pino's call shapes, applies serializers (so\n * a raw request or reply is never written out) and forwards to logixia's\n * `(message, data)` API.\n *\n * @example\n * ```ts\n * import Fastify from 'fastify';\n * import { createLogger } from 'logixia';\n * import { createFastifyLogger } from 'logixia/fastify';\n *\n * const app = Fastify({ loggerInstance: createFastifyLogger(createLogger({ appName: 'api' })) });\n * ```\n */\n\nimport type { IBaseLogger } from '../types';\nimport { serializeError } from '../utils/error.utils';\nimport { internalError } from '../utils/internal-log';\nimport { assignOwn } from '../utils/own-property';\nimport { usableRequestId } from '../utils/request-trace';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n buildNameSet,\n DEFAULT_REDACT_QUERY_PARAMS,\n redactUrlQuery,\n} from '../utils/sensitive-names';\nimport { getCurrentTraceId, runWithTraceId } from '../utils/trace.utils';\n\n// ── Public types ─────────────────────────────────────────────────────────────\n\nexport type PinoLevelName = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\nexport type SerializerFn = (value: unknown) => unknown;\n\n/** pino's log function: `(obj, msg?, ...args)` or `(msg, ...args)`. Always returns `void`. */\nexport interface PinoCompatibleLogFn {\n <T extends object>(obj: T, msg?: string, ...args: unknown[]): void;\n (obj: unknown, msg?: string, ...args: unknown[]): void;\n (msg: string, ...args: unknown[]): void;\n}\n\nexport interface PinoChildOptions {\n /** Level for the child: a pino level name, `silent`, or a logixia level name. */\n level?: string | undefined;\n /** Serializers added to (and overriding) the ones the parent already has. */\n serializers?: Record<string, SerializerFn> | undefined;\n}\n\n/** The pino surface Fastify and its plugins use. Satisfies `FastifyBaseLogger` without importing it. */\nexport interface PinoCompatibleLogger {\n trace: PinoCompatibleLogFn;\n debug: PinoCompatibleLogFn;\n info: PinoCompatibleLogFn;\n warn: PinoCompatibleLogFn;\n error: PinoCompatibleLogFn;\n fatal: PinoCompatibleLogFn;\n /** Accepts the call and writes nothing, like pino's `silent`. */\n silent: PinoCompatibleLogFn;\n /** Current level: a pino level name, `silent`, or a logixia-only level such as `verbose`. */\n level: string;\n /** Numeric value of the current level (pino scale), `Infinity` when silent. */\n readonly levelVal: number;\n readonly levels: {\n readonly values: Record<string, number>;\n readonly labels: Record<number, string>;\n };\n /** Serializers Fastify merges over its own, so these win for `req`, `res` and `err`. */\n readonly serializers: Record<string, SerializerFn>;\n /** True when the configured level would let `level` through. */\n isLevelEnabled(level: string): boolean;\n /** The fields bound to this logger by `child()`. */\n bindings(): Record<string, unknown>;\n child(bindings: Record<string, unknown>, options?: PinoChildOptions): PinoCompatibleLogger;\n}\n\nexport interface FastifyLoggerOptions {\n /**\n * Serializers keyed by field name. They replace the defaults for `req`, `res` and\n * `err` and apply to any other key you add.\n */\n serializers?: Record<string, SerializerFn>;\n /**\n * Query-string parameter names redacted from the `req` URL, merged with the defaults\n * (token, access_token, refresh_token, code, password, secret, api_key, ...).\n */\n redactQueryParams?: string[];\n /**\n * Binding whose value becomes the trace ID of entries logged outside a trace scope.\n * Default: `'reqId'` (Fastify's `requestIdLogLabel`). Counter IDs such as `req-1`\n * are never used. Pass `false` to leave trace IDs alone.\n */\n traceIdBinding?: string | false;\n}\n\nexport interface FastifySerializerOptions {\n redactQueryParams?: string[];\n}\n\n// ── Levels ───────────────────────────────────────────────────────────────────\n\nconst PINO_LEVEL_VALUES: Record<string, number> = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n fatal: 60,\n};\nconst PINO_LEVEL_LABELS: Record<number, string> = {\n 10: 'trace',\n 20: 'debug',\n 30: 'info',\n 40: 'warn',\n 50: 'error',\n 60: 'fatal',\n};\n\n/** Severity rank in logixia's order: lower is more severe. */\nconst RANK: Record<string, number> = {\n fatal: 0,\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n verbose: 5,\n};\n\ntype Writer = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\n// ── Serializers ──────────────────────────────────────────────────────────────\n\ntype Obj = Record<string, unknown>;\n\nconst asObject = (value: unknown): Obj | undefined =>\n typeof value === 'object' && value !== null ? (value as Obj) : undefined;\n\nconst firstString = (value: unknown): string | undefined =>\n typeof value === 'string' && value !== '' ? value : undefined;\n\n/** The host without its port; an IPv6 literal keeps its brackets. */\nfunction hostnameOf(host: string | undefined): string | undefined {\n if (host === undefined) return host;\n return host.startsWith('[') ? host.slice(0, host.indexOf(']') + 1) : host.split(':', 1)[0];\n}\n\n/**\n * pino-std-like `req`, `res` and `err` serializers. `req` reads a Fastify request or a\n * Node `IncomingMessage` and keeps only method, url (query secrets redacted), hostname,\n * remote address and port, and the request ID; headers, body and sockets are dropped.\n */\nexport function createFastifySerializers(\n options: FastifySerializerOptions = {}\n): Record<'req' | 'res' | 'err', SerializerFn> {\n const params = buildNameSet(DEFAULT_REDACT_QUERY_PARAMS, options.redactQueryParams);\n\n return {\n req(value) {\n const req = asObject(value);\n if (!req) return value;\n const raw = asObject(req['raw']);\n const headers = asObject(req['headers']) ?? asObject(raw?.['headers']);\n const socket = asObject(req['socket']) ?? asObject(raw?.['socket']);\n const url = firstString(req['originalUrl']) ?? firstString(req['url']);\n const out: Obj = {\n method: req['method'] ?? raw?.['method'],\n url: url === undefined ? url : redactUrlQuery(url, params),\n hostname: hostnameOf(firstString(req['host']) ?? firstString(headers?.['host'])),\n remoteAddress: req['ip'] ?? socket?.['remoteAddress'],\n remotePort: socket?.['remotePort'],\n };\n if (typeof req['id'] === 'string' || typeof req['id'] === 'number') out['reqId'] = req['id'];\n return out;\n },\n res(value) {\n const res = asObject(value);\n return res ? { statusCode: res['statusCode'] } : value;\n },\n err(value) {\n return value instanceof Error ? serializeError(value) : value;\n },\n };\n}\n\nfunction applySerializers(source: Obj, serializers: Record<string, SerializerFn>): Obj {\n const out: Obj = {};\n const renameErr = source['err'] instanceof Error && !('error' in source);\n for (const key of Object.keys(source)) {\n const value = source[key];\n const serializer = serializers[key];\n let result = value;\n if (serializer !== undefined && value !== undefined) {\n try {\n result = serializer(value);\n } catch (error) {\n internalError(`fastify logger: '${key}' serializer failed`, error);\n result = '[serializer failed]';\n }\n }\n assignOwn(out, renameErr && key === 'err' ? 'error' : key, result);\n }\n return out;\n}\n\n// ── Argument parsing ─────────────────────────────────────────────────────────\n\nconst stringify = (value: unknown): string => stringifyForLog(value) ?? String(value);\n\nfunction interpolate(format: string, args: unknown[], start: number): string {\n if (args.length <= start || !format.includes('%')) return format;\n let next = start;\n return format.replace(/%([%sdifjoO])/g, (match, token: string) => {\n if (token === '%') return '%';\n if (next >= args.length) return match;\n const arg = args[next++];\n switch (token) {\n case 's':\n if (typeof arg === 'string') return arg;\n if (typeof arg === 'function') return arg.name || '<anonymous>';\n return typeof arg === 'object' && arg !== null ? stringify(arg) : String(arg);\n case 'd':\n return String(Number(arg));\n case 'i':\n return String(Number.parseInt(String(arg), 10));\n case 'f':\n return String(Number.parseFloat(String(arg)));\n default:\n return stringify(arg);\n }\n });\n}\n\ninterface ParsedCall {\n message: string;\n data: Obj | undefined;\n}\n\nfunction parseCall(args: unknown[], serializers: Record<string, SerializerFn>): ParsedCall {\n const first = args[0];\n const second = args[1];\n const describe = (fallback: string): string => {\n if (second === undefined) return fallback;\n return typeof second === 'string' ? interpolate(second, args, 2) : stringify(second);\n };\n\n if (first instanceof Error) {\n const serialize = serializers['err'];\n return {\n message: describe(first.message),\n data: { error: serialize ? serialize(first) : serializeError(first) },\n };\n }\n if (typeof first === 'object' && first !== null && !Array.isArray(first)) {\n const data = applySerializers(first as Obj, serializers);\n const err = (first as Obj)['err'];\n return { message: describe(err instanceof Error ? err.message : ''), data };\n }\n return typeof first === 'string'\n ? { message: interpolate(first, args, 1), data: undefined }\n : { message: stringify(first), data: undefined };\n}\n\n/** Fire-and-forget: a rejected log call must never become an unhandled rejection. */\nfunction fire(result: unknown): void {\n if (result && typeof (result as Promise<unknown>).catch === 'function') {\n (result as Promise<unknown>).catch((error: unknown) =>\n internalError('fastify logger: log call failed', error)\n );\n }\n}\n\n// ── Facade ───────────────────────────────────────────────────────────────────\n\nfunction toLogixiaLevel(level: string): string {\n return level === 'fatal' ? 'error' : level;\n}\n\nclass FastifyLoggerFacade implements PinoCompatibleLogger {\n readonly levels = { values: PINO_LEVEL_VALUES, labels: PINO_LEVEL_LABELS };\n\n constructor(\n private readonly target: IBaseLogger,\n readonly serializers: Record<string, SerializerFn>,\n private readonly bound: Obj,\n private readonly traceIdBinding: string | false,\n private readonly traceId: string | undefined,\n private muted: boolean\n ) {}\n\n trace(...args: unknown[]): void {\n this.write('trace', args);\n }\n debug(...args: unknown[]): void {\n this.write('debug', args);\n }\n info(...args: unknown[]): void {\n this.write('info', args);\n }\n warn(...args: unknown[]): void {\n this.write('warn', args);\n }\n error(...args: unknown[]): void {\n this.write('error', args);\n }\n fatal(...args: unknown[]): void {\n this.write('error', args);\n }\n silent(..._args: unknown[]): void {}\n\n get level(): string {\n return this.muted ? 'silent' : this.target.getLevel();\n }\n\n set level(level: string) {\n if (level === 'silent') {\n this.muted = true;\n return;\n }\n this.muted = false;\n this.target.setLevel(toLogixiaLevel(level));\n }\n\n get levelVal(): number {\n return this.muted ? Infinity : (PINO_LEVEL_VALUES[this.level] ?? PINO_LEVEL_VALUES['info']!);\n }\n\n isLevelEnabled(level: string): boolean {\n if (this.muted) return false;\n const wanted = RANK[level];\n const current = RANK[this.target.getLevel()];\n return wanted === undefined || current === undefined || wanted <= current;\n }\n\n bindings(): Record<string, unknown> {\n return { ...this.bound };\n }\n\n child(bindings: Record<string, unknown>, options: PinoChildOptions = {}): PinoCompatibleLogger {\n const serializers = options.serializers\n ? { ...this.serializers, ...options.serializers }\n : this.serializers;\n const fields = applySerializers(bindings ?? {}, serializers);\n const traceId = this.traceIdBinding ? usableRequestId(fields[this.traceIdBinding]) : undefined;\n const child = new FastifyLoggerFacade(\n this.target.child(this.target.getContext() ?? '', fields),\n serializers,\n { ...this.bound, ...fields },\n this.traceIdBinding,\n traceId ?? this.traceId,\n this.muted\n );\n if (options.level) child.level = options.level;\n return child;\n }\n\n private write(method: Writer, args: unknown[]): void {\n if (this.muted) return;\n try {\n const { message, data } = parseCall(args, this.serializers);\n const traceId = this.traceId;\n const send = (): void => fire(this.target[method](message, data));\n if (traceId !== undefined && getCurrentTraceId() === undefined) runWithTraceId(traceId, send);\n else send();\n } catch (error) {\n internalError('fastify logger: log call failed', error);\n }\n }\n}\n\n/**\n * Wrap a logixia logger so Fastify accepts it as `loggerInstance`.\n *\n * - Call shapes: `(obj, msg?, ...args)`, `(msg, ...args)` with `%s %d %i %f %j %o %O`,\n * and `(err)` / `(err, msg)`. An `Error` under `err` is logged under `error`, like\n * `logger.error(err)` does, with its stack and `cause` chain.\n * - `fatal` is logged at `error`. `silent` mutes the facade (and children made after).\n * - `child(bindings)` creates a logixia child that carries the bindings as context data.\n * It starts no transports and registers nothing for shutdown, so one per request is cheap.\n * - Methods return `void`; rejected log calls are caught.\n * - `req`, `res` and `err` serializers are supplied; Fastify gives them precedence over\n * its own. Override or extend them with `options.serializers`.\n *\n * @example\n * ```ts\n * const app = Fastify({ loggerInstance: createFastifyLogger(logger) });\n * ```\n */\nexport function createFastifyLogger(\n logger: IBaseLogger,\n options: FastifyLoggerOptions = {}\n): PinoCompatibleLogger {\n const serializers: Record<string, SerializerFn> = {\n ...createFastifySerializers(\n options.redactQueryParams ? { redactQueryParams: options.redactQueryParams } : {}\n ),\n ...options.serializers,\n };\n return new FastifyLoggerFacade(\n logger,\n serializers,\n {},\n options.traceIdBinding ?? 'reqId',\n undefined,\n false\n );\n}\n"],"mappings":"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"}
package/dist/gcp.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as GCPTransport, r as GCPTransportConfig, t as GCPMonitoredResource } from "./gcp.transport-D9SdLPwP.mjs";
1
+ import { n as GCPTransport, r as GCPTransportConfig, t as GCPMonitoredResource } from "./gcp.transport-C8VJiEM7.mjs";
2
2
  export { GCPMonitoredResource, GCPTransport, GCPTransportConfig };
package/dist/gcp.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as GCPTransport, r as GCPTransportConfig, t as GCPMonitoredResource } from "./gcp.transport-BCIvdFV-.js";
1
+ import { n as GCPTransport, r as GCPTransportConfig, t as GCPMonitoredResource } from "./gcp.transport-Ct0BtKFo.js";
2
2
  export { GCPMonitoredResource, GCPTransport, GCPTransportConfig };
package/dist/gcp.js CHANGED
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_gcp_transport = require("./gcp.transport-D_NHVZrw.js");
2
+ const require_gcp_transport = require("./gcp.transport-V9R4dwdT.js");
3
3
  exports.GCPTransport = require_gcp_transport.GCPTransport;
package/dist/gcp.mjs CHANGED
@@ -1 +1 @@
1
- export { t as GCPTransport } from "./gcp.transport-DOH4bpWM.mjs";
1
+ export { t as GCPTransport } from "./gcp.transport-BY1Z3cS0.mjs";