@mazyos/lp-tracker 0.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 (153) hide show
  1. package/AGENTS.md +71 -0
  2. package/LICENSE +16 -0
  3. package/README.md +208 -0
  4. package/SKILL.md +71 -0
  5. package/dist/attribution.d.ts +16 -0
  6. package/dist/attribution.d.ts.map +1 -0
  7. package/dist/attribution.js +77 -0
  8. package/dist/attribution.js.map +1 -0
  9. package/dist/checkout/profiles.d.ts +18 -0
  10. package/dist/checkout/profiles.d.ts.map +1 -0
  11. package/dist/checkout/profiles.js +89 -0
  12. package/dist/checkout/profiles.js.map +1 -0
  13. package/dist/checkout/resolve.d.ts +16 -0
  14. package/dist/checkout/resolve.d.ts.map +1 -0
  15. package/dist/checkout/resolve.js +95 -0
  16. package/dist/checkout/resolve.js.map +1 -0
  17. package/dist/checkout.d.ts +3 -0
  18. package/dist/checkout.d.ts.map +1 -0
  19. package/dist/checkout.js +3 -0
  20. package/dist/checkout.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +78 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/client/browser-attribution.d.ts +9 -0
  26. package/dist/client/browser-attribution.d.ts.map +1 -0
  27. package/dist/client/browser-attribution.js +116 -0
  28. package/dist/client/browser-attribution.js.map +1 -0
  29. package/dist/client/delegated.d.ts +6 -0
  30. package/dist/client/delegated.d.ts.map +1 -0
  31. package/dist/client/delegated.js +139 -0
  32. package/dist/client/delegated.js.map +1 -0
  33. package/dist/client/engagement-tracking.d.ts +11 -0
  34. package/dist/client/engagement-tracking.d.ts.map +1 -0
  35. package/dist/client/engagement-tracking.js +138 -0
  36. package/dist/client/engagement-tracking.js.map +1 -0
  37. package/dist/client/events.d.ts +43 -0
  38. package/dist/client/events.d.ts.map +1 -0
  39. package/dist/client/events.js +223 -0
  40. package/dist/client/events.js.map +1 -0
  41. package/dist/client/meta-pixel.d.ts +33 -0
  42. package/dist/client/meta-pixel.d.ts.map +1 -0
  43. package/dist/client/meta-pixel.js +143 -0
  44. package/dist/client/meta-pixel.js.map +1 -0
  45. package/dist/client/provider.d.ts +4 -0
  46. package/dist/client/provider.d.ts.map +1 -0
  47. package/dist/client/provider.js +113 -0
  48. package/dist/client/provider.js.map +1 -0
  49. package/dist/client/public-api.d.ts +7 -0
  50. package/dist/client/public-api.d.ts.map +1 -0
  51. package/dist/client/public-api.js +74 -0
  52. package/dist/client/public-api.js.map +1 -0
  53. package/dist/client/retry-queue.d.ts +20 -0
  54. package/dist/client/retry-queue.d.ts.map +1 -0
  55. package/dist/client/retry-queue.js +165 -0
  56. package/dist/client/retry-queue.js.map +1 -0
  57. package/dist/client/runtime.d.ts +81 -0
  58. package/dist/client/runtime.d.ts.map +1 -0
  59. package/dist/client/runtime.js +301 -0
  60. package/dist/client/runtime.js.map +1 -0
  61. package/dist/client/spa-tracking.d.ts +3 -0
  62. package/dist/client/spa-tracking.d.ts.map +1 -0
  63. package/dist/client/spa-tracking.js +54 -0
  64. package/dist/client/spa-tracking.js.map +1 -0
  65. package/dist/client/transport.d.ts +14 -0
  66. package/dist/client/transport.d.ts.map +1 -0
  67. package/dist/client/transport.js +54 -0
  68. package/dist/client/transport.js.map +1 -0
  69. package/dist/client/view-tracking.d.ts +3 -0
  70. package/dist/client/view-tracking.d.ts.map +1 -0
  71. package/dist/client/view-tracking.js +71 -0
  72. package/dist/client/view-tracking.js.map +1 -0
  73. package/dist/doctor/format.d.ts +3 -0
  74. package/dist/doctor/format.d.ts.map +1 -0
  75. package/dist/doctor/format.js +18 -0
  76. package/dist/doctor/format.js.map +1 -0
  77. package/dist/doctor/remote-checks.d.ts +3 -0
  78. package/dist/doctor/remote-checks.d.ts.map +1 -0
  79. package/dist/doctor/remote-checks.js +132 -0
  80. package/dist/doctor/remote-checks.js.map +1 -0
  81. package/dist/doctor/run.d.ts +3 -0
  82. package/dist/doctor/run.d.ts.map +1 -0
  83. package/dist/doctor/run.js +18 -0
  84. package/dist/doctor/run.js.map +1 -0
  85. package/dist/doctor/scan.d.ts +2 -0
  86. package/dist/doctor/scan.d.ts.map +1 -0
  87. package/dist/doctor/scan.js +70 -0
  88. package/dist/doctor/scan.js.map +1 -0
  89. package/dist/doctor/static-checks.d.ts +5 -0
  90. package/dist/doctor/static-checks.d.ts.map +1 -0
  91. package/dist/doctor/static-checks.js +130 -0
  92. package/dist/doctor/static-checks.js.map +1 -0
  93. package/dist/doctor/types.d.ts +20 -0
  94. package/dist/doctor/types.d.ts.map +1 -0
  95. package/dist/doctor/types.js +2 -0
  96. package/dist/doctor/types.js.map +1 -0
  97. package/dist/handler/body.d.ts +7 -0
  98. package/dist/handler/body.d.ts.map +1 -0
  99. package/dist/handler/body.js +67 -0
  100. package/dist/handler/body.js.map +1 -0
  101. package/dist/handler/create.d.ts +16 -0
  102. package/dist/handler/create.d.ts.map +1 -0
  103. package/dist/handler/create.js +69 -0
  104. package/dist/handler/create.js.map +1 -0
  105. package/dist/handler/forward.d.ts +13 -0
  106. package/dist/handler/forward.d.ts.map +1 -0
  107. package/dist/handler/forward.js +65 -0
  108. package/dist/handler/forward.js.map +1 -0
  109. package/dist/handler/health.d.ts +7 -0
  110. package/dist/handler/health.d.ts.map +1 -0
  111. package/dist/handler/health.js +85 -0
  112. package/dist/handler/health.js.map +1 -0
  113. package/dist/handler/sanitize.d.ts +12 -0
  114. package/dist/handler/sanitize.d.ts.map +1 -0
  115. package/dist/handler/sanitize.js +87 -0
  116. package/dist/handler/sanitize.js.map +1 -0
  117. package/dist/ids.d.ts +4 -0
  118. package/dist/ids.d.ts.map +1 -0
  119. package/dist/ids.js +37 -0
  120. package/dist/ids.js.map +1 -0
  121. package/dist/index.d.ts +5 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +5 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/middleware/capture.d.ts +11 -0
  126. package/dist/middleware/capture.d.ts.map +1 -0
  127. package/dist/middleware/capture.js +78 -0
  128. package/dist/middleware/capture.js.map +1 -0
  129. package/dist/middleware.d.ts +8 -0
  130. package/dist/middleware.d.ts.map +1 -0
  131. package/dist/middleware.js +9 -0
  132. package/dist/middleware.js.map +1 -0
  133. package/dist/next.d.ts +8 -0
  134. package/dist/next.d.ts.map +1 -0
  135. package/dist/next.js +10 -0
  136. package/dist/next.js.map +1 -0
  137. package/dist/server/site.d.ts +23 -0
  138. package/dist/server/site.d.ts.map +1 -0
  139. package/dist/server/site.js +147 -0
  140. package/dist/server/site.js.map +1 -0
  141. package/dist/server.d.ts +2 -0
  142. package/dist/server.d.ts.map +1 -0
  143. package/dist/server.js +2 -0
  144. package/dist/server.js.map +1 -0
  145. package/dist/types.d.ts +170 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +10 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/version.d.ts +2 -0
  150. package/dist/version.d.ts.map +1 -0
  151. package/dist/version.js +2 -0
  152. package/dist/version.js.map +1 -0
  153. package/package.json +99 -0
@@ -0,0 +1,301 @@
1
+ import { generateEventId } from "../ids.js";
2
+ import { isMzc } from "../attribution.js";
3
+ import { readBrowserAttribution, writeBrowserCookie, } from "./browser-attribution.js";
4
+ import { createCollectEvent, createTrackingPulse, hasNewIdentity, mergeIdentity, } from "./events.js";
5
+ import { MetaPixel } from "./meta-pixel.js";
6
+ import { RETRY_QUEUE_MAX_ITEMS, RetryQueue } from "./retry-queue.js";
7
+ import { EventTransport } from "./transport.js";
8
+ export class TrackerRuntime {
9
+ checkoutProfile;
10
+ #dataProcessingOptions;
11
+ #cookieDomain;
12
+ #debug;
13
+ #defaultContentIds;
14
+ #defaultContentName;
15
+ #document;
16
+ #listeners = new Set();
17
+ #location;
18
+ #now;
19
+ #pageviewPolicy;
20
+ #pending = [];
21
+ #pixel;
22
+ #queueFactory;
23
+ #transport;
24
+ #attribution;
25
+ #consent;
26
+ #flushing = false;
27
+ #identity = {};
28
+ #queue;
29
+ #ready = false;
30
+ constructor(options) {
31
+ this.checkoutProfile = options.checkoutProfile;
32
+ this.#attribution = options.attribution;
33
+ this.#cookieDomain = options.cookieDomain;
34
+ this.#consent = options.consentMode === "implied" ? "granted" : "pending";
35
+ this.#dataProcessingOptions = options.dataProcessingOptions;
36
+ this.#debug = options.debug ?? false;
37
+ this.#defaultContentIds = options.defaultContentIds;
38
+ this.#defaultContentName = options.defaultContentName;
39
+ this.#document = options.document ?? document;
40
+ this.#location = options.location ?? window.location;
41
+ this.#now = options.now ?? Date.now;
42
+ this.#pageviewPolicy = options.pageviewPolicy ?? "pixel_only";
43
+ this.#queueFactory =
44
+ options.queueFactory ?? (() => new RetryQueue(options.storage));
45
+ this.#transport =
46
+ options.transport ??
47
+ new EventTransport({
48
+ collectUrl: options.collectUrl,
49
+ location: this.#location,
50
+ });
51
+ this.#pixel =
52
+ options.pixel ??
53
+ new MetaPixel({
54
+ cookieDomain: options.cookieDomain,
55
+ dataProcessingOptions: options.dataProcessingOptions,
56
+ onFallbackFbp: (fbp) => {
57
+ if (this.#attribution) {
58
+ this.#attribution = { ...this.#attribution, fbp };
59
+ }
60
+ },
61
+ pixelId: options.pixelId,
62
+ });
63
+ }
64
+ get state() {
65
+ return {
66
+ consent: this.#consent,
67
+ mzc: this.#attribution?.mzc ?? null,
68
+ ready: this.#ready,
69
+ };
70
+ }
71
+ get attribution() {
72
+ return this.#attribution ? { ...this.#attribution } : undefined;
73
+ }
74
+ start(cookieDomain) {
75
+ if (this.#ready) {
76
+ return;
77
+ }
78
+ this.#cookieDomain = cookieDomain ?? this.#cookieDomain;
79
+ this.#attribution ??= readBrowserAttribution({ cookieDomain: this.#cookieDomain });
80
+ this.#ready = true;
81
+ if (this.#consent === "granted") {
82
+ this.#activate();
83
+ }
84
+ this.#emitState();
85
+ }
86
+ subscribe(listener) {
87
+ this.#listeners.add(listener);
88
+ listener(this.state);
89
+ return () => {
90
+ this.#listeners.delete(listener);
91
+ };
92
+ }
93
+ refreshAttribution() {
94
+ try {
95
+ const url = new URL(this.#location.href);
96
+ const current = this.#attribution;
97
+ const captured = readBrowserAttribution({
98
+ cookieDomain: this.#cookieDomain,
99
+ now: this.#now(),
100
+ url,
101
+ });
102
+ const mzc = isMzc(url.searchParams.get("mzc"))
103
+ ? captured.mzc
104
+ : current?.mzc ?? captured.mzc;
105
+ this.#attribution = {
106
+ ...current,
107
+ ...captured,
108
+ mzc,
109
+ query: captured.query ?? {},
110
+ utm: { ...current?.utm, ...captured.utm },
111
+ };
112
+ writeBrowserCookie("_mzc", mzc, this.#cookieDomain);
113
+ if (current?.mzc !== mzc)
114
+ this.#emitState();
115
+ }
116
+ catch {
117
+ // A malformed location or blocked cookie jar cannot stop interactions.
118
+ }
119
+ return this.attribution;
120
+ }
121
+ consent(decision) {
122
+ if (decision === this.#consent) {
123
+ return;
124
+ }
125
+ this.#consent = decision;
126
+ if (decision === "denied") {
127
+ this.#pending.length = 0;
128
+ this.#identity = {};
129
+ this.#queue?.clear();
130
+ this.#pixel.revokeConsent();
131
+ }
132
+ else if (this.#ready) {
133
+ this.#activate();
134
+ }
135
+ this.#emitState();
136
+ }
137
+ track(eventName, properties, envelope = {}) {
138
+ const eventId = envelope.eventId ?? generateEventId();
139
+ const eventTime = envelope.eventTime ?? new Date(this.#now()).toISOString();
140
+ if (!this.#attribution) {
141
+ this.start();
142
+ }
143
+ const attribution = this.#attribution;
144
+ if (!attribution) {
145
+ return eventId;
146
+ }
147
+ if (this.#consent === "denied") {
148
+ return eventId;
149
+ }
150
+ const event = createCollectEvent({
151
+ attribution,
152
+ dataProcessingOptions: this.#dataProcessingOptions,
153
+ defaultContentIds: this.#defaultContentIds,
154
+ defaultContentName: this.#defaultContentName,
155
+ eventId,
156
+ eventName,
157
+ eventTime,
158
+ identity: this.#identity,
159
+ location: this.#location,
160
+ properties,
161
+ referrer: this.#document.referrer,
162
+ });
163
+ this.#identity = mergeIdentity(this.#identity, properties?.userData);
164
+ if (this.#consent === "pending") {
165
+ this.#pending.push(event);
166
+ if (this.#pending.length > RETRY_QUEUE_MAX_ITEMS) {
167
+ this.#pending.shift();
168
+ }
169
+ }
170
+ else if (this.#consent === "granted") {
171
+ this.#dispatch(event);
172
+ }
173
+ return eventId;
174
+ }
175
+ pulse(pulseType, snapshot, envelope = {}) {
176
+ const eventId = envelope.eventId ?? generateEventId();
177
+ if (!this.#attribution)
178
+ this.start();
179
+ const attribution = this.#attribution;
180
+ if (!attribution || this.#consent !== "granted")
181
+ return eventId;
182
+ const pulse = createTrackingPulse({
183
+ attribution,
184
+ engagementMs: snapshot.engagementMs ?? 0,
185
+ eventId,
186
+ eventTime: envelope.eventTime ?? new Date(this.#now()).toISOString(),
187
+ interactionCount: snapshot.interactionCount ?? 0,
188
+ isBounce: snapshot.isBounce,
189
+ location: this.#location,
190
+ maxScrollPercent: snapshot.maxScrollPercent ?? 0,
191
+ navigationType: snapshot.navigationType,
192
+ pageviewEventId: snapshot.pageviewEventId,
193
+ pulseType,
194
+ referrer: this.#document.referrer,
195
+ screen: snapshot.screen,
196
+ sessionId: snapshot.sessionId,
197
+ viewport: snapshot.viewport,
198
+ visibilityState: snapshot.visibilityState,
199
+ });
200
+ if (this.#debug) {
201
+ console.debug(`[mazyos] debug ${pulse.pulse_type} (${pulse.event_id}); delivery disabled`);
202
+ return eventId;
203
+ }
204
+ if (snapshot.useBeacon && this.#transport.sendBeacon(pulse)) {
205
+ return eventId;
206
+ }
207
+ this.#send(pulse);
208
+ return eventId;
209
+ }
210
+ identify(identity, envelope = {}) {
211
+ if (!hasNewIdentity(this.#identity, identity)) {
212
+ return undefined;
213
+ }
214
+ return this.track("CompleteRegistration", { userData: identity }, envelope);
215
+ }
216
+ async flush(useBeacon = false) {
217
+ if (this.#consent !== "granted" ||
218
+ !this.#queue ||
219
+ this.#flushing) {
220
+ return;
221
+ }
222
+ this.#flushing = true;
223
+ try {
224
+ const sent = new Set();
225
+ const items = this.#queue.entries();
226
+ await Promise.all(items.map(async ({ event }) => {
227
+ if (useBeacon && this.#transport.sendBeacon(event)) {
228
+ sent.add(event.event_id);
229
+ return;
230
+ }
231
+ if (await this.#transport.send(event)) {
232
+ sent.add(event.event_id);
233
+ }
234
+ }));
235
+ this.#queue.remove(sent);
236
+ }
237
+ finally {
238
+ this.#flushing = false;
239
+ }
240
+ }
241
+ handlePageHide() {
242
+ void this.flush(true);
243
+ }
244
+ destroy() {
245
+ this.#pixel.destroy();
246
+ this.#listeners.clear();
247
+ }
248
+ #activate() {
249
+ this.#queue ??= this.#queueFactory();
250
+ if (!this.#debug) {
251
+ this.#pixel.initialize();
252
+ this.#pixel.grantConsent();
253
+ }
254
+ const pending = this.#pending.splice(0);
255
+ for (const event of pending) {
256
+ this.#dispatch(event);
257
+ }
258
+ void this.flush();
259
+ }
260
+ #dispatch(event) {
261
+ if (this.#debug) {
262
+ console.debug(`[mazyos] debug ${event.event_name} (${event.event_id}); delivery disabled`);
263
+ return;
264
+ }
265
+ this.#pixel.track(event);
266
+ if (event.event_name === "PageView" &&
267
+ this.#pageviewPolicy === "pixel_only") {
268
+ return;
269
+ }
270
+ this.#send(event);
271
+ }
272
+ #send(event) {
273
+ queueMicrotask(() => {
274
+ void this.#transport
275
+ .send(event)
276
+ .then((sent) => {
277
+ if (!sent)
278
+ this.#enqueueFailed(event);
279
+ })
280
+ .catch(() => {
281
+ this.#enqueueFailed(event);
282
+ });
283
+ });
284
+ }
285
+ #enqueueFailed(event) {
286
+ if (this.#consent !== "granted") {
287
+ return;
288
+ }
289
+ this.#queue?.enqueue(event);
290
+ if (this.#debug) {
291
+ console.debug(`[mazyos] queued ${"event_name" in event ? event.event_name : event.pulse_type} (${event.event_id}) for retry`);
292
+ }
293
+ }
294
+ #emitState() {
295
+ const state = this.state;
296
+ for (const listener of this.#listeners) {
297
+ listener(state);
298
+ }
299
+ }
300
+ }
301
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/client/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TrackerRuntime } from "./runtime.js";
2
+ export declare function installSpaPageViews(runtime: TrackerRuntime, targetWindow?: Window, onPageView?: (eventId: string, initial: boolean) => void): () => void;
3
+ //# sourceMappingURL=spa-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spa-tracking.d.ts","sourceRoot":"","sources":["../../src/client/spa-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,YAAY,GAAE,MAAe,EAC7B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GACvD,MAAM,IAAI,CA4DZ"}
@@ -0,0 +1,54 @@
1
+ export function installSpaPageViews(runtime, targetWindow = window, onPageView) {
2
+ const history = targetWindow.history;
3
+ const originalPushState = history.pushState;
4
+ const originalReplaceState = history.replaceState;
5
+ let currentRoute = routeKey(targetWindow.location);
6
+ let active = true;
7
+ const trackChangedPath = () => {
8
+ if (!active) {
9
+ return;
10
+ }
11
+ const nextRoute = routeKey(targetWindow.location);
12
+ if (nextRoute === currentRoute) {
13
+ return;
14
+ }
15
+ currentRoute = nextRoute;
16
+ runtime.refreshAttribution();
17
+ const eventId = runtime.track("PageView");
18
+ onPageView?.(eventId, false);
19
+ };
20
+ const deferPathCheck = () => {
21
+ queueMicrotask(trackChangedPath);
22
+ };
23
+ const pushState = function (...args) {
24
+ originalPushState.apply(this, args);
25
+ deferPathCheck();
26
+ };
27
+ const replaceState = function (...args) {
28
+ originalReplaceState.apply(this, args);
29
+ deferPathCheck();
30
+ };
31
+ history.pushState = pushState;
32
+ history.replaceState = replaceState;
33
+ targetWindow.addEventListener("popstate", deferPathCheck);
34
+ queueMicrotask(() => {
35
+ if (active) {
36
+ const eventId = runtime.track("PageView");
37
+ onPageView?.(eventId, true);
38
+ }
39
+ });
40
+ return () => {
41
+ active = false;
42
+ targetWindow.removeEventListener("popstate", deferPathCheck);
43
+ if (history.pushState === pushState) {
44
+ history.pushState = originalPushState;
45
+ }
46
+ if (history.replaceState === replaceState) {
47
+ history.replaceState = originalReplaceState;
48
+ }
49
+ };
50
+ }
51
+ function routeKey(location) {
52
+ return `${location.pathname}${location.search}`;
53
+ }
54
+ //# sourceMappingURL=spa-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spa-tracking.js","sourceRoot":"","sources":["../../src/client/spa-tracking.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CACjC,OAAuB,EACvB,YAAY,GAAW,MAAM,EAC7B,UAAwD;IAExD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;IACrC,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;IAC5C,MAAM,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;IAClD,IAAI,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,YAAY,GAAG,SAAS,CAAC;QACzB,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1C,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,SAAS,GAAyB,UAEtC,GAAG,IAAI;QAEP,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,YAAY,GAA4B,UAE5C,GAAG,IAAI;QAEP,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;IACpC,YAAY,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC1D,cAAc,CAAC,GAAG,EAAE;QAClB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1C,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,KAAK,CAAC;QACf,YAAY,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;QACxC,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;YAC1C,OAAO,CAAC,YAAY,GAAG,oBAAoB,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,QAA+C;IAC/D,OAAO,GAAG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { TrackingPayload } from "../types.js";
2
+ export interface EventTransportOptions {
3
+ collectUrl: string;
4
+ fetch?: typeof globalThis.fetch;
5
+ location?: Pick<Location, "href" | "origin">;
6
+ navigator?: Pick<Navigator, "sendBeacon">;
7
+ }
8
+ export declare class EventTransport {
9
+ #private;
10
+ constructor(options: EventTransportOptions);
11
+ send(event: TrackingPayload): Promise<boolean>;
12
+ sendBeacon(event: TrackingPayload): boolean;
13
+ }
14
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;CAC3C;AAED,qBAAa,cAAc;;IAMzB,YAAY,OAAO,EAAE,qBAAqB,EAKzC;IAEK,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBnD;IAED,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAY1C;CAUF"}
@@ -0,0 +1,54 @@
1
+ export class EventTransport {
2
+ #collectUrl;
3
+ #fetch;
4
+ #location;
5
+ #navigator;
6
+ constructor(options) {
7
+ this.#collectUrl = options.collectUrl;
8
+ this.#fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
9
+ this.#location = options.location ?? window.location;
10
+ this.#navigator = options.navigator ?? globalThis.navigator;
11
+ }
12
+ async send(event) {
13
+ if (!this.#isSameOrigin()) {
14
+ return false;
15
+ }
16
+ try {
17
+ const response = await this.#fetch(this.#collectUrl, {
18
+ body: JSON.stringify(event),
19
+ credentials: "same-origin",
20
+ headers: { "content-type": "text/plain;charset=UTF-8" },
21
+ keepalive: true,
22
+ method: "POST",
23
+ });
24
+ return response.ok;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ sendBeacon(event) {
31
+ if (!this.#navigator?.sendBeacon || !this.#isSameOrigin()) {
32
+ return false;
33
+ }
34
+ try {
35
+ const body = new Blob([JSON.stringify(event)], {
36
+ type: "text/plain;charset=UTF-8",
37
+ });
38
+ return this.#navigator.sendBeacon(this.#collectUrl, body);
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ #isSameOrigin() {
45
+ try {
46
+ return new URL(this.#collectUrl, this.#location.href).origin ===
47
+ this.#location.origin;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ }
54
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,cAAc;IAChB,WAAW,CAAS;IACpB,MAAM,CAA0B;IAChC,SAAS,CAAoC;IAC7C,UAAU,CAA4C;IAE/D,YAAY,OAA8B;QACxC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAsB;QAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;gBACnD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3B,WAAW,EAAE,aAAa;gBAC1B,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE;gBACvD,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,UAAU,CAAC,KAAsB;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE;gBAC7C,IAAI,EAAE,0BAA0B;aACjC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,aAAa;QACX,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM;gBAC1D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { TrackerRuntime } from "./runtime.js";
2
+ export declare function installViewTracking(runtime: TrackerRuntime, root?: Document): () => void;
3
+ //# sourceMappingURL=view-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-tracking.d.ts","sourceRoot":"","sources":["../../src/client/view-tracking.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAKnD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,QAAmB,GACxB,MAAM,IAAI,CAkFZ"}
@@ -0,0 +1,71 @@
1
+ import { propertiesFromElement } from "./delegated.js";
2
+ const VIEW_DELAY_MS = 8_000;
3
+ const VIEW_THRESHOLD = 0.35;
4
+ export function installViewTracking(runtime, root = document) {
5
+ const tracked = new WeakSet();
6
+ const timers = new Map();
7
+ const observed = new WeakSet();
8
+ const trackElement = (element) => {
9
+ if (tracked.has(element) || !(element instanceof HTMLElement)) {
10
+ return;
11
+ }
12
+ tracked.add(element);
13
+ const timer = timers.get(element);
14
+ if (timer) {
15
+ clearTimeout(timer);
16
+ timers.delete(element);
17
+ }
18
+ observer?.unobserve(element);
19
+ runtime.track("ViewContent", propertiesFromElement(element));
20
+ };
21
+ const observer = typeof IntersectionObserver === "function"
22
+ ? new IntersectionObserver((entries) => {
23
+ for (const entry of entries) {
24
+ if (entry.isIntersecting &&
25
+ entry.intersectionRatio >= VIEW_THRESHOLD) {
26
+ trackElement(entry.target);
27
+ }
28
+ }
29
+ }, { threshold: VIEW_THRESHOLD })
30
+ : undefined;
31
+ const register = (element) => {
32
+ if (tracked.has(element) || observed.has(element)) {
33
+ return;
34
+ }
35
+ observed.add(element);
36
+ observer?.observe(element);
37
+ timers.set(element, setTimeout(() => {
38
+ trackElement(element);
39
+ }, VIEW_DELAY_MS));
40
+ };
41
+ const scan = (node) => {
42
+ if (node instanceof Element && node.matches("[data-mazyos-view]")) {
43
+ register(node);
44
+ }
45
+ for (const element of node.querySelectorAll("[data-mazyos-view]")) {
46
+ register(element);
47
+ }
48
+ };
49
+ scan(root);
50
+ const mutations = typeof MutationObserver === "function"
51
+ ? new MutationObserver((records) => {
52
+ for (const record of records) {
53
+ for (const node of record.addedNodes) {
54
+ if (node instanceof Element) {
55
+ scan(node);
56
+ }
57
+ }
58
+ }
59
+ })
60
+ : undefined;
61
+ mutations?.observe(root.documentElement, { childList: true, subtree: true });
62
+ return () => {
63
+ observer?.disconnect();
64
+ mutations?.disconnect();
65
+ for (const timer of timers.values()) {
66
+ clearTimeout(timer);
67
+ }
68
+ timers.clear();
69
+ };
70
+ }
71
+ //# sourceMappingURL=view-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-tracking.js","sourceRoot":"","sources":["../../src/client/view-tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DoctorReport } from "./types.js";
2
+ export declare function formatDoctorReport(report: DoctorReport): string;
3
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/doctor/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS/C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAkB/D"}
@@ -0,0 +1,18 @@
1
+ const STATUS_LABELS = {
2
+ fail: "FAIL",
3
+ pass: "PASS",
4
+ skip: "SKIP",
5
+ warn: "WARN",
6
+ };
7
+ export function formatDoctorReport(report) {
8
+ const lines = [`MazyOS LP Doctor ${report.version}`, ""];
9
+ for (const check of report.checks) {
10
+ lines.push(`[${STATUS_LABELS[check.status]}] ${check.message}`, ...(check.detail ? [` ${check.detail}`] : []));
11
+ }
12
+ const failures = report.checks.filter((check) => check.status === "fail").length;
13
+ lines.push("", report.ok
14
+ ? "Integration checks passed."
15
+ : `${failures} integration check${failures === 1 ? "" : "s"} failed.`);
16
+ return `${lines.join("\n")}\n`;
17
+ }
18
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/doctor/format.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACJ,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,KAAK,GAAG,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CACR,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,EACnD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CACpD,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACnC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CACnC,CAAC,MAAM,CAAC;IACT,KAAK,CAAC,IAAI,CACR,EAAE,EACF,MAAM,CAAC,EAAE;QACP,CAAC,CAAC,4BAA4B;QAC9B,CAAC,CAAC,GAAG,QAAQ,qBAAqB,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CACxE,CAAC;IACF,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DoctorCheck, DoctorOptions } from "./types.js";
2
+ export declare function runRemoteChecks(options: DoctorOptions): Promise<DoctorCheck[]>;
3
+ //# sourceMappingURL=remote-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-checks.d.ts","sourceRoot":"","sources":["../../src/doctor/remote-checks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,WAAW,EAAE,CAAC,CAaxB"}