evlog 1.11.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/{_severity-D_IU9-90.mjs → _severity-78FkT5MD.mjs} +1 -1
  2. package/dist/{_severity-D_IU9-90.mjs.map → _severity-78FkT5MD.mjs.map} +1 -1
  3. package/dist/adapters/axiom.d.mts +18 -5
  4. package/dist/adapters/axiom.d.mts.map +1 -1
  5. package/dist/adapters/axiom.mjs +25 -1
  6. package/dist/adapters/axiom.mjs.map +1 -1
  7. package/dist/adapters/better-stack.d.mts +0 -2
  8. package/dist/adapters/better-stack.d.mts.map +1 -1
  9. package/dist/adapters/otlp.d.mts +0 -2
  10. package/dist/adapters/otlp.d.mts.map +1 -1
  11. package/dist/adapters/otlp.mjs +1 -1
  12. package/dist/adapters/posthog.d.mts +40 -31
  13. package/dist/adapters/posthog.d.mts.map +1 -1
  14. package/dist/adapters/posthog.mjs +71 -54
  15. package/dist/adapters/posthog.mjs.map +1 -1
  16. package/dist/adapters/sentry.d.mts +0 -2
  17. package/dist/adapters/sentry.d.mts.map +1 -1
  18. package/dist/adapters/sentry.mjs +1 -1
  19. package/dist/dist-By0jiJRA.mjs +52 -0
  20. package/dist/dist-By0jiJRA.mjs.map +1 -0
  21. package/dist/index.d.mts +2 -2
  22. package/dist/index.mjs +2 -2
  23. package/dist/logger.d.mts +14 -1
  24. package/dist/logger.d.mts.map +1 -1
  25. package/dist/logger.mjs +29 -14
  26. package/dist/logger.mjs.map +1 -1
  27. package/dist/next/client.d.mts +8 -0
  28. package/dist/next/client.d.mts.map +1 -1
  29. package/dist/next/client.mjs +3 -1
  30. package/dist/next/client.mjs.map +1 -1
  31. package/dist/next/index.d.mts +0 -1
  32. package/dist/next/index.d.mts.map +1 -1
  33. package/dist/nitro/module.d.mts +3 -2
  34. package/dist/nitro/module.d.mts.map +1 -1
  35. package/dist/nitro/module.mjs +1 -0
  36. package/dist/nitro/module.mjs.map +1 -1
  37. package/dist/nitro/v3/errorHandler.mjs +1 -1
  38. package/dist/nitro/v3/index.d.mts +0 -1
  39. package/dist/nitro/v3/module.d.mts +3 -2
  40. package/dist/nitro/v3/module.d.mts.map +1 -1
  41. package/dist/nitro/v3/module.mjs +2 -0
  42. package/dist/nitro/v3/module.mjs.map +1 -1
  43. package/dist/nitro/v3/plugin.mjs +1 -1
  44. package/dist/{nitro-CrFBjY1Y.d.mts → nitro-mfub2f8G.d.mts} +1 -1
  45. package/dist/{nitro-CrFBjY1Y.d.mts.map → nitro-mfub2f8G.d.mts.map} +1 -1
  46. package/dist/nuxt/module.d.mts +38 -11
  47. package/dist/nuxt/module.d.mts.map +1 -1
  48. package/dist/nuxt/module.mjs +2 -1
  49. package/dist/nuxt/module.mjs.map +1 -1
  50. package/dist/runtime/client/log.d.mts +1 -0
  51. package/dist/runtime/client/log.d.mts.map +1 -1
  52. package/dist/runtime/client/log.mjs +10 -6
  53. package/dist/runtime/client/log.mjs.map +1 -1
  54. package/dist/runtime/client/plugin.mjs +1 -0
  55. package/dist/runtime/client/plugin.mjs.map +1 -1
  56. package/package.json +5 -5
@@ -14,4 +14,4 @@ const OTEL_SEVERITY_TEXT = {
14
14
 
15
15
  //#endregion
16
16
  export { OTEL_SEVERITY_TEXT as n, OTEL_SEVERITY_NUMBER as t };
17
- //# sourceMappingURL=_severity-D_IU9-90.mjs.map
17
+ //# sourceMappingURL=_severity-78FkT5MD.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-78FkT5MD.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
1
  import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
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;EAFQ;EAIR,KAAA;;EAEA,KAAA;EAJA;EAMA,OAAA;AAAA;AAAA,UAGQ,eAAA;EAHD;;AAAA;;;EASP,OAAA;EAEO;EAAP,OAAA;AAAA;AAAA,UAGQ,mBAAA;EAER;EAAA,OAAA;EAKU;EAHV,OAAA;AAAA;AAAA,KAGU,WAAA,GAAc,eAAA,IAAmB,eAAA,GAAkB,mBAAA;;;;;;;;;;AAoC/D;;;;;;;;;;;iBAAgB,gBAAA,CAAiB,SAAA,GAAY,OAAA,CAAQ,WAAA,KAAY,GAAA,EAAb,YAAA,GAAa,YAAA,OAAA,OAAA;;;;;;;;AAoCjE;;;;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"}
@@ -14,6 +14,10 @@ const AXIOM_FIELDS = [
14
14
  key: "orgId",
15
15
  env: ["NUXT_AXIOM_ORG_ID", "AXIOM_ORG_ID"]
16
16
  },
17
+ {
18
+ key: "edgeUrl",
19
+ env: ["NUXT_AXIOM_EDGE_URL", "AXIOM_EDGE_URL"]
20
+ },
17
21
  {
18
22
  key: "baseUrl",
19
23
  env: ["NUXT_AXIOM_URL", "AXIOM_URL"]
@@ -49,6 +53,10 @@ function createAxiomDrain(overrides) {
49
53
  console.error("[evlog/axiom] Missing dataset or token. Set NUXT_AXIOM_TOKEN/NUXT_AXIOM_DATASET env vars or pass to createAxiomDrain()");
50
54
  return null;
51
55
  }
56
+ if (config.edgeUrl && config.baseUrl) {
57
+ console.warn("[evlog/axiom] Both edgeUrl and baseUrl are set. edgeUrl takes precedence for ingest.");
58
+ delete config.baseUrl;
59
+ }
52
60
  return config;
53
61
  },
54
62
  send: sendBatchToAxiom
@@ -80,7 +88,7 @@ async function sendToAxiom(event, config) {
80
88
  * ```
81
89
  */
82
90
  async function sendBatchToAxiom(events, config) {
83
- const url = `${config.baseUrl ?? "https://api.axiom.co"}/v1/datasets/${encodeURIComponent(config.dataset)}/ingest`;
91
+ const url = resolveIngestUrl(config);
84
92
  const headers = {
85
93
  "Content-Type": "application/json",
86
94
  "Authorization": `Bearer ${config.token}`
@@ -94,6 +102,22 @@ async function sendBatchToAxiom(events, config) {
94
102
  label: "Axiom"
95
103
  });
96
104
  }
105
+ function resolveIngestUrl(config) {
106
+ const encodedDataset = encodeURIComponent(config.dataset);
107
+ if (!config.edgeUrl) return `${config.baseUrl ?? "https://api.axiom.co"}/v1/datasets/${encodedDataset}/ingest`;
108
+ try {
109
+ const parsed = new URL(config.edgeUrl);
110
+ if (parsed.pathname === "" || parsed.pathname === "/") {
111
+ parsed.pathname = `/v1/ingest/${encodedDataset}`;
112
+ return parsed.toString();
113
+ }
114
+ parsed.pathname = parsed.pathname.replace(/\/+$/, "");
115
+ return parsed.toString();
116
+ } catch {
117
+ console.warn(`[evlog/axiom] edgeUrl "${config.edgeUrl}" is not a valid URL, falling back to string concatenation.`);
118
+ return `${config.edgeUrl.replace(/\/+$/, "")}/v1/ingest/${encodedDataset}`;
119
+ }
120
+ }
97
121
 
98
122
  //#endregion
99
123
  export { createAxiomDrain, sendBatchToAxiom, sendToAxiom };
@@ -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.evlog.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('evlog:drain', createAxiomDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('evlog: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('[evlog/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,yHAAyH;AACvI,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.evlog.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('evlog:drain', createAxiomDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('evlog: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('[evlog/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('[evlog/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(`[evlog/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,yHAAyH;AACvI,WAAO;;AAGT,OAAI,OAAO,WAAW,OAAO,SAAS;AACpC,YAAQ,KAAK,uFAAuF;AACpG,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,0BAA0B,OAAO,QAAQ,6DAA6D;AAEnH,SAAO,GADS,OAAO,QAAQ,QAAQ,QAAQ,GAAG,CAChC,aAAa"}
@@ -1,6 +1,4 @@
1
1
  import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
4
2
  //#region src/adapters/better-stack.d.ts
5
3
  interface BetterStackConfig {
6
4
  /** Better Stack source token */
@@ -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;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,6 +1,4 @@
1
1
  import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
4
2
  //#region src/adapters/otlp.d.ts
5
3
  interface OTLPConfig {
6
4
  /** OTLP HTTP endpoint (e.g., http://localhost:4318) */
@@ -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;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,5 +1,5 @@
1
1
  import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-DVDwNag0.mjs";
2
- import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "../_severity-D_IU9-90.mjs";
2
+ import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "../_severity-78FkT5MD.mjs";
3
3
 
4
4
  //#region src/adapters/otlp.ts
5
5
  const OTLP_FIELDS = [
@@ -1,18 +1,18 @@
1
1
  import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
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;
8
+ /** Request timeout in milliseconds. Default: 5000 */
9
+ timeout?: number;
10
+ }
11
+ interface PostHogEventsConfig extends PostHogConfig {
10
12
  /** PostHog event name. Default: evlog_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.evlog.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('evlog:drain', createPostHogLogsDrain())
96
- *
97
- * // With overrides
98
- * nitroApp.hooks.hook('evlog:drain', createPostHogLogsDrain({
99
- * apiKey: 'phc_...',
100
- * host: 'https://eu.i.posthog.com',
86
+ * nitroApp.hooks.hook('evlog: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;EAFe;EAIf,IAAA;;EAEA,OAAA;AAAA;AAAA,UAGe,mBAAA,SAA4B,aAAA;EAH3C;EAKA,SAAA;EALO;EAOP,UAAA;AAAA;;UAIe,YAAA;EACf,KAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA,EAAY,MAAA;AAAA;AAJd;;;AAAA,iBAmCgB,cAAA,CAAe,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,mBAAA,GAAsB,YAAA;;;;;;;;AAA/E;;;;;;;;;;;;;;iBAwCgB,kBAAA,CAAmB,SAAA,GAAY,OAAA,CAAQ,aAAA,KAAc,GAAA,EAAf,YAAA,GAAe,YAAA,OAAA,OAAA;AAArE;;;;;;;;;;AAAA,iBAyBsB,aAAA,CAAc,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,aAAA,GAAgB,OAAA;;;;;;;;;AAA9E;;iBAcsB,kBAAA,CAAmB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,aAAA,GAAgB,OAAA;;;;;;;;;;;;;AAAtF;;;;;;;iBA4BgB,wBAAA,CAAyB,SAAA,GAAY,OAAA,CAAQ,mBAAA,KAAoB,GAAA,EAArB,YAAA,GAAqB,YAAA,OAAA,OAAA;;;;;;;;AAAjF;;;iBAyBsB,mBAAA,CAAoB,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,mBAAA,GAAsB,OAAA;;;;;;;;;;;iBAcpE,wBAAA,CAAyB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,mBAAA,GAAsB,OAAA"}
@@ -11,12 +11,25 @@ const POSTHOG_FIELDS = [
11
11
  key: "host",
12
12
  env: ["NUXT_POSTHOG_HOST", "POSTHOG_HOST"]
13
13
  },
14
- { key: "eventName" },
15
- { key: "distinctId" },
16
14
  { key: "timeout" }
17
15
  ];
16
+ const POSTHOG_EVENTS_FIELDS = [
17
+ ...POSTHOG_FIELDS,
18
+ { key: "eventName" },
19
+ { key: "distinctId" }
20
+ ];
21
+ function resolveHost(config) {
22
+ return (config.host ?? "https://us.i.posthog.com").replace(/\/$/, "");
23
+ }
24
+ function toOTLPConfig(config) {
25
+ return {
26
+ endpoint: `${resolveHost(config)}/i`,
27
+ headers: { Authorization: `Bearer ${config.apiKey}` },
28
+ timeout: config.timeout
29
+ };
30
+ }
18
31
  /**
19
- * Convert a WideEvent to a PostHog event format.
32
+ * Convert a WideEvent to a PostHog custom event format.
20
33
  */
21
34
  function toPostHogEvent(event, config) {
22
35
  const { timestamp, level, service, ...rest } = event;
@@ -32,7 +45,7 @@ function toPostHogEvent(event, config) {
32
45
  };
33
46
  }
34
47
  /**
35
- * Create a drain function for sending logs to PostHog.
48
+ * Create a drain function for sending logs to PostHog Logs via OTLP.
36
49
  *
37
50
  * Configuration priority (highest to lowest):
38
51
  * 1. Overrides passed to createPostHogDrain()
@@ -67,7 +80,7 @@ function createPostHogDrain(overrides) {
67
80
  });
68
81
  }
69
82
  /**
70
- * Send a single event to PostHog.
83
+ * Send a single event to PostHog Logs via OTLP.
71
84
  *
72
85
  * @example
73
86
  * ```ts
@@ -80,7 +93,7 @@ async function sendToPostHog(event, config) {
80
93
  await sendBatchToPostHog([event], config);
81
94
  }
82
95
  /**
83
- * Send a batch of events to PostHog.
96
+ * Send a batch of events to PostHog Logs via OTLP.
84
97
  *
85
98
  * @example
86
99
  * ```ts
@@ -91,76 +104,80 @@ async function sendToPostHog(event, config) {
91
104
  */
92
105
  async function sendBatchToPostHog(events, config) {
93
106
  if (events.length === 0) return;
94
- const url = `${(config.host ?? "https://us.i.posthog.com").replace(/\/$/, "")}/batch/`;
95
- const batch = events.map((event) => toPostHogEvent(event, config));
96
- const payload = {
97
- api_key: config.apiKey,
98
- batch
99
- };
100
- await httpPost({
101
- url,
102
- headers: { "Content-Type": "application/json" },
103
- body: JSON.stringify(payload),
104
- timeout: config.timeout ?? 5e3,
105
- label: "PostHog"
106
- });
107
+ await sendBatchToOTLP(events, toOTLPConfig(config));
107
108
  }
108
- const POSTHOG_LOGS_FIELDS = [
109
- {
110
- key: "apiKey",
111
- env: ["NUXT_POSTHOG_API_KEY", "POSTHOG_API_KEY"]
112
- },
113
- {
114
- key: "host",
115
- env: ["NUXT_POSTHOG_HOST", "POSTHOG_HOST"]
116
- },
117
- { key: "timeout" }
118
- ];
119
109
  /**
120
- * Create a drain function for sending logs to PostHog Logs via OTLP.
110
+ * Create a drain function for sending logs to PostHog as custom events.
121
111
  *
122
- * PostHog Logs uses the standard OTLP log format. This drain wraps
123
- * `sendBatchToOTLP()` with PostHog-specific defaults (endpoint, auth).
112
+ * Uses PostHog's `/batch/` API. Consider using `createPostHogDrain()` instead
113
+ * which uses PostHog Logs (OTLP) and is significantly cheaper.
124
114
  *
125
115
  * Configuration priority (highest to lowest):
126
- * 1. Overrides passed to createPostHogLogsDrain()
116
+ * 1. Overrides passed to createPostHogEventsDrain()
127
117
  * 2. runtimeConfig.evlog.posthog
128
118
  * 3. runtimeConfig.posthog
129
- * 4. Environment variables: NUXT_POSTHOG_*, POSTHOG_*
119
+ * 4. Environment variables: NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY, NUXT_POSTHOG_HOST/POSTHOG_HOST
130
120
  *
131
121
  * @example
132
122
  * ```ts
133
- * // Zero config - just set NUXT_POSTHOG_API_KEY env var
134
- * nitroApp.hooks.hook('evlog:drain', createPostHogLogsDrain())
135
- *
136
- * // With overrides
137
- * nitroApp.hooks.hook('evlog:drain', createPostHogLogsDrain({
138
- * apiKey: 'phc_...',
139
- * host: 'https://eu.i.posthog.com',
123
+ * nitroApp.hooks.hook('evlog:drain', createPostHogEventsDrain({
124
+ * eventName: 'server_request',
140
125
  * }))
141
126
  * ```
142
127
  */
143
- function createPostHogLogsDrain(overrides) {
128
+ function createPostHogEventsDrain(overrides) {
144
129
  return defineDrain({
145
- name: "posthog",
130
+ name: "posthog-events",
146
131
  resolve: () => {
147
- const config = resolveAdapterConfig("posthog", POSTHOG_LOGS_FIELDS, overrides);
132
+ const config = resolveAdapterConfig("posthog", POSTHOG_EVENTS_FIELDS, overrides);
148
133
  if (!config.apiKey) {
149
- console.error("[evlog/posthog] Missing apiKey. Set NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY env var or pass to createPostHogLogsDrain()");
134
+ console.error("[evlog/posthog-events] Missing apiKey. Set NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY env var or pass to createPostHogEventsDrain()");
150
135
  return null;
151
136
  }
152
137
  return config;
153
138
  },
154
- send: async (events, config) => {
155
- await sendBatchToOTLP(events, {
156
- endpoint: `${(config.host ?? "https://us.i.posthog.com").replace(/\/$/, "")}/i`,
157
- headers: { Authorization: `Bearer ${config.apiKey}` },
158
- timeout: config.timeout
159
- });
160
- }
139
+ send: sendBatchToPostHogEvents
140
+ });
141
+ }
142
+ /**
143
+ * Send a single event to PostHog as a custom event.
144
+ *
145
+ * @example
146
+ * ```ts
147
+ * await sendToPostHogEvents(event, {
148
+ * apiKey: process.env.POSTHOG_API_KEY!,
149
+ * })
150
+ * ```
151
+ */
152
+ async function sendToPostHogEvents(event, config) {
153
+ await sendBatchToPostHogEvents([event], config);
154
+ }
155
+ /**
156
+ * Send a batch of events to PostHog as custom events via the `/batch/` API.
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * await sendBatchToPostHogEvents(events, {
161
+ * apiKey: process.env.POSTHOG_API_KEY!,
162
+ * })
163
+ * ```
164
+ */
165
+ async function sendBatchToPostHogEvents(events, config) {
166
+ if (events.length === 0) return;
167
+ const url = `${resolveHost(config)}/batch/`;
168
+ const batch = events.map((event) => toPostHogEvent(event, config));
169
+ await httpPost({
170
+ url,
171
+ headers: { "Content-Type": "application/json" },
172
+ body: JSON.stringify({
173
+ api_key: config.apiKey,
174
+ batch
175
+ }),
176
+ timeout: config.timeout ?? 5e3,
177
+ label: "PostHog"
161
178
  });
162
179
  }
163
180
 
164
181
  //#endregion
165
- export { createPostHogDrain, createPostHogLogsDrain, sendBatchToPostHog, sendToPostHog, toPostHogEvent };
182
+ export { createPostHogDrain, createPostHogEventsDrain, sendBatchToPostHog, sendBatchToPostHogEvents, sendToPostHog, sendToPostHogEvents, toPostHogEvent };
166
183
  //# sourceMappingURL=posthog.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"posthog.mjs","names":[],"sources":["../../src/adapters/posthog.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 { sendBatchToOTLP } from './otlp'\nimport type { OTLPConfig } from './otlp'\n\nexport interface PostHogConfig {\n /** PostHog project API key */\n apiKey: string\n /** PostHog host URL. Default: https://us.i.posthog.com */\n host?: string\n /** PostHog event name. Default: evlog_wide_event */\n eventName?: string\n /** Override distinct_id (defaults to event.service) */\n distinctId?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\n/** PostHog event structure for the batch API */\nexport interface PostHogEvent {\n event: string\n distinct_id: string\n timestamp: string\n properties: Record<string, unknown>\n}\n\nconst POSTHOG_FIELDS: ConfigField<PostHogConfig>[] = [\n { key: 'apiKey', env: ['NUXT_POSTHOG_API_KEY', 'POSTHOG_API_KEY'] },\n { key: 'host', env: ['NUXT_POSTHOG_HOST', 'POSTHOG_HOST'] },\n { key: 'eventName' },\n { key: 'distinctId' },\n { key: 'timeout' },\n]\n\n/**\n * Convert a WideEvent to a PostHog event format.\n */\nexport function toPostHogEvent(event: WideEvent, config: PostHogConfig): PostHogEvent {\n const { timestamp, level, service, ...rest } = event\n\n return {\n event: config.eventName ?? 'evlog_wide_event',\n distinct_id: config.distinctId ?? (typeof event.userId === 'string' ? event.userId : undefined) ?? service,\n timestamp,\n properties: {\n level,\n service,\n ...rest,\n },\n }\n}\n\n/**\n * Create a drain function for sending logs to PostHog.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createPostHogDrain()\n * 2. runtimeConfig.evlog.posthog\n * 3. runtimeConfig.posthog\n * 4. Environment variables: NUXT_POSTHOG_*, POSTHOG_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_POSTHOG_API_KEY env var\n * nitroApp.hooks.hook('evlog:drain', createPostHogDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('evlog:drain', createPostHogDrain({\n * apiKey: 'phc_...',\n * host: 'https://eu.i.posthog.com',\n * }))\n * ```\n */\nexport function createPostHogDrain(overrides?: Partial<PostHogConfig>) {\n return defineDrain<PostHogConfig>({\n name: 'posthog',\n resolve: () => {\n const config = resolveAdapterConfig<PostHogConfig>('posthog', POSTHOG_FIELDS, overrides)\n if (!config.apiKey) {\n console.error('[evlog/posthog] Missing apiKey. Set NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY env var or pass to createPostHogDrain()')\n return null\n }\n return config as PostHogConfig\n },\n send: sendBatchToPostHog,\n })\n}\n\n/**\n * Send a single event to PostHog.\n *\n * @example\n * ```ts\n * await sendToPostHog(event, {\n * apiKey: process.env.POSTHOG_API_KEY!,\n * })\n * ```\n */\nexport async function sendToPostHog(event: WideEvent, config: PostHogConfig): Promise<void> {\n await sendBatchToPostHog([event], config)\n}\n\n/**\n * Send a batch of events to PostHog.\n *\n * @example\n * ```ts\n * await sendBatchToPostHog(events, {\n * apiKey: process.env.POSTHOG_API_KEY!,\n * })\n * ```\n */\nexport async function sendBatchToPostHog(events: WideEvent[], config: PostHogConfig): Promise<void> {\n if (events.length === 0) return\n\n const host = (config.host ?? 'https://us.i.posthog.com').replace(/\\/$/, '')\n const url = `${host}/batch/`\n\n const batch = events.map(event => toPostHogEvent(event, config))\n\n const payload = {\n api_key: config.apiKey,\n batch,\n }\n\n await httpPost({\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n timeout: config.timeout ?? 5000,\n label: 'PostHog',\n })\n}\n\nexport interface PostHogLogsConfig {\n /** PostHog project API key */\n apiKey: string\n /** PostHog host URL. Default: https://us.i.posthog.com */\n host?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\nconst POSTHOG_LOGS_FIELDS: ConfigField<PostHogLogsConfig>[] = [\n { key: 'apiKey', env: ['NUXT_POSTHOG_API_KEY', 'POSTHOG_API_KEY'] },\n { key: 'host', env: ['NUXT_POSTHOG_HOST', 'POSTHOG_HOST'] },\n { key: 'timeout' },\n]\n\n/**\n * Create a drain function for sending logs to PostHog Logs via OTLP.\n *\n * PostHog Logs uses the standard OTLP log format. This drain wraps\n * `sendBatchToOTLP()` with PostHog-specific defaults (endpoint, auth).\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createPostHogLogsDrain()\n * 2. runtimeConfig.evlog.posthog\n * 3. runtimeConfig.posthog\n * 4. Environment variables: NUXT_POSTHOG_*, POSTHOG_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_POSTHOG_API_KEY env var\n * nitroApp.hooks.hook('evlog:drain', createPostHogLogsDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('evlog:drain', createPostHogLogsDrain({\n * apiKey: 'phc_...',\n * host: 'https://eu.i.posthog.com',\n * }))\n * ```\n */\nexport function createPostHogLogsDrain(overrides?: Partial<PostHogLogsConfig>) {\n return defineDrain<PostHogLogsConfig>({\n name: 'posthog',\n resolve: () => {\n const config = resolveAdapterConfig<PostHogLogsConfig>('posthog', POSTHOG_LOGS_FIELDS, overrides)\n if (!config.apiKey) {\n console.error('[evlog/posthog] Missing apiKey. Set NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY env var or pass to createPostHogLogsDrain()')\n return null\n }\n return config as PostHogLogsConfig\n },\n send: async (events, config) => {\n const host = (config.host ?? 'https://us.i.posthog.com').replace(/\\/$/, '')\n const otlpConfig: OTLPConfig = {\n endpoint: `${host}/i`,\n headers: { Authorization: `Bearer ${config.apiKey}` },\n timeout: config.timeout,\n }\n await sendBatchToOTLP(events, otlpConfig)\n },\n })\n}\n"],"mappings":";;;;AA6BA,MAAM,iBAA+C;CACnD;EAAE,KAAK;EAAU,KAAK,CAAC,wBAAwB,kBAAkB;EAAE;CACnE;EAAE,KAAK;EAAQ,KAAK,CAAC,qBAAqB,eAAe;EAAE;CAC3D,EAAE,KAAK,aAAa;CACpB,EAAE,KAAK,cAAc;CACrB,EAAE,KAAK,WAAW;CACnB;;;;AAKD,SAAgB,eAAe,OAAkB,QAAqC;CACpF,MAAM,EAAE,WAAW,OAAO,SAAS,GAAG,SAAS;AAE/C,QAAO;EACL,OAAO,OAAO,aAAa;EAC3B,aAAa,OAAO,eAAe,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS,WAAc;EACnG;EACA,YAAY;GACV;GACA;GACA,GAAG;GACJ;EACF;;;;;;;;;;;;;;;;;;;;;;;AAwBH,SAAgB,mBAAmB,WAAoC;AACrE,QAAO,YAA2B;EAChC,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAAoC,WAAW,gBAAgB,UAAU;AACxF,OAAI,CAAC,OAAO,QAAQ;AAClB,YAAQ,MAAM,mHAAmH;AACjI,WAAO;;AAET,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;AAaJ,eAAsB,cAAc,OAAkB,QAAsC;AAC1F,OAAM,mBAAmB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;AAa3C,eAAsB,mBAAmB,QAAqB,QAAsC;AAClG,KAAI,OAAO,WAAW,EAAG;CAGzB,MAAM,MAAM,IADE,OAAO,QAAQ,4BAA4B,QAAQ,OAAO,GAAG,CACvD;CAEpB,MAAM,QAAQ,OAAO,KAAI,UAAS,eAAe,OAAO,OAAO,CAAC;CAEhE,MAAM,UAAU;EACd,SAAS,OAAO;EAChB;EACD;AAED,OAAM,SAAS;EACb;EACA,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU,QAAQ;EAC7B,SAAS,OAAO,WAAW;EAC3B,OAAO;EACR,CAAC;;AAYJ,MAAM,sBAAwD;CAC5D;EAAE,KAAK;EAAU,KAAK,CAAC,wBAAwB,kBAAkB;EAAE;CACnE;EAAE,KAAK;EAAQ,KAAK,CAAC,qBAAqB,eAAe;EAAE;CAC3D,EAAE,KAAK,WAAW;CACnB;;;;;;;;;;;;;;;;;;;;;;;;;AA0BD,SAAgB,uBAAuB,WAAwC;AAC7E,QAAO,YAA+B;EACpC,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAAwC,WAAW,qBAAqB,UAAU;AACjG,OAAI,CAAC,OAAO,QAAQ;AAClB,YAAQ,MAAM,uHAAuH;AACrI,WAAO;;AAET,UAAO;;EAET,MAAM,OAAO,QAAQ,WAAW;AAO9B,SAAM,gBAAgB,QALS;IAC7B,UAAU,IAFE,OAAO,QAAQ,4BAA4B,QAAQ,OAAO,GAAG,CAEvD;IAClB,SAAS,EAAE,eAAe,UAAU,OAAO,UAAU;IACrD,SAAS,OAAO;IACjB,CACwC;;EAE5C,CAAC"}
1
+ {"version":3,"file":"posthog.mjs","names":[],"sources":["../../src/adapters/posthog.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 { sendBatchToOTLP } from './otlp'\nimport type { OTLPConfig } from './otlp'\n\nexport interface PostHogConfig {\n /** PostHog project API key */\n apiKey: string\n /** PostHog host URL. Default: https://us.i.posthog.com */\n host?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\nexport interface PostHogEventsConfig extends PostHogConfig {\n /** PostHog event name. Default: evlog_wide_event */\n eventName?: string\n /** Override distinct_id (defaults to event.service) */\n distinctId?: string\n}\n\n/** PostHog event structure for the batch API */\nexport interface PostHogEvent {\n event: string\n distinct_id: string\n timestamp: string\n properties: Record<string, unknown>\n}\n\nconst POSTHOG_FIELDS: ConfigField<PostHogConfig>[] = [\n { key: 'apiKey', env: ['NUXT_POSTHOG_API_KEY', 'POSTHOG_API_KEY'] },\n { key: 'host', env: ['NUXT_POSTHOG_HOST', 'POSTHOG_HOST'] },\n { key: 'timeout' },\n]\n\nconst POSTHOG_EVENTS_FIELDS: ConfigField<PostHogEventsConfig>[] = [\n ...POSTHOG_FIELDS,\n { key: 'eventName' },\n { key: 'distinctId' },\n]\n\nfunction resolveHost(config: PostHogConfig): string {\n return (config.host ?? 'https://us.i.posthog.com').replace(/\\/$/, '')\n}\n\nfunction toOTLPConfig(config: PostHogConfig): OTLPConfig {\n const host = resolveHost(config)\n return {\n endpoint: `${host}/i`,\n headers: { Authorization: `Bearer ${config.apiKey}` },\n timeout: config.timeout,\n }\n}\n\n/**\n * Convert a WideEvent to a PostHog custom event format.\n */\nexport function toPostHogEvent(event: WideEvent, config: PostHogEventsConfig): PostHogEvent {\n const { timestamp, level, service, ...rest } = event\n\n return {\n event: config.eventName ?? 'evlog_wide_event',\n distinct_id: config.distinctId ?? (typeof event.userId === 'string' ? event.userId : undefined) ?? service,\n timestamp,\n properties: {\n level,\n service,\n ...rest,\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// PostHog Logs (OTLP) — default\n// ---------------------------------------------------------------------------\n\n/**\n * Create a drain function for sending logs to PostHog Logs via OTLP.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createPostHogDrain()\n * 2. runtimeConfig.evlog.posthog\n * 3. runtimeConfig.posthog\n * 4. Environment variables: NUXT_POSTHOG_*, POSTHOG_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_POSTHOG_API_KEY env var\n * nitroApp.hooks.hook('evlog:drain', createPostHogDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('evlog:drain', createPostHogDrain({\n * apiKey: 'phc_...',\n * host: 'https://eu.i.posthog.com',\n * }))\n * ```\n */\nexport function createPostHogDrain(overrides?: Partial<PostHogConfig>) {\n return defineDrain<PostHogConfig>({\n name: 'posthog',\n resolve: () => {\n const config = resolveAdapterConfig<PostHogConfig>('posthog', POSTHOG_FIELDS, overrides)\n if (!config.apiKey) {\n console.error('[evlog/posthog] Missing apiKey. Set NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY env var or pass to createPostHogDrain()')\n return null\n }\n return config as PostHogConfig\n },\n send: sendBatchToPostHog,\n })\n}\n\n/**\n * Send a single event to PostHog Logs via OTLP.\n *\n * @example\n * ```ts\n * await sendToPostHog(event, {\n * apiKey: process.env.POSTHOG_API_KEY!,\n * })\n * ```\n */\nexport async function sendToPostHog(event: WideEvent, config: PostHogConfig): Promise<void> {\n await sendBatchToPostHog([event], config)\n}\n\n/**\n * Send a batch of events to PostHog Logs via OTLP.\n *\n * @example\n * ```ts\n * await sendBatchToPostHog(events, {\n * apiKey: process.env.POSTHOG_API_KEY!,\n * })\n * ```\n */\nexport async function sendBatchToPostHog(events: WideEvent[], config: PostHogConfig): Promise<void> {\n if (events.length === 0) return\n await sendBatchToOTLP(events, toOTLPConfig(config))\n}\n\n// ---------------------------------------------------------------------------\n// PostHog Events (custom events via /batch/)\n// ---------------------------------------------------------------------------\n\n/**\n * Create a drain function for sending logs to PostHog as custom events.\n *\n * Uses PostHog's `/batch/` API. Consider using `createPostHogDrain()` instead\n * which uses PostHog Logs (OTLP) and is significantly cheaper.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createPostHogEventsDrain()\n * 2. runtimeConfig.evlog.posthog\n * 3. runtimeConfig.posthog\n * 4. Environment variables: NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY, NUXT_POSTHOG_HOST/POSTHOG_HOST\n *\n * @example\n * ```ts\n * nitroApp.hooks.hook('evlog:drain', createPostHogEventsDrain({\n * eventName: 'server_request',\n * }))\n * ```\n */\nexport function createPostHogEventsDrain(overrides?: Partial<PostHogEventsConfig>) {\n return defineDrain<PostHogEventsConfig>({\n name: 'posthog-events',\n resolve: () => {\n const config = resolveAdapterConfig<PostHogEventsConfig>('posthog', POSTHOG_EVENTS_FIELDS, overrides)\n if (!config.apiKey) {\n console.error('[evlog/posthog-events] Missing apiKey. Set NUXT_POSTHOG_API_KEY/POSTHOG_API_KEY env var or pass to createPostHogEventsDrain()')\n return null\n }\n return config as PostHogEventsConfig\n },\n send: sendBatchToPostHogEvents,\n })\n}\n\n/**\n * Send a single event to PostHog as a custom event.\n *\n * @example\n * ```ts\n * await sendToPostHogEvents(event, {\n * apiKey: process.env.POSTHOG_API_KEY!,\n * })\n * ```\n */\nexport async function sendToPostHogEvents(event: WideEvent, config: PostHogEventsConfig): Promise<void> {\n await sendBatchToPostHogEvents([event], config)\n}\n\n/**\n * Send a batch of events to PostHog as custom events via the `/batch/` API.\n *\n * @example\n * ```ts\n * await sendBatchToPostHogEvents(events, {\n * apiKey: process.env.POSTHOG_API_KEY!,\n * })\n * ```\n */\nexport async function sendBatchToPostHogEvents(events: WideEvent[], config: PostHogEventsConfig): Promise<void> {\n if (events.length === 0) return\n\n const url = `${resolveHost(config)}/batch/`\n const batch = events.map(event => toPostHogEvent(event, config))\n\n await httpPost({\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ api_key: config.apiKey, batch }),\n timeout: config.timeout ?? 5000,\n label: 'PostHog',\n })\n}\n"],"mappings":";;;;AAgCA,MAAM,iBAA+C;CACnD;EAAE,KAAK;EAAU,KAAK,CAAC,wBAAwB,kBAAkB;EAAE;CACnE;EAAE,KAAK;EAAQ,KAAK,CAAC,qBAAqB,eAAe;EAAE;CAC3D,EAAE,KAAK,WAAW;CACnB;AAED,MAAM,wBAA4D;CAChE,GAAG;CACH,EAAE,KAAK,aAAa;CACpB,EAAE,KAAK,cAAc;CACtB;AAED,SAAS,YAAY,QAA+B;AAClD,SAAQ,OAAO,QAAQ,4BAA4B,QAAQ,OAAO,GAAG;;AAGvE,SAAS,aAAa,QAAmC;AAEvD,QAAO;EACL,UAAU,GAFC,YAAY,OAAO,CAEZ;EAClB,SAAS,EAAE,eAAe,UAAU,OAAO,UAAU;EACrD,SAAS,OAAO;EACjB;;;;;AAMH,SAAgB,eAAe,OAAkB,QAA2C;CAC1F,MAAM,EAAE,WAAW,OAAO,SAAS,GAAG,SAAS;AAE/C,QAAO;EACL,OAAO,OAAO,aAAa;EAC3B,aAAa,OAAO,eAAe,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS,WAAc;EACnG;EACA,YAAY;GACV;GACA;GACA,GAAG;GACJ;EACF;;;;;;;;;;;;;;;;;;;;;;;AA4BH,SAAgB,mBAAmB,WAAoC;AACrE,QAAO,YAA2B;EAChC,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAAoC,WAAW,gBAAgB,UAAU;AACxF,OAAI,CAAC,OAAO,QAAQ;AAClB,YAAQ,MAAM,mHAAmH;AACjI,WAAO;;AAET,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;AAaJ,eAAsB,cAAc,OAAkB,QAAsC;AAC1F,OAAM,mBAAmB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;AAa3C,eAAsB,mBAAmB,QAAqB,QAAsC;AAClG,KAAI,OAAO,WAAW,EAAG;AACzB,OAAM,gBAAgB,QAAQ,aAAa,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;AA0BrD,SAAgB,yBAAyB,WAA0C;AACjF,QAAO,YAAiC;EACtC,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAA0C,WAAW,uBAAuB,UAAU;AACrG,OAAI,CAAC,OAAO,QAAQ;AAClB,YAAQ,MAAM,gIAAgI;AAC9I,WAAO;;AAET,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;AAaJ,eAAsB,oBAAoB,OAAkB,QAA4C;AACtG,OAAM,yBAAyB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;AAajD,eAAsB,yBAAyB,QAAqB,QAA4C;AAC9G,KAAI,OAAO,WAAW,EAAG;CAEzB,MAAM,MAAM,GAAG,YAAY,OAAO,CAAC;CACnC,MAAM,QAAQ,OAAO,KAAI,UAAS,eAAe,OAAO,OAAO,CAAC;AAEhE,OAAM,SAAS;EACb;EACA,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU;GAAE,SAAS,OAAO;GAAQ;GAAO,CAAC;EACvD,SAAS,OAAO,WAAW;EAC3B,OAAO;EACR,CAAC"}
@@ -1,6 +1,4 @@
1
1
  import { DrainContext, WideEvent } from "../types.mjs";
2
- import "../index.mjs";
3
-
4
2
  //#region src/adapters/sentry.d.ts
5
3
  interface SentryConfig {
6
4
  /** Sentry DSN */
@@ -1 +1 @@
1
- {"version":3,"file":"sentry.d.mts","names":[],"sources":["../../src/adapters/sentry.ts"],"mappings":";;;;UAOiB,YAAA;;EAEf,GAAA;EAFe;EAIf,WAAA;;EAEA,OAAA;EAJA;EAMA,IAAA,GAAO,MAAA;EAFP;EAIA,OAAA;AAAA;;UAIe,oBAAA;EACf,KAAA;EACA,IAAA;AAAA;;UAIe,SAAA;EACf,SAAA;EACA,QAAA;EACA,KAAA;EACA,IAAA;EACA,eAAA;EACA,UAAA,GAAa,MAAA,SAAe,oBAAA;AAAA;AAAA,iBA0Fd,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,YAAA,GAAe,SAAA;;;;;;;;AAArE;;;;;;;;;;;;;;;AAiGA;iBAAgB,iBAAA,CAAkB,SAAA,GAAY,OAAA,CAAQ,YAAA,KAAa,GAAA,EAAd,YAAA,GAAc,YAAA,OAAA,OAAA;;;;;;;;;;;iBAyB7C,YAAA,CAAa,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,YAAA,GAAe,OAAA;;;;;;;AAA5E;;;;iBAcsB,iBAAA,CAAkB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,YAAA,GAAe,OAAA"}
1
+ {"version":3,"file":"sentry.d.mts","names":[],"sources":["../../src/adapters/sentry.ts"],"mappings":";;UAOiB,YAAA;;EAEf,GAAA;EAFe;EAIf,WAAA;;EAEA,OAAA;EAJA;EAMA,IAAA,GAAO,MAAA;EAFP;EAIA,OAAA;AAAA;;UAIe,oBAAA;EACf,KAAA;EACA,IAAA;AAAA;;UAIe,SAAA;EACf,SAAA;EACA,QAAA;EACA,KAAA;EACA,IAAA;EACA,eAAA;EACA,UAAA,GAAa,MAAA,SAAe,oBAAA;AAAA;AAAA,iBA0Fd,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,YAAA,GAAe,SAAA;;;;;;;;AAArE;;;;;;;;;;;;;;;AAiGA;iBAAgB,iBAAA,CAAkB,SAAA,GAAY,OAAA,CAAQ,YAAA,KAAa,GAAA,EAAd,YAAA,GAAc,YAAA,OAAA,OAAA;;;;;;;;;;;iBAyB7C,YAAA,CAAa,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,YAAA,GAAe,OAAA;;;;;;;AAA5E;;;;iBAcsB,iBAAA,CAAkB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,YAAA,GAAe,OAAA"}
@@ -1,5 +1,5 @@
1
1
  import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-DVDwNag0.mjs";
2
- import { t as OTEL_SEVERITY_NUMBER } from "../_severity-D_IU9-90.mjs";
2
+ import { t as OTEL_SEVERITY_NUMBER } from "../_severity-78FkT5MD.mjs";
3
3
 
4
4
  //#region src/adapters/sentry.ts
5
5
  const SENTRY_FIELDS = [
@@ -0,0 +1,52 @@
1
+ //#region ../../node_modules/ufo/dist/index.mjs
2
+ const r = String.fromCharCode;
3
+ const PROTOCOL_STRICT_REGEX = /^[\s\w\0+.-]{2,}:([/\\]{1,2})/;
4
+ const PROTOCOL_REGEX = /^[\s\w\0+.-]{2,}:([/\\]{2})?/;
5
+ const PROTOCOL_RELATIVE_REGEX = /^([/\\]\s*){2,}[^/\\]/;
6
+ function hasProtocol(inputString, opts = {}) {
7
+ if (typeof opts === "boolean") opts = { acceptRelative: opts };
8
+ if (opts.strict) return PROTOCOL_STRICT_REGEX.test(inputString);
9
+ return PROTOCOL_REGEX.test(inputString) || (opts.acceptRelative ? PROTOCOL_RELATIVE_REGEX.test(inputString) : false);
10
+ }
11
+ const protocolRelative = Symbol.for("ufo:protocolRelative");
12
+ function parseURL(input = "", defaultProto) {
13
+ const _specialProtoMatch = input.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);
14
+ if (_specialProtoMatch) {
15
+ const [, _proto, _pathname = ""] = _specialProtoMatch;
16
+ return {
17
+ protocol: _proto.toLowerCase(),
18
+ pathname: _pathname,
19
+ href: _proto + _pathname,
20
+ auth: "",
21
+ host: "",
22
+ search: "",
23
+ hash: ""
24
+ };
25
+ }
26
+ if (!hasProtocol(input, { acceptRelative: true })) return defaultProto ? parseURL(defaultProto + input) : parsePath(input);
27
+ const [, protocol = "", auth, hostAndPath = ""] = input.replace(/\\/g, "/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/) || [];
28
+ let [, host = "", path = ""] = hostAndPath.match(/([^#/?]*)(.*)?/) || [];
29
+ if (protocol === "file:") path = path.replace(/\/(?=[A-Za-z]:)/, "");
30
+ const { pathname, search, hash } = parsePath(path);
31
+ return {
32
+ protocol: protocol.toLowerCase(),
33
+ auth: auth ? auth.slice(0, Math.max(0, auth.length - 1)) : "",
34
+ host,
35
+ pathname,
36
+ search,
37
+ hash,
38
+ [protocolRelative]: !protocol
39
+ };
40
+ }
41
+ function parsePath(input = "") {
42
+ const [pathname = "", search = "", hash = ""] = (input.match(/([^#?]*)(\?[^#]*)?(#.*)?/) || []).splice(1);
43
+ return {
44
+ pathname,
45
+ search,
46
+ hash
47
+ };
48
+ }
49
+
50
+ //#endregion
51
+ export { parseURL as t };
52
+ //# sourceMappingURL=dist-By0jiJRA.mjs.map