@safaricom-mxl/log 0.0.3 → 0.0.4

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 (153) hide show
  1. package/dist/{_http-DmaJ426Z.mjs → _http-CTtzGDc6.mjs} +3 -7
  2. package/dist/_http-CTtzGDc6.mjs.map +1 -0
  3. package/dist/{_severity-D_IU9-90.mjs → _severity-CLNgC2HU.mjs} +2 -2
  4. package/dist/{_severity-D_IU9-90.mjs.map → _severity-CLNgC2HU.mjs.map} +1 -1
  5. package/dist/adapters/axiom.d.mts +19 -6
  6. package/dist/adapters/axiom.d.mts.map +1 -1
  7. package/dist/adapters/axiom.mjs +28 -5
  8. package/dist/adapters/axiom.mjs.map +1 -1
  9. package/dist/adapters/better-stack.d.mts +2 -4
  10. package/dist/adapters/better-stack.d.mts.map +1 -1
  11. package/dist/adapters/better-stack.mjs +4 -5
  12. package/dist/adapters/better-stack.mjs.map +1 -1
  13. package/dist/adapters/otlp.d.mts +3 -5
  14. package/dist/adapters/otlp.d.mts.map +1 -1
  15. package/dist/adapters/otlp.mjs +6 -7
  16. package/dist/adapters/otlp.mjs.map +1 -1
  17. package/dist/adapters/posthog.d.mts +42 -33
  18. package/dist/adapters/posthog.d.mts.map +1 -1
  19. package/dist/adapters/posthog.mjs +75 -59
  20. package/dist/adapters/posthog.mjs.map +1 -1
  21. package/dist/adapters/sentry.d.mts +1 -3
  22. package/dist/adapters/sentry.d.mts.map +1 -1
  23. package/dist/adapters/sentry.mjs +5 -6
  24. package/dist/adapters/sentry.mjs.map +1 -1
  25. package/dist/browser.d.mts +1 -1
  26. package/dist/browser.mjs +3 -4
  27. package/dist/browser.mjs.map +1 -1
  28. package/dist/dist-Dalk68oO.mjs +51 -0
  29. package/dist/dist-Dalk68oO.mjs.map +1 -0
  30. package/dist/elysia/index.d.mts +58 -0
  31. package/dist/elysia/index.d.mts.map +1 -0
  32. package/dist/elysia/index.mjs +71 -0
  33. package/dist/elysia/index.mjs.map +1 -0
  34. package/dist/enrichers.d.mts +1 -1
  35. package/dist/enrichers.mjs +1 -1
  36. package/dist/enrichers.mjs.map +1 -1
  37. package/dist/error-IMQ3w1i0.d.mts +65 -0
  38. package/dist/error-IMQ3w1i0.d.mts.map +1 -0
  39. package/dist/error.d.mts +2 -65
  40. package/dist/error.mjs +1 -2
  41. package/dist/error.mjs.map +1 -1
  42. package/dist/express/index.d.mts +34 -0
  43. package/dist/express/index.d.mts.map +1 -0
  44. package/dist/express/index.mjs +46 -0
  45. package/dist/express/index.mjs.map +1 -0
  46. package/dist/fastify/index.d.mts +37 -0
  47. package/dist/fastify/index.d.mts.map +1 -0
  48. package/dist/fastify/index.mjs +72 -0
  49. package/dist/fastify/index.mjs.map +1 -0
  50. package/dist/headers-BnDMFr6p.mjs +139 -0
  51. package/dist/headers-BnDMFr6p.mjs.map +1 -0
  52. package/dist/hono/index.d.mts +47 -0
  53. package/dist/hono/index.d.mts.map +1 -0
  54. package/dist/hono/index.mjs +47 -0
  55. package/dist/hono/index.mjs.map +1 -0
  56. package/dist/index.d.mts +6 -6
  57. package/dist/index.mjs +2 -3
  58. package/dist/logger-B6moO_0c.d.mts +59 -0
  59. package/dist/logger-B6moO_0c.d.mts.map +1 -0
  60. package/dist/logger.d.mts +2 -46
  61. package/dist/logger.mjs +31 -17
  62. package/dist/logger.mjs.map +1 -1
  63. package/dist/middleware-CVOU14aj.d.mts +36 -0
  64. package/dist/middleware-CVOU14aj.d.mts.map +1 -0
  65. package/dist/nestjs/index.d.mts +83 -0
  66. package/dist/nestjs/index.d.mts.map +1 -0
  67. package/dist/nestjs/index.mjs +108 -0
  68. package/dist/nestjs/index.mjs.map +1 -0
  69. package/dist/next/client.d.mts +10 -2
  70. package/dist/next/client.d.mts.map +1 -1
  71. package/dist/next/client.mjs +6 -6
  72. package/dist/next/client.mjs.map +1 -1
  73. package/dist/next/index.d.mts +10 -42
  74. package/dist/next/index.d.mts.map +1 -1
  75. package/dist/next/index.mjs +13 -17
  76. package/dist/next/index.mjs.map +1 -1
  77. package/dist/nitro/errorHandler.mjs +2 -3
  78. package/dist/nitro/errorHandler.mjs.map +1 -1
  79. package/dist/nitro/module.d.mts +4 -3
  80. package/dist/nitro/module.d.mts.map +1 -1
  81. package/dist/nitro/module.mjs +3 -3
  82. package/dist/nitro/module.mjs.map +1 -1
  83. package/dist/nitro/plugin.mjs +6 -7
  84. package/dist/nitro/plugin.mjs.map +1 -1
  85. package/dist/nitro/v3/errorHandler.mjs +3 -4
  86. package/dist/nitro/v3/errorHandler.mjs.map +1 -1
  87. package/dist/nitro/v3/index.d.mts +0 -1
  88. package/dist/nitro/v3/index.mjs +1 -2
  89. package/dist/nitro/v3/middleware.d.mts +1 -1
  90. package/dist/nitro/v3/middleware.mjs +2 -3
  91. package/dist/nitro/v3/middleware.mjs.map +1 -1
  92. package/dist/nitro/v3/module.d.mts +3 -2
  93. package/dist/nitro/v3/module.d.mts.map +1 -1
  94. package/dist/nitro/v3/module.mjs +4 -3
  95. package/dist/nitro/v3/module.mjs.map +1 -1
  96. package/dist/nitro/v3/plugin.d.mts +1 -1
  97. package/dist/nitro/v3/plugin.mjs +9 -10
  98. package/dist/nitro/v3/plugin.mjs.map +1 -1
  99. package/dist/nitro/v3/useLogger.d.mts +1 -1
  100. package/dist/nitro/v3/useLogger.mjs +2 -2
  101. package/dist/nitro/v3/useLogger.mjs.map +1 -1
  102. package/dist/{nitro-Dsv6dSzv.mjs → nitro-BsDTWASN.mjs} +3 -3
  103. package/dist/{nitro-Dsv6dSzv.mjs.map → nitro-BsDTWASN.mjs.map} +1 -1
  104. package/dist/{nitro-CrFBjY1Y.d.mts → nitro-iuEZtGVq.d.mts} +2 -2
  105. package/dist/{nitro-CrFBjY1Y.d.mts.map → nitro-iuEZtGVq.d.mts.map} +1 -1
  106. package/dist/nuxt/module.d.mts +44 -17
  107. package/dist/nuxt/module.d.mts.map +1 -1
  108. package/dist/nuxt/module.mjs +6 -8
  109. package/dist/nuxt/module.mjs.map +1 -1
  110. package/dist/parseError-DGjBRrb3.d.mts +7 -0
  111. package/dist/parseError-DGjBRrb3.d.mts.map +1 -0
  112. package/dist/pipeline.mjs +7 -7
  113. package/dist/pipeline.mjs.map +1 -1
  114. package/dist/{routes-BNbrnm14.mjs → routes-DdmLpEnG.mjs} +2 -3
  115. package/dist/{routes-BNbrnm14.mjs.map → routes-DdmLpEnG.mjs.map} +1 -1
  116. package/dist/runtime/client/log.d.mts +2 -1
  117. package/dist/runtime/client/log.d.mts.map +1 -1
  118. package/dist/runtime/client/log.mjs +13 -10
  119. package/dist/runtime/client/log.mjs.map +1 -1
  120. package/dist/runtime/client/plugin.mjs +2 -2
  121. package/dist/runtime/client/plugin.mjs.map +1 -1
  122. package/dist/runtime/server/routes/_mxllog/ingest.post.d.mts +1 -1
  123. package/dist/runtime/server/routes/_mxllog/ingest.post.mjs +1 -2
  124. package/dist/runtime/server/routes/_mxllog/ingest.post.mjs.map +1 -1
  125. package/dist/runtime/server/useLogger.d.mts +2 -39
  126. package/dist/runtime/server/useLogger.mjs +2 -2
  127. package/dist/runtime/server/useLogger.mjs.map +1 -1
  128. package/dist/runtime/utils/parseError.d.mts +3 -7
  129. package/dist/runtime/utils/parseError.mjs +1 -1
  130. package/dist/storage-CZLHKrbu.mjs +44 -0
  131. package/dist/storage-CZLHKrbu.mjs.map +1 -0
  132. package/dist/sveltekit/index.d.mts +128 -0
  133. package/dist/sveltekit/index.d.mts.map +1 -0
  134. package/dist/sveltekit/index.mjs +162 -0
  135. package/dist/sveltekit/index.mjs.map +1 -0
  136. package/dist/types-abpnM9XB.d.mts +496 -0
  137. package/dist/types-abpnM9XB.d.mts.map +1 -0
  138. package/dist/types.d.mts +2 -496
  139. package/dist/types.mjs +1 -1
  140. package/dist/useLogger-DW6-kpBP.d.mts +39 -0
  141. package/dist/useLogger-DW6-kpBP.d.mts.map +1 -0
  142. package/dist/utils.d.mts +1 -1
  143. package/dist/utils.mjs +1 -1
  144. package/dist/workers.d.mts +2 -2
  145. package/dist/workers.mjs +2 -3
  146. package/dist/workers.mjs.map +1 -1
  147. package/package.json +72 -7
  148. package/dist/_http-DmaJ426Z.mjs.map +0 -1
  149. package/dist/error.d.mts.map +0 -1
  150. package/dist/logger.d.mts.map +0 -1
  151. package/dist/runtime/server/useLogger.d.mts.map +0 -1
  152. package/dist/runtime/utils/parseError.d.mts.map +0 -1
  153. package/dist/types.d.mts.map +0 -1
@@ -1,8 +1,6 @@
1
1
  import { createRequire } from "node:module";
2
-
3
2
  //#region \0rolldown/runtime.js
4
3
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
5
-
6
4
  //#endregion
7
5
  //#region src/adapters/_config.ts
8
6
  /**
@@ -32,7 +30,6 @@ function resolveEnv(envKeys) {
32
30
  if (val) return val;
33
31
  }
34
32
  }
35
-
36
33
  //#endregion
37
34
  //#region src/adapters/_drain.ts
38
35
  function defineDrain(options) {
@@ -44,11 +41,10 @@ function defineDrain(options) {
44
41
  try {
45
42
  await options.send(contexts.map((c) => c.event), config);
46
43
  } catch (error) {
47
- console.error(`[mxllog/${options.name}] Failed to send events:`, error);
44
+ console.error(`[@safaricom-mxl/log/${options.name}] Failed to send events:`, error);
48
45
  }
49
46
  };
50
47
  }
51
-
52
48
  //#endregion
53
49
  //#region src/adapters/_http.ts
54
50
  async function httpPost({ url, headers, body, timeout, label }) {
@@ -70,7 +66,7 @@ async function httpPost({ url, headers, body, timeout, label }) {
70
66
  clearTimeout(timeoutId);
71
67
  }
72
68
  }
73
-
74
69
  //#endregion
75
70
  export { defineDrain as n, resolveAdapterConfig as r, httpPost as t };
76
- //# sourceMappingURL=_http-DmaJ426Z.mjs.map
71
+
72
+ //# sourceMappingURL=_http-CTtzGDc6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_http-CTtzGDc6.mjs","names":[],"sources":["../src/adapters/_config.ts","../src/adapters/_drain.ts","../src/adapters/_http.ts"],"sourcesContent":["/**\n * Try to get runtime config from Nitro/Nuxt environment.\n * Returns undefined if not in a Nitro context.\n */\nexport function getRuntimeConfig(): Record<string, any> | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { useRuntimeConfig } = require('nitropack/runtime')\n return useRuntimeConfig()\n } catch {\n return undefined\n }\n}\n\nexport interface ConfigField<T> {\n key: keyof T & string\n env?: string[]\n}\n\nexport function resolveAdapterConfig<T>(\n namespace: string,\n fields: ConfigField<T>[],\n overrides?: Partial<T>,\n): Partial<T> {\n const runtimeConfig = getRuntimeConfig()\n const mxllogNs = runtimeConfig?.mxllog?.[namespace]\n const rootNs = runtimeConfig?.[namespace]\n\n const config: Record<string, unknown> = {}\n\n for (const { key, env } of fields) {\n config[key] =\n overrides?.[key]\n ?? mxllogNs?.[key]\n ?? rootNs?.[key]\n ?? resolveEnv(env)\n }\n\n return config as Partial<T>\n}\n\nfunction resolveEnv(envKeys?: string[]): string | undefined {\n if (!envKeys) return undefined\n for (const key of envKeys) {\n const val = process.env[key]\n if (val) return val\n }\n return undefined\n}\n","import type { DrainContext, WideEvent } from '../types'\n\nexport interface DrainOptions<TConfig> {\n name: string\n resolve: () => TConfig | null\n send: (events: WideEvent[], config: TConfig) => Promise<void>\n}\n\nexport function defineDrain<TConfig>(options: DrainOptions<TConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void> {\n return async (ctx: DrainContext | DrainContext[]) => {\n const contexts = Array.isArray(ctx) ? ctx : [ctx]\n if (contexts.length === 0) return\n\n const config = options.resolve()\n if (!config) return\n\n try {\n await options.send(contexts.map(c => c.event), config)\n } catch (error) {\n console.error(`[@safaricom-mxl/log/${options.name}] Failed to send events:`, error)\n }\n }\n}\n","export interface HttpPostOptions {\n url: string\n headers: Record<string, string>\n body: string\n timeout: number\n label: string\n}\n\nexport async function httpPost({ url, headers, body, timeout, label }: HttpPostOptions): Promise<void> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error')\n const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text\n throw new Error(`${label} API error: ${response.status} ${response.statusText} - ${safeText}`)\n }\n } finally {\n clearTimeout(timeoutId)\n }\n}\n"],"mappings":";;;;;;;;;AAIA,SAAgB,mBAAoD;AAClE,KAAI;EAEF,MAAM,EAAE,qBAAA,UAA6B,oBAAoB;AACzD,SAAO,kBAAkB;SACnB;AACN;;;AASJ,SAAgB,qBACd,WACA,QACA,WACY;CACZ,MAAM,gBAAgB,kBAAkB;CACxC,MAAM,WAAW,eAAe,SAAS;CACzC,MAAM,SAAS,gBAAgB;CAE/B,MAAM,SAAkC,EAAE;AAE1C,MAAK,MAAM,EAAE,KAAK,SAAS,OACzB,QAAO,OACL,YAAY,QACT,WAAW,QACX,SAAS,QACT,WAAW,IAAI;AAGtB,QAAO;;AAGT,SAAS,WAAW,SAAwC;AAC1D,KAAI,CAAC,QAAS,QAAO,KAAA;AACrB,MAAK,MAAM,OAAO,SAAS;EACzB,MAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAO;;;;;ACrCpB,SAAgB,YAAqB,SAAuF;AAC1H,QAAO,OAAO,QAAuC;EACnD,MAAM,WAAW,MAAM,QAAQ,IAAI,GAAG,MAAM,CAAC,IAAI;AACjD,MAAI,SAAS,WAAW,EAAG;EAE3B,MAAM,SAAS,QAAQ,SAAS;AAChC,MAAI,CAAC,OAAQ;AAEb,MAAI;AACF,SAAM,QAAQ,KAAK,SAAS,KAAI,MAAK,EAAE,MAAM,EAAE,OAAO;WAC/C,OAAO;AACd,WAAQ,MAAM,uBAAuB,QAAQ,KAAK,2BAA2B,MAAM;;;;;;ACXzF,eAAsB,SAAS,EAAE,KAAK,SAAS,MAAM,SAAS,SAAyC;CACrG,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,YAAY,iBAAiB,WAAW,OAAO,EAAE,QAAQ;AAE/D,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,QAAQ;GACR;GACA;GACA,QAAQ,WAAW;GACpB,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,gBAAgB;GAC/D,MAAM,WAAW,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB;AAC7E,SAAM,IAAI,MAAM,GAAG,MAAM,cAAc,SAAS,OAAO,GAAG,SAAS,WAAW,KAAK,WAAW;;WAExF;AACR,eAAa,UAAU"}
@@ -11,7 +11,7 @@ const OTEL_SEVERITY_TEXT = {
11
11
  warn: "WARN",
12
12
  error: "ERROR"
13
13
  };
14
-
15
14
  //#endregion
16
15
  export { OTEL_SEVERITY_TEXT as n, OTEL_SEVERITY_NUMBER as t };
17
- //# sourceMappingURL=_severity-D_IU9-90.mjs.map
16
+
17
+ //# sourceMappingURL=_severity-CLNgC2HU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_severity-D_IU9-90.mjs","names":[],"sources":["../src/adapters/_severity.ts"],"sourcesContent":["import type { LogLevel } from '../types'\n\nexport const OTEL_SEVERITY_NUMBER: Record<LogLevel, number> = {\n debug: 5,\n info: 9,\n warn: 13,\n error: 17,\n}\n\nexport const OTEL_SEVERITY_TEXT: Record<LogLevel, string> = {\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n}\n"],"mappings":";AAEA,MAAa,uBAAiD;CAC5D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAa,qBAA+C;CAC1D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR"}
1
+ {"version":3,"file":"_severity-CLNgC2HU.mjs","names":[],"sources":["../src/adapters/_severity.ts"],"sourcesContent":["import type { LogLevel } from '../types'\n\nexport const OTEL_SEVERITY_NUMBER: Record<LogLevel, number> = {\n debug: 5,\n info: 9,\n warn: 13,\n error: 17,\n}\n\nexport const OTEL_SEVERITY_TEXT: Record<LogLevel, string> = {\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n}\n"],"mappings":";AAEA,MAAa,uBAAiD;CAC5D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAa,qBAA+C;CAC1D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR"}
@@ -1,19 +1,32 @@
1
- import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
1
+ import { T as WideEvent, r as DrainContext } from "../types-abpnM9XB.mjs";
4
2
  //#region src/adapters/axiom.d.ts
5
- interface AxiomConfig {
3
+ interface BaseAxiomConfig {
6
4
  /** Axiom dataset name */
7
5
  dataset: string;
8
6
  /** Axiom API token */
9
7
  token: string;
10
8
  /** Organization ID (required for Personal Access Tokens) */
11
9
  orgId?: string;
12
- /** Base URL for Axiom API. Default: https://api.axiom.co */
13
- baseUrl?: string;
14
10
  /** Request timeout in milliseconds. Default: 5000 */
15
11
  timeout?: number;
16
12
  }
13
+ interface EdgeAxiomConfig {
14
+ /**
15
+ * Edge URL for Axiom ingest/query endpoints.
16
+ * If no path is provided, uses /v1/ingest/{dataset}.
17
+ * If a custom path is provided, it is used as-is (trailing slash trimmed).
18
+ */
19
+ edgeUrl: string;
20
+ /** Mutually exclusive with edgeUrl. */
21
+ baseUrl?: never;
22
+ }
23
+ interface EndpointAxiomConfig {
24
+ /** Base URL for Axiom API. Uses /v1/datasets/{dataset}/ingest. */
25
+ baseUrl?: string;
26
+ /** Mutually exclusive with baseUrl. */
27
+ edgeUrl?: never;
28
+ }
29
+ type AxiomConfig = BaseAxiomConfig & (EdgeAxiomConfig | EndpointAxiomConfig);
17
30
  /**
18
31
  * Create a drain function for sending logs to Axiom.
19
32
  *
@@ -1 +1 @@
1
- {"version":3,"file":"axiom.d.mts","names":[],"sources":["../../src/adapters/axiom.ts"],"mappings":";;;;UAMiB,WAAA;;EAEf,OAAA;EAFe;EAIf,KAAA;;EAEA,KAAA;EAJA;EAMA,OAAA;EAFA;EAIA,OAAA;AAAA;;;AA+BF;;;;;;;;;;;;;;;;;;iBAAgB,gBAAA,CAAiB,SAAA,GAAY,OAAA,CAAQ,WAAA,KAAY,GAAA,EAAb,YAAA,GAAa,YAAA,OAAA,OAAA;AA0BjE;;;;;;;;;;;AAAA,iBAAsB,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,WAAA,GAAc,OAAA;;;;AAe1E;;;;;;;;iBAAsB,gBAAA,CAAiB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,WAAA,GAAc,OAAA"}
1
+ {"version":3,"file":"axiom.d.mts","names":[],"sources":["../../src/adapters/axiom.ts"],"mappings":";;UAMU,eAAA;;EAER,OAAA;;EAEA,KAAA;;EAEA,KAAA;EANQ;EAQR,OAAA;AAAA;AAAA,UAGQ,eAAA;EATR;;;;;EAeA,OAAA;EANQ;EAQR,OAAA;AAAA;AAAA,UAGQ,mBAAA;EAHD;EAKP,OAAA;EAF2B;EAI3B,OAAA;AAAA;AAAA,KAGU,WAAA,GAAc,eAAA,IAAmB,eAAA,GAAkB,mBAAA;AAA/D;;;;;;;;;;;;;AAoCA;;;;;;;AApCA,iBAoCgB,gBAAA,CAAiB,SAAA,GAAY,OAAA,CAAQ,WAAA,KAAY,GAAA,EAAb,YAAA,GAAa,YAAA,OAAA,OAAA;;;;;;;;;;;;iBAoC3C,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,WAAA,GAAc,OAAA;;;;;;;;;;;;iBAepD,gBAAA,CAAiB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,WAAA,GAAc,OAAA"}
@@ -1,5 +1,4 @@
1
- import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-DmaJ426Z.mjs";
2
-
1
+ import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-CTtzGDc6.mjs";
3
2
  //#region src/adapters/axiom.ts
4
3
  const AXIOM_FIELDS = [
5
4
  {
@@ -14,6 +13,10 @@ const AXIOM_FIELDS = [
14
13
  key: "orgId",
15
14
  env: ["NUXT_AXIOM_ORG_ID", "AXIOM_ORG_ID"]
16
15
  },
16
+ {
17
+ key: "edgeUrl",
18
+ env: ["NUXT_AXIOM_EDGE_URL", "AXIOM_EDGE_URL"]
19
+ },
17
20
  {
18
21
  key: "baseUrl",
19
22
  env: ["NUXT_AXIOM_URL", "AXIOM_URL"]
@@ -46,9 +49,13 @@ function createAxiomDrain(overrides) {
46
49
  resolve: () => {
47
50
  const config = resolveAdapterConfig("axiom", AXIOM_FIELDS, overrides);
48
51
  if (!config.dataset || !config.token) {
49
- console.error("[mxllog/axiom] Missing dataset or token. Set NUXT_AXIOM_TOKEN/NUXT_AXIOM_DATASET env vars or pass to createAxiomDrain()");
52
+ console.error("[@safaricom-mxl/log/axiom] Missing dataset or token. Set NUXT_AXIOM_TOKEN/NUXT_AXIOM_DATASET env vars or pass to createAxiomDrain()");
50
53
  return null;
51
54
  }
55
+ if (config.edgeUrl && config.baseUrl) {
56
+ console.warn("[@safaricom-mxl/log/axiom] Both edgeUrl and baseUrl are set. edgeUrl takes precedence for ingest.");
57
+ delete config.baseUrl;
58
+ }
52
59
  return config;
53
60
  },
54
61
  send: sendBatchToAxiom
@@ -80,7 +87,7 @@ async function sendToAxiom(event, config) {
80
87
  * ```
81
88
  */
82
89
  async function sendBatchToAxiom(events, config) {
83
- const url = `${config.baseUrl ?? "https://api.axiom.co"}/v1/datasets/${encodeURIComponent(config.dataset)}/ingest`;
90
+ const url = resolveIngestUrl(config);
84
91
  const headers = {
85
92
  "Content-Type": "application/json",
86
93
  "Authorization": `Bearer ${config.token}`
@@ -94,7 +101,23 @@ async function sendBatchToAxiom(events, config) {
94
101
  label: "Axiom"
95
102
  });
96
103
  }
97
-
104
+ function resolveIngestUrl(config) {
105
+ const encodedDataset = encodeURIComponent(config.dataset);
106
+ if (!config.edgeUrl) return `${config.baseUrl ?? "https://api.axiom.co"}/v1/datasets/${encodedDataset}/ingest`;
107
+ try {
108
+ const parsed = new URL(config.edgeUrl);
109
+ if (parsed.pathname === "" || parsed.pathname === "/") {
110
+ parsed.pathname = `/v1/ingest/${encodedDataset}`;
111
+ return parsed.toString();
112
+ }
113
+ parsed.pathname = parsed.pathname.replace(/\/+$/, "");
114
+ return parsed.toString();
115
+ } catch {
116
+ console.warn(`[@safaricom-mxl/log/axiom] edgeUrl "${config.edgeUrl}" is not a valid URL, falling back to string concatenation.`);
117
+ return `${config.edgeUrl.replace(/\/+$/, "")}/v1/ingest/${encodedDataset}`;
118
+ }
119
+ }
98
120
  //#endregion
99
121
  export { createAxiomDrain, sendBatchToAxiom, sendToAxiom };
122
+
100
123
  //# sourceMappingURL=axiom.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"axiom.mjs","names":[],"sources":["../../src/adapters/axiom.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\n\nexport interface AxiomConfig {\n /** Axiom dataset name */\n dataset: string\n /** Axiom API token */\n token: string\n /** Organization ID (required for Personal Access Tokens) */\n orgId?: string\n /** Base URL for Axiom API. Default: https://api.axiom.co */\n baseUrl?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\nconst AXIOM_FIELDS: ConfigField<AxiomConfig>[] = [\n { key: 'dataset', env: ['NUXT_AXIOM_DATASET', 'AXIOM_DATASET'] },\n { key: 'token', env: ['NUXT_AXIOM_TOKEN', 'AXIOM_TOKEN'] },\n { key: 'orgId', env: ['NUXT_AXIOM_ORG_ID', 'AXIOM_ORG_ID'] },\n { key: 'baseUrl', env: ['NUXT_AXIOM_URL', 'AXIOM_URL'] },\n { key: 'timeout' },\n]\n\n/**\n * Create a drain function for sending logs to Axiom.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createAxiomDrain()\n * 2. runtimeConfig.mxllog.axiom\n * 3. runtimeConfig.axiom\n * 4. Environment variables: NUXT_AXIOM_*, AXIOM_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_AXIOM_TOKEN and NUXT_AXIOM_DATASET env vars\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain({\n * dataset: 'my-dataset',\n * }))\n * ```\n */\nexport function createAxiomDrain(overrides?: Partial<AxiomConfig>) {\n return defineDrain<AxiomConfig>({\n name: 'axiom',\n resolve: () => {\n const config = resolveAdapterConfig<AxiomConfig>('axiom', AXIOM_FIELDS, overrides)\n if (!config.dataset || !config.token) {\n console.error('[mxllog/axiom] Missing dataset or token. Set NUXT_AXIOM_TOKEN/NUXT_AXIOM_DATASET env vars or pass to createAxiomDrain()')\n return null\n }\n return config as AxiomConfig\n },\n send: sendBatchToAxiom,\n })\n}\n\n/**\n * Send a single event to Axiom.\n *\n * @example\n * ```ts\n * await sendToAxiom(event, {\n * dataset: 'my-logs',\n * token: process.env.AXIOM_TOKEN!,\n * })\n * ```\n */\nexport async function sendToAxiom(event: WideEvent, config: AxiomConfig): Promise<void> {\n await sendBatchToAxiom([event], config)\n}\n\n/**\n * Send a batch of events to Axiom.\n *\n * @example\n * ```ts\n * await sendBatchToAxiom(events, {\n * dataset: 'my-logs',\n * token: process.env.AXIOM_TOKEN!,\n * })\n * ```\n */\nexport async function sendBatchToAxiom(events: WideEvent[], config: AxiomConfig): Promise<void> {\n const baseUrl = config.baseUrl ?? 'https://api.axiom.co'\n const url = `${baseUrl}/v1/datasets/${encodeURIComponent(config.dataset)}/ingest`\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.token}`,\n }\n\n if (config.orgId) {\n headers['X-Axiom-Org-Id'] = config.orgId\n }\n\n await httpPost({\n url,\n headers,\n body: JSON.stringify(events),\n timeout: config.timeout ?? 5000,\n label: 'Axiom',\n })\n}\n"],"mappings":";;;AAmBA,MAAM,eAA2C;CAC/C;EAAE,KAAK;EAAW,KAAK,CAAC,sBAAsB,gBAAgB;EAAE;CAChE;EAAE,KAAK;EAAS,KAAK,CAAC,oBAAoB,cAAc;EAAE;CAC1D;EAAE,KAAK;EAAS,KAAK,CAAC,qBAAqB,eAAe;EAAE;CAC5D;EAAE,KAAK;EAAW,KAAK,CAAC,kBAAkB,YAAY;EAAE;CACxD,EAAE,KAAK,WAAW;CACnB;;;;;;;;;;;;;;;;;;;;;AAsBD,SAAgB,iBAAiB,WAAkC;AACjE,QAAO,YAAyB;EAC9B,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAAkC,SAAS,cAAc,UAAU;AAClF,OAAI,CAAC,OAAO,WAAW,CAAC,OAAO,OAAO;AACpC,YAAQ,MAAM,0HAA0H;AACxI,WAAO;;AAET,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;;AAcJ,eAAsB,YAAY,OAAkB,QAAoC;AACtF,OAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;;AAczC,eAAsB,iBAAiB,QAAqB,QAAoC;CAE9F,MAAM,MAAM,GADI,OAAO,WAAW,uBACX,eAAe,mBAAmB,OAAO,QAAQ,CAAC;CAEzE,MAAM,UAAkC;EACtC,gBAAgB;EAChB,iBAAiB,UAAU,OAAO;EACnC;AAED,KAAI,OAAO,MACT,SAAQ,oBAAoB,OAAO;AAGrC,OAAM,SAAS;EACb;EACA;EACA,MAAM,KAAK,UAAU,OAAO;EAC5B,SAAS,OAAO,WAAW;EAC3B,OAAO;EACR,CAAC"}
1
+ {"version":3,"file":"axiom.mjs","names":[],"sources":["../../src/adapters/axiom.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\n\ninterface BaseAxiomConfig {\n /** Axiom dataset name */\n dataset: string\n /** Axiom API token */\n token: string\n /** Organization ID (required for Personal Access Tokens) */\n orgId?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\ninterface EdgeAxiomConfig {\n /**\n * Edge URL for Axiom ingest/query endpoints.\n * If no path is provided, uses /v1/ingest/{dataset}.\n * If a custom path is provided, it is used as-is (trailing slash trimmed).\n */\n edgeUrl: string\n /** Mutually exclusive with edgeUrl. */\n baseUrl?: never\n}\n\ninterface EndpointAxiomConfig {\n /** Base URL for Axiom API. Uses /v1/datasets/{dataset}/ingest. */\n baseUrl?: string\n /** Mutually exclusive with baseUrl. */\n edgeUrl?: never\n}\n\nexport type AxiomConfig = BaseAxiomConfig & (EdgeAxiomConfig | EndpointAxiomConfig)\n\ntype ResolvedAxiomConfig = BaseAxiomConfig & {\n edgeUrl?: string\n baseUrl?: string\n}\n\nconst AXIOM_FIELDS: ConfigField<ResolvedAxiomConfig>[] = [\n { key: 'dataset', env: ['NUXT_AXIOM_DATASET', 'AXIOM_DATASET'] },\n { key: 'token', env: ['NUXT_AXIOM_TOKEN', 'AXIOM_TOKEN'] },\n { key: 'orgId', env: ['NUXT_AXIOM_ORG_ID', 'AXIOM_ORG_ID'] },\n { key: 'edgeUrl', env: ['NUXT_AXIOM_EDGE_URL', 'AXIOM_EDGE_URL'] },\n { key: 'baseUrl', env: ['NUXT_AXIOM_URL', 'AXIOM_URL'] },\n { key: 'timeout' },\n]\n\n/**\n * Create a drain function for sending logs to Axiom.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createAxiomDrain()\n * 2. runtimeConfig.mxllog.axiom\n * 3. runtimeConfig.axiom\n * 4. Environment variables: NUXT_AXIOM_*, AXIOM_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_AXIOM_TOKEN and NUXT_AXIOM_DATASET env vars\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain({\n * dataset: 'my-dataset',\n * }))\n * ```\n */\nexport function createAxiomDrain(overrides?: Partial<AxiomConfig>) {\n return defineDrain<AxiomConfig>({\n name: 'axiom',\n resolve: () => {\n const config = resolveAdapterConfig<ResolvedAxiomConfig>(\n 'axiom',\n AXIOM_FIELDS,\n overrides as Partial<ResolvedAxiomConfig>,\n )\n if (!config.dataset || !config.token) {\n console.error('[@safaricom-mxl/log/axiom] Missing dataset or token. Set NUXT_AXIOM_TOKEN/NUXT_AXIOM_DATASET env vars or pass to createAxiomDrain()')\n return null\n }\n\n if (config.edgeUrl && config.baseUrl) {\n console.warn('[@safaricom-mxl/log/axiom] Both edgeUrl and baseUrl are set. edgeUrl takes precedence for ingest.')\n delete config.baseUrl\n }\n\n return config as AxiomConfig\n },\n send: sendBatchToAxiom,\n })\n}\n\n/**\n * Send a single event to Axiom.\n *\n * @example\n * ```ts\n * await sendToAxiom(event, {\n * dataset: 'my-logs',\n * token: process.env.AXIOM_TOKEN!,\n * })\n * ```\n */\nexport async function sendToAxiom(event: WideEvent, config: AxiomConfig): Promise<void> {\n await sendBatchToAxiom([event], config)\n}\n\n/**\n * Send a batch of events to Axiom.\n *\n * @example\n * ```ts\n * await sendBatchToAxiom(events, {\n * dataset: 'my-logs',\n * token: process.env.AXIOM_TOKEN!,\n * })\n * ```\n */\nexport async function sendBatchToAxiom(events: WideEvent[], config: AxiomConfig): Promise<void> {\n const url = resolveIngestUrl(config)\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.token}`,\n }\n\n if (config.orgId) {\n headers['X-Axiom-Org-Id'] = config.orgId\n }\n\n await httpPost({\n url,\n headers,\n body: JSON.stringify(events),\n timeout: config.timeout ?? 5000,\n label: 'Axiom',\n })\n}\n\nfunction resolveIngestUrl(config: AxiomConfig): string {\n const encodedDataset = encodeURIComponent(config.dataset)\n\n if (!config.edgeUrl) {\n const baseUrl = config.baseUrl ?? 'https://api.axiom.co'\n return `${baseUrl}/v1/datasets/${encodedDataset}/ingest`\n }\n\n try {\n const parsed = new URL(config.edgeUrl)\n\n if (parsed.pathname === '' || parsed.pathname === '/') {\n parsed.pathname = `/v1/ingest/${encodedDataset}`\n return parsed.toString()\n }\n\n parsed.pathname = parsed.pathname.replace(/\\/+$/, '')\n return parsed.toString()\n } catch {\n console.warn(`[@safaricom-mxl/log/axiom] edgeUrl \"${config.edgeUrl}\" is not a valid URL, falling back to string concatenation.`)\n const trimmed = config.edgeUrl.replace(/\\/+$/, '')\n return `${trimmed}/v1/ingest/${encodedDataset}`\n }\n}\n"],"mappings":";;AA0CA,MAAM,eAAmD;CACvD;EAAE,KAAK;EAAW,KAAK,CAAC,sBAAsB,gBAAgB;EAAE;CAChE;EAAE,KAAK;EAAS,KAAK,CAAC,oBAAoB,cAAc;EAAE;CAC1D;EAAE,KAAK;EAAS,KAAK,CAAC,qBAAqB,eAAe;EAAE;CAC5D;EAAE,KAAK;EAAW,KAAK,CAAC,uBAAuB,iBAAiB;EAAE;CAClE;EAAE,KAAK;EAAW,KAAK,CAAC,kBAAkB,YAAY;EAAE;CACxD,EAAE,KAAK,WAAW;CACnB;;;;;;;;;;;;;;;;;;;;;AAsBD,SAAgB,iBAAiB,WAAkC;AACjE,QAAO,YAAyB;EAC9B,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBACb,SACA,cACA,UACD;AACD,OAAI,CAAC,OAAO,WAAW,CAAC,OAAO,OAAO;AACpC,YAAQ,MAAM,sIAAsI;AACpJ,WAAO;;AAGT,OAAI,OAAO,WAAW,OAAO,SAAS;AACpC,YAAQ,KAAK,oGAAoG;AACjH,WAAO,OAAO;;AAGhB,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;;AAcJ,eAAsB,YAAY,OAAkB,QAAoC;AACtF,OAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;;AAczC,eAAsB,iBAAiB,QAAqB,QAAoC;CAC9F,MAAM,MAAM,iBAAiB,OAAO;CAEpC,MAAM,UAAkC;EACtC,gBAAgB;EAChB,iBAAiB,UAAU,OAAO;EACnC;AAED,KAAI,OAAO,MACT,SAAQ,oBAAoB,OAAO;AAGrC,OAAM,SAAS;EACb;EACA;EACA,MAAM,KAAK,UAAU,OAAO;EAC5B,SAAS,OAAO,WAAW;EAC3B,OAAO;EACR,CAAC;;AAGJ,SAAS,iBAAiB,QAA6B;CACrD,MAAM,iBAAiB,mBAAmB,OAAO,QAAQ;AAEzD,KAAI,CAAC,OAAO,QAEV,QAAO,GADS,OAAO,WAAW,uBAChB,eAAe,eAAe;AAGlD,KAAI;EACF,MAAM,SAAS,IAAI,IAAI,OAAO,QAAQ;AAEtC,MAAI,OAAO,aAAa,MAAM,OAAO,aAAa,KAAK;AACrD,UAAO,WAAW,cAAc;AAChC,UAAO,OAAO,UAAU;;AAG1B,SAAO,WAAW,OAAO,SAAS,QAAQ,QAAQ,GAAG;AACrD,SAAO,OAAO,UAAU;SAClB;AACN,UAAQ,KAAK,uCAAuC,OAAO,QAAQ,6DAA6D;AAEhI,SAAO,GADS,OAAO,QAAQ,QAAQ,QAAQ,GAAG,CAChC,aAAa"}
@@ -1,6 +1,4 @@
1
- import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
1
+ import { T as WideEvent, r as DrainContext } from "../types-abpnM9XB.mjs";
4
2
  //#region src/adapters/better-stack.d.ts
5
3
  interface BetterStackConfig {
6
4
  /** Better Stack source token */
@@ -11,7 +9,7 @@ interface BetterStackConfig {
11
9
  timeout?: number;
12
10
  }
13
11
  /**
14
- * Transform an mxllog wide event into a Better Stack event.
12
+ * Transform an @safaricom-mxl/log wide event into a Better Stack event.
15
13
  * Maps `timestamp` to `dt` (Better Stack's expected field).
16
14
  */
17
15
  declare function toBetterStackEvent(event: WideEvent): Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"better-stack.d.mts","names":[],"sources":["../../src/adapters/better-stack.ts"],"mappings":";;;;UAMiB,iBAAA;;EAEf,WAAA;EAFe;EAIf,QAAA;;EAEA,OAAA;AAAA;;;;;iBAac,kBAAA,CAAmB,KAAA,EAAO,SAAA,GAAY,MAAA;;;;;;;;;AAyBtD;;;;;;;;;;;;iBAAgB,sBAAA,CAAuB,SAAA,GAAY,OAAA,CAAQ,iBAAA,KAAkB,GAAA,EAAnB,YAAA,GAAmB,YAAA,OAAA,OAAA;;;;;;;AAyB7E;;;;iBAAsB,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,iBAAA,GAAoB,OAAA;;;;;;;;;;;iBAchE,sBAAA,CAAuB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,iBAAA,GAAoB,OAAA"}
1
+ {"version":3,"file":"better-stack.d.mts","names":[],"sources":["../../src/adapters/better-stack.ts"],"mappings":";;UAMiB,iBAAA;;EAEf,WAAA;;EAEA,QAAA;;EAEA,OAAA;AAAA;;;;;iBAac,kBAAA,CAAmB,KAAA,EAAO,SAAA,GAAY,MAAA;;;;AAAtD;;;;;;;;;AAyBA;;;;;;;;iBAAgB,sBAAA,CAAuB,SAAA,GAAY,OAAA,CAAQ,iBAAA,KAAkB,GAAA,EAAnB,YAAA,GAAmB,YAAA,OAAA,OAAA;;;;;;;;;;;iBAyBvD,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,iBAAA,GAAoB,OAAA;;;;;;;;;;;iBAchE,sBAAA,CAAuB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,iBAAA,GAAoB,OAAA"}
@@ -1,5 +1,4 @@
1
- import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-DmaJ426Z.mjs";
2
-
1
+ import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-CTtzGDc6.mjs";
3
2
  //#region src/adapters/better-stack.ts
4
3
  const BETTER_STACK_FIELDS = [
5
4
  {
@@ -13,7 +12,7 @@ const BETTER_STACK_FIELDS = [
13
12
  { key: "timeout" }
14
13
  ];
15
14
  /**
16
- * Transform an mxllog wide event into a Better Stack event.
15
+ * Transform an @safaricom-mxl/log wide event into a Better Stack event.
17
16
  * Maps `timestamp` to `dt` (Better Stack's expected field).
18
17
  */
19
18
  function toBetterStackEvent(event) {
@@ -49,7 +48,7 @@ function createBetterStackDrain(overrides) {
49
48
  resolve: () => {
50
49
  const config = resolveAdapterConfig("betterStack", BETTER_STACK_FIELDS, overrides);
51
50
  if (!config.sourceToken) {
52
- console.error("[mxllog/better-stack] Missing source token. Set NUXT_BETTER_STACK_SOURCE_TOKEN env var or pass to createBetterStackDrain()");
51
+ console.error("[@safaricom-mxl/log/better-stack] Missing source token. Set NUXT_BETTER_STACK_SOURCE_TOKEN env var or pass to createBetterStackDrain()");
53
52
  return null;
54
53
  }
55
54
  return config;
@@ -92,7 +91,7 @@ async function sendBatchToBetterStack(events, config) {
92
91
  label: "Better Stack"
93
92
  });
94
93
  }
95
-
96
94
  //#endregion
97
95
  export { createBetterStackDrain, sendBatchToBetterStack, sendToBetterStack, toBetterStackEvent };
96
+
98
97
  //# sourceMappingURL=better-stack.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"better-stack.mjs","names":[],"sources":["../../src/adapters/better-stack.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\n\nexport interface BetterStackConfig {\n /** Better Stack source token */\n sourceToken: string\n /** Logtail ingestion endpoint. Default: https://in.logs.betterstack.com */\n endpoint?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\nconst BETTER_STACK_FIELDS: ConfigField<BetterStackConfig>[] = [\n { key: 'sourceToken', env: ['NUXT_BETTER_STACK_SOURCE_TOKEN', 'BETTER_STACK_SOURCE_TOKEN'] },\n { key: 'endpoint', env: ['NUXT_BETTER_STACK_ENDPOINT', 'BETTER_STACK_ENDPOINT'] },\n { key: 'timeout' },\n]\n\n/**\n * Transform an mxllog wide event into a Better Stack event.\n * Maps `timestamp` to `dt` (Better Stack's expected field).\n */\nexport function toBetterStackEvent(event: WideEvent): Record<string, unknown> {\n const { timestamp, ...rest } = event\n return { ...rest, dt: timestamp }\n}\n\n/**\n * Create a drain function for sending logs to Better Stack.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createBetterStackDrain()\n * 2. runtimeConfig.mxllog.betterStack\n * 3. runtimeConfig.betterStack\n * 4. Environment variables: NUXT_BETTER_STACK_*, BETTER_STACK_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_BETTER_STACK_SOURCE_TOKEN env var\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain({\n * sourceToken: 'my-token',\n * }))\n * ```\n */\nexport function createBetterStackDrain(overrides?: Partial<BetterStackConfig>) {\n return defineDrain<BetterStackConfig>({\n name: 'better-stack',\n resolve: () => {\n const config = resolveAdapterConfig<BetterStackConfig>('betterStack', BETTER_STACK_FIELDS, overrides)\n if (!config.sourceToken) {\n console.error('[mxllog/better-stack] Missing source token. Set NUXT_BETTER_STACK_SOURCE_TOKEN env var or pass to createBetterStackDrain()')\n return null\n }\n return config as BetterStackConfig\n },\n send: sendBatchToBetterStack,\n })\n}\n\n/**\n * Send a single event to Better Stack.\n *\n * @example\n * ```ts\n * await sendToBetterStack(event, {\n * sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,\n * })\n * ```\n */\nexport async function sendToBetterStack(event: WideEvent, config: BetterStackConfig): Promise<void> {\n await sendBatchToBetterStack([event], config)\n}\n\n/**\n * Send a batch of events to Better Stack.\n *\n * @example\n * ```ts\n * await sendBatchToBetterStack(events, {\n * sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,\n * })\n * ```\n */\nexport async function sendBatchToBetterStack(events: WideEvent[], config: BetterStackConfig): Promise<void> {\n const endpoint = (config.endpoint ?? 'https://in.logs.betterstack.com').replace(/\\/+$/, '')\n\n await httpPost({\n url: endpoint,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.sourceToken}`,\n },\n body: JSON.stringify(events.map(toBetterStackEvent)),\n timeout: config.timeout ?? 5000,\n label: 'Better Stack',\n })\n}\n"],"mappings":";;;AAeA,MAAM,sBAAwD;CAC5D;EAAE,KAAK;EAAe,KAAK,CAAC,kCAAkC,4BAA4B;EAAE;CAC5F;EAAE,KAAK;EAAY,KAAK,CAAC,8BAA8B,wBAAwB;EAAE;CACjF,EAAE,KAAK,WAAW;CACnB;;;;;AAMD,SAAgB,mBAAmB,OAA2C;CAC5E,MAAM,EAAE,WAAW,GAAG,SAAS;AAC/B,QAAO;EAAE,GAAG;EAAM,IAAI;EAAW;;;;;;;;;;;;;;;;;;;;;;AAuBnC,SAAgB,uBAAuB,WAAwC;AAC7E,QAAO,YAA+B;EACpC,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAAwC,eAAe,qBAAqB,UAAU;AACrG,OAAI,CAAC,OAAO,aAAa;AACvB,YAAQ,MAAM,6HAA6H;AAC3I,WAAO;;AAET,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;AAaJ,eAAsB,kBAAkB,OAAkB,QAA0C;AAClG,OAAM,uBAAuB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;AAa/C,eAAsB,uBAAuB,QAAqB,QAA0C;AAG1G,OAAM,SAAS;EACb,MAHgB,OAAO,YAAY,mCAAmC,QAAQ,QAAQ,GAAG;EAIzF,SAAS;GACP,gBAAgB;GAChB,iBAAiB,UAAU,OAAO;GACnC;EACD,MAAM,KAAK,UAAU,OAAO,IAAI,mBAAmB,CAAC;EACpD,SAAS,OAAO,WAAW;EAC3B,OAAO;EACR,CAAC"}
1
+ {"version":3,"file":"better-stack.mjs","names":[],"sources":["../../src/adapters/better-stack.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\n\nexport interface BetterStackConfig {\n /** Better Stack source token */\n sourceToken: string\n /** Logtail ingestion endpoint. Default: https://in.logs.betterstack.com */\n endpoint?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\nconst BETTER_STACK_FIELDS: ConfigField<BetterStackConfig>[] = [\n { key: 'sourceToken', env: ['NUXT_BETTER_STACK_SOURCE_TOKEN', 'BETTER_STACK_SOURCE_TOKEN'] },\n { key: 'endpoint', env: ['NUXT_BETTER_STACK_ENDPOINT', 'BETTER_STACK_ENDPOINT'] },\n { key: 'timeout' },\n]\n\n/**\n * Transform an @safaricom-mxl/log wide event into a Better Stack event.\n * Maps `timestamp` to `dt` (Better Stack's expected field).\n */\nexport function toBetterStackEvent(event: WideEvent): Record<string, unknown> {\n const { timestamp, ...rest } = event\n return { ...rest, dt: timestamp }\n}\n\n/**\n * Create a drain function for sending logs to Better Stack.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createBetterStackDrain()\n * 2. runtimeConfig.mxllog.betterStack\n * 3. runtimeConfig.betterStack\n * 4. Environment variables: NUXT_BETTER_STACK_*, BETTER_STACK_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_BETTER_STACK_SOURCE_TOKEN env var\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain({\n * sourceToken: 'my-token',\n * }))\n * ```\n */\nexport function createBetterStackDrain(overrides?: Partial<BetterStackConfig>) {\n return defineDrain<BetterStackConfig>({\n name: 'better-stack',\n resolve: () => {\n const config = resolveAdapterConfig<BetterStackConfig>('betterStack', BETTER_STACK_FIELDS, overrides)\n if (!config.sourceToken) {\n console.error('[@safaricom-mxl/log/better-stack] Missing source token. Set NUXT_BETTER_STACK_SOURCE_TOKEN env var or pass to createBetterStackDrain()')\n return null\n }\n return config as BetterStackConfig\n },\n send: sendBatchToBetterStack,\n })\n}\n\n/**\n * Send a single event to Better Stack.\n *\n * @example\n * ```ts\n * await sendToBetterStack(event, {\n * sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,\n * })\n * ```\n */\nexport async function sendToBetterStack(event: WideEvent, config: BetterStackConfig): Promise<void> {\n await sendBatchToBetterStack([event], config)\n}\n\n/**\n * Send a batch of events to Better Stack.\n *\n * @example\n * ```ts\n * await sendBatchToBetterStack(events, {\n * sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,\n * })\n * ```\n */\nexport async function sendBatchToBetterStack(events: WideEvent[], config: BetterStackConfig): Promise<void> {\n const endpoint = (config.endpoint ?? 'https://in.logs.betterstack.com').replace(/\\/+$/, '')\n\n await httpPost({\n url: endpoint,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.sourceToken}`,\n },\n body: JSON.stringify(events.map(toBetterStackEvent)),\n timeout: config.timeout ?? 5000,\n label: 'Better Stack',\n })\n}\n"],"mappings":";;AAeA,MAAM,sBAAwD;CAC5D;EAAE,KAAK;EAAe,KAAK,CAAC,kCAAkC,4BAA4B;EAAE;CAC5F;EAAE,KAAK;EAAY,KAAK,CAAC,8BAA8B,wBAAwB;EAAE;CACjF,EAAE,KAAK,WAAW;CACnB;;;;;AAMD,SAAgB,mBAAmB,OAA2C;CAC5E,MAAM,EAAE,WAAW,GAAG,SAAS;AAC/B,QAAO;EAAE,GAAG;EAAM,IAAI;EAAW;;;;;;;;;;;;;;;;;;;;;;AAuBnC,SAAgB,uBAAuB,WAAwC;AAC7E,QAAO,YAA+B;EACpC,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAAwC,eAAe,qBAAqB,UAAU;AACrG,OAAI,CAAC,OAAO,aAAa;AACvB,YAAQ,MAAM,yIAAyI;AACvJ,WAAO;;AAET,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;AAaJ,eAAsB,kBAAkB,OAAkB,QAA0C;AAClG,OAAM,uBAAuB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;AAa/C,eAAsB,uBAAuB,QAAqB,QAA0C;AAG1G,OAAM,SAAS;EACb,MAHgB,OAAO,YAAY,mCAAmC,QAAQ,QAAQ,GAAG;EAIzF,SAAS;GACP,gBAAgB;GAChB,iBAAiB,UAAU,OAAO;GACnC;EACD,MAAM,KAAK,UAAU,OAAO,IAAI,mBAAmB,CAAC;EACpD,SAAS,OAAO,WAAW;EAC3B,OAAO;EACR,CAAC"}
@@ -1,6 +1,4 @@
1
- import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
1
+ import { T as WideEvent, r as DrainContext } from "../types-abpnM9XB.mjs";
4
2
  //#region src/adapters/otlp.d.ts
5
3
  interface OTLPConfig {
6
4
  /** OTLP HTTP endpoint (e.g., http://localhost:4318) */
@@ -34,7 +32,7 @@ interface OTLPLogRecord {
34
32
  spanId?: string;
35
33
  }
36
34
  /**
37
- * Convert an mxllog WideEvent to an OTLP LogRecord.
35
+ * Convert an @safaricom-mxl/log WideEvent to an OTLP LogRecord.
38
36
  */
39
37
  declare function toOTLPLogRecord(event: WideEvent): OTLPLogRecord;
40
38
  /**
@@ -42,7 +40,7 @@ declare function toOTLPLogRecord(event: WideEvent): OTLPLogRecord;
42
40
  *
43
41
  * Configuration priority (highest to lowest):
44
42
  * 1. Overrides passed to createOTLPDrain()
45
- * 2. runtimeConfig.mxllog.otlp (NUXT_MXLLOG_OTLP_*)
43
+ * 2. runtimeConfig.mxllog.otlp (NUXT_EVLOG_OTLP_*)
46
44
  * 3. runtimeConfig.otlp (NUXT_OTLP_*)
47
45
  * 4. Environment variables: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME
48
46
  *
@@ -1 +1 @@
1
- {"version":3,"file":"otlp.d.mts","names":[],"sources":["../../src/adapters/otlp.ts"],"mappings":";;;;UAOiB,UAAA;;EAEf,QAAA;EAFe;EAIf,WAAA;;EAEA,kBAAA,GAAqB,MAAA;EAJrB;EAMA,OAAA,GAAU,MAAA;EAFV;EAIA,OAAA;AAAA;;UAIe,aAAA;EACf,YAAA;EACA,cAAA;EACA,YAAA;EACA,IAAA;IAAQ,WAAA;EAAA;EACR,UAAA,EAAY,KAAA;IACV,GAAA;IACA,KAAA;MAAS,WAAA;MAAsB,QAAA;MAAmB,SAAA;IAAA;EAAA;EAEpD,OAAA;EACA,MAAA;AAAA;;;;iBAwDc,eAAA,CAAgB,KAAA,EAAO,SAAA,GAAY,aAAA;;AAAnD;;;;;;;;;AA0JA;;;;;;;;;;iBAAgB,eAAA,CAAgB,SAAA,GAAY,OAAA,CAAQ,UAAA,KAAW,GAAA,EAAZ,YAAA,GAAY,YAAA,OAAA,OAAA;;;;;;;;;AA+B/D;;iBAAsB,UAAA,CAAW,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,UAAA,GAAa,OAAA;;;;;;;;;;;iBAclD,eAAA,CAAgB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,UAAA,GAAa,OAAA"}
1
+ {"version":3,"file":"otlp.d.mts","names":[],"sources":["../../src/adapters/otlp.ts"],"mappings":";;UAOiB,UAAA;;EAEf,QAAA;;EAEA,WAAA;;EAEA,kBAAA,GAAqB,MAAA;EANN;EAQf,OAAA,GAAU,MAAA;;EAEV,OAAA;AAAA;;UAIe,aAAA;EACf,YAAA;EACA,cAAA;EACA,YAAA;EACA,IAAA;IAAQ,WAAA;EAAA;EACR,UAAA,EAAY,KAAA;IACV,GAAA;IACA,KAAA;MAAS,WAAA;MAAsB,QAAA;MAAmB,SAAA;IAAA;EAAA;EAEpD,OAAA;EACA,MAAA;AAAA;;;;iBAwDc,eAAA,CAAgB,KAAA,EAAO,SAAA,GAAY,aAAA;;;;;;AAAnD;;;;;;;;;AA0JA;;;;;;iBAAgB,eAAA,CAAgB,SAAA,GAAY,OAAA,CAAQ,UAAA,KAAW,GAAA,EAAZ,YAAA,GAAY,YAAA,OAAA,OAAA;;;;;;;;;;;iBA+BzC,UAAA,CAAW,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,UAAA,GAAa,OAAA;;AAAxE;;;;;;;;;iBAcsB,eAAA,CAAgB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,UAAA,GAAa,OAAA"}
@@ -1,6 +1,5 @@
1
- import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-DmaJ426Z.mjs";
2
- import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "../_severity-D_IU9-90.mjs";
3
-
1
+ import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-CTtzGDc6.mjs";
2
+ import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "../_severity-CLNgC2HU.mjs";
4
3
  //#region src/adapters/otlp.ts
5
4
  const OTLP_FIELDS = [
6
5
  {
@@ -25,7 +24,7 @@ function toAttributeValue(value) {
25
24
  return { stringValue: JSON.stringify(value) };
26
25
  }
27
26
  /**
28
- * Convert an mxllog WideEvent to an OTLP LogRecord.
27
+ * Convert an @safaricom-mxl/log WideEvent to an OTLP LogRecord.
29
28
  */
30
29
  function toOTLPLogRecord(event) {
31
30
  const timestamp = new Date(event.timestamp).getTime() * 1e6;
@@ -110,7 +109,7 @@ function getHeadersFromEnv() {
110
109
  *
111
110
  * Configuration priority (highest to lowest):
112
111
  * 1. Overrides passed to createOTLPDrain()
113
- * 2. runtimeConfig.mxllog.otlp (NUXT_MXLLOG_OTLP_*)
112
+ * 2. runtimeConfig.mxllog.otlp (NUXT_EVLOG_OTLP_*)
114
113
  * 3. runtimeConfig.otlp (NUXT_OTLP_*)
115
114
  * 4. Environment variables: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME
116
115
  *
@@ -132,7 +131,7 @@ function createOTLPDrain(overrides) {
132
131
  const config = resolveAdapterConfig("otlp", OTLP_FIELDS, overrides);
133
132
  if (!config.headers) config.headers = getHeadersFromEnv();
134
133
  if (!config.endpoint) {
135
- console.error("[mxllog/otlp] Missing endpoint. Set NUXT_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_ENDPOINT env var, or pass to createOTLPDrain()");
134
+ console.error("[@safaricom-mxl/log/otlp] Missing endpoint. Set NUXT_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_ENDPOINT env var, or pass to createOTLPDrain()");
136
135
  return null;
137
136
  }
138
137
  return config;
@@ -190,7 +189,7 @@ async function sendBatchToOTLP(events, config) {
190
189
  label: "OTLP"
191
190
  });
192
191
  }
193
-
194
192
  //#endregion
195
193
  export { createOTLPDrain, sendBatchToOTLP, sendToOTLP, toOTLPLogRecord };
194
+
196
195
  //# sourceMappingURL=otlp.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"otlp.mjs","names":[],"sources":["../../src/adapters/otlp.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\nimport { OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT } from './_severity'\n\nexport interface OTLPConfig {\n /** OTLP HTTP endpoint (e.g., http://localhost:4318) */\n endpoint: string\n /** Override service name (defaults to event.service) */\n serviceName?: string\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string | number | boolean>\n /** Custom headers (e.g., for authentication) */\n headers?: Record<string, string>\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\n/** OTLP Log Record structure */\nexport interface OTLPLogRecord {\n timeUnixNano: string\n severityNumber: number\n severityText: string\n body: { stringValue: string }\n attributes: Array<{\n key: string\n value: { stringValue?: string, intValue?: string, boolValue?: boolean }\n }>\n traceId?: string\n spanId?: string\n}\n\n/** OTLP Resource structure */\ninterface OTLPResource {\n attributes: Array<{\n key: string\n value: { stringValue?: string, intValue?: string, boolValue?: boolean }\n }>\n}\n\n/** OTLP Scope structure */\ninterface OTLPScope {\n name: string\n version?: string\n}\n\n/** OTLP ExportLogsServiceRequest structure */\ninterface ExportLogsServiceRequest {\n resourceLogs: Array<{\n resource: OTLPResource\n scopeLogs: Array<{\n scope: OTLPScope\n logRecords: OTLPLogRecord[]\n }>\n }>\n}\n\nconst OTLP_FIELDS: ConfigField<OTLPConfig>[] = [\n { key: 'endpoint', env: ['NUXT_OTLP_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT'] },\n { key: 'serviceName', env: ['NUXT_OTLP_SERVICE_NAME', 'OTEL_SERVICE_NAME'] },\n { key: 'headers' },\n { key: 'resourceAttributes' },\n { key: 'timeout' },\n]\n\n/**\n * Convert a value to OTLP attribute value format.\n */\nfunction toAttributeValue(value: unknown): { stringValue?: string, intValue?: string, boolValue?: boolean } {\n if (typeof value === 'boolean') {\n return { boolValue: value }\n }\n if (typeof value === 'number' && Number.isInteger(value)) {\n return { intValue: String(value) }\n }\n if (typeof value === 'string') {\n return { stringValue: value }\n }\n // For complex types, serialize to JSON string\n return { stringValue: JSON.stringify(value) }\n}\n\n/**\n * Convert an mxllog WideEvent to an OTLP LogRecord.\n */\nexport function toOTLPLogRecord(event: WideEvent): OTLPLogRecord {\n const timestamp = new Date(event.timestamp).getTime() * 1_000_000 // Convert to nanoseconds\n\n // Extract known fields, rest goes to attributes\n const { level, traceId, spanId, ...rest } = event\n // Remove base fields from rest (they're handled as resource attributes)\n delete (rest as Record<string, unknown>).timestamp\n delete (rest as Record<string, unknown>).service\n delete (rest as Record<string, unknown>).environment\n delete (rest as Record<string, unknown>).version\n delete (rest as Record<string, unknown>).commitHash\n delete (rest as Record<string, unknown>).region\n\n const attributes: OTLPLogRecord['attributes'] = []\n\n // Add all remaining event fields as attributes\n for (const [key, value] of Object.entries(rest)) {\n if (value !== undefined && value !== null) {\n attributes.push({\n key,\n value: toAttributeValue(value),\n })\n }\n }\n\n const record: OTLPLogRecord = {\n timeUnixNano: String(timestamp),\n severityNumber: OTEL_SEVERITY_NUMBER[level] ?? 9,\n severityText: OTEL_SEVERITY_TEXT[level] ?? 'INFO',\n body: { stringValue: JSON.stringify(event) },\n attributes,\n }\n\n // Add trace context if present\n if (typeof traceId === 'string') {\n record.traceId = traceId\n }\n if (typeof spanId === 'string') {\n record.spanId = spanId\n }\n\n return record\n}\n\n/**\n * Build OTLP resource attributes from event and config.\n */\nfunction buildResourceAttributes(\n event: WideEvent,\n config: OTLPConfig,\n): OTLPResource['attributes'] {\n const attributes: OTLPResource['attributes'] = []\n\n // Service name\n attributes.push({\n key: 'service.name',\n value: { stringValue: config.serviceName ?? event.service },\n })\n\n // Environment\n if (event.environment) {\n attributes.push({\n key: 'deployment.environment',\n value: { stringValue: event.environment },\n })\n }\n\n // Version\n if (event.version) {\n attributes.push({\n key: 'service.version',\n value: { stringValue: event.version },\n })\n }\n\n // Region\n if (event.region) {\n attributes.push({\n key: 'cloud.region',\n value: { stringValue: event.region },\n })\n }\n\n // Commit hash\n if (event.commitHash) {\n attributes.push({\n key: 'vcs.commit.id',\n value: { stringValue: event.commitHash },\n })\n }\n\n // Custom resource attributes from config\n if (config.resourceAttributes) {\n for (const [key, value] of Object.entries(config.resourceAttributes)) {\n attributes.push({\n key,\n value: toAttributeValue(value),\n })\n }\n }\n\n return attributes\n}\n\n/**\n * Build headers from OTEL env vars.\n * Kept inline as OTLP-specific (parses OTEL_EXPORTER_OTLP_HEADERS=key=val,key=val).\n */\nfunction getHeadersFromEnv(): Record<string, string> | undefined {\n const headersEnv = process.env.OTEL_EXPORTER_OTLP_HEADERS || process.env.NUXT_OTLP_HEADERS\n if (headersEnv) {\n const headers: Record<string, string> = {}\n const decoded = decodeURIComponent(headersEnv)\n for (const pair of decoded.split(',')) {\n const eqIndex = pair.indexOf('=')\n if (eqIndex > 0) {\n const key = pair.slice(0, eqIndex).trim()\n const value = pair.slice(eqIndex + 1).trim()\n if (key && value) {\n headers[key] = value\n }\n }\n }\n if (Object.keys(headers).length > 0) return headers\n }\n\n const auth = process.env.NUXT_OTLP_AUTH\n if (auth) {\n return { Authorization: auth }\n }\n\n return undefined\n}\n\n/**\n * Create a drain function for sending logs to an OTLP endpoint.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createOTLPDrain()\n * 2. runtimeConfig.mxllog.otlp (NUXT_MXLLOG_OTLP_*)\n * 3. runtimeConfig.otlp (NUXT_OTLP_*)\n * 4. Environment variables: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME\n *\n * @example\n * ```ts\n * // Zero config - reads from runtimeConfig or env vars\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createOTLPDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createOTLPDrain({\n * endpoint: 'http://localhost:4318',\n * }))\n * ```\n */\nexport function createOTLPDrain(overrides?: Partial<OTLPConfig>) {\n return defineDrain<OTLPConfig>({\n name: 'otlp',\n resolve: () => {\n const config = resolveAdapterConfig<OTLPConfig>('otlp', OTLP_FIELDS, overrides)\n\n // OTLP-specific: resolve headers from env if not provided via config\n if (!config.headers) {\n config.headers = getHeadersFromEnv()\n }\n\n if (!config.endpoint) {\n console.error('[mxllog/otlp] Missing endpoint. Set NUXT_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_ENDPOINT env var, or pass to createOTLPDrain()')\n return null\n }\n return config as OTLPConfig\n },\n send: sendBatchToOTLP,\n })\n}\n\n/**\n * Send a single event to an OTLP endpoint.\n *\n * @example\n * ```ts\n * await sendToOTLP(event, {\n * endpoint: 'http://localhost:4318',\n * })\n * ```\n */\nexport async function sendToOTLP(event: WideEvent, config: OTLPConfig): Promise<void> {\n await sendBatchToOTLP([event], config)\n}\n\n/**\n * Send a batch of events to an OTLP endpoint.\n *\n * @example\n * ```ts\n * await sendBatchToOTLP(events, {\n * endpoint: 'http://localhost:4318',\n * })\n * ```\n */\nexport async function sendBatchToOTLP(events: WideEvent[], config: OTLPConfig): Promise<void> {\n if (events.length === 0) return\n\n const url = `${config.endpoint.replace(/\\/$/, '')}/v1/logs`\n\n // Group events by service for proper resource attribution\n // For simplicity, we use the first event's resource attributes\n const [firstEvent] = events\n const resourceAttributes = buildResourceAttributes(firstEvent, config)\n\n const logRecords = events.map(toOTLPLogRecord)\n\n const payload: ExportLogsServiceRequest = {\n resourceLogs: [\n {\n resource: { attributes: resourceAttributes },\n scopeLogs: [\n {\n scope: { name: '@safaricom-mxl/log', version: '1.0.0' },\n logRecords,\n },\n ],\n },\n ],\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...config.headers,\n }\n\n await httpPost({\n url,\n headers,\n body: JSON.stringify(payload),\n timeout: config.timeout ?? 5000,\n label: 'OTLP',\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"otlp.mjs","names":[],"sources":["../../src/adapters/otlp.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\nimport { OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT } from './_severity'\n\nexport interface OTLPConfig {\n /** OTLP HTTP endpoint (e.g., http://localhost:4318) */\n endpoint: string\n /** Override service name (defaults to event.service) */\n serviceName?: string\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string | number | boolean>\n /** Custom headers (e.g., for authentication) */\n headers?: Record<string, string>\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\n/** OTLP Log Record structure */\nexport interface OTLPLogRecord {\n timeUnixNano: string\n severityNumber: number\n severityText: string\n body: { stringValue: string }\n attributes: Array<{\n key: string\n value: { stringValue?: string, intValue?: string, boolValue?: boolean }\n }>\n traceId?: string\n spanId?: string\n}\n\n/** OTLP Resource structure */\ninterface OTLPResource {\n attributes: Array<{\n key: string\n value: { stringValue?: string, intValue?: string, boolValue?: boolean }\n }>\n}\n\n/** OTLP Scope structure */\ninterface OTLPScope {\n name: string\n version?: string\n}\n\n/** OTLP ExportLogsServiceRequest structure */\ninterface ExportLogsServiceRequest {\n resourceLogs: Array<{\n resource: OTLPResource\n scopeLogs: Array<{\n scope: OTLPScope\n logRecords: OTLPLogRecord[]\n }>\n }>\n}\n\nconst OTLP_FIELDS: ConfigField<OTLPConfig>[] = [\n { key: 'endpoint', env: ['NUXT_OTLP_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT'] },\n { key: 'serviceName', env: ['NUXT_OTLP_SERVICE_NAME', 'OTEL_SERVICE_NAME'] },\n { key: 'headers' },\n { key: 'resourceAttributes' },\n { key: 'timeout' },\n]\n\n/**\n * Convert a value to OTLP attribute value format.\n */\nfunction toAttributeValue(value: unknown): { stringValue?: string, intValue?: string, boolValue?: boolean } {\n if (typeof value === 'boolean') {\n return { boolValue: value }\n }\n if (typeof value === 'number' && Number.isInteger(value)) {\n return { intValue: String(value) }\n }\n if (typeof value === 'string') {\n return { stringValue: value }\n }\n // For complex types, serialize to JSON string\n return { stringValue: JSON.stringify(value) }\n}\n\n/**\n * Convert an @safaricom-mxl/log WideEvent to an OTLP LogRecord.\n */\nexport function toOTLPLogRecord(event: WideEvent): OTLPLogRecord {\n const timestamp = new Date(event.timestamp).getTime() * 1_000_000 // Convert to nanoseconds\n\n // Extract known fields, rest goes to attributes\n const { level, traceId, spanId, ...rest } = event\n // Remove base fields from rest (they're handled as resource attributes)\n delete (rest as Record<string, unknown>).timestamp\n delete (rest as Record<string, unknown>).service\n delete (rest as Record<string, unknown>).environment\n delete (rest as Record<string, unknown>).version\n delete (rest as Record<string, unknown>).commitHash\n delete (rest as Record<string, unknown>).region\n\n const attributes: OTLPLogRecord['attributes'] = []\n\n // Add all remaining event fields as attributes\n for (const [key, value] of Object.entries(rest)) {\n if (value !== undefined && value !== null) {\n attributes.push({\n key,\n value: toAttributeValue(value),\n })\n }\n }\n\n const record: OTLPLogRecord = {\n timeUnixNano: String(timestamp),\n severityNumber: OTEL_SEVERITY_NUMBER[level] ?? 9,\n severityText: OTEL_SEVERITY_TEXT[level] ?? 'INFO',\n body: { stringValue: JSON.stringify(event) },\n attributes,\n }\n\n // Add trace context if present\n if (typeof traceId === 'string') {\n record.traceId = traceId\n }\n if (typeof spanId === 'string') {\n record.spanId = spanId\n }\n\n return record\n}\n\n/**\n * Build OTLP resource attributes from event and config.\n */\nfunction buildResourceAttributes(\n event: WideEvent,\n config: OTLPConfig,\n): OTLPResource['attributes'] {\n const attributes: OTLPResource['attributes'] = []\n\n // Service name\n attributes.push({\n key: 'service.name',\n value: { stringValue: config.serviceName ?? event.service },\n })\n\n // Environment\n if (event.environment) {\n attributes.push({\n key: 'deployment.environment',\n value: { stringValue: event.environment },\n })\n }\n\n // Version\n if (event.version) {\n attributes.push({\n key: 'service.version',\n value: { stringValue: event.version },\n })\n }\n\n // Region\n if (event.region) {\n attributes.push({\n key: 'cloud.region',\n value: { stringValue: event.region },\n })\n }\n\n // Commit hash\n if (event.commitHash) {\n attributes.push({\n key: 'vcs.commit.id',\n value: { stringValue: event.commitHash },\n })\n }\n\n // Custom resource attributes from config\n if (config.resourceAttributes) {\n for (const [key, value] of Object.entries(config.resourceAttributes)) {\n attributes.push({\n key,\n value: toAttributeValue(value),\n })\n }\n }\n\n return attributes\n}\n\n/**\n * Build headers from OTEL env vars.\n * Kept inline as OTLP-specific (parses OTEL_EXPORTER_OTLP_HEADERS=key=val,key=val).\n */\nfunction getHeadersFromEnv(): Record<string, string> | undefined {\n const headersEnv = process.env.OTEL_EXPORTER_OTLP_HEADERS || process.env.NUXT_OTLP_HEADERS\n if (headersEnv) {\n const headers: Record<string, string> = {}\n const decoded = decodeURIComponent(headersEnv)\n for (const pair of decoded.split(',')) {\n const eqIndex = pair.indexOf('=')\n if (eqIndex > 0) {\n const key = pair.slice(0, eqIndex).trim()\n const value = pair.slice(eqIndex + 1).trim()\n if (key && value) {\n headers[key] = value\n }\n }\n }\n if (Object.keys(headers).length > 0) return headers\n }\n\n const auth = process.env.NUXT_OTLP_AUTH\n if (auth) {\n return { Authorization: auth }\n }\n\n return undefined\n}\n\n/**\n * Create a drain function for sending logs to an OTLP endpoint.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createOTLPDrain()\n * 2. runtimeConfig.mxllog.otlp (NUXT_EVLOG_OTLP_*)\n * 3. runtimeConfig.otlp (NUXT_OTLP_*)\n * 4. Environment variables: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME\n *\n * @example\n * ```ts\n * // Zero config - reads from runtimeConfig or env vars\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createOTLPDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createOTLPDrain({\n * endpoint: 'http://localhost:4318',\n * }))\n * ```\n */\nexport function createOTLPDrain(overrides?: Partial<OTLPConfig>) {\n return defineDrain<OTLPConfig>({\n name: 'otlp',\n resolve: () => {\n const config = resolveAdapterConfig<OTLPConfig>('otlp', OTLP_FIELDS, overrides)\n\n // OTLP-specific: resolve headers from env if not provided via config\n if (!config.headers) {\n config.headers = getHeadersFromEnv()\n }\n\n if (!config.endpoint) {\n console.error('[@safaricom-mxl/log/otlp] Missing endpoint. Set NUXT_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_ENDPOINT env var, or pass to createOTLPDrain()')\n return null\n }\n return config as OTLPConfig\n },\n send: sendBatchToOTLP,\n })\n}\n\n/**\n * Send a single event to an OTLP endpoint.\n *\n * @example\n * ```ts\n * await sendToOTLP(event, {\n * endpoint: 'http://localhost:4318',\n * })\n * ```\n */\nexport async function sendToOTLP(event: WideEvent, config: OTLPConfig): Promise<void> {\n await sendBatchToOTLP([event], config)\n}\n\n/**\n * Send a batch of events to an OTLP endpoint.\n *\n * @example\n * ```ts\n * await sendBatchToOTLP(events, {\n * endpoint: 'http://localhost:4318',\n * })\n * ```\n */\nexport async function sendBatchToOTLP(events: WideEvent[], config: OTLPConfig): Promise<void> {\n if (events.length === 0) return\n\n const url = `${config.endpoint.replace(/\\/$/, '')}/v1/logs`\n\n // Group events by service for proper resource attribution\n // For simplicity, we use the first event's resource attributes\n const [firstEvent] = events\n const resourceAttributes = buildResourceAttributes(firstEvent, config)\n\n const logRecords = events.map(toOTLPLogRecord)\n\n const payload: ExportLogsServiceRequest = {\n resourceLogs: [\n {\n resource: { attributes: resourceAttributes },\n scopeLogs: [\n {\n scope: { name: '@safaricom-mxl/log', version: '1.0.0' },\n logRecords,\n },\n ],\n },\n ],\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...config.headers,\n }\n\n await httpPost({\n url,\n headers,\n body: JSON.stringify(payload),\n timeout: config.timeout ?? 5000,\n label: 'OTLP',\n })\n}\n"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
- import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
1
+ import { T as WideEvent, r as DrainContext } from "../types-abpnM9XB.mjs";
4
2
  //#region src/adapters/posthog.d.ts
5
3
  interface PostHogConfig {
6
4
  /** PostHog project API key */
7
5
  apiKey: string;
8
6
  /** PostHog host URL. Default: https://us.i.posthog.com */
9
7
  host?: string;
10
- /** PostHog event name. Default: mxllog_wide_event */
8
+ /** Request timeout in milliseconds. Default: 5000 */
9
+ timeout?: number;
10
+ }
11
+ interface PostHogEventsConfig extends PostHogConfig {
12
+ /** PostHog event name. Default: @safaricom-mxl/log_wide_event */
11
13
  eventName?: string;
12
14
  /** Override distinct_id (defaults to event.service) */
13
15
  distinctId?: string;
14
- /** Request timeout in milliseconds. Default: 5000 */
15
- timeout?: number;
16
16
  }
17
17
  /** PostHog event structure for the batch API */
18
18
  interface PostHogEvent {
@@ -22,11 +22,11 @@ interface PostHogEvent {
22
22
  properties: Record<string, unknown>;
23
23
  }
24
24
  /**
25
- * Convert a WideEvent to a PostHog event format.
25
+ * Convert a WideEvent to a PostHog custom event format.
26
26
  */
27
- declare function toPostHogEvent(event: WideEvent, config: PostHogConfig): PostHogEvent;
27
+ declare function toPostHogEvent(event: WideEvent, config: PostHogEventsConfig): PostHogEvent;
28
28
  /**
29
- * Create a drain function for sending logs to PostHog.
29
+ * Create a drain function for sending logs to PostHog Logs via OTLP.
30
30
  *
31
31
  * Configuration priority (highest to lowest):
32
32
  * 1. Overrides passed to createPostHogDrain()
@@ -48,7 +48,7 @@ declare function toPostHogEvent(event: WideEvent, config: PostHogConfig): PostHo
48
48
  */
49
49
  declare function createPostHogDrain(overrides?: Partial<PostHogConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
50
50
  /**
51
- * Send a single event to PostHog.
51
+ * Send a single event to PostHog Logs via OTLP.
52
52
  *
53
53
  * @example
54
54
  * ```ts
@@ -59,7 +59,7 @@ declare function createPostHogDrain(overrides?: Partial<PostHogConfig>): (ctx: D
59
59
  */
60
60
  declare function sendToPostHog(event: WideEvent, config: PostHogConfig): Promise<void>;
61
61
  /**
62
- * Send a batch of events to PostHog.
62
+ * Send a batch of events to PostHog Logs via OTLP.
63
63
  *
64
64
  * @example
65
65
  * ```ts
@@ -69,39 +69,48 @@ declare function sendToPostHog(event: WideEvent, config: PostHogConfig): Promise
69
69
  * ```
70
70
  */
71
71
  declare function sendBatchToPostHog(events: WideEvent[], config: PostHogConfig): Promise<void>;
72
- interface PostHogLogsConfig {
73
- /** PostHog project API key */
74
- apiKey: string;
75
- /** PostHog host URL. Default: https://us.i.posthog.com */
76
- host?: string;
77
- /** Request timeout in milliseconds. Default: 5000 */
78
- timeout?: number;
79
- }
80
72
  /**
81
- * Create a drain function for sending logs to PostHog Logs via OTLP.
73
+ * Create a drain function for sending logs to PostHog as custom events.
82
74
  *
83
- * PostHog Logs uses the standard OTLP log format. This drain wraps
84
- * `sendBatchToOTLP()` with PostHog-specific defaults (endpoint, auth).
75
+ * Uses PostHog's `/batch/` API. Consider using `createPostHogDrain()` instead
76
+ * which uses PostHog Logs (OTLP) and is significantly cheaper.
85
77
  *
86
78
  * Configuration priority (highest to lowest):
87
- * 1. Overrides passed to createPostHogLogsDrain()
79
+ * 1. Overrides passed to createPostHogEventsDrain()
88
80
  * 2. runtimeConfig.mxllog.posthog
89
81
  * 3. runtimeConfig.posthog
90
- * 4. Environment variables: NUXT_POSTHOG_*, POSTHOG_*
82
+ * 4. Environment variables: NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY, NUXT_POSTHOG_HOST/POSTHOG_HOST
91
83
  *
92
84
  * @example
93
85
  * ```ts
94
- * // Zero config - just set NUXT_POSTHOG_API_KEY env var
95
- * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createPostHogLogsDrain())
96
- *
97
- * // With overrides
98
- * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createPostHogLogsDrain({
99
- * apiKey: 'phc_...',
100
- * host: 'https://eu.i.posthog.com',
86
+ * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createPostHogEventsDrain({
87
+ * eventName: 'server_request',
101
88
  * }))
102
89
  * ```
103
90
  */
104
- declare function createPostHogLogsDrain(overrides?: Partial<PostHogLogsConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
91
+ declare function createPostHogEventsDrain(overrides?: Partial<PostHogEventsConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
92
+ /**
93
+ * Send a single event to PostHog as a custom event.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * await sendToPostHogEvents(event, {
98
+ * apiKey: process.env.POSTHOG_API_KEY!,
99
+ * })
100
+ * ```
101
+ */
102
+ declare function sendToPostHogEvents(event: WideEvent, config: PostHogEventsConfig): Promise<void>;
103
+ /**
104
+ * Send a batch of events to PostHog as custom events via the `/batch/` API.
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * await sendBatchToPostHogEvents(events, {
109
+ * apiKey: process.env.POSTHOG_API_KEY!,
110
+ * })
111
+ * ```
112
+ */
113
+ declare function sendBatchToPostHogEvents(events: WideEvent[], config: PostHogEventsConfig): Promise<void>;
105
114
  //#endregion
106
- export { PostHogConfig, PostHogEvent, PostHogLogsConfig, createPostHogDrain, createPostHogLogsDrain, sendBatchToPostHog, sendToPostHog, toPostHogEvent };
115
+ export { PostHogConfig, PostHogEvent, PostHogEventsConfig, createPostHogDrain, createPostHogEventsDrain, sendBatchToPostHog, sendBatchToPostHogEvents, sendToPostHog, sendToPostHogEvents, toPostHogEvent };
107
116
  //# sourceMappingURL=posthog.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"posthog.d.mts","names":[],"sources":["../../src/adapters/posthog.ts"],"mappings":";;;;UAQiB,aAAA;;EAEf,MAAA;EAFe;EAIf,IAAA;;EAEA,SAAA;EAJA;EAMA,UAAA;EAFA;EAIA,OAAA;AAAA;;UAIe,YAAA;EACf,KAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA,EAAY,MAAA;AAAA;;;;iBAcE,cAAA,CAAe,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,aAAA,GAAgB,YAAA;;;AAAzE;;;;;;;;;;;;;;;AAoCA;;;;iBAAgB,kBAAA,CAAmB,SAAA,GAAY,OAAA,CAAQ,aAAA,KAAc,GAAA,EAAf,YAAA,GAAe,YAAA,OAAA,OAAA;;;;;;;;;;;iBAyB/C,aAAA,CAAc,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,aAAA,GAAgB,OAAA;;;;AAA9E;;;;;;;iBAcsB,kBAAA,CAAmB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,aAAA,GAAgB,OAAA;AAAA,UAsBrE,iBAAA;EApCmB;EAsClC,MAAA;EAtCoD;EAwCpD,IAAA;EAxCmF;EA0CnF,OAAA;AAAA;;;;;;;;;;;;;;;AANF;;;;;;;;;AAuCA;iBAAgB,sBAAA,CAAuB,SAAA,GAAY,OAAA,CAAQ,iBAAA,KAAkB,GAAA,EAAnB,YAAA,GAAmB,YAAA,OAAA,OAAA"}
1
+ {"version":3,"file":"posthog.d.mts","names":[],"sources":["../../src/adapters/posthog.ts"],"mappings":";;UAQiB,aAAA;;EAEf,MAAA;;EAEA,IAAA;;EAEA,OAAA;AAAA;AAAA,UAGe,mBAAA,SAA4B,aAAA;;EAE3C,SAAA;EATA;EAWA,UAAA;AAAA;;UAIe,YAAA;EACf,KAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA,EAAY,MAAA;AAAA;;;;iBA+BE,cAAA,CAAe,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,mBAAA,GAAsB,YAAA;AAnC/E;;;;;;;;;;;AAmCA;;;;;;;;;;AAnCA,iBA2EgB,kBAAA,CAAmB,SAAA,GAAY,OAAA,CAAQ,aAAA,KAAc,GAAA,EAAf,YAAA,GAAe,YAAA,OAAA,OAAA;;;;;AAArE;;;;;;iBAyBsB,aAAA,CAAc,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,aAAA,GAAgB,OAAA;;;;;;;;;;;iBAcxD,kBAAA,CAAmB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,aAAA,GAAgB,OAAA;;AAdtF;;;;;;;;;;;;;;;AAcA;;;iBA4BgB,wBAAA,CAAyB,SAAA,GAAY,OAAA,CAAQ,mBAAA,KAAoB,GAAA,EAArB,YAAA,GAAqB,YAAA,OAAA,OAAA;;;;;;;;;;;iBAyB3D,mBAAA,CAAoB,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,mBAAA,GAAsB,OAAA;AAzB1F;;;;;;;;;;AAAA,iBAuCsB,wBAAA,CAAyB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,mBAAA,GAAsB,OAAA"}