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.
- package/dist/{_severity-D_IU9-90.mjs → _severity-78FkT5MD.mjs} +1 -1
- package/dist/{_severity-D_IU9-90.mjs.map → _severity-78FkT5MD.mjs.map} +1 -1
- package/dist/adapters/axiom.d.mts +18 -5
- package/dist/adapters/axiom.d.mts.map +1 -1
- package/dist/adapters/axiom.mjs +25 -1
- package/dist/adapters/axiom.mjs.map +1 -1
- package/dist/adapters/better-stack.d.mts +0 -2
- package/dist/adapters/better-stack.d.mts.map +1 -1
- package/dist/adapters/otlp.d.mts +0 -2
- package/dist/adapters/otlp.d.mts.map +1 -1
- package/dist/adapters/otlp.mjs +1 -1
- package/dist/adapters/posthog.d.mts +40 -31
- package/dist/adapters/posthog.d.mts.map +1 -1
- package/dist/adapters/posthog.mjs +71 -54
- package/dist/adapters/posthog.mjs.map +1 -1
- package/dist/adapters/sentry.d.mts +0 -2
- package/dist/adapters/sentry.d.mts.map +1 -1
- package/dist/adapters/sentry.mjs +1 -1
- package/dist/dist-By0jiJRA.mjs +52 -0
- package/dist/dist-By0jiJRA.mjs.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/logger.d.mts +14 -1
- package/dist/logger.d.mts.map +1 -1
- package/dist/logger.mjs +29 -14
- package/dist/logger.mjs.map +1 -1
- package/dist/next/client.d.mts +8 -0
- package/dist/next/client.d.mts.map +1 -1
- package/dist/next/client.mjs +3 -1
- package/dist/next/client.mjs.map +1 -1
- package/dist/next/index.d.mts +0 -1
- package/dist/next/index.d.mts.map +1 -1
- package/dist/nitro/module.d.mts +3 -2
- package/dist/nitro/module.d.mts.map +1 -1
- package/dist/nitro/module.mjs +1 -0
- package/dist/nitro/module.mjs.map +1 -1
- package/dist/nitro/v3/errorHandler.mjs +1 -1
- package/dist/nitro/v3/index.d.mts +0 -1
- package/dist/nitro/v3/module.d.mts +3 -2
- package/dist/nitro/v3/module.d.mts.map +1 -1
- package/dist/nitro/v3/module.mjs +2 -0
- package/dist/nitro/v3/module.mjs.map +1 -1
- package/dist/nitro/v3/plugin.mjs +1 -1
- package/dist/{nitro-CrFBjY1Y.d.mts → nitro-mfub2f8G.d.mts} +1 -1
- package/dist/{nitro-CrFBjY1Y.d.mts.map → nitro-mfub2f8G.d.mts.map} +1 -1
- package/dist/nuxt/module.d.mts +38 -11
- package/dist/nuxt/module.d.mts.map +1 -1
- package/dist/nuxt/module.mjs +2 -1
- package/dist/nuxt/module.mjs.map +1 -1
- package/dist/runtime/client/log.d.mts +1 -0
- package/dist/runtime/client/log.d.mts.map +1 -1
- package/dist/runtime/client/log.mjs +10 -6
- package/dist/runtime/client/log.mjs.map +1 -1
- package/dist/runtime/client/plugin.mjs +1 -0
- package/dist/runtime/client/plugin.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_severity-
|
|
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
|
|
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":"
|
|
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"}
|
package/dist/adapters/axiom.mjs
CHANGED
|
@@ -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 =
|
|
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\
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"better-stack.d.mts","names":[],"sources":["../../src/adapters/better-stack.ts"],"mappings":"
|
|
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"}
|
package/dist/adapters/otlp.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otlp.d.mts","names":[],"sources":["../../src/adapters/otlp.ts"],"mappings":"
|
|
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"}
|
package/dist/adapters/otlp.mjs
CHANGED
|
@@ -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-
|
|
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:
|
|
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
|
|
73
|
+
* Create a drain function for sending logs to PostHog as custom events.
|
|
82
74
|
*
|
|
83
|
-
* PostHog
|
|
84
|
-
*
|
|
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
|
|
79
|
+
* 1. Overrides passed to createPostHogEventsDrain()
|
|
88
80
|
* 2. runtimeConfig.evlog.posthog
|
|
89
81
|
* 3. runtimeConfig.posthog
|
|
90
|
-
* 4. Environment variables:
|
|
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
|
-
*
|
|
95
|
-
*
|
|
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
|
|
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,
|
|
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":"
|
|
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
|
-
|
|
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
|
|
110
|
+
* Create a drain function for sending logs to PostHog as custom events.
|
|
121
111
|
*
|
|
122
|
-
* PostHog
|
|
123
|
-
*
|
|
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
|
|
116
|
+
* 1. Overrides passed to createPostHogEventsDrain()
|
|
127
117
|
* 2. runtimeConfig.evlog.posthog
|
|
128
118
|
* 3. runtimeConfig.posthog
|
|
129
|
-
* 4. Environment variables:
|
|
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
|
-
*
|
|
134
|
-
*
|
|
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
|
|
128
|
+
function createPostHogEventsDrain(overrides) {
|
|
144
129
|
return defineDrain({
|
|
145
|
-
name: "posthog",
|
|
130
|
+
name: "posthog-events",
|
|
146
131
|
resolve: () => {
|
|
147
|
-
const config = resolveAdapterConfig("posthog",
|
|
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
|
|
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:
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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,
|
|
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
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry.d.mts","names":[],"sources":["../../src/adapters/sentry.ts"],"mappings":"
|
|
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"}
|
package/dist/adapters/sentry.mjs
CHANGED
|
@@ -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-
|
|
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
|