@interfere/react 9.0.2 → 10.0.1-canary.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/README.md +4 -4
- package/dist/api.d.mts +25 -0
- package/dist/api.d.mts.map +1 -0
- package/dist/api.mjs +1 -0
- package/dist/api.mjs.map +1 -0
- package/dist/error-boundary.d.mts +10 -4
- package/dist/error-boundary.d.mts.map +1 -1
- package/dist/error-boundary.mjs +1 -39
- package/dist/error-boundary.mjs.map +1 -1
- package/dist/internal/browser-context.d.mts +6 -0
- package/dist/internal/browser-context.d.mts.map +1 -0
- package/dist/internal/browser-context.mjs +1 -0
- package/dist/internal/browser-context.mjs.map +1 -0
- package/dist/internal/capture-boundary.d.mts +4 -1
- package/dist/internal/capture-boundary.d.mts.map +1 -1
- package/dist/internal/capture-boundary.mjs +1 -44
- package/dist/internal/capture-boundary.mjs.map +1 -1
- package/dist/internal/capture.d.mts +16 -5
- package/dist/internal/capture.d.mts.map +1 -1
- package/dist/internal/capture.mjs +1 -23
- package/dist/internal/capture.mjs.map +1 -1
- package/dist/internal/config.d.mts +22 -4
- package/dist/internal/config.d.mts.map +1 -1
- package/dist/internal/config.mjs +1 -33
- package/dist/internal/config.mjs.map +1 -1
- package/dist/internal/consent.d.mts.map +1 -1
- package/dist/internal/consent.mjs +1 -25
- package/dist/internal/consent.mjs.map +1 -1
- package/dist/internal/console-patch.d.mts +19 -0
- package/dist/internal/console-patch.d.mts.map +1 -0
- package/dist/internal/console-patch.mjs +1 -0
- package/dist/internal/console-patch.mjs.map +1 -0
- package/dist/internal/dom/actionable.d.mts +27 -0
- package/dist/internal/dom/actionable.d.mts.map +1 -0
- package/dist/internal/dom/actionable.mjs +1 -0
- package/dist/internal/dom/actionable.mjs.map +1 -0
- package/dist/internal/kernel-registry.d.mts +8 -0
- package/dist/internal/kernel-registry.d.mts.map +1 -0
- package/dist/internal/kernel-registry.mjs +1 -0
- package/dist/internal/kernel-registry.mjs.map +1 -0
- package/dist/internal/kernel.d.mts +267 -0
- package/dist/internal/kernel.d.mts.map +1 -0
- package/dist/internal/kernel.mjs +1 -0
- package/dist/internal/kernel.mjs.map +1 -0
- package/dist/internal/otel/exporter.d.mts +85 -0
- package/dist/internal/otel/exporter.d.mts.map +1 -0
- package/dist/internal/otel/exporter.mjs +1 -0
- package/dist/internal/otel/exporter.mjs.map +1 -0
- package/dist/internal/otel/index.d.mts +6 -0
- package/dist/internal/otel/index.mjs +1 -0
- package/dist/internal/otel/instrumentations.d.mts +42 -0
- package/dist/internal/otel/instrumentations.d.mts.map +1 -0
- package/dist/internal/otel/instrumentations.mjs +1 -0
- package/dist/internal/otel/instrumentations.mjs.map +1 -0
- package/dist/internal/otel/page-scope-context-manager.d.mts +32 -0
- package/dist/internal/otel/page-scope-context-manager.d.mts.map +1 -0
- package/dist/internal/otel/page-scope-context-manager.mjs +1 -0
- package/dist/internal/otel/page-scope-context-manager.mjs.map +1 -0
- package/dist/internal/otel/propagation.d.mts +21 -0
- package/dist/internal/otel/propagation.d.mts.map +1 -0
- package/dist/internal/otel/propagation.mjs +1 -0
- package/dist/internal/otel/propagation.mjs.map +1 -0
- package/dist/internal/otel/provider.d.mts +106 -0
- package/dist/internal/otel/provider.d.mts.map +1 -0
- package/dist/internal/otel/provider.mjs +1 -0
- package/dist/internal/otel/provider.mjs.map +1 -0
- package/dist/internal/otel/web-vitals.d.mts +35 -0
- package/dist/internal/otel/web-vitals.d.mts.map +1 -0
- package/dist/internal/otel/web-vitals.mjs +1 -0
- package/dist/internal/otel/web-vitals.mjs.map +1 -0
- package/dist/internal/page-lifecycle.d.mts +21 -0
- package/dist/internal/page-lifecycle.d.mts.map +1 -0
- package/dist/internal/page-lifecycle.mjs +1 -0
- package/dist/internal/page-lifecycle.mjs.map +1 -0
- package/dist/internal/plugin-runtime.d.mts +0 -2
- package/dist/internal/plugin-runtime.d.mts.map +1 -1
- package/dist/internal/plugin-runtime.mjs +1 -107
- package/dist/internal/plugin-runtime.mjs.map +1 -1
- package/dist/internal/react-context.d.mts +44 -0
- package/dist/internal/react-context.d.mts.map +1 -0
- package/dist/internal/react-context.mjs +1 -0
- package/dist/internal/react-context.mjs.map +1 -0
- package/dist/internal/sw.d.mts +22 -2
- package/dist/internal/sw.d.mts.map +1 -1
- package/dist/internal/sw.mjs +1 -10
- package/dist/internal/sw.mjs.map +1 -1
- package/dist/internal/version.d.mts +3 -1
- package/dist/internal/version.d.mts.map +1 -1
- package/dist/internal/version.mjs +1 -5
- package/dist/internal/version.mjs.map +1 -1
- package/dist/internal/wrapper-singleton.d.mts +47 -0
- package/dist/internal/wrapper-singleton.d.mts.map +1 -0
- package/dist/internal/wrapper-singleton.mjs +1 -0
- package/dist/internal/wrapper-singleton.mjs.map +1 -0
- package/dist/package.mjs +1 -5
- package/dist/plugins/errors.d.mts.map +1 -1
- package/dist/plugins/errors.mjs +1 -91
- package/dist/plugins/errors.mjs.map +1 -1
- package/dist/plugins/lib/loader.d.mts +1 -2
- package/dist/plugins/lib/loader.d.mts.map +1 -1
- package/dist/plugins/lib/loader.mjs +1 -43
- package/dist/plugins/lib/loader.mjs.map +1 -1
- package/dist/plugins/lib/types.d.mts +3 -2
- package/dist/plugins/lib/types.d.mts.map +1 -1
- package/dist/plugins/lib/types.mjs +1 -1
- package/dist/plugins/logs.d.mts +13 -0
- package/dist/plugins/logs.d.mts.map +1 -0
- package/dist/plugins/logs.mjs +1 -0
- package/dist/plugins/logs.mjs.map +1 -0
- package/dist/plugins/rage-clicks.d.mts.map +1 -1
- package/dist/plugins/rage-clicks.mjs +1 -53
- package/dist/plugins/rage-clicks.mjs.map +1 -1
- package/dist/plugins/replay.d.mts.map +1 -1
- package/dist/plugins/replay.mjs +1 -62
- package/dist/plugins/replay.mjs.map +1 -1
- package/dist/provider.d.mts +11 -20
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +1 -32
- package/dist/provider.mjs.map +1 -1
- package/dist/react-error-handler.d.mts +21 -5
- package/dist/react-error-handler.d.mts.map +1 -1
- package/dist/react-error-handler.mjs +1 -54
- package/dist/react-error-handler.mjs.map +1 -1
- package/dist/sw.d.mts +2 -0
- package/dist/sw.mjs +2 -0
- package/dist/tracking/api.d.mts +41 -15
- package/dist/tracking/api.d.mts.map +1 -1
- package/dist/tracking/api.mjs +1 -134
- package/dist/tracking/api.mjs.map +1 -1
- package/dist/tracking/device.d.mts +30 -7
- package/dist/tracking/device.d.mts.map +1 -1
- package/dist/tracking/device.mjs +1 -80
- package/dist/tracking/device.mjs.map +1 -1
- package/dist/tracking/geo.d.mts +11 -3
- package/dist/tracking/geo.d.mts.map +1 -1
- package/dist/tracking/geo.mjs +2 -44
- package/dist/tracking/geo.mjs.map +1 -1
- package/dist/tracking/session.d.mts +3 -1
- package/dist/tracking/session.d.mts.map +1 -1
- package/dist/tracking/session.mjs +1 -75
- package/dist/tracking/session.mjs.map +1 -1
- package/dist/util/bot.d.mts +10 -0
- package/dist/util/bot.d.mts.map +1 -0
- package/dist/util/bot.mjs +1 -0
- package/dist/util/bot.mjs.map +1 -0
- package/dist/util/global.d.mts +10 -0
- package/dist/util/global.d.mts.map +1 -0
- package/dist/util/global.mjs +1 -0
- package/dist/util/global.mjs.map +1 -0
- package/dist/util/log.d.mts.map +1 -1
- package/dist/util/log.mjs +1 -37
- package/dist/util/log.mjs.map +1 -1
- package/dist/util/stringify.d.mts +9 -0
- package/dist/util/stringify.d.mts.map +1 -0
- package/dist/util/stringify.mjs +1 -0
- package/dist/util/stringify.mjs.map +1 -0
- package/package.json +79 -25
- package/dist/internal/client.d.mts +0 -48
- package/dist/internal/client.d.mts.map +0 -1
- package/dist/internal/client.mjs +0 -146
- package/dist/internal/client.mjs.map +0 -1
- package/dist/internal/context.d.mts +0 -6
- package/dist/internal/context.d.mts.map +0 -1
- package/dist/internal/context.mjs +0 -32
- package/dist/internal/context.mjs.map +0 -1
- package/dist/internal/envelope.d.mts +0 -15
- package/dist/internal/envelope.d.mts.map +0 -1
- package/dist/internal/envelope.mjs +0 -24
- package/dist/internal/envelope.mjs.map +0 -1
- package/dist/internal/errors.d.mts +0 -4
- package/dist/internal/errors.d.mts.map +0 -1
- package/dist/internal/errors.mjs +0 -4
- package/dist/internal/errors.mjs.map +0 -1
- package/dist/plugins/device.d.mts +0 -6
- package/dist/plugins/device.d.mts.map +0 -1
- package/dist/plugins/device.mjs +0 -13
- package/dist/plugins/device.mjs.map +0 -1
- package/dist/plugins/pages.d.mts +0 -6
- package/dist/plugins/pages.d.mts.map +0 -1
- package/dist/plugins/pages.mjs +0 -102
- package/dist/plugins/pages.mjs.map +0 -1
- package/dist/transport/http.d.mts +0 -25
- package/dist/transport/http.d.mts.map +0 -1
- package/dist/transport/http.mjs +0 -80
- package/dist/transport/http.mjs.map +0 -1
- package/dist/transport/queue.d.mts +0 -34
- package/dist/transport/queue.d.mts.map +0 -1
- package/dist/transport/queue.mjs +0 -100
- package/dist/transport/queue.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interfere/react",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "10.0.1-canary.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Client-side React SDK for Interfere. Error tracking, session replay, and analytics.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"observability",
|
|
8
|
-
"typescript",
|
|
8
|
+
"@typescript/native-preview",
|
|
9
9
|
"react",
|
|
10
10
|
"error-tracking",
|
|
11
11
|
"session-replay"
|
|
@@ -26,29 +26,53 @@
|
|
|
26
26
|
"type": "module",
|
|
27
27
|
"exports": {
|
|
28
28
|
"./provider": {
|
|
29
|
-
"
|
|
29
|
+
"monorepo": "./src/provider.tsx",
|
|
30
30
|
"types": "./dist/provider.d.mts",
|
|
31
31
|
"default": "./dist/provider.mjs"
|
|
32
32
|
},
|
|
33
33
|
"./error-boundary": {
|
|
34
|
-
"
|
|
34
|
+
"monorepo": "./src/error-boundary.tsx",
|
|
35
35
|
"types": "./dist/error-boundary.d.mts",
|
|
36
36
|
"default": "./dist/error-boundary.mjs"
|
|
37
37
|
},
|
|
38
38
|
"./react-error-handler": {
|
|
39
|
-
"
|
|
39
|
+
"monorepo": "./src/react-error-handler.ts",
|
|
40
40
|
"types": "./dist/react-error-handler.d.mts",
|
|
41
41
|
"default": "./dist/react-error-handler.mjs"
|
|
42
42
|
},
|
|
43
|
-
"./
|
|
44
|
-
"
|
|
45
|
-
"types": "./dist/
|
|
46
|
-
"default": "./dist/
|
|
43
|
+
"./api": {
|
|
44
|
+
"monorepo": "./src/api.ts",
|
|
45
|
+
"types": "./dist/api.d.mts",
|
|
46
|
+
"default": "./dist/api.mjs"
|
|
47
|
+
},
|
|
48
|
+
"./internal/kernel": {
|
|
49
|
+
"monorepo": "./src/internal/kernel.ts",
|
|
50
|
+
"types": "./dist/internal/kernel.d.mts",
|
|
51
|
+
"default": "./dist/internal/kernel.mjs"
|
|
52
|
+
},
|
|
53
|
+
"./internal/kernel-registry": {
|
|
54
|
+
"monorepo": "./src/internal/kernel-registry.ts",
|
|
55
|
+
"types": "./dist/internal/kernel-registry.d.mts",
|
|
56
|
+
"default": "./dist/internal/kernel-registry.mjs"
|
|
47
57
|
},
|
|
48
58
|
"./internal/version": {
|
|
49
|
-
"
|
|
59
|
+
"monorepo": "./src/internal/version.ts",
|
|
50
60
|
"types": "./dist/internal/version.d.mts",
|
|
51
61
|
"default": "./dist/internal/version.mjs"
|
|
62
|
+
},
|
|
63
|
+
"./internal/wrapper-singleton": {
|
|
64
|
+
"monorepo": "./src/internal/wrapper-singleton.ts",
|
|
65
|
+
"types": "./dist/internal/wrapper-singleton.d.mts",
|
|
66
|
+
"default": "./dist/internal/wrapper-singleton.mjs"
|
|
67
|
+
},
|
|
68
|
+
"./sw": {
|
|
69
|
+
"types": "./dist/sw.d.mts",
|
|
70
|
+
"default": "./dist/sw.mjs"
|
|
71
|
+
},
|
|
72
|
+
"./util/log": {
|
|
73
|
+
"monorepo": "./src/util/log.ts",
|
|
74
|
+
"types": "./dist/util/log.d.mts",
|
|
75
|
+
"default": "./dist/util/log.mjs"
|
|
52
76
|
}
|
|
53
77
|
},
|
|
54
78
|
"sideEffects": false,
|
|
@@ -57,20 +81,47 @@
|
|
|
57
81
|
},
|
|
58
82
|
"scripts": {
|
|
59
83
|
"build": "tsdown",
|
|
60
|
-
"test": "vitest run
|
|
61
|
-
"typecheck": "
|
|
84
|
+
"test": "vitest run",
|
|
85
|
+
"typecheck": "tsgo --noEmit --incremental",
|
|
86
|
+
"typegen": "bun run scripts/build-sw.ts"
|
|
62
87
|
},
|
|
63
88
|
"dependencies": {
|
|
64
89
|
"@fingerprintjs/fingerprintjs": "^5.2.0",
|
|
65
|
-
"@interfere/constants": "^9.0.0",
|
|
66
|
-
"@interfere/types": "^9.0.0",
|
|
90
|
+
"@interfere/constants": "^9.0.2-canary.0",
|
|
91
|
+
"@interfere/types": "^9.0.3-canary.0",
|
|
92
|
+
"@opentelemetry/api": "^1.9.1",
|
|
93
|
+
"@opentelemetry/api-logs": "^0.218.0",
|
|
94
|
+
"@opentelemetry/context-zone": "^2.7.1",
|
|
95
|
+
"@opentelemetry/core": "^2.7.0",
|
|
96
|
+
"@opentelemetry/exporter-logs-otlp-http": "^0.218.0",
|
|
97
|
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.218.0",
|
|
98
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.218.0",
|
|
99
|
+
"@opentelemetry/instrumentation": "^0.218.0",
|
|
100
|
+
"@opentelemetry/instrumentation-browser-navigation": "^0.11.0",
|
|
101
|
+
"@opentelemetry/instrumentation-document-load": "^0.63.0",
|
|
102
|
+
"@opentelemetry/instrumentation-fetch": "^0.218.0",
|
|
103
|
+
"@opentelemetry/instrumentation-long-task": "^0.62.0",
|
|
104
|
+
"@opentelemetry/instrumentation-user-interaction": "^0.62.0",
|
|
105
|
+
"@opentelemetry/instrumentation-xml-http-request": "^0.218.0",
|
|
106
|
+
"@opentelemetry/opentelemetry-browser-detector": "^0.218.0",
|
|
107
|
+
"@opentelemetry/otlp-transformer": "^0.218.0",
|
|
108
|
+
"@opentelemetry/resources": "^2.7.0",
|
|
109
|
+
"@opentelemetry/sdk-logs": "^0.218.0",
|
|
110
|
+
"@opentelemetry/sdk-metrics": "^2.7.0",
|
|
111
|
+
"@opentelemetry/sdk-trace-base": "^2.7.0",
|
|
112
|
+
"@opentelemetry/sdk-trace-web": "^2.7.1",
|
|
113
|
+
"@opentelemetry/web-common": "^0.218.0",
|
|
67
114
|
"@ua-parser-js/pro-enterprise": "^2.0.6",
|
|
68
115
|
"rrweb": "2.0.0-alpha.4",
|
|
69
|
-
"uuid": "^14.0.0"
|
|
116
|
+
"uuid": "^14.0.0",
|
|
117
|
+
"web-vitals": "^5.2.0",
|
|
118
|
+
"workbox-background-sync": "^7.4.0",
|
|
119
|
+
"workbox-routing": "^7.4.0",
|
|
120
|
+
"workbox-strategies": "^7.4.0"
|
|
70
121
|
},
|
|
71
122
|
"peerDependencies": {
|
|
72
|
-
"react": "^19.
|
|
73
|
-
"react-dom": "^19.
|
|
123
|
+
"react": "^19.2.6",
|
|
124
|
+
"react-dom": "^19.2.6"
|
|
74
125
|
},
|
|
75
126
|
"peerDependenciesMeta": {
|
|
76
127
|
"react": {
|
|
@@ -85,15 +136,18 @@
|
|
|
85
136
|
"@interfere/typescript-config": "^9.0.0",
|
|
86
137
|
"@rrweb/types": "2.0.0-alpha.20",
|
|
87
138
|
"@types/node": "^24.12.0",
|
|
88
|
-
"@types/react": "19.2.
|
|
139
|
+
"@types/react": "19.2.15",
|
|
89
140
|
"@types/react-dom": "19.2.3",
|
|
90
|
-
"@
|
|
91
|
-
"@vitest/browser
|
|
92
|
-
"@vitest/
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
141
|
+
"@typescript/native-preview": "7.0.0-dev.20260522.1",
|
|
142
|
+
"@vitest/browser": "4.1.7",
|
|
143
|
+
"@vitest/browser-playwright": "4.1.7",
|
|
144
|
+
"@vitest/coverage-v8": "^4.1.6",
|
|
145
|
+
"playwright": "^1.60.0",
|
|
146
|
+
"react": "^19.2.6",
|
|
147
|
+
"react-dom": "^19.2.6",
|
|
148
|
+
"rolldown": "^1.0.0-rc.17",
|
|
149
|
+
"tsdown": "^0.22.0",
|
|
150
|
+
"vitest": "^4.1.6",
|
|
97
151
|
"vitest-browser-react": "2.2.0"
|
|
98
152
|
}
|
|
99
153
|
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { PluginOverrides } from "../plugins/lib/loader.mjs";
|
|
2
|
-
import { QueueOptions } from "../transport/queue.mjs";
|
|
3
|
-
import { ConsentState } from "@interfere/types/sdk/plugins/manifest";
|
|
4
|
-
import { EnvelopePayload, EventType } from "@interfere/types/sdk/envelope";
|
|
5
|
-
|
|
6
|
-
//#region src/internal/client.d.ts
|
|
7
|
-
declare function buildSdkStack(wrapperVersions?: string[]): string[];
|
|
8
|
-
interface ClientOptions {
|
|
9
|
-
/** @internal Wrapper SDK versions (e.g. `@interfere/next@8.1.0`). */
|
|
10
|
-
_wrapperVersions?: string[];
|
|
11
|
-
batch?: Omit<Partial<QueueOptions>, "transport">;
|
|
12
|
-
consent?: ConsentState;
|
|
13
|
-
/**
|
|
14
|
-
* Override the automatic dev-mode guard. When `undefined`, the SDK
|
|
15
|
-
* auto-detects: it disables itself if `process.env["NODE_ENV"]` is not
|
|
16
|
-
* `"production"` (Node / webpack / Next.js). In environments where
|
|
17
|
-
* `process` does not exist (Vite, CRA, plain browser) the SDK
|
|
18
|
-
* defaults to **enabled** — pass `false` to disable explicitly.
|
|
19
|
-
*/
|
|
20
|
-
enabled?: boolean;
|
|
21
|
-
plugins?: PluginOverrides;
|
|
22
|
-
}
|
|
23
|
-
declare class Client {
|
|
24
|
-
private readonly metadata;
|
|
25
|
-
private readonly queue;
|
|
26
|
-
private readonly runtime;
|
|
27
|
-
constructor(opts: ClientOptions, buildId: string, releaseId: string | null);
|
|
28
|
-
private fetchRemoteConfig;
|
|
29
|
-
capture<T extends EventType>(type: T, payload: EnvelopePayload<T>): void;
|
|
30
|
-
flush(): void;
|
|
31
|
-
dispose(): Promise<void>;
|
|
32
|
-
getConsent(): ConsentState | null;
|
|
33
|
-
setConsent(value?: ConsentState): void;
|
|
34
|
-
resetConsent(): void;
|
|
35
|
-
}
|
|
36
|
-
declare function getClient(): Client;
|
|
37
|
-
declare function init(opts?: ClientOptions): void;
|
|
38
|
-
declare function close(): Promise<void>;
|
|
39
|
-
declare const consent: {
|
|
40
|
-
get(): ConsentState | null;
|
|
41
|
-
set(value?: ConsentState): void;
|
|
42
|
-
};
|
|
43
|
-
declare function syncConsent(consentState: ConsentState | undefined): void;
|
|
44
|
-
declare function flush(): void;
|
|
45
|
-
/** @internal Test-only. Resets the module state so init() can be called again. */
|
|
46
|
-
declare function _reset(): void;
|
|
47
|
-
//#endregion
|
|
48
|
-
export { ClientOptions, _reset, buildSdkStack, close, consent, flush, getClient, init, syncConsent };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.mts","names":[],"sources":["../../src/internal/client.ts"],"mappings":";;;;;;iBAmBgB,aAAA,CAAc,eAAA;AAAA,UAIb,aAAA;EAJD;EAMd,gBAAA;EACA,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,YAAA;EACrB,OAAA,GAAU,YAAA;EAR4C;AAIxD;;;;;;EAYE,OAAA;EACA,OAAA,GAAU,eAAA;AAAA;AAAA,cAGN,MAAA;EAAA,iBACa,QAAA;EAAA,iBACA,KAAA;EAAA,iBACA,OAAA;cAEL,IAAA,EAAM,aAAA,EAAe,OAAA,UAAiB,SAAA;EAAA,QAuC1C,iBAAA;EA0BR,OAAA,WAAkB,SAAA,CAAA,CAAW,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,eAAA,CAAgB,CAAA;EAS/D,KAAA,CAAA;EAIM,OAAA,CAAA,GAAW,OAAA;EAMjB,UAAA,CAAA,GAAc,YAAA;EAId,UAAA,CAAW,KAAA,GAAQ,YAAA;EAInB,YAAA,CAAA;AAAA;AAAA,iBAOc,SAAA,CAAA,GAAa,MAAA;AAAA,iBA6Bb,IAAA,CAAK,IAAA,GAAM,aAAA;AAAA,iBAoCL,KAAA,CAAA,GAAS,OAAA;AAAA,cASlB,OAAA;SACJ,YAAA;cAIK,YAAA;AAAA;AAAA,iBAKE,WAAA,CAAY,YAAA,EAAc,YAAA;AAAA,iBAa1B,KAAA,CAAA;;iBAKA,MAAA,CAAA"}
|
package/dist/internal/client.mjs
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { createLogger } from "../util/log.mjs";
|
|
2
|
-
import { HttpTransport, buildHeaders } from "../transport/http.mjs";
|
|
3
|
-
import { bootstrap, session, teardown } from "../tracking/api.mjs";
|
|
4
|
-
import { BatchQueue } from "../transport/queue.mjs";
|
|
5
|
-
import { resolveTargets } from "./config.mjs";
|
|
6
|
-
import { collectContext } from "./context.mjs";
|
|
7
|
-
import { PRODUCER_VERSION } from "./version.mjs";
|
|
8
|
-
import { buildEnvelope } from "./envelope.mjs";
|
|
9
|
-
import { PluginRuntime } from "./plugin-runtime.mjs";
|
|
10
|
-
import { registerServiceWorker } from "./sw.mjs";
|
|
11
|
-
import { inferRuntime, normalizeEnv } from "@interfere/types/sdk/runtime";
|
|
12
|
-
//#region src/internal/client.ts
|
|
13
|
-
const log = createLogger("client");
|
|
14
|
-
function buildSdkStack(wrapperVersions) {
|
|
15
|
-
return [...wrapperVersions ?? [], PRODUCER_VERSION];
|
|
16
|
-
}
|
|
17
|
-
var Client = class {
|
|
18
|
-
metadata;
|
|
19
|
-
queue;
|
|
20
|
-
runtime;
|
|
21
|
-
constructor(opts, buildId, releaseId) {
|
|
22
|
-
const targets = resolveTargets();
|
|
23
|
-
bootstrap(targets.session);
|
|
24
|
-
log.info("target: %s", targets.ingest.url);
|
|
25
|
-
this.metadata = {
|
|
26
|
-
context: collectContext(),
|
|
27
|
-
environment: normalizeEnv(typeof process === "undefined" ? void 0 : process.env["NODE_ENV"]),
|
|
28
|
-
runtime: inferRuntime(),
|
|
29
|
-
buildId,
|
|
30
|
-
releaseId,
|
|
31
|
-
...opts._wrapperVersions ? { wrapperVersions: opts._wrapperVersions } : {}
|
|
32
|
-
};
|
|
33
|
-
registerServiceWorker();
|
|
34
|
-
const transport = new HttpTransport(targets.ingest);
|
|
35
|
-
this.queue = new BatchQueue({
|
|
36
|
-
transport,
|
|
37
|
-
...opts.batch
|
|
38
|
-
});
|
|
39
|
-
this.queue.start();
|
|
40
|
-
this.runtime = new PluginRuntime({
|
|
41
|
-
capture: (type, payload) => this.capture(type, payload),
|
|
42
|
-
getSessionId: () => session.getId() ?? ""
|
|
43
|
-
}, opts.plugins, opts.consent);
|
|
44
|
-
this.runtime.start();
|
|
45
|
-
this.fetchRemoteConfig(targets.config);
|
|
46
|
-
}
|
|
47
|
-
fetchRemoteConfig(configTarget) {
|
|
48
|
-
fetch(configTarget.url, {
|
|
49
|
-
method: "GET",
|
|
50
|
-
headers: buildHeaders(configTarget.headers),
|
|
51
|
-
signal: AbortSignal.timeout(1e4)
|
|
52
|
-
}).then((res) => {
|
|
53
|
-
if (!res.ok) return;
|
|
54
|
-
return res.json();
|
|
55
|
-
}).then((config) => {
|
|
56
|
-
if (config?.plugins) {
|
|
57
|
-
this.runtime.applyRemoteConfig(config.plugins);
|
|
58
|
-
log.debug("applied remote config");
|
|
59
|
-
}
|
|
60
|
-
}).catch(() => {
|
|
61
|
-
log.warn("remote config fetch failed, using local defaults");
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
capture(type, payload) {
|
|
65
|
-
const sessionId = session.getId();
|
|
66
|
-
if (!(sessionId && this.runtime.canCapture(type))) return;
|
|
67
|
-
this.queue.enqueue(buildEnvelope(type, payload, sessionId, this.metadata));
|
|
68
|
-
}
|
|
69
|
-
flush() {
|
|
70
|
-
this.queue.flush();
|
|
71
|
-
}
|
|
72
|
-
async dispose() {
|
|
73
|
-
await this.runtime.dispose();
|
|
74
|
-
teardown();
|
|
75
|
-
this.queue.dispose();
|
|
76
|
-
}
|
|
77
|
-
getConsent() {
|
|
78
|
-
return this.runtime.getConsent();
|
|
79
|
-
}
|
|
80
|
-
setConsent(value) {
|
|
81
|
-
this.runtime.setConsent(value);
|
|
82
|
-
}
|
|
83
|
-
resetConsent() {
|
|
84
|
-
this.runtime.resetConsent();
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
let instance = null;
|
|
88
|
-
function getClient() {
|
|
89
|
-
if (!instance) throw new Error("Interfere SDK not initialized. Call init() from your instrumentation-client entrypoint.");
|
|
90
|
-
return instance;
|
|
91
|
-
}
|
|
92
|
-
function isEnabledByEnvironment() {
|
|
93
|
-
try {
|
|
94
|
-
if (typeof process === "undefined" || !process.env) return true;
|
|
95
|
-
if (process.env["NODE_ENV"] === "production") return true;
|
|
96
|
-
if (process.env["NODE_ENV"] === void 0) return true;
|
|
97
|
-
return !!(globalThis["__INTERFERE_FORCE_ENABLE__"] || process.env["INTERFERE_FORCE_ENABLE"]);
|
|
98
|
-
} catch {
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function init(opts = {}) {
|
|
103
|
-
if (instance) return;
|
|
104
|
-
if (!(opts.enabled ?? isEnabledByEnvironment())) {
|
|
105
|
-
log.info("Disabled in non-production. Pass enabled: true to init() or set INTERFERE_FORCE_ENABLE=1.");
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
const buildId = globalThis["__INTERFERE_BUILD_ID__"];
|
|
109
|
-
const releaseId = globalThis["__INTERFERE_RELEASE_ID__"];
|
|
110
|
-
if (!buildId) {
|
|
111
|
-
log.error("buildId not found — ensure withInterfere() is configured in next.config and instrumentation-client.ts exists in your project root.");
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
if (typeof window !== "undefined") window["__INTERFERE_SDK_STACK__"] = buildSdkStack(opts._wrapperVersions);
|
|
115
|
-
instance = new Client(opts, buildId, releaseId ?? null);
|
|
116
|
-
}
|
|
117
|
-
async function close() {
|
|
118
|
-
if (!instance) return;
|
|
119
|
-
await instance.dispose();
|
|
120
|
-
instance = null;
|
|
121
|
-
}
|
|
122
|
-
const consent = {
|
|
123
|
-
get() {
|
|
124
|
-
return instance?.getConsent() ?? null;
|
|
125
|
-
},
|
|
126
|
-
set(value) {
|
|
127
|
-
instance?.setConsent(value);
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
function syncConsent(consentState) {
|
|
131
|
-
if (!instance) return;
|
|
132
|
-
if (consentState) {
|
|
133
|
-
instance.setConsent(consentState);
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
instance.resetConsent();
|
|
137
|
-
}
|
|
138
|
-
function flush() {
|
|
139
|
-
instance?.flush();
|
|
140
|
-
}
|
|
141
|
-
/** @internal Test-only. Resets the module state so init() can be called again. */
|
|
142
|
-
function _reset() {
|
|
143
|
-
instance = null;
|
|
144
|
-
}
|
|
145
|
-
//#endregion
|
|
146
|
-
export { _reset, buildSdkStack, close, consent, flush, getClient, init, syncConsent };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.mjs","names":[],"sources":["../../src/internal/client.ts"],"sourcesContent":["import type { EnvelopePayload, EventType } from \"@interfere/types/sdk/envelope\";\nimport type { ConsentState } from \"@interfere/types/sdk/plugins/manifest\";\nimport type { RemoteConfig } from \"@interfere/types/sdk/remote-config\";\nimport { inferRuntime, normalizeEnv } from \"@interfere/types/sdk/runtime\";\n\nimport type { PluginOverrides } from \"../plugins/lib/loader.js\";\nimport { bootstrap, session, teardown } from \"../tracking/api.js\";\nimport { buildHeaders, HttpTransport } from \"../transport/http.js\";\nimport { BatchQueue, type QueueOptions } from \"../transport/queue.js\";\nimport { createLogger } from \"../util/log.js\";\nimport { resolveTargets } from \"./config.js\";\nimport { collectContext } from \"./context.js\";\nimport { buildEnvelope, type EnvelopeMetadata } from \"./envelope.js\";\nimport { PluginRuntime } from \"./plugin-runtime.js\";\nimport { registerServiceWorker } from \"./sw.js\";\nimport { PRODUCER_VERSION } from \"./version.js\";\n\nconst log = createLogger(\"client\");\n\nexport function buildSdkStack(wrapperVersions?: string[]): string[] {\n return [...(wrapperVersions ?? []), PRODUCER_VERSION];\n}\n\nexport interface ClientOptions {\n /** @internal Wrapper SDK versions (e.g. `@interfere/next@8.1.0`). */\n _wrapperVersions?: string[];\n batch?: Omit<Partial<QueueOptions>, \"transport\">;\n consent?: ConsentState;\n /**\n * Override the automatic dev-mode guard. When `undefined`, the SDK\n * auto-detects: it disables itself if `process.env[\"NODE_ENV\"]` is not\n * `\"production\"` (Node / webpack / Next.js). In environments where\n * `process` does not exist (Vite, CRA, plain browser) the SDK\n * defaults to **enabled** — pass `false` to disable explicitly.\n */\n enabled?: boolean;\n plugins?: PluginOverrides;\n}\n\nclass Client {\n private readonly metadata: EnvelopeMetadata;\n private readonly queue: BatchQueue;\n private readonly runtime: PluginRuntime;\n\n constructor(opts: ClientOptions, buildId: string, releaseId: string | null) {\n const targets = resolveTargets();\n bootstrap(targets.session);\n\n log.info(\"target: %s\", targets.ingest.url);\n\n this.metadata = {\n context: collectContext(),\n environment: normalizeEnv(\n typeof process === \"undefined\" ? undefined : process.env[\"NODE_ENV\"]\n ),\n runtime: inferRuntime(),\n buildId,\n releaseId,\n ...(opts._wrapperVersions\n ? { wrapperVersions: opts._wrapperVersions }\n : {}),\n };\n\n registerServiceWorker();\n\n const transport = new HttpTransport(targets.ingest);\n this.queue = new BatchQueue({ transport, ...opts.batch });\n this.queue.start();\n\n this.runtime = new PluginRuntime(\n {\n capture: (type, payload) => this.capture(type, payload),\n getSessionId: () => session.getId() ?? \"\",\n },\n opts.plugins,\n opts.consent\n );\n\n this.runtime.start();\n\n this.fetchRemoteConfig(targets.config);\n }\n\n private fetchRemoteConfig(configTarget: {\n url: string;\n headers: Headers;\n }): void {\n fetch(configTarget.url, {\n method: \"GET\",\n headers: buildHeaders(configTarget.headers),\n signal: AbortSignal.timeout(10_000),\n })\n .then((res) => {\n if (!res.ok) {\n return;\n }\n return res.json() as Promise<RemoteConfig>;\n })\n .then((config) => {\n if (config?.plugins) {\n this.runtime.applyRemoteConfig(config.plugins);\n log.debug(\"applied remote config\");\n }\n })\n .catch(() => {\n log.warn(\"remote config fetch failed, using local defaults\");\n });\n }\n\n capture<T extends EventType>(type: T, payload: EnvelopePayload<T>): void {\n const sessionId = session.getId();\n if (!(sessionId && this.runtime.canCapture(type))) {\n return;\n }\n\n this.queue.enqueue(buildEnvelope(type, payload, sessionId, this.metadata));\n }\n\n flush(): void {\n this.queue.flush();\n }\n\n async dispose(): Promise<void> {\n await this.runtime.dispose();\n teardown();\n this.queue.dispose();\n }\n\n getConsent(): ConsentState | null {\n return this.runtime.getConsent();\n }\n\n setConsent(value?: ConsentState): void {\n this.runtime.setConsent(value);\n }\n\n resetConsent(): void {\n this.runtime.resetConsent();\n }\n}\n\nlet instance: Client | null = null;\n\nexport function getClient(): Client {\n if (!instance) {\n throw new Error(\n \"Interfere SDK not initialized. Call init() from your instrumentation-client entrypoint.\"\n );\n }\n return instance;\n}\n\nfunction isEnabledByEnvironment(): boolean {\n try {\n if (typeof process === \"undefined\" || !process.env) {\n return true;\n }\n if (process.env[\"NODE_ENV\"] === \"production\") {\n return true;\n }\n if (process.env[\"NODE_ENV\"] === undefined) {\n return true;\n }\n return !!(\n (globalThis as Record<string, unknown>)[\"__INTERFERE_FORCE_ENABLE__\"] ||\n process.env[\"INTERFERE_FORCE_ENABLE\"]\n );\n } catch {\n return true;\n }\n}\n\nexport function init(opts: ClientOptions = {}): void {\n if (instance) {\n return;\n }\n\n if (!(opts.enabled ?? isEnabledByEnvironment())) {\n log.info(\n \"Disabled in non-production. Pass enabled: true to init() or set INTERFERE_FORCE_ENABLE=1.\"\n );\n return;\n }\n\n const buildId = (globalThis as Record<string, unknown>)[\n \"__INTERFERE_BUILD_ID__\"\n ] as string | undefined;\n\n const releaseId = (globalThis as Record<string, unknown>)[\n \"__INTERFERE_RELEASE_ID__\"\n ] as string | null | undefined;\n\n if (!buildId) {\n log.error(\n \"buildId not found — ensure withInterfere() is configured in \" +\n \"next.config and instrumentation-client.ts exists in your project root.\"\n );\n return;\n }\n\n if (typeof window !== \"undefined\") {\n (window as unknown as Record<string, unknown>)[\"__INTERFERE_SDK_STACK__\"] =\n buildSdkStack(opts._wrapperVersions);\n }\n\n instance = new Client(opts, buildId, releaseId ?? null);\n}\n\nexport async function close(): Promise<void> {\n if (!instance) {\n return;\n }\n\n await instance.dispose();\n instance = null;\n}\n\nexport const consent = {\n get(): ConsentState | null {\n return instance?.getConsent() ?? null;\n },\n\n set(value?: ConsentState): void {\n instance?.setConsent(value);\n },\n};\n\nexport function syncConsent(consentState: ConsentState | undefined): void {\n if (!instance) {\n return;\n }\n\n if (consentState) {\n instance.setConsent(consentState);\n return;\n }\n\n instance.resetConsent();\n}\n\nexport function flush(): void {\n instance?.flush();\n}\n\n/** @internal Test-only. Resets the module state so init() can be called again. */\nexport function _reset(): void {\n instance = null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.mts","names":[],"sources":["../../src/internal/context.ts"],"mappings":";;;iBAwCgB,cAAA,CAAA,GAAkB,cAAA"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { UAParser } from "@ua-parser-js/pro-enterprise";
|
|
2
|
-
//#region src/internal/context.ts
|
|
3
|
-
function getDeviceMetadata() {
|
|
4
|
-
if (typeof navigator === "undefined") return null;
|
|
5
|
-
return UAParser(navigator.userAgent) ?? null;
|
|
6
|
-
}
|
|
7
|
-
function getBrowserMetadata() {
|
|
8
|
-
if ([
|
|
9
|
-
typeof navigator,
|
|
10
|
-
typeof screen,
|
|
11
|
-
typeof globalThis
|
|
12
|
-
].some((x) => x === "undefined")) return null;
|
|
13
|
-
const { language } = navigator;
|
|
14
|
-
return {
|
|
15
|
-
language,
|
|
16
|
-
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
17
|
-
display: { screen: {
|
|
18
|
-
height: screen.availHeight,
|
|
19
|
-
width: screen.availWidth,
|
|
20
|
-
orientation: screen.orientation?.type
|
|
21
|
-
} }
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
function collectContext() {
|
|
25
|
-
return {
|
|
26
|
-
runtime: "browser",
|
|
27
|
-
browser: getBrowserMetadata(),
|
|
28
|
-
device: getDeviceMetadata()
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
//#endregion
|
|
32
|
-
export { collectContext };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.mjs","names":[],"sources":["../../src/internal/context.ts"],"sourcesContent":["import type {\n BrowserContext,\n BrowserMetadata,\n DeviceMetadata,\n} from \"@interfere/types/sdk/plugins/context/browser\";\n\nimport { UAParser } from \"@ua-parser-js/pro-enterprise\";\n\nfunction getDeviceMetadata(): DeviceMetadata | null {\n if (typeof navigator === \"undefined\") {\n return null;\n }\n\n return UAParser(navigator.userAgent) ?? null;\n}\n\nfunction getBrowserMetadata(): BrowserMetadata | null {\n if (\n [typeof navigator, typeof screen, typeof globalThis].some(\n (x) => x === \"undefined\"\n )\n ) {\n return null;\n }\n\n const { language } = navigator;\n\n return {\n language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n display: {\n screen: {\n height: screen.availHeight,\n width: screen.availWidth,\n orientation: screen.orientation?.type,\n },\n },\n };\n}\n\nexport function collectContext(): BrowserContext {\n return {\n runtime: \"browser\",\n browser: getBrowserMetadata(),\n device: getDeviceMetadata(),\n };\n}\n"],"mappings":";;AAQA,SAAS,oBAA2C;AAClD,KAAI,OAAO,cAAc,YACvB,QAAO;AAGT,QAAO,SAAS,UAAU,UAAU,IAAI;;AAG1C,SAAS,qBAA6C;AACpD,KACE;EAAC,OAAO;EAAW,OAAO;EAAQ,OAAO;EAAW,CAAC,MAClD,MAAM,MAAM,YACd,CAED,QAAO;CAGT,MAAM,EAAE,aAAa;AAErB,QAAO;EACL;EACA,UAAU,KAAK,gBAAgB,CAAC,iBAAiB,CAAC;EAClD,SAAS,EACP,QAAQ;GACN,QAAQ,OAAO;GACf,OAAO,OAAO;GACd,aAAa,OAAO,aAAa;GAClC,EACF;EACF;;AAGH,SAAgB,iBAAiC;AAC/C,QAAO;EACL,SAAS;EACT,SAAS,oBAAoB;EAC7B,QAAQ,mBAAmB;EAC5B"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Env, Runtime } from "@interfere/types/sdk/runtime";
|
|
2
|
-
import { Envelope, EnvelopeContext, EnvelopePayload, EventType } from "@interfere/types/sdk/envelope";
|
|
3
|
-
|
|
4
|
-
//#region src/internal/envelope.d.ts
|
|
5
|
-
interface EnvelopeMetadata {
|
|
6
|
-
buildId: string;
|
|
7
|
-
context: EnvelopeContext;
|
|
8
|
-
environment: Env;
|
|
9
|
-
releaseId: string | null;
|
|
10
|
-
runtime: Runtime;
|
|
11
|
-
wrapperVersions?: string[];
|
|
12
|
-
}
|
|
13
|
-
declare function buildEnvelope<T extends EventType>(type: T, payload: EnvelopePayload<T>, sessionId: string, metadata: EnvelopeMetadata): Envelope<T>;
|
|
14
|
-
//#endregion
|
|
15
|
-
export { EnvelopeMetadata, buildEnvelope };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.d.mts","names":[],"sources":["../../src/internal/envelope.ts"],"mappings":";;;;UAYiB,gBAAA;EACf,OAAA;EACA,OAAA,EAAS,eAAA;EACT,WAAA,EAAa,GAAA;EACb,SAAA;EACA,OAAA,EAAS,OAAA;EACT,eAAA;AAAA;AAAA,iBAGc,aAAA,WAAwB,SAAA,CAAA,CACtC,IAAA,EAAM,CAAA,EACN,OAAA,EAAS,eAAA,CAAgB,CAAA,GACzB,SAAA,UACA,QAAA,EAAU,gBAAA,GACT,QAAA,CAAS,CAAA"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { PRODUCER_VERSION } from "./version.mjs";
|
|
2
|
-
import { v7 } from "uuid";
|
|
3
|
-
//#region src/internal/envelope.ts
|
|
4
|
-
function buildEnvelope(type, payload, sessionId, metadata) {
|
|
5
|
-
const sdkStack = [...metadata.wrapperVersions ?? [], PRODUCER_VERSION];
|
|
6
|
-
return {
|
|
7
|
-
uuid: v7(),
|
|
8
|
-
v: 0,
|
|
9
|
-
type,
|
|
10
|
-
payload,
|
|
11
|
-
context: metadata.context,
|
|
12
|
-
runtime: metadata.runtime,
|
|
13
|
-
environment: metadata.environment,
|
|
14
|
-
buildId: metadata.buildId,
|
|
15
|
-
releaseId: metadata.releaseId,
|
|
16
|
-
producerVersion: sdkStack[0],
|
|
17
|
-
sdkStack,
|
|
18
|
-
clientTs: Date.now(),
|
|
19
|
-
sessionId,
|
|
20
|
-
sessionSource: "client"
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
//#endregion
|
|
24
|
-
export { buildEnvelope };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.mjs","names":["uuidv7"],"sources":["../../src/internal/envelope.ts"],"sourcesContent":["import type {\n Envelope,\n EnvelopeContext,\n EnvelopePayload,\n EventType,\n} from \"@interfere/types/sdk/envelope\";\nimport type { Env, Runtime } from \"@interfere/types/sdk/runtime\";\n\nimport { v7 as uuidv7 } from \"uuid\";\n\nimport { PRODUCER_VERSION } from \"./version.js\";\n\nexport interface EnvelopeMetadata {\n buildId: string;\n context: EnvelopeContext;\n environment: Env;\n releaseId: string | null;\n runtime: Runtime;\n wrapperVersions?: string[];\n}\n\nexport function buildEnvelope<T extends EventType>(\n type: T,\n payload: EnvelopePayload<T>,\n sessionId: string,\n metadata: EnvelopeMetadata\n): Envelope<T> {\n const sdkStack = [...(metadata.wrapperVersions ?? []), PRODUCER_VERSION];\n\n return {\n uuid: uuidv7(),\n v: 0 as const,\n type,\n payload,\n context: metadata.context,\n runtime: metadata.runtime,\n environment: metadata.environment,\n buildId: metadata.buildId,\n releaseId: metadata.releaseId,\n producerVersion: sdkStack[0],\n sdkStack,\n clientTs: Date.now(),\n sessionId,\n sessionSource: \"client\" as const,\n } as Envelope<T>;\n}\n"],"mappings":";;;AAqBA,SAAgB,cACd,MACA,SACA,WACA,UACa;CACb,MAAM,WAAW,CAAC,GAAI,SAAS,mBAAmB,EAAE,EAAG,iBAAiB;AAExE,QAAO;EACL,MAAMA,IAAQ;EACd,GAAG;EACH;EACA;EACA,SAAS,SAAS;EAClB,SAAS,SAAS;EAClB,aAAa,SAAS;EACtB,SAAS,SAAS;EAClB,WAAW,SAAS;EACpB,iBAAiB,SAAS;EAC1B;EACA,UAAU,KAAK,KAAK;EACpB;EACA,eAAe;EAChB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.mts","names":[],"sources":["../../src/internal/errors.ts"],"mappings":";cAAa,IAAA,EAAI,OAAA,CAAA,KAAA"}
|
package/dist/internal/errors.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.mjs","names":[],"sources":["../../src/internal/errors.ts"],"sourcesContent":["export const seen = new WeakSet<Error>();\n"],"mappings":";AAAA,MAAa,uBAAO,IAAI,SAAgB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"device.d.mts","names":[],"sources":["../../src/plugins/device.ts"],"mappings":";;;cAGa,YAAA,EAAc,MAAA"}
|
package/dist/plugins/device.mjs
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { initDevice, resetDevice } from "../tracking/device.mjs";
|
|
2
|
-
//#region src/plugins/device.ts
|
|
3
|
-
const devicePlugin = {
|
|
4
|
-
name: "device",
|
|
5
|
-
setup() {
|
|
6
|
-
initDevice();
|
|
7
|
-
return () => {
|
|
8
|
-
resetDevice();
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
//#endregion
|
|
13
|
-
export { devicePlugin as default, devicePlugin };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"device.mjs","names":[],"sources":["../../src/plugins/device.ts"],"sourcesContent":["import { initDevice, resetDevice } from \"../tracking/device.js\";\nimport type { Plugin } from \"./lib/types.js\";\n\nexport const devicePlugin: Plugin = {\n name: \"device\",\n\n setup() {\n initDevice();\n\n return () => {\n resetDevice();\n };\n },\n};\n\nexport default devicePlugin;\n"],"mappings":";;AAGA,MAAa,eAAuB;CAClC,MAAM;CAEN,QAAQ;AACN,cAAY;AAEZ,eAAa;AACX,gBAAa;;;CAGlB"}
|
package/dist/plugins/pages.d.mts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pages.d.mts","names":[],"sources":["../../src/plugins/pages.ts"],"mappings":";;;cAmDa,WAAA,EAAa,MAAA"}
|
package/dist/plugins/pages.mjs
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
//#region src/plugins/pages.ts
|
|
2
|
-
const INTERACTIVE_TAGS = new Set([
|
|
3
|
-
"A",
|
|
4
|
-
"BUTTON",
|
|
5
|
-
"INPUT",
|
|
6
|
-
"SELECT",
|
|
7
|
-
"TEXTAREA"
|
|
8
|
-
]);
|
|
9
|
-
const INTERACTIVE_ROLES = new Set([
|
|
10
|
-
"button",
|
|
11
|
-
"link",
|
|
12
|
-
"tab",
|
|
13
|
-
"menuitem",
|
|
14
|
-
"checkbox",
|
|
15
|
-
"radio",
|
|
16
|
-
"switch"
|
|
17
|
-
]);
|
|
18
|
-
function isInteractive(el) {
|
|
19
|
-
if (INTERACTIVE_TAGS.has(el.tagName)) return true;
|
|
20
|
-
const role = el.getAttribute("role");
|
|
21
|
-
return role !== null && INTERACTIVE_ROLES.has(role);
|
|
22
|
-
}
|
|
23
|
-
function closestInteractive(target) {
|
|
24
|
-
if (!(target instanceof Element)) return null;
|
|
25
|
-
let el = target;
|
|
26
|
-
while (el) {
|
|
27
|
-
if (isInteractive(el)) return el;
|
|
28
|
-
el = el.parentElement;
|
|
29
|
-
}
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
function elementDescriptor(el) {
|
|
33
|
-
return {
|
|
34
|
-
tag: el.tagName.toLowerCase(),
|
|
35
|
-
text: el.textContent?.trim().slice(0, 120) ?? null,
|
|
36
|
-
...el.id && { id: el.id },
|
|
37
|
-
...el.getAttribute("role") && { role: el.getAttribute("role") },
|
|
38
|
-
...el instanceof HTMLAnchorElement && { href: el.href }
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
const pagesPlugin = {
|
|
42
|
-
name: "pages",
|
|
43
|
-
setup(ctx) {
|
|
44
|
-
let pageEnteredAt = Date.now();
|
|
45
|
-
let currentUrl = location.href;
|
|
46
|
-
const emitPageview = () => {
|
|
47
|
-
currentUrl = location.href;
|
|
48
|
-
pageEnteredAt = Date.now();
|
|
49
|
-
ctx.capture("pageview", {
|
|
50
|
-
url: currentUrl,
|
|
51
|
-
title: document.title || void 0
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
const emitPageleave = () => {
|
|
55
|
-
ctx.capture("pageleave", {
|
|
56
|
-
url: currentUrl,
|
|
57
|
-
durationMs: Date.now() - pageEnteredAt
|
|
58
|
-
});
|
|
59
|
-
};
|
|
60
|
-
const originalPushState = history.pushState;
|
|
61
|
-
const originalReplaceState = history.replaceState;
|
|
62
|
-
history.pushState = function(...args) {
|
|
63
|
-
emitPageleave();
|
|
64
|
-
originalPushState.apply(this, args);
|
|
65
|
-
emitPageview();
|
|
66
|
-
};
|
|
67
|
-
history.replaceState = function(...args) {
|
|
68
|
-
originalReplaceState.apply(this, args);
|
|
69
|
-
currentUrl = location.href;
|
|
70
|
-
};
|
|
71
|
-
const onPopState = () => {
|
|
72
|
-
emitPageleave();
|
|
73
|
-
emitPageview();
|
|
74
|
-
};
|
|
75
|
-
globalThis.addEventListener("popstate", onPopState);
|
|
76
|
-
const onBeforeUnload = () => {
|
|
77
|
-
emitPageleave();
|
|
78
|
-
};
|
|
79
|
-
globalThis.addEventListener("beforeunload", onBeforeUnload);
|
|
80
|
-
const onVisibilityChange = () => {
|
|
81
|
-
if (document.visibilityState === "hidden") emitPageleave();
|
|
82
|
-
};
|
|
83
|
-
globalThis.addEventListener("visibilitychange", onVisibilityChange);
|
|
84
|
-
const onClick = (event) => {
|
|
85
|
-
const el = closestInteractive(event.target);
|
|
86
|
-
if (!el) return;
|
|
87
|
-
ctx.capture("ui_event", { event: elementDescriptor(el) });
|
|
88
|
-
};
|
|
89
|
-
document.addEventListener("click", onClick, { capture: true });
|
|
90
|
-
emitPageview();
|
|
91
|
-
return () => {
|
|
92
|
-
history.pushState = originalPushState;
|
|
93
|
-
history.replaceState = originalReplaceState;
|
|
94
|
-
globalThis.removeEventListener("popstate", onPopState);
|
|
95
|
-
globalThis.removeEventListener("beforeunload", onBeforeUnload);
|
|
96
|
-
globalThis.removeEventListener("visibilitychange", onVisibilityChange);
|
|
97
|
-
document.removeEventListener("click", onClick, { capture: true });
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
//#endregion
|
|
102
|
-
export { pagesPlugin as default, pagesPlugin };
|