@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,132 @@
1
+ import { TRACKER_VERSION } from "../version.js";
2
+ export async function runRemoteChecks(options) {
3
+ if (options.remote === false) {
4
+ return [
5
+ skipped("collect-health", "Remote collect health check disabled"),
6
+ skipped("core-site", "Remote core site check disabled"),
7
+ ];
8
+ }
9
+ const env = options.env ?? process.env;
10
+ const [health, core] = await Promise.all([
11
+ checkCollectHealth(env, options),
12
+ checkCoreSite(env, options),
13
+ ]);
14
+ return [health, core];
15
+ }
16
+ async function checkCollectHealth(env, options) {
17
+ const configuredUrl = clean(env.MAZYOS_COLLECT_URL ?? env.NEXT_PUBLIC_MAZYOS_COLLECT_URL) ??
18
+ clean(env.MAZYOS_LP_URL);
19
+ const collectUrl = resolveCollectUrl(env);
20
+ if (!collectUrl) {
21
+ if (configuredUrl) {
22
+ return result("collect-health", false, "Configured collect health URL is invalid", "Expected an absolute http(s) URL");
23
+ }
24
+ return skipped("collect-health", "Set MAZYOS_COLLECT_URL or MAZYOS_LP_URL to check deployed health");
25
+ }
26
+ const diagnosticsToken = clean(env.MAZYOS_DIAGNOSTICS_TOKEN);
27
+ if (diagnosticsToken) {
28
+ collectUrl.searchParams.set("token", diagnosticsToken);
29
+ }
30
+ try {
31
+ const response = await fetchWithTimeout(collectUrl, options, {
32
+ headers: { accept: "application/json" },
33
+ });
34
+ const body = (await response.json());
35
+ const valid = response.ok &&
36
+ body !== null &&
37
+ typeof body === "object" &&
38
+ body.ok === true &&
39
+ typeof body.version === "string";
40
+ return result("collect-health", valid, "Deployed collect route reports healthy", valid
41
+ ? `tracker ${body.version}`
42
+ : `HTTP ${response.status}`);
43
+ }
44
+ catch (error) {
45
+ return result("collect-health", false, "Deployed collect route is unreachable", errorMessage(error));
46
+ }
47
+ }
48
+ async function checkCoreSite(env, options) {
49
+ const coreUrl = clean(env.MAZYOS_CORE_URL);
50
+ const secret = clean(env.MAZYOS_SITE_SECRET);
51
+ if (!coreUrl || !secret) {
52
+ return skipped("core-site", "Set MAZYOS_CORE_URL and MAZYOS_SITE_SECRET to validate site config");
53
+ }
54
+ let endpoint;
55
+ try {
56
+ endpoint = new URL(coreUrl);
57
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, "")}/conversions/site`;
58
+ endpoint.search = "";
59
+ endpoint.hash = "";
60
+ }
61
+ catch {
62
+ return result("core-site", false, "MAZYOS_CORE_URL is invalid", "Expected an absolute http(s) URL");
63
+ }
64
+ try {
65
+ const response = await fetchWithTimeout(endpoint, options, {
66
+ headers: {
67
+ accept: "application/json",
68
+ authorization: `Bearer ${secret}`,
69
+ },
70
+ });
71
+ const body = (await response.json());
72
+ const minimum = body && typeof body === "object"
73
+ ? body.tracker_min_version
74
+ : undefined;
75
+ const configured = body !== null &&
76
+ typeof body === "object" &&
77
+ typeof body.name === "string" &&
78
+ Array.isArray(body.allowed_origins);
79
+ const compatible = typeof minimum === "string" &&
80
+ compareVersions(TRACKER_VERSION, minimum) >= 0;
81
+ const valid = response.ok && configured && compatible;
82
+ return result("core-site", valid, "Core accepts the site credential and tracker version", response.ok
83
+ ? `required ${String(minimum)}, installed ${TRACKER_VERSION}`
84
+ : `HTTP ${response.status}`);
85
+ }
86
+ catch (error) {
87
+ return result("core-site", false, "Core site configuration is unreachable", errorMessage(error));
88
+ }
89
+ }
90
+ function resolveCollectUrl(env) {
91
+ const direct = clean(env.MAZYOS_COLLECT_URL ?? env.NEXT_PUBLIC_MAZYOS_COLLECT_URL);
92
+ const landingPage = clean(env.MAZYOS_LP_URL);
93
+ try {
94
+ return direct
95
+ ? new URL(direct)
96
+ : landingPage
97
+ ? new URL("/api/mazyos/collect", landingPage)
98
+ : undefined;
99
+ }
100
+ catch {
101
+ return undefined;
102
+ }
103
+ }
104
+ function fetchWithTimeout(input, options, init) {
105
+ return (options.fetch ?? globalThis.fetch)(input, {
106
+ ...init,
107
+ signal: AbortSignal.timeout(options.timeoutMs ?? 2_500),
108
+ });
109
+ }
110
+ function compareVersions(left, right) {
111
+ const a = left.split(".").map((value) => Number.parseInt(value, 10) || 0);
112
+ const b = right.split(".").map((value) => Number.parseInt(value, 10) || 0);
113
+ for (let index = 0; index < 3; index += 1) {
114
+ const difference = (a[index] ?? 0) - (b[index] ?? 0);
115
+ if (difference !== 0)
116
+ return difference;
117
+ }
118
+ return 0;
119
+ }
120
+ function clean(value) {
121
+ return value?.trim() || undefined;
122
+ }
123
+ function errorMessage(error) {
124
+ return error instanceof Error ? error.message : "Unknown network error";
125
+ }
126
+ function skipped(id, message) {
127
+ return { id, message, status: "skip" };
128
+ }
129
+ function result(id, valid, message, detail) {
130
+ return { detail, id, message, status: valid ? "pass" : "fail" };
131
+ }
132
+ //# sourceMappingURL=remote-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-checks.js","sourceRoot":"","sources":["../../src/doctor/remote-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DoctorOptions, DoctorReport } from "./types.js";
2
+ export declare function runDoctor(options?: DoctorOptions): Promise<DoctorReport>;
3
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/doctor/run.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAsB,SAAS,CAC7B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAWvB"}
@@ -0,0 +1,18 @@
1
+ import { resolve } from "node:path";
2
+ import { TRACKER_VERSION } from "../version.js";
3
+ import { runRemoteChecks } from "./remote-checks.js";
4
+ import { scanProjectFiles } from "./scan.js";
5
+ import { runStaticChecks } from "./static-checks.js";
6
+ export async function runDoctor(options = {}) {
7
+ const cwd = resolve(options.cwd ?? process.cwd());
8
+ const files = await scanProjectFiles(cwd);
9
+ const staticChecks = runStaticChecks(files);
10
+ const remoteChecks = await runRemoteChecks(options);
11
+ const checks = [...staticChecks, ...remoteChecks];
12
+ return {
13
+ checks,
14
+ ok: checks.every((check) => check.status !== "fail"),
15
+ version: TRACKER_VERSION,
16
+ };
17
+ }
18
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/doctor/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAO,GAAkB,EAAE;IAE3B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC,CAAC;IAClD,OAAO;QACL,MAAM;QACN,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC;QACpD,OAAO,EAAE,eAAe;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function scanProjectFiles(cwd: string): Promise<Map<string, string>>;
2
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/doctor/scan.ts"],"names":[],"mappings":"AA0BA,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAK9B"}
@@ -0,0 +1,70 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { extname, relative, resolve } from "node:path";
3
+ const EXCLUDED_DIRECTORIES = new Set([
4
+ ".git",
5
+ ".next",
6
+ ".turbo",
7
+ "coverage",
8
+ "dist",
9
+ "node_modules",
10
+ ]);
11
+ const TEXT_EXTENSIONS = new Set([
12
+ ".cjs",
13
+ ".html",
14
+ ".js",
15
+ ".jsx",
16
+ ".mdx",
17
+ ".mjs",
18
+ ".ts",
19
+ ".tsx",
20
+ ]);
21
+ const MAX_FILES = 10_000;
22
+ const MAX_FILE_BYTES = 1_000_000;
23
+ export async function scanProjectFiles(cwd) {
24
+ const root = resolve(cwd);
25
+ const files = new Map();
26
+ await walk(root, root, files);
27
+ return files;
28
+ }
29
+ async function walk(root, directory, output) {
30
+ if (output.size >= MAX_FILES) {
31
+ return;
32
+ }
33
+ let entries;
34
+ try {
35
+ entries = await readdir(directory, { withFileTypes: true });
36
+ }
37
+ catch {
38
+ return;
39
+ }
40
+ await Promise.all(entries.map(async (entry) => {
41
+ if (output.size >= MAX_FILES || entry.isSymbolicLink()) {
42
+ return;
43
+ }
44
+ const absolute = resolve(directory, entry.name);
45
+ if (entry.isDirectory()) {
46
+ if (!EXCLUDED_DIRECTORIES.has(entry.name)) {
47
+ await walk(root, absolute, output);
48
+ }
49
+ return;
50
+ }
51
+ if (!entry.isFile() || !isScannable(entry.name)) {
52
+ return;
53
+ }
54
+ try {
55
+ const content = await readFile(absolute, "utf8");
56
+ if (Buffer.byteLength(content) <= MAX_FILE_BYTES) {
57
+ output.set(relative(root, absolute).replaceAll("\\", "/"), content);
58
+ }
59
+ }
60
+ catch {
61
+ // Unreadable files are not actionable static integration failures.
62
+ }
63
+ }));
64
+ }
65
+ function isScannable(name) {
66
+ return (TEXT_EXTENSIONS.has(extname(name).toLowerCase()) ||
67
+ name === ".env" ||
68
+ name.startsWith(".env."));
69
+ }
70
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/doctor/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,MAAM;IACN,OAAO;IACP,QAAQ;IACR,UAAU;IACV,MAAM;IACN,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW;IAEX,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,IAAY,EACZ,SAAiB,EACjB,MAA2B;IAE3B,IAAI,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC1B,IAAI,MAAM,CAAC,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,cAAc,EAAE,CAAC;gBACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,CACL,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,KAAK,MAAM;QACf,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DoctorCheck } from "./types.js";
2
+ type ProjectFiles = ReadonlyMap<string, string>;
3
+ export declare function runStaticChecks(files: ProjectFiles): DoctorCheck[];
4
+ export {};
5
+ //# sourceMappingURL=static-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-checks.d.ts","sourceRoot":"","sources":["../../src/doctor/static-checks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,KAAK,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAIhD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,EAAE,CAWlE"}
@@ -0,0 +1,130 @@
1
+ import { BUILTIN_CHECKOUT_PROFILES } from "../checkout/profiles.js";
2
+ const SOURCE_FILE = /\.(?:[cm]?[jt]sx?|html|mdx)$/;
3
+ export function runStaticChecks(files) {
4
+ return [
5
+ middlewareCheck(files),
6
+ routeCheck(files),
7
+ providerCheck(files),
8
+ secretCheck(files),
9
+ envExampleCheck(files),
10
+ duplicateTrackingCheck(files),
11
+ queryPreservationCheck(files),
12
+ checkoutMarkupCheck(files),
13
+ ];
14
+ }
15
+ function middlewareCheck(files) {
16
+ const found = firstFile(files, ["middleware.ts", "src/middleware.ts"]);
17
+ const valid = found &&
18
+ /export\s*\{[^}]*\bmiddleware\b[^}]*\}\s*from\s*["']@mazyos\/lp-tracker\/middleware["']/s.test(found.content) &&
19
+ /export\s+const\s+config\s*=\s*\{[\s\S]*?\bmatcher\s*:/.test(found.content);
20
+ return result("middleware-reexport", Boolean(valid), "Middleware reexports tracker capture with local static config", found
21
+ ? found.path
22
+ : "Expected middleware.ts or src/middleware.ts");
23
+ }
24
+ function routeCheck(files) {
25
+ const found = firstFile(files, [
26
+ "app/api/mazyos/collect/route.ts",
27
+ "src/app/api/mazyos/collect/route.ts",
28
+ ]);
29
+ const valid = found &&
30
+ /export\s*\{(?=[^}]*\bPOST\b)(?=[^}]*\bGET\b)[^}]*\}\s*from\s*["']@mazyos\/lp-tracker\/next["']/s.test(found.content) &&
31
+ /export\s+const\s+runtime\s*=\s*["']nodejs["']/.test(found.content) &&
32
+ /export\s+const\s+dynamic\s*=\s*["']force-dynamic["']/.test(found.content);
33
+ return result("collect-route-reexport", Boolean(valid), "Collect route reexports handlers with local static route config", found
34
+ ? found.path
35
+ : "Expected app/api/mazyos/collect/route.ts");
36
+ }
37
+ function providerCheck(files) {
38
+ const found = firstFile(files, ["app/layout.tsx", "src/app/layout.tsx"]);
39
+ const valid = found &&
40
+ /@mazyos\/lp-tracker/.test(found.content) &&
41
+ /<MazyosProvider(?:\s|>)/.test(found.content);
42
+ return result("root-provider", Boolean(valid), "Root layout renders MazyosProvider", found ? found.path : "Expected app/layout.tsx or src/app/layout.tsx");
43
+ }
44
+ function secretCheck(files) {
45
+ const violations = [];
46
+ for (const [path, content] of files) {
47
+ if (/NEXT_PUBLIC_[A-Z0-9_]*[^\n]*sk_lp_/i.test(content)) {
48
+ violations.push(`${path}: server credential under NEXT_PUBLIC_*`);
49
+ }
50
+ if (isVersionedEnvironmentName(path) &&
51
+ /sk_lp_[A-Za-z0-9_-]{12,}/.test(content)) {
52
+ violations.push(`${path}: probable landing-page secret`);
53
+ }
54
+ }
55
+ return result("secret-safety", violations.length === 0, "No landing-page secret is public or stored in a versioned env file", violations.join("; "));
56
+ }
57
+ function envExampleCheck(files) {
58
+ const content = files.get(".env.example");
59
+ const required = ["MAZYOS_SITE_SECRET", "MAZYOS_CORE_URL"];
60
+ const missing = required.filter((name) => !content || !new RegExp(`^\\s*${name}=`, "m").test(content));
61
+ return result("env-example", missing.length === 0, ".env.example documents required server variables", missing.length > 0
62
+ ? `Missing ${missing.join(", ")}`
63
+ : ".env.example");
64
+ }
65
+ function duplicateTrackingCheck(files) {
66
+ const violations = [];
67
+ const patterns = [
68
+ { label: "manual fbq PageView", regex: /fbq\s*\(\s*["']track["']\s*,\s*["']PageView["']/ },
69
+ { label: "manual fbq Purchase", regex: /fbq\s*\(\s*["']track["']\s*,\s*["']Purchase["']/ },
70
+ { label: "gtag conversion", regex: /gtag\s*\(\s*["']event["']\s*,\s*["']conversion["']/ },
71
+ { label: "Meta pixel snippet", regex: /connect\.facebook\.net\/[^"'`\s]+\/fbevents\.js/ },
72
+ ];
73
+ for (const [path, content] of sourceFiles(files)) {
74
+ for (const pattern of patterns) {
75
+ if (pattern.regex.test(content)) {
76
+ violations.push(`${path}: ${pattern.label}`);
77
+ }
78
+ }
79
+ }
80
+ return result("duplicate-tracking", violations.length === 0, "No duplicate pixel PageView/Purchase, conversion call, or Meta snippet", violations.join("; "));
81
+ }
82
+ function queryPreservationCheck(files) {
83
+ const found = firstFile(files, ["app/layout.tsx", "src/app/layout.tsx"]);
84
+ const content = found?.content ?? "";
85
+ const clearsQuery = /router\.replace\s*\(\s*pathname\b/.test(content) ||
86
+ (/history\.replaceState\s*\(/.test(content) &&
87
+ /location\.pathname|window\.location\.pathname/.test(content));
88
+ return result("query-preservation", !clearsQuery, "Root layout does not clear attribution query parameters", clearsQuery ? found?.path : undefined);
89
+ }
90
+ function checkoutMarkupCheck(files) {
91
+ const hosts = BUILTIN_CHECKOUT_PROFILES.flatMap((profile) => profile.hostnames);
92
+ const hostPattern = hosts.map(escapeRegex).join("|");
93
+ const linkPattern = new RegExp(`<(?:a|Link)\\b(?:(?!</?(?:a|Link)\\b)[\\s\\S]){0,1200}?(?:${hostPattern})(?:(?!</?(?:a|Link)\\b)[\\s\\S]){0,500}?>`, "gi");
94
+ const violations = [];
95
+ for (const [path, content] of sourceFiles(files)) {
96
+ for (const match of content.matchAll(linkPattern)) {
97
+ if (!/data-mazyos-checkout(?:\s|=|>)/i.test(match[0])) {
98
+ violations.push(path);
99
+ break;
100
+ }
101
+ }
102
+ }
103
+ return result("checkout-markup", violations.length === 0, "Known checkout links declare data-mazyos-checkout", [...new Set(violations)].join(", "));
104
+ }
105
+ function sourceFiles(files) {
106
+ return [...files].filter(([path]) => SOURCE_FILE.test(path));
107
+ }
108
+ function firstFile(files, paths) {
109
+ for (const path of paths) {
110
+ const content = files.get(path);
111
+ if (content !== undefined)
112
+ return { content, path };
113
+ }
114
+ return undefined;
115
+ }
116
+ function isVersionedEnvironmentName(path) {
117
+ return /^\.env(?:\.(?:development|production|test))?$/.test(path);
118
+ }
119
+ function result(id, valid, message, detail) {
120
+ return {
121
+ ...(detail ? { detail } : {}),
122
+ id,
123
+ message,
124
+ status: valid ? "pass" : "fail",
125
+ };
126
+ }
127
+ function escapeRegex(value) {
128
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
129
+ }
130
+ //# sourceMappingURL=static-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-checks.js","sourceRoot":"","sources":["../../src/doctor/static-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export type DoctorCheckStatus = "fail" | "pass" | "skip" | "warn";
2
+ export interface DoctorCheck {
3
+ detail?: string;
4
+ id: string;
5
+ message: string;
6
+ status: DoctorCheckStatus;
7
+ }
8
+ export interface DoctorReport {
9
+ checks: DoctorCheck[];
10
+ ok: boolean;
11
+ version: string;
12
+ }
13
+ export interface DoctorOptions {
14
+ cwd?: string;
15
+ env?: NodeJS.ProcessEnv;
16
+ fetch?: typeof globalThis.fetch;
17
+ remote?: boolean;
18
+ timeoutMs?: number;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export declare const DEFAULT_MAX_BODY_BYTES: number;
2
+ export declare class RequestBodyError extends Error {
3
+ readonly status: number;
4
+ constructor(message: string, status: number);
5
+ }
6
+ export declare function readJsonObject(request: Request, maxBytes?: number): Promise<Record<string, unknown>>;
7
+ //# sourceMappingURL=body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../src/handler/body.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAAa,CAAC;AAEjD,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAI1C;CACF;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,QAAQ,SAAyB,GAChC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA8ClC"}
@@ -0,0 +1,67 @@
1
+ export const DEFAULT_MAX_BODY_BYTES = 64 * 1_024;
2
+ export class RequestBodyError extends Error {
3
+ status;
4
+ constructor(message, status) {
5
+ super(message);
6
+ this.name = "RequestBodyError";
7
+ this.status = status;
8
+ }
9
+ }
10
+ export async function readJsonObject(request, maxBytes = DEFAULT_MAX_BODY_BYTES) {
11
+ validateContentType(request.headers.get("content-type"));
12
+ const contentLength = Number(request.headers.get("content-length"));
13
+ if (Number.isFinite(contentLength) && contentLength > maxBytes) {
14
+ throw new RequestBodyError("Request body is too large", 413);
15
+ }
16
+ if (!request.body) {
17
+ throw new RequestBodyError("Request body is required", 400);
18
+ }
19
+ const reader = request.body.getReader();
20
+ const chunks = [];
21
+ let size = 0;
22
+ try {
23
+ while (true) {
24
+ const result = await reader.read();
25
+ if (result.done) {
26
+ break;
27
+ }
28
+ size += result.value.byteLength;
29
+ if (size > maxBytes) {
30
+ await reader.cancel();
31
+ throw new RequestBodyError("Request body is too large", 413);
32
+ }
33
+ chunks.push(result.value);
34
+ }
35
+ }
36
+ finally {
37
+ reader.releaseLock();
38
+ }
39
+ const bytes = new Uint8Array(size);
40
+ let offset = 0;
41
+ for (const chunk of chunks) {
42
+ bytes.set(chunk, offset);
43
+ offset += chunk.byteLength;
44
+ }
45
+ let parsed;
46
+ try {
47
+ parsed = JSON.parse(new TextDecoder().decode(bytes));
48
+ }
49
+ catch {
50
+ throw new RequestBodyError("Request body must contain valid JSON", 400);
51
+ }
52
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
53
+ throw new RequestBodyError("Request body must be a JSON object", 400);
54
+ }
55
+ return parsed;
56
+ }
57
+ function validateContentType(value) {
58
+ const contentType = value?.split(";", 1)[0]?.trim().toLowerCase() ?? "";
59
+ const accepted = !contentType ||
60
+ contentType === "application/json" ||
61
+ contentType.endsWith("+json") ||
62
+ contentType === "text/plain";
63
+ if (!accepted) {
64
+ throw new RequestBodyError("Content-Type must be application/json or text/plain", 415);
65
+ }
66
+ }
67
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../../src/handler/body.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface MazyosCollectHandlerOptions {
2
+ botRegex?: RegExp | undefined;
3
+ env?: NodeJS.ProcessEnv | undefined;
4
+ fetch?: typeof globalThis.fetch | undefined;
5
+ maxBodyBytes?: number | undefined;
6
+ random?: (() => number) | undefined;
7
+ retryJitterMs?: readonly [number, number] | undefined;
8
+ sleep?: ((milliseconds: number) => Promise<void>) | undefined;
9
+ timeoutMs?: number | undefined;
10
+ }
11
+ export interface MazyosCollectHandlers {
12
+ GET: (request: Request) => Promise<Response>;
13
+ POST: (request: Request) => Promise<Response>;
14
+ }
15
+ export declare function createMazyosCollectHandler(options?: MazyosCollectHandlerOptions): MazyosCollectHandlers;
16
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/handler/create.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;IACpC,aAAa,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACtD,KAAK,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC/C;AAED,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,2BAAgC,GACxC,qBAAqB,CAoDvB"}
@@ -0,0 +1,69 @@
1
+ import { readJsonObject, RequestBodyError } from "./body.js";
2
+ import { forwardToCore, } from "./forward.js";
3
+ import { healthResponse } from "./health.js";
4
+ import { DEFAULT_BOT_REGEX, EventValidationError, isTrackingPulsePayload, isBotUserAgent, sanitizeBrowserPayload, validateBrowserPayload, } from "./sanitize.js";
5
+ export function createMazyosCollectHandler(options = {}) {
6
+ const env = options.env ?? process.env;
7
+ return {
8
+ GET: (request) => healthResponse(request, {
9
+ env,
10
+ fetch: options.fetch,
11
+ timeoutMs: options.timeoutMs,
12
+ }),
13
+ POST: async (request) => {
14
+ let payload;
15
+ try {
16
+ payload = await readJsonObject(request, options.maxBodyBytes);
17
+ validateBrowserPayload(payload);
18
+ }
19
+ catch (error) {
20
+ if (error instanceof RequestBodyError) {
21
+ return errorResponse("invalid_request", error.status);
22
+ }
23
+ if (error instanceof EventValidationError) {
24
+ return errorResponse("invalid_event", error.status);
25
+ }
26
+ return errorResponse("invalid_request", 400);
27
+ }
28
+ if (isBotUserAgent(request.headers.get("user-agent"), options.botRegex ?? DEFAULT_BOT_REGEX)) {
29
+ return acceptedResponse();
30
+ }
31
+ const sanitized = sanitizeBrowserPayload(payload, request.headers);
32
+ const forwardOptions = {
33
+ coreUrl: env.MAZYOS_CORE_URL,
34
+ fetch: options.fetch,
35
+ random: options.random,
36
+ retryJitterMs: options.retryJitterMs,
37
+ secret: env.MAZYOS_SITE_SECRET,
38
+ sleep: options.sleep,
39
+ timeoutMs: options.timeoutMs,
40
+ endpointPath: isTrackingPulsePayload(payload)
41
+ ? "/conversions/pulse/forward"
42
+ : "/conversions/forward",
43
+ };
44
+ const forwarded = forwardToCore(sanitized, forwardOptions);
45
+ return (await forwarded)
46
+ ? acceptedResponse()
47
+ : unavailableResponse();
48
+ },
49
+ };
50
+ }
51
+ function acceptedResponse() {
52
+ return new Response(null, {
53
+ headers: { "cache-control": "no-store" },
54
+ status: 202,
55
+ });
56
+ }
57
+ function errorResponse(error, status) {
58
+ return Response.json({ error }, {
59
+ headers: { "cache-control": "no-store" },
60
+ status,
61
+ });
62
+ }
63
+ function unavailableResponse() {
64
+ return new Response(null, {
65
+ headers: { "cache-control": "no-store" },
66
+ status: 503,
67
+ });
68
+ }
69
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/handler/create.ts"],"names":[],"mappings":"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"}