logixia 2.0.0 → 2.0.6

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 (239) hide show
  1. package/README.md +172 -2597
  2. package/dist/async-context-2mbUKhcl.mjs +132 -0
  3. package/dist/async-context-2mbUKhcl.mjs.map +1 -0
  4. package/dist/async-context-DUFMDYAr.js +148 -0
  5. package/dist/async-context-DUFMDYAr.js.map +1 -0
  6. package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-Bu4S2I2q.js} +32 -20
  7. package/dist/azure-monitor.transport-Bu4S2I2q.js.map +1 -0
  8. package/dist/{azure-monitor.transport-Cn_3Usvu.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +3 -6
  9. package/dist/azure-monitor.transport-Bvf7Xegt.d.ts.map +1 -0
  10. package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-C1RWAumT.mjs} +27 -15
  11. package/dist/azure-monitor.transport-C1RWAumT.mjs.map +1 -0
  12. package/dist/{azure-monitor.transport-D7Da4RAb.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +3 -6
  13. package/dist/azure-monitor.transport-CbSHOnNX.d.mts.map +1 -0
  14. package/dist/azure.d.mts +1 -2
  15. package/dist/azure.d.ts +1 -2
  16. package/dist/azure.js +3 -6
  17. package/dist/azure.mjs +1 -6
  18. package/dist/{batch-buffer-PGvSgbmd.mjs → batch-buffer-BvXLDPlV.mjs} +21 -7
  19. package/dist/batch-buffer-BvXLDPlV.mjs.map +1 -0
  20. package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-C7Am4Mw-.js} +53 -40
  21. package/dist/batch-buffer-C7Am4Mw-.js.map +1 -0
  22. package/dist/browser.d.mts +47 -27
  23. package/dist/browser.d.mts.map +1 -1
  24. package/dist/browser.d.ts +47 -27
  25. package/dist/browser.d.ts.map +1 -1
  26. package/dist/browser.js +464 -62
  27. package/dist/browser.js.map +1 -1
  28. package/dist/browser.mjs +465 -65
  29. package/dist/browser.mjs.map +1 -1
  30. package/dist/{builder-0gEzRopq.mjs → builder-DhNhvOkt.mjs} +307 -246
  31. package/dist/builder-DhNhvOkt.mjs.map +1 -0
  32. package/dist/{builder-D44QktIo.js → builder-yFvJrz7o.js} +435 -399
  33. package/dist/builder-yFvJrz7o.js.map +1 -0
  34. package/dist/cli/index.js +216 -125
  35. package/dist/cloudwatch.d.mts +1 -2
  36. package/dist/cloudwatch.d.ts +1 -2
  37. package/dist/cloudwatch.js +3 -7
  38. package/dist/cloudwatch.mjs +1 -7
  39. package/dist/{cloudwatch.transport-DsEq633o.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -6
  40. package/dist/cloudwatch.transport-CQyT6U91.d.ts.map +1 -0
  41. package/dist/{cloudwatch.transport-BO1ahxw-.js → cloudwatch.transport-Ch1Uae-0.js} +61 -36
  42. package/dist/cloudwatch.transport-Ch1Uae-0.js.map +1 -0
  43. package/dist/{cloudwatch.transport-UlyZFWMn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -6
  44. package/dist/cloudwatch.transport-CjVrI6S4.d.mts.map +1 -0
  45. package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-DZqF2xZO.mjs} +54 -28
  46. package/dist/cloudwatch.transport-DZqF2xZO.mjs.map +1 -0
  47. package/dist/{coerce.utils-Cu6IUTgX.mjs → coerce.utils-B_rEudCn.mjs} +3 -4
  48. package/dist/{coerce.utils-Cu6IUTgX.mjs.map → coerce.utils-B_rEudCn.mjs.map} +1 -1
  49. package/dist/{coerce.utils-B-LilukN.js → coerce.utils-C1C5sIX0.js} +8 -10
  50. package/dist/{coerce.utils-B-LilukN.js.map → coerce.utils-C1C5sIX0.js.map} +1 -1
  51. package/dist/correlation.d.mts +15 -69
  52. package/dist/correlation.d.mts.map +1 -1
  53. package/dist/correlation.d.ts +15 -69
  54. package/dist/correlation.d.ts.map +1 -1
  55. package/dist/correlation.js +69 -20
  56. package/dist/correlation.js.map +1 -1
  57. package/dist/correlation.mjs +67 -17
  58. package/dist/correlation.mjs.map +1 -1
  59. package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-BSLkzw18.js} +16 -13
  60. package/dist/entry-fields-BSLkzw18.js.map +1 -0
  61. package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-J1OBi24o.mjs} +11 -7
  62. package/dist/entry-fields-J1OBi24o.mjs.map +1 -0
  63. package/dist/gcp.d.mts +1 -2
  64. package/dist/gcp.d.ts +1 -2
  65. package/dist/gcp.js +3 -7
  66. package/dist/gcp.mjs +1 -7
  67. package/dist/{gcp.transport-B7oc97sG.d.ts → gcp.transport-BCIvdFV-.d.ts} +5 -8
  68. package/dist/gcp.transport-BCIvdFV-.d.ts.map +1 -0
  69. package/dist/{gcp.transport-GrJurKo8.d.mts → gcp.transport-D9SdLPwP.d.mts} +5 -8
  70. package/dist/gcp.transport-D9SdLPwP.d.mts.map +1 -0
  71. package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-DVCmnA3b.mjs} +59 -16
  72. package/dist/gcp.transport-DVCmnA3b.mjs.map +1 -0
  73. package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-Dy2Lf8FI.js} +64 -22
  74. package/dist/gcp.transport-Dy2Lf8FI.js.map +1 -0
  75. package/dist/http-shapes-BnBkJcid.d.mts +32 -0
  76. package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
  77. package/dist/http-shapes-BnBkJcid.d.ts +32 -0
  78. package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
  79. package/dist/{index-3mw5gaCw.d.mts → index-BSTtFcQ6.d.mts} +142 -13
  80. package/dist/index-BSTtFcQ6.d.mts.map +1 -0
  81. package/dist/{index-DhIoploR.d.ts → index-CFDGkI8n.d.ts} +142 -13
  82. package/dist/index-CFDGkI8n.d.ts.map +1 -0
  83. package/dist/index.d.mts +114 -217
  84. package/dist/index.d.mts.map +1 -1
  85. package/dist/index.d.ts +113 -216
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +182 -279
  88. package/dist/index.js.map +1 -1
  89. package/dist/index.mjs +160 -256
  90. package/dist/index.mjs.map +1 -1
  91. package/dist/internal-log-Bg4V1cPg.mjs +170 -0
  92. package/dist/internal-log-Bg4V1cPg.mjs.map +1 -0
  93. package/dist/internal-log-By4Govmu.js +223 -0
  94. package/dist/internal-log-By4Govmu.js.map +1 -0
  95. package/dist/{logitron-logger-UVeN-mQm.d.ts → logitron-logger-D22Yb61K.d.mts} +121 -100
  96. package/dist/logitron-logger-D22Yb61K.d.mts.map +1 -0
  97. package/dist/{logitron-logger-BFDSO8Io.d.mts → logitron-logger-D_MYYrQt.d.ts} +121 -100
  98. package/dist/logitron-logger-D_MYYrQt.d.ts.map +1 -0
  99. package/dist/middleware.d.mts +13 -28
  100. package/dist/middleware.d.mts.map +1 -1
  101. package/dist/middleware.d.ts +13 -28
  102. package/dist/middleware.d.ts.map +1 -1
  103. package/dist/middleware.js +20 -81
  104. package/dist/middleware.js.map +1 -1
  105. package/dist/middleware.mjs +17 -79
  106. package/dist/middleware.mjs.map +1 -1
  107. package/dist/nest.d.mts +37 -48
  108. package/dist/nest.d.mts.map +1 -1
  109. package/dist/nest.d.ts +37 -48
  110. package/dist/nest.d.ts.map +1 -1
  111. package/dist/nest.js +124 -135
  112. package/dist/nest.js.map +1 -1
  113. package/dist/nest.mjs +69 -78
  114. package/dist/nest.mjs.map +1 -1
  115. package/dist/{transport.manager-BiuCAJd2.mjs → otel-Dt5riXuE.mjs} +275 -117
  116. package/dist/otel-Dt5riXuE.mjs.map +1 -0
  117. package/dist/{transport.manager-CXbKKdVE.js → otel-DyeH6DVR.js} +373 -178
  118. package/dist/otel-DyeH6DVR.js.map +1 -0
  119. package/dist/own-property-BWkibepN.js +40 -0
  120. package/dist/own-property-BWkibepN.js.map +1 -0
  121. package/dist/own-property-CjFw9qwZ.mjs +29 -0
  122. package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
  123. package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-BgNykH9M.mjs} +40 -9
  124. package/dist/request-trace-BgNykH9M.mjs.map +1 -0
  125. package/dist/{trace.utils-DpBOLDtq.js → request-trace-ByujsUZk.js} +117 -77
  126. package/dist/request-trace-ByujsUZk.js.map +1 -0
  127. package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
  128. package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-B5p5ktFe.mjs} +39 -15
  129. package/dist/safe-stringify-B5p5ktFe.mjs.map +1 -0
  130. package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-J3sh-7YM.js} +59 -36
  131. package/dist/safe-stringify-J3sh-7YM.js.map +1 -0
  132. package/dist/{search-C4V0OMEn.js → search-CRjhHxe9.js} +319 -92
  133. package/dist/search-CRjhHxe9.js.map +1 -0
  134. package/dist/{search-CNh9uVwR.d.ts → search-DA3ft3X5.d.mts} +5 -22
  135. package/dist/search-DA3ft3X5.d.mts.map +1 -0
  136. package/dist/{search-BFbu_oVn.mjs → search-DAXKE-P9.mjs} +289 -62
  137. package/dist/search-DAXKE-P9.mjs.map +1 -0
  138. package/dist/{search-DXANsQ2n.d.mts → search-DEl3Pe47.d.ts} +5 -22
  139. package/dist/search-DEl3Pe47.d.ts.map +1 -0
  140. package/dist/search.d.mts +2 -4
  141. package/dist/search.d.ts +2 -4
  142. package/dist/search.js +3 -4
  143. package/dist/search.mjs +1 -4
  144. package/dist/secret-config-CmK2wVkr.js +272 -0
  145. package/dist/secret-config-CmK2wVkr.js.map +1 -0
  146. package/dist/secret-config-Dhb6pqTU.mjs +210 -0
  147. package/dist/secret-config-Dhb6pqTU.mjs.map +1 -0
  148. package/dist/{slack.transport-CXjQYOes.d.ts → slack.transport-BDyENuR0.d.mts} +56 -9
  149. package/dist/slack.transport-BDyENuR0.d.mts.map +1 -0
  150. package/dist/{slack.transport-Bzw7sucI.mjs → slack.transport-BTEwsREY.mjs} +263 -31
  151. package/dist/slack.transport-BTEwsREY.mjs.map +1 -0
  152. package/dist/{slack.transport-BZzoXDPn.d.mts → slack.transport-C6E0l4kw.d.ts} +56 -9
  153. package/dist/slack.transport-C6E0l4kw.d.ts.map +1 -0
  154. package/dist/{slack.transport-BfJRouB2.js → slack.transport-UbYvOdKx.js} +286 -42
  155. package/dist/slack.transport-UbYvOdKx.js.map +1 -0
  156. package/dist/testing.d.mts +13 -11
  157. package/dist/testing.d.mts.map +1 -1
  158. package/dist/testing.d.ts +13 -11
  159. package/dist/testing.d.ts.map +1 -1
  160. package/dist/testing.js +41 -7
  161. package/dist/testing.js.map +1 -1
  162. package/dist/testing.mjs +40 -6
  163. package/dist/testing.mjs.map +1 -1
  164. package/dist/{transport.types-CGoHpWQR.d.ts → transport.types-CzJq4IrF.d.mts} +14 -5
  165. package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
  166. package/dist/{transport.types-BMnurPcc.d.mts → transport.types-CzJq4IrF.d.ts} +14 -5
  167. package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
  168. package/dist/transports.d.mts +39 -41
  169. package/dist/transports.d.mts.map +1 -1
  170. package/dist/transports.d.ts +39 -41
  171. package/dist/transports.d.ts.map +1 -1
  172. package/dist/transports.js +19 -22
  173. package/dist/transports.mjs +7 -13
  174. package/dist/worker-entry.js +438 -107
  175. package/dist/worker.d.mts +1 -2
  176. package/dist/worker.d.ts +1 -2
  177. package/dist/worker.js +3 -4
  178. package/dist/worker.mjs +1 -4
  179. package/dist/{worker.transport-JvGPog3C.d.mts → worker.transport-B9mCQSM1.d.ts} +7 -6
  180. package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
  181. package/dist/{worker.transport-CdzSZJmw.d.ts → worker.transport-Bl8lFRck.d.mts} +7 -6
  182. package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
  183. package/dist/{worker.transport-lPxO2MVL.mjs → worker.transport-BmmOKb1-.mjs} +43 -10
  184. package/dist/worker.transport-BmmOKb1-.mjs.map +1 -0
  185. package/dist/{worker.transport-BdPxu3PN.js → worker.transport-DxxbqQCG.js} +48 -15
  186. package/dist/worker.transport-DxxbqQCG.js.map +1 -0
  187. package/package.json +51 -75
  188. package/dist/async-context-BzJrbfQs.mjs +0 -72
  189. package/dist/async-context-BzJrbfQs.mjs.map +0 -1
  190. package/dist/async-context-DyQQYq3I.js +0 -92
  191. package/dist/async-context-DyQQYq3I.js.map +0 -1
  192. package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +0 -1
  193. package/dist/azure-monitor.transport-Cn_3Usvu.d.ts.map +0 -1
  194. package/dist/azure-monitor.transport-CrvfHd9C.js.map +0 -1
  195. package/dist/azure-monitor.transport-D7Da4RAb.d.mts.map +0 -1
  196. package/dist/batch-buffer-BY-mRWIK.js.map +0 -1
  197. package/dist/batch-buffer-PGvSgbmd.mjs.map +0 -1
  198. package/dist/builder-0gEzRopq.mjs.map +0 -1
  199. package/dist/builder-D44QktIo.js.map +0 -1
  200. package/dist/chunk-DLSkYcPk.mjs +0 -7
  201. package/dist/chunk-nOFOJqeH.js +0 -30
  202. package/dist/cloudwatch.transport-BO1ahxw-.js.map +0 -1
  203. package/dist/cloudwatch.transport-DZ6ies7g.mjs.map +0 -1
  204. package/dist/cloudwatch.transport-DsEq633o.d.ts.map +0 -1
  205. package/dist/cloudwatch.transport-UlyZFWMn.d.mts.map +0 -1
  206. package/dist/entry-fields-BJkuPnIg.mjs.map +0 -1
  207. package/dist/entry-fields-BvOLFlJ4.js.map +0 -1
  208. package/dist/gcp.transport-B7oc97sG.d.ts.map +0 -1
  209. package/dist/gcp.transport-CHV8MGgz.js.map +0 -1
  210. package/dist/gcp.transport-DBX5TPIy.mjs.map +0 -1
  211. package/dist/gcp.transport-GrJurKo8.d.mts.map +0 -1
  212. package/dist/index-3mw5gaCw.d.mts.map +0 -1
  213. package/dist/index-DhIoploR.d.ts.map +0 -1
  214. package/dist/internal-log-BUJYMZbE.js +0 -70
  215. package/dist/internal-log-BUJYMZbE.js.map +0 -1
  216. package/dist/internal-log-Cm8SOWSV.mjs +0 -52
  217. package/dist/internal-log-Cm8SOWSV.mjs.map +0 -1
  218. package/dist/logitron-logger-BFDSO8Io.d.mts.map +0 -1
  219. package/dist/logitron-logger-UVeN-mQm.d.ts.map +0 -1
  220. package/dist/safe-stringify-DJ66tW5I.mjs.map +0 -1
  221. package/dist/safe-stringify-DWo3aZp_.js.map +0 -1
  222. package/dist/search-BFbu_oVn.mjs.map +0 -1
  223. package/dist/search-C4V0OMEn.js.map +0 -1
  224. package/dist/search-CNh9uVwR.d.ts.map +0 -1
  225. package/dist/search-DXANsQ2n.d.mts.map +0 -1
  226. package/dist/slack.transport-BZzoXDPn.d.mts.map +0 -1
  227. package/dist/slack.transport-BfJRouB2.js.map +0 -1
  228. package/dist/slack.transport-Bzw7sucI.mjs.map +0 -1
  229. package/dist/slack.transport-CXjQYOes.d.ts.map +0 -1
  230. package/dist/trace.utils-CvXgaiQT.mjs.map +0 -1
  231. package/dist/trace.utils-DpBOLDtq.js.map +0 -1
  232. package/dist/transport.manager-BiuCAJd2.mjs.map +0 -1
  233. package/dist/transport.manager-CXbKKdVE.js.map +0 -1
  234. package/dist/transport.types-BMnurPcc.d.mts.map +0 -1
  235. package/dist/transport.types-CGoHpWQR.d.ts.map +0 -1
  236. package/dist/worker.transport-BdPxu3PN.js.map +0 -1
  237. package/dist/worker.transport-CdzSZJmw.d.ts.map +0 -1
  238. package/dist/worker.transport-JvGPog3C.d.mts.map +0 -1
  239. package/dist/worker.transport-lPxO2MVL.mjs.map +0 -1
package/dist/browser.js CHANGED
@@ -1,5 +1,297 @@
1
-
2
- //#region src/utils/safe-stringify.ts
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ // src/utils/own-property.ts
3
+ /**
4
+ * Copy `value` onto `target[key]` as an own, enumerable data property.
5
+ *
6
+ * Normal keys use a plain assignment, which is the fast path. `__proto__` goes
7
+ * through `Object.defineProperty` so that a key taken from logged or parsed data
8
+ * becomes an own property instead of replacing the object's prototype.
9
+ */
10
+ function assignOwn(target, key, value) {
11
+ if (key === "__proto__") Object.defineProperty(target, key, {
12
+ value,
13
+ enumerable: true,
14
+ writable: true,
15
+ configurable: true
16
+ });
17
+ else target[key] = value;
18
+ }
19
+ // src/utils/sensitive-names.ts
20
+ /**
21
+ * The one list of sensitive names. Log redaction (redact.utils), the HTTP logger
22
+ * middleware and transport secret handling (transports/secret-config) all read it,
23
+ * so the lists cannot drift. No imports: safe from any module, including browser code.
24
+ */
25
+ /** Field names redacted by name, wherever they appear in logged data. */
26
+ const SENSITIVE_KEY_NAMES = [
27
+ "password",
28
+ "passwd",
29
+ "secret",
30
+ "token",
31
+ "apiKey",
32
+ "api_key",
33
+ "accessToken",
34
+ "access_token",
35
+ "refreshToken",
36
+ "refresh_token",
37
+ "authorization",
38
+ "credentials",
39
+ "privateKey",
40
+ "private_key",
41
+ "clientSecret",
42
+ "client_secret",
43
+ "cookie",
44
+ "set-cookie",
45
+ "x-api-key",
46
+ "session",
47
+ "proxy-authorization",
48
+ "x-auth-token",
49
+ "x-access-token",
50
+ "aws_secret_access_key",
51
+ "awsSecretAccessKey",
52
+ "secretAccessKey"
53
+ ];
54
+ /**
55
+ * Extra names that only mean "secret" inside transport configuration, where
56
+ * short words like `key` or `signature` are credentials, not log fields.
57
+ */
58
+ const TRANSPORT_CONFIG_SECRET_NAMES = [
59
+ "writeKey",
60
+ "apiSecret",
61
+ "connectionString",
62
+ "sessionToken",
63
+ "passphrase",
64
+ "signature",
65
+ "pwd",
66
+ "pfx",
67
+ "cert",
68
+ "key",
69
+ "auth"
70
+ ];
71
+ /** Query-string parameters whose values are never logged. */
72
+ const DEFAULT_REDACT_QUERY_PARAMS = [
73
+ "token",
74
+ "access_token",
75
+ "refresh_token",
76
+ "code",
77
+ "password",
78
+ "secret",
79
+ "api_key",
80
+ "apikey",
81
+ "key",
82
+ "signature",
83
+ "sig",
84
+ "auth"
85
+ ];
86
+ // src/transports/secret-config.ts
87
+ /**
88
+ * Keeps credentials out of serialized transport output and error text.
89
+ *
90
+ * `protectSecrets()` replaces each listed field with a non-enumerable accessor backed
91
+ * by a WeakMap, whether or not the field is assigned yet, so later assignments (a
92
+ * connection opened on first write, a refreshed token) stay hidden too. It also
93
+ * installs `toJSON()` and a Node inspect hook returning a redacted view: scalar
94
+ * fields stay for debugging, secret-looking keys become '[REDACTED]', URLs lose
95
+ * userinfo, query and fragment. No Node imports, so browser bundles can use it.
96
+ */
97
+ const REDACTED = "[REDACTED]";
98
+ const INSPECT_CUSTOM = Symbol.for("nodejs.util.inspect.custom");
99
+ const MAX_DEPTH = 4;
100
+ const SCHEME_PREFIX = /^[a-z][a-z0-9+.-]*:\/\//i;
101
+ function normalizeName(name) {
102
+ return name.toLowerCase().replaceAll("-", "").replaceAll("_", "");
103
+ }
104
+ const SECRET_NAMES = [...SENSITIVE_KEY_NAMES, ...TRANSPORT_CONFIG_SECRET_NAMES].map(normalizeName);
105
+ new Set(DEFAULT_REDACT_QUERY_PARAMS.map(normalizeName));
106
+ /** Exact match for short names (`key`, `pfx`), suffix match for longer ones (`azureClientSecret`). */
107
+ function isSecretKey(key) {
108
+ const name = normalizeName(key);
109
+ return SECRET_NAMES.some((n) => name === n || n.length >= 5 && name.endsWith(n));
110
+ }
111
+ function isUrlKey(key) {
112
+ return /url|uri|endpoint|href/i.test(key);
113
+ }
114
+ function isPlainObject(value) {
115
+ const proto = Object.getPrototypeOf(value);
116
+ return proto === Object.prototype || proto === null;
117
+ }
118
+ /** Absolute URL: `scheme://host` only. Relative or unparseable: path kept, query and fragment cut. */
119
+ function redactUrl(raw) {
120
+ if (typeof raw !== "string") return `${raw.protocol}//${raw.host}`;
121
+ if (SCHEME_PREFIX.test(raw)) try {
122
+ const url = new URL(raw);
123
+ return `${url.protocol}//${url.host}`;
124
+ } catch {
125
+ return REDACTED;
126
+ }
127
+ return raw.split(/[?#]/, 1)[0] ?? "";
128
+ }
129
+ function redactHeaders(headers) {
130
+ if (!headers || typeof headers !== "object") return headers;
131
+ return Object.fromEntries(Object.keys(headers).map((name) => [name, REDACTED]));
132
+ }
133
+ /** Redacted deep copy of a config-like value. Never throws, never returns a secret. */
134
+ function redactConfig(value, depth = 0, key = "") {
135
+ var _value$constructor;
136
+ if (value === null || value === void 0) return value;
137
+ if (typeof value === "string") return SCHEME_PREFIX.test(value) || isUrlKey(key) ? redactUrl(value) : value;
138
+ if (typeof value === "number" || typeof value === "boolean") return value;
139
+ if (typeof value === "function") return "[Function]";
140
+ if (typeof value !== "object") return "[Unserializable]";
141
+ if (typeof URL !== "undefined" && value instanceof URL) return redactUrl(value);
142
+ if (Array.isArray(value)) return depth >= MAX_DEPTH ? "[Array]" : value.map((v) => redactConfig(v, depth + 1, key));
143
+ if (!isPlainObject(value) || depth >= MAX_DEPTH) return `[${((_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name) ?? "Object"}]`;
144
+ const out = {};
145
+ for (const [name, inner] of Object.entries(value)) if (isSecretKey(name)) assignOwn(out, name, inner === void 0 ? void 0 : REDACTED);
146
+ else if (name.toLowerCase() === "headers") assignOwn(out, name, redactHeaders(inner));
147
+ else assignOwn(out, name, redactConfig(inner, depth + 1, name));
148
+ return out;
149
+ }
150
+ const hiddenKeys = /* @__PURE__ */ new WeakMap();
151
+ const hiddenValues = /* @__PURE__ */ new WeakMap();
152
+ function viewOf(target) {
153
+ var _target$constructor;
154
+ const hidden = hiddenKeys.get(target) ?? /* @__PURE__ */ new Set();
155
+ const values = hiddenValues.get(target);
156
+ const view = { class: (_target$constructor = target.constructor) === null || _target$constructor === void 0 ? void 0 : _target$constructor.name };
157
+ for (const key of /* @__PURE__ */ new Set([...Object.keys(target), ...hidden])) {
158
+ const inner = hidden.has(key) ? values === null || values === void 0 ? void 0 : values.get(key) : target[key];
159
+ if (isSecretKey(key)) view[key] = inner === void 0 ? void 0 : REDACTED;
160
+ else if (key.toLowerCase() === "headers") view[key] = redactHeaders(inner);
161
+ else if (inner !== null && typeof inner === "object" && !hidden.has(key) && !(inner instanceof URL)) view[key] = "[Object]";
162
+ else if (hidden.has(key) && typeof inner === "string" && !isUrlKey(key)) view[key] = REDACTED;
163
+ else view[key] = redactConfig(inner, 0, key);
164
+ }
165
+ return view;
166
+ }
167
+ /**
168
+ * Hides `keys` on `target` (assigned or not yet) and gives it a redacted `toJSON()` /
169
+ * inspect view. Fields stay readable and writable. Safe to call more than once.
170
+ * Throws when the target cannot carry the protection (frozen or sealed), instead of
171
+ * silently leaving the secret enumerable.
172
+ */
173
+ function protectSecrets(target, keys) {
174
+ if (!Object.isExtensible(target)) {
175
+ var _target$constructor2;
176
+ throw new TypeError(`protectSecrets: ${((_target$constructor2 = target.constructor) === null || _target$constructor2 === void 0 ? void 0 : _target$constructor2.name) ?? "object"} is not extensible`);
177
+ }
178
+ let hidden = hiddenKeys.get(target);
179
+ let values = hiddenValues.get(target);
180
+ if (!hidden || !values) {
181
+ hidden = /* @__PURE__ */ new Set();
182
+ values = /* @__PURE__ */ new Map();
183
+ hiddenKeys.set(target, hidden);
184
+ hiddenValues.set(target, values);
185
+ const view = () => viewOf(target);
186
+ Object.defineProperty(target, "toJSON", {
187
+ value: view,
188
+ enumerable: false,
189
+ configurable: true
190
+ });
191
+ Object.defineProperty(target, INSPECT_CUSTOM, {
192
+ value: view,
193
+ enumerable: false,
194
+ configurable: true
195
+ });
196
+ }
197
+ const store = values;
198
+ for (const key of keys) {
199
+ if (hidden.has(key)) continue;
200
+ const desc = Object.getOwnPropertyDescriptor(target, key);
201
+ if (desc && !desc.configurable) throw new TypeError(`protectSecrets: "${key}" is not configurable`);
202
+ if (desc && "value" in desc) store.set(key, desc.value);
203
+ hidden.add(key);
204
+ Object.defineProperty(target, key, {
205
+ enumerable: false,
206
+ configurable: true,
207
+ get: () => store.get(key),
208
+ set: (next) => void store.set(key, next)
209
+ });
210
+ }
211
+ }
212
+ // src/utils/internal-log.ts
213
+ /**
214
+ * Internal logging helpers for use within the logixia library itself.
215
+ *
216
+ * These functions write directly to stderr/stdout without going through
217
+ * LogixiaLogger — this avoids circular dependencies and ensures internal
218
+ * diagnostics still surface even when the logger is misconfigured.
219
+ *
220
+ * Library code must NEVER call console.log/warn/error directly. Use these
221
+ * helpers instead so that internal output can be silenced in tests by setting
222
+ * the LOGIXIA_SILENT_INTERNAL=1 environment variable.
223
+ */
224
+ /**
225
+ * Read the silence flag on each call rather than caching it at import time, so
226
+ * setting LOGIXIA_SILENT_INTERNAL=1 AFTER the module is first imported (e.g. in
227
+ * a test setup file) still takes effect — the documented test-silencing
228
+ * behavior was previously unreliable because the value was frozen at load.
229
+ */
230
+ function isSilent() {
231
+ var _process$env;
232
+ if (typeof process !== "undefined" && ((_process$env = process.env) === null || _process$env === void 0 ? void 0 : _process$env.LOGIXIA_SILENT_INTERNAL) === "1") return true;
233
+ const flag = globalThis["LOGIXIA_SILENT_INTERNAL"];
234
+ return flag === "1" || flag === 1 || flag === true;
235
+ }
236
+ /**
237
+ * Write a line to stderr, falling back to the matching console method where
238
+ * `process` is unavailable (browsers, Cloudflare Workers, Deno without Node compat).
239
+ */
240
+ function writeLine(method, line) {
241
+ var _process$stderr;
242
+ if (typeof process !== "undefined" && typeof ((_process$stderr = process.stderr) === null || _process$stderr === void 0 ? void 0 : _process$stderr.write) === "function") process.stderr.write(`${line}\n`);
243
+ else if (typeof console !== "undefined" && typeof console[method] === "function") console[method](line);
244
+ }
245
+ /**
246
+ * Emit an internal debug/info message to stderr.
247
+ * Use for field-enable/disable notifications that a developer might want to see
248
+ * during development but should not appear in production log streams.
249
+ */
250
+ function internalLog(message) {
251
+ if (!isSilent()) writeLine("log", `[logixia] ${message}`);
252
+ }
253
+ /**
254
+ * Emit an internal warning to stderr.
255
+ * Use when something is misconfigured but logixia can continue operating.
256
+ */
257
+ function internalWarn(message) {
258
+ if (!isSilent()) writeLine("warn", `[logixia:warn] ${message}`);
259
+ }
260
+ /**
261
+ * Emit an internal error to stderr.
262
+ * Use when a transport write fails or a serious internal error occurs.
263
+ */
264
+ function internalError(message, error) {
265
+ if (!isSilent()) {
266
+ let errStr = "";
267
+ if (error instanceof Error) errStr = ` — ${error.message}`;
268
+ else if (error != null) errStr = ` — ${String(error)}`;
269
+ writeLine("error", `[logixia:error] ${message}${errStr}`);
270
+ }
271
+ }
272
+ // src/utils/safe-stringify.ts
273
+ /**
274
+ * logixia — robust JSON serialization for log payloads.
275
+ *
276
+ * Modern Winston/Pino already neutralize circular refs to `[Circular]` (via
277
+ * safe-stable-stringify / fast-safe-stringify), so merely "surviving cycles" is
278
+ * not a differentiator. This goes one notch further:
279
+ *
280
+ * - **BigInt** → serialized (as a string by default; JSON.stringify throws on
281
+ * BigInt, which silently breaks logging of e.g. DB bigint ids).
282
+ * - **Deterministic key order** (optional) so identical objects hash/diff equal.
283
+ * - **True decycle** (optional) — replace repeated references with JSONPath
284
+ * `$ref` pointers that round-trip back to the original object graph, instead
285
+ * of the lossy `[Circular]` tag. Useful when you need to reconstruct shared
286
+ * structure downstream.
287
+ *
288
+ * @example
289
+ * ```ts
290
+ * safeStringify({ id: 10n, self: obj }); // → BigInt + cycle safe
291
+ * safeStringify(graph, { decycle: true }); // → round-trippable $ref pointers
292
+ * const back = retrocycle(JSON.parse(json)); // → reconstruct shared refs
293
+ * ```
294
+ */
3
295
  /** Build a JSONPath like `$["a"][0]["b"]` for a decycle pointer. */
4
296
  function jsonPath(parts) {
5
297
  let path = "$";
@@ -29,10 +321,7 @@ function safeStringify(value, options = {}) {
29
321
  const rec = val;
30
322
  const keys = deterministic ? Object.keys(rec).sort() : Object.keys(rec);
31
323
  const obj = {};
32
- for (const k of keys) {
33
- if (k === "__proto__" || k === "constructor" || k === "prototype") continue;
34
- obj[k] = transform(rec[k]);
35
- }
324
+ for (const k of keys) assignOwn(obj, k, transform(rec[k]));
36
325
  out = obj;
37
326
  }
38
327
  seen.delete(val);
@@ -57,10 +346,7 @@ function decycleValue(value, bigint = "string") {
57
346
  if (Array.isArray(val)) return val.map((item, i) => walk(item, [...path, i]));
58
347
  const rec = val;
59
348
  const obj = {};
60
- for (const k of Object.keys(rec)) {
61
- if (k === "__proto__" || k === "constructor" || k === "prototype") continue;
62
- obj[k] = walk(rec[k], [...path, k]);
63
- }
349
+ for (const k of Object.keys(rec)) assignOwn(obj, k, walk(rec[k], [...path, k]));
64
350
  return obj;
65
351
  };
66
352
  return walk(value, []);
@@ -83,9 +369,9 @@ function stringifyForLog(value) {
83
369
  }
84
370
  }
85
371
  }
86
-
87
- //#endregion
88
- //#region src/utils/otel.ts
372
+ // src/utils/otel.ts
373
+ /** W3C trace-flags bit 0: the span is sampled (`TraceFlags.SAMPLED` in the OTel API). */
374
+ const TRACE_FLAG_SAMPLED = 1;
89
375
  let _otelApi;
90
376
  function tryLoadOtelApi() {
91
377
  if (_otelApi !== void 0) return _otelApi;
@@ -113,7 +399,7 @@ function getActiveOtelContext(opts = {}) {
113
399
  const ctx = api.context.active();
114
400
  const sc = api.trace.getSpanContext(ctx);
115
401
  if (!sc || !api.trace.isSpanContextValid(sc)) return void 0;
116
- const isSampled = (sc.traceFlags & api.trace.TraceFlags.SAMPLED) === api.trace.TraceFlags.SAMPLED;
402
+ const isSampled = (sc.traceFlags & TRACE_FLAG_SAMPLED) === TRACE_FLAG_SAMPLED;
117
403
  if (opts.sampledOnly && !isSampled) return void 0;
118
404
  return {
119
405
  traceId: sc.traceId,
@@ -149,7 +435,6 @@ function getOtelMetaFields(opts = {}) {
149
435
  [traceFlagsField]: ctx.traceFlags
150
436
  };
151
437
  }
152
- let _bridgeOptions = null;
153
438
  /**
154
439
  * Initialise the global OTel bridge.
155
440
  *
@@ -163,49 +448,60 @@ let _bridgeOptions = null;
163
448
  * initOtelBridge();
164
449
  * ```
165
450
  */
166
- function initOtelBridge(opts = {}) {
167
- _bridgeOptions = opts;
168
- }
451
+ function initOtelBridge(opts = {}) {}
169
452
  /**
170
453
  * Disable the OTel bridge (useful for tests).
171
454
  */
172
- function disableOtelBridge() {
173
- _bridgeOptions = null;
174
- }
175
-
176
- //#endregion
177
- //#region src/utils/internal-log.ts
455
+ function disableOtelBridge() {}
456
+ // src/utils/typed-logger.ts
178
457
  /**
179
- * Internal logging helpers for use within the logixia library itself.
458
+ * logixia — TypeScript typed log fields
180
459
  *
181
- * These functions write directly to stderr/stdout without going through
182
- * LogixiaLogger — this avoids circular dependencies and ensures internal
183
- * diagnostics still surface even when the logger is misconfigured.
460
+ * Solves the type-safety gap: standard `Record<string, unknown>` metadata gives
461
+ * zero IDE autocomplete and lets typos slip silently into production logs.
184
462
  *
185
- * Library code must NEVER call console.log/warn/error directly. Use these
186
- * helpers instead so that internal output can be silenced in tests by setting
187
- * the LOGIXIA_SILENT_INTERNAL=1 environment variable.
188
- */
189
- /**
190
- * Read the silence flag on each call rather than caching it at import time, so
191
- * setting LOGIXIA_SILENT_INTERNAL=1 AFTER the module is first imported (e.g. in
192
- * a test setup file) still takes effect — the documented test-silencing
193
- * behavior was previously unreliable because the value was frozen at load.
463
+ * Two complementary utilities:
464
+ *
465
+ * 1. `createTypedLogger<TFields>()` — wraps any IBaseLogger so that the second
466
+ * argument of every log method is constrained to `TFields` (a typed object).
467
+ * Compile-time safety, zero runtime overhead.
468
+ *
469
+ * 2. `defineLogSchema<TFields>(schema)` — declares expected fields with optional
470
+ * validators. In development (NODE_ENV !== 'production') every log call is
471
+ * validated against the schema and a warning is emitted for missing required
472
+ * fields or type mismatches.
473
+ *
474
+ * @example
475
+ * ```ts
476
+ * import { createTypedLogger, defineLogSchema } from 'logixia';
477
+ *
478
+ * interface OrderFields {
479
+ * orderId: string;
480
+ * userId: string;
481
+ * amount?: number;
482
+ * currency?: string;
483
+ * }
484
+ *
485
+ * const schema = defineLogSchema<OrderFields>({
486
+ * orderId: { type: 'string', required: true },
487
+ * userId: { type: 'string', required: true },
488
+ * amount: { type: 'number' },
489
+ * currency: { type: 'string' },
490
+ * });
491
+ *
492
+ * const orderLogger = createTypedLogger<OrderFields>(baseLogger, schema);
493
+ * await orderLogger.info('Order created', { orderId: 'ord_123', userId: 'usr_456', amount: 99.99 });
494
+ * // ^^^^ fully typed autocomplete ^^^^
495
+ * ```
194
496
  */
195
- function isSilent() {
196
- return process.env.LOGIXIA_SILENT_INTERNAL === "1";
497
+ function isProduction() {
498
+ try {
499
+ return process.env.NODE_ENV === "production";
500
+ } catch {
501
+ return false;
502
+ }
197
503
  }
198
504
  /**
199
- * Emit an internal warning to stderr.
200
- * Use when something is misconfigured but logixia can continue operating.
201
- */
202
- function internalWarn(message) {
203
- if (!isSilent()) process.stderr.write(`[logixia:warn] ${message}\n`);
204
- }
205
-
206
- //#endregion
207
- //#region src/utils/typed-logger.ts
208
- /**
209
505
  * Define a typed schema for a category of log entries.
210
506
  *
211
507
  * Call this once at module initialisation and pass it to `createTypedLogger`.
@@ -215,7 +511,7 @@ function defineLogSchema(fields) {
215
511
  return {
216
512
  fields,
217
513
  validate(payload) {
218
- if (process.env["NODE_ENV"] === "production") return [];
514
+ if (isProduction()) return [];
219
515
  const warnings = [];
220
516
  for (const [key, def] of Object.entries(fields)) {
221
517
  const value = payload[key];
@@ -267,9 +563,42 @@ function createTypedLogger(logger, schema) {
267
563
  trace: (m, d) => withValidation("trace", (logger.trace ?? logger.debug).bind(logger), m, d)
268
564
  };
269
565
  }
270
-
271
- //#endregion
272
- //#region src/browser.ts
566
+ // src/browser.ts
567
+ /**
568
+ * logixia — Browser / Edge Runtime entry point
569
+ *
570
+ * This module is the browser-safe subset of logixia. It contains **no**
571
+ * references to Node.js built-ins (`node:fs`, `node:http`, `node:worker_threads`,
572
+ * `node:crypto`, `node:async_hooks`) so it can be bundled for:
573
+ *
574
+ * - Browser (Webpack / Vite / esbuild)
575
+ * - Cloudflare Workers / Vercel Edge Functions
576
+ * - Deno (via ESM import)
577
+ * - Bun (core subset, no file/DB transports)
578
+ *
579
+ * Excluded from this entry: FileTransport, DatabaseTransport, WorkerTransport,
580
+ * CloudWatchTransport, GCPTransport, AzureMonitorTransport, and anything that
581
+ * requires `AsyncLocalStorage`.
582
+ *
583
+ * @example Basic browser usage
584
+ * ```ts
585
+ * import { createBrowserLogger, BrowserConsoleTransport } from 'logixia/browser';
586
+ *
587
+ * const logger = createBrowserLogger({ appName: 'my-app' });
588
+ * logger.info('Page loaded', { url: location.href });
589
+ * ```
590
+ *
591
+ * @example Custom transport in browser
592
+ * ```ts
593
+ * import { createBrowserLogger, BrowserConsoleTransport } from 'logixia/browser';
594
+ *
595
+ * const logger = createBrowserLogger({
596
+ * appName: 'my-app',
597
+ * json: false, // pretty-print in devtools
598
+ * level: 'debug',
599
+ * });
600
+ * ```
601
+ */
273
602
  const LEVEL_ORDER = {
274
603
  verbose: 0,
275
604
  debug: 1,
@@ -364,7 +693,7 @@ function validateRemoteUrl(raw) {
364
693
  try {
365
694
  parsed = new URL(raw);
366
695
  } catch {
367
- throw new TypeError(`BrowserRemoteTransport: invalid url "${raw}"`);
696
+ throw new TypeError(`BrowserRemoteTransport: invalid url [redacted]`);
368
697
  }
369
698
  if (parsed.protocol !== "http:" && parsed.protocol !== "https:") throw new TypeError(`BrowserRemoteTransport: url scheme "${parsed.protocol}" is not allowed; use http: or https:`);
370
699
  return raw;
@@ -377,8 +706,33 @@ function validateRemoteUrl(raw) {
377
706
  function byteLength(s) {
378
707
  return new TextEncoder().encode(s).length;
379
708
  }
709
+ const FAILURE_REPORT_INTERVAL_MS = 6e4;
710
+ /**
711
+ * Error name/code, HTTP status and host only. The error message is never
712
+ * included: runtimes embed request URLs (absolute or relative) and header
713
+ * values in it.
714
+ */
715
+ function describeFailure(error, url) {
716
+ let host = "relative endpoint";
717
+ try {
718
+ host = `host ${new URL(url).host}`;
719
+ } catch {}
720
+ const e = error;
721
+ const parts = [];
722
+ if (e && typeof e.name === "string") parts.push(e.name);
723
+ if (e && typeof e.code === "string") parts.push(e.code);
724
+ if (e && typeof e.status === "number") parts.push(`HTTP ${e.status}`);
725
+ parts.push(host);
726
+ return parts.join(" ");
727
+ }
728
+ /** True only in a real browser page, where console noise reaches end users. */
729
+ function isBrowserPage() {
730
+ const g = globalThis;
731
+ return typeof g["window"] !== "undefined" && typeof g["document"] !== "undefined";
732
+ }
380
733
  function isKeepaliveError(error) {
381
- return error instanceof Error && /keepalive/i.test(error.message);
734
+ const message = error === null || error === void 0 ? void 0 : error.message;
735
+ return typeof message === "string" && /keepalive/i.test(message);
382
736
  }
383
737
  /**
384
738
  * Browser transport that batches log entries and sends them to a remote
@@ -405,12 +759,17 @@ var BrowserRemoteTransport = class {
405
759
  this.failedFlushCount = 0;
406
760
  this.timer = null;
407
761
  this.droppedEntries = 0;
762
+ this.reporting = false;
763
+ this.failureReported = false;
764
+ this.silent = options.silent ?? isBrowserPage();
765
+ this.onError = options.onError;
408
766
  this.url = validateRemoteUrl(options.url);
409
767
  this.headers = options.headers ?? {};
410
768
  this.batchSize = options.batchSize ?? 100;
411
769
  this.flushIntervalMs = options.flushIntervalMs ?? 5e3;
412
770
  this.maxBufferSize = options.maxBufferSize ?? 1e3;
413
771
  if (options.level !== void 0) this.level = options.level;
772
+ protectSecrets(this, ["headers", "url"]);
414
773
  this.scheduleFlush();
415
774
  }
416
775
  /**
@@ -421,15 +780,23 @@ var BrowserRemoteTransport = class {
421
780
  get dropped() {
422
781
  return this.droppedEntries;
423
782
  }
424
- /** Number of flush attempts that failed with a network error and were re-buffered. */
783
+ /** Number of flush attempts that failed (network error or non-OK HTTP status). */
425
784
  get failedFlushes() {
426
785
  return this.failedFlushCount;
427
786
  }
428
- /** The most recent network error from a failed flush, if any. */
787
+ /**
788
+ * The most recent failure from a flush, if any: the raw fetch error (which on
789
+ * some runtimes embeds the request URL, so do not log it blindly) or an
790
+ * `Error` carrying only the HTTP status.
791
+ */
429
792
  get lastError() {
430
793
  return this.lastFlushError;
431
794
  }
432
795
  write(entry) {
796
+ if (this.reporting) {
797
+ this.droppedEntries += 1;
798
+ return;
799
+ }
433
800
  this.batch.push(entry);
434
801
  while (this.batch.length > this.maxBufferSize) {
435
802
  this.batch.shift();
@@ -460,10 +827,15 @@ var BrowserRemoteTransport = class {
460
827
  }
461
828
  }
462
829
  if (!res.ok) {
463
- if (res.status >= 500 || res.status === 429) this.batch.unshift(...entries);
464
- else this.droppedEntries += entries.length;
830
+ const failure = Object.assign(/* @__PURE__ */ new Error(`HTTP ${res.status}`), { status: res.status });
831
+ if (res.status >= 500 || res.status === 429) this.recordFailure(entries, failure);
832
+ else {
833
+ this.droppedEntries += entries.length;
834
+ this.recordFailure([], failure);
835
+ }
465
836
  return;
466
837
  }
838
+ this.reportRecovery();
467
839
  }
468
840
  }
469
841
  send(body, keepalive) {
@@ -481,6 +853,34 @@ var BrowserRemoteTransport = class {
481
853
  this.batch.unshift(...entries);
482
854
  this.failedFlushCount += 1;
483
855
  this.lastFlushError = error;
856
+ const now = Date.now();
857
+ const shouldReport = this.lastReportAt === void 0 || now - this.lastReportAt >= FAILURE_REPORT_INTERVAL_MS;
858
+ this.guarded(() => {
859
+ if (this.onError) try {
860
+ this.onError(error);
861
+ } catch {}
862
+ if (shouldReport && !this.silent) {
863
+ this.lastReportAt = now;
864
+ this.failureReported = true;
865
+ internalError(`BrowserRemoteTransport flush failed (${describeFailure(error, this.url)})`);
866
+ }
867
+ });
868
+ }
869
+ reportRecovery() {
870
+ if (!this.failureReported) return;
871
+ this.failureReported = false;
872
+ const now = Date.now();
873
+ if (this.lastRecoveryAt !== void 0 && now - this.lastRecoveryAt < FAILURE_REPORT_INTERVAL_MS) return;
874
+ this.lastRecoveryAt = now;
875
+ this.guarded(() => internalLog("BrowserRemoteTransport delivery recovered"));
876
+ }
877
+ guarded(fn) {
878
+ this.reporting = true;
879
+ try {
880
+ fn();
881
+ } finally {
882
+ this.reporting = false;
883
+ }
484
884
  }
485
885
  scheduleFlush() {
486
886
  if (this.flushIntervalMs <= 0) return;
@@ -517,7 +917,10 @@ var BrowserLogger = class BrowserLogger {
517
917
  context: config.context
518
918
  };
519
919
  if (config.silent) this.transports = [];
520
- else this.transports = [new BrowserConsoleTransport({ json: this.config.json }), ...config.transports ?? []];
920
+ else {
921
+ const builtIn = new BrowserConsoleTransport({ json: this.config.json });
922
+ this.transports = [builtIn, ...config.transports ?? []];
923
+ }
521
924
  }
522
925
  verbose(message, payload) {
523
926
  this.emit("verbose", message, payload);
@@ -605,8 +1008,6 @@ function createBrowserLogger(config) {
605
1008
  * ```
606
1009
  */
607
1010
  const browserLogger = new BrowserLogger({ appName: "App" });
608
-
609
- //#endregion
610
1011
  exports.BrowserConsoleTransport = BrowserConsoleTransport;
611
1012
  exports.BrowserLogger = BrowserLogger;
612
1013
  exports.BrowserRemoteTransport = BrowserRemoteTransport;
@@ -618,4 +1019,5 @@ exports.disableOtelBridge = disableOtelBridge;
618
1019
  exports.getActiveOtelContext = getActiveOtelContext;
619
1020
  exports.getOtelMetaFields = getOtelMetaFields;
620
1021
  exports.initOtelBridge = initOtelBridge;
1022
+
621
1023
  //# sourceMappingURL=browser.js.map