@jmp-technologies/analytics 0.1.20 → 0.1.22

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 (83) hide show
  1. package/README.md +7 -7
  2. package/dist/astro/client.cjs +93 -108
  3. package/dist/astro/client.cjs.map +1 -1
  4. package/dist/astro/client.d.cts +3 -12
  5. package/dist/astro/client.d.ts +3 -12
  6. package/dist/astro/client.js +4 -2
  7. package/dist/astro/client.js.map +1 -1
  8. package/dist/astro/content.cjs +106 -98
  9. package/dist/astro/content.cjs.map +1 -1
  10. package/dist/astro/content.d.cts +2 -2
  11. package/dist/astro/content.d.ts +2 -2
  12. package/dist/astro/content.js +3 -2
  13. package/dist/astro/integration.cjs +68 -60
  14. package/dist/astro/integration.cjs.map +1 -1
  15. package/dist/astro/integration.js +3 -2
  16. package/dist/astro/integration.js.map +1 -1
  17. package/dist/astro/middleware.cjs +66 -63
  18. package/dist/astro/middleware.cjs.map +1 -1
  19. package/dist/astro/middleware.d.cts +2 -2
  20. package/dist/astro/middleware.d.ts +2 -2
  21. package/dist/astro/middleware.js +2 -2
  22. package/dist/astro/register.cjs +68 -60
  23. package/dist/astro/register.cjs.map +1 -1
  24. package/dist/astro/register.js +3 -2
  25. package/dist/{chunk-UDNKWFBM.js → chunk-3U2BSIYX.js} +5 -3
  26. package/dist/{chunk-UDNKWFBM.js.map → chunk-3U2BSIYX.js.map} +1 -1
  27. package/dist/chunk-4OOWA55U.js +215 -0
  28. package/dist/chunk-4OOWA55U.js.map +1 -0
  29. package/dist/{chunk-GFCBZN6S.js → chunk-AHRVNEFV.js} +80 -276
  30. package/dist/chunk-AHRVNEFV.js.map +1 -0
  31. package/dist/{chunk-ALTSW5DB.js → chunk-DQ6A6HTY.js} +12 -8
  32. package/dist/chunk-DQ6A6HTY.js.map +1 -0
  33. package/dist/{chunk-QIWGUF7V.js → chunk-IYFVJ2EY.js} +6 -4
  34. package/dist/{chunk-QIWGUF7V.js.map → chunk-IYFVJ2EY.js.map} +1 -1
  35. package/dist/{chunk-NZS4M3V3.js → chunk-TEFKM3GW.js} +2 -2
  36. package/dist/chunk-TEFKM3GW.js.map +1 -0
  37. package/dist/create-jmp-analytics-BdGOgPxl.d.ts +70 -0
  38. package/dist/create-jmp-analytics-DxhHOmtR.d.cts +70 -0
  39. package/dist/env-public-B6Y0DG68.d.cts +14 -0
  40. package/dist/env-public-B6Y0DG68.d.ts +14 -0
  41. package/dist/index.cjs +203 -198
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +16 -340
  44. package/dist/index.d.ts +16 -340
  45. package/dist/index.js +9 -5
  46. package/dist/landing-capture-C8pyZWuF.d.cts +4 -0
  47. package/dist/landing-capture-C8pyZWuF.d.ts +4 -0
  48. package/dist/next/content.cjs +106 -98
  49. package/dist/next/content.cjs.map +1 -1
  50. package/dist/next/content.d.cts +2 -1
  51. package/dist/next/content.d.ts +2 -1
  52. package/dist/next/content.js +3 -2
  53. package/dist/next/content.js.map +1 -1
  54. package/dist/next/instrumentation.cjs +68 -60
  55. package/dist/next/instrumentation.cjs.map +1 -1
  56. package/dist/next/instrumentation.js +4 -2
  57. package/dist/next/instrumentation.js.map +1 -1
  58. package/dist/next/middleware.cjs +66 -63
  59. package/dist/next/middleware.cjs.map +1 -1
  60. package/dist/next/middleware.d.cts +2 -2
  61. package/dist/next/middleware.d.ts +2 -2
  62. package/dist/next/middleware.js +2 -2
  63. package/dist/next.cjs +152 -123
  64. package/dist/next.cjs.map +1 -1
  65. package/dist/next.d.cts +15 -3
  66. package/dist/next.d.ts +15 -3
  67. package/dist/next.js +45 -7
  68. package/dist/next.js.map +1 -1
  69. package/dist/react.cjs +115 -118
  70. package/dist/react.cjs.map +1 -1
  71. package/dist/react.d.cts +2 -1
  72. package/dist/react.d.ts +2 -1
  73. package/dist/react.js +3 -2
  74. package/dist/site-config-BRuZWGSW.d.cts +46 -0
  75. package/dist/site-config-hkGMSeT7.d.ts +46 -0
  76. package/dist/{track-page-view-CoYo96n0.d.cts → track-page-view-BLS0YfL-.d.ts} +1 -1
  77. package/dist/{track-page-view-DAy0I0Vb.d.ts → track-page-view-DfCyWHqe.d.cts} +1 -1
  78. package/dist/types-BtiK_Acj.d.cts +224 -0
  79. package/dist/types-BtiK_Acj.d.ts +224 -0
  80. package/package.json +2 -4
  81. package/dist/chunk-ALTSW5DB.js.map +0 -1
  82. package/dist/chunk-GFCBZN6S.js.map +0 -1
  83. package/dist/chunk-NZS4M3V3.js.map +0 -1
package/dist/next.cjs CHANGED
@@ -38,7 +38,9 @@ __export(next_exports, {
38
38
  JmpTrackedMailtoLink: () => JmpTrackedMailtoLink,
39
39
  JmpTrackedTelLink: () => JmpTrackedTelLink,
40
40
  buildLandingCaptureInlineScript: () => buildLandingCaptureInlineScript,
41
+ getOrCreateJmpAnalyticsForNextApp: () => getOrCreateJmpAnalyticsForNextApp,
41
42
  isJmpTrackingConsentGranted: () => isJmpTrackingConsentGranted,
43
+ readJmpPublicEnvFromProcess: () => readJmpPublicEnvFromProcess,
42
44
  setJmpTrackingConsent: () => setJmpTrackingConsent,
43
45
  subscribeJmpTrackingConsent: () => subscribeJmpTrackingConsent,
44
46
  useJmpAnalytics: () => useJmpAnalytics
@@ -190,6 +192,51 @@ function buildLandingCaptureInlineScript() {
190
192
  return `(function(){try{var h=location.hostname;var ref=document.referrer||'';function rh(u){try{return new URL(u).hostname.replace(/^www\\./i,'').toLowerCase()}catch(e){try{return new URL('https://'+u).hostname.replace(/^www\\./i,'').toLowerCase()}catch(e2){return null}}}function ext(r){var x=rh(r);if(!x)return false;var s=h.replace(/^www\\./i,'').toLowerCase();return x!==s&&x.slice(-('.'+s).length)!==('.'+s)}function apexDom(hn){var s=hn.replace(/^www\\./i,'').toLowerCase();if(!s||s==='localhost'||/\\.local$/i.test(s)||s.indexOf('.')<0)return null;return s}function readCk(hn){var apex=apexDom(hn);if(!apex)return '';var pre='${JMP_LANDING_REFERER_COOKIE}=';var parts=document.cookie.split(';');for(var i=0;i<parts.length;i++){var t=parts[i].trim();if(t.indexOf(pre)===0){try{return decodeURIComponent(t.slice(pre.length)).trim()}catch(e){return ''}}}return ''}function writeCk(r,hn){var apex=apexDom(hn);if(!apex)return;var sec=location.protocol==='https:'?'; Secure':'';document.cookie='${JMP_LANDING_REFERER_COOKIE}='+encodeURIComponent(r.slice(0,2048))+'; Domain=.'+apex+'; Path=/; Max-Age=${cookieMaxAge}; SameSite=Lax'+sec}var stored=sessionStorage.getItem('${JMP_LANDING_REFERER_KEY}')||'';var ck=readCk(h);var preserved=stored||ck;var lr='';if(ref&&ext(ref)){sessionStorage.setItem('${JMP_LANDING_REFERER_KEY}',ref);writeCk(ref,h);lr=ref}else{lr=preserved||'';if(lr&&!stored)sessionStorage.setItem('${JMP_LANDING_REFERER_KEY}',lr)}var sid=sessionStorage.getItem('${JMP_SESSION_ID_KEY}');if(!sid&&crypto&&crypto.randomUUID){sid=crypto.randomUUID();sessionStorage.setItem('${JMP_SESSION_ID_KEY}',sid)}try{var sp=new URLSearchParams(location.search);var utm={};var updated=false;['utm_source','utm_medium','utm_campaign','utm_content','utm_term'].forEach(function(n){var v=sp.get(n);if(v){utm[n]=v;updated=true}});if(updated)sessionStorage.setItem('${JMP_UTM_SESSION_KEY}',JSON.stringify(utm))}catch(e){}}catch(e){}})();`;
191
193
  }
192
194
 
195
+ // src/env-public.ts
196
+ function firstDefined(...values) {
197
+ for (const v of values) {
198
+ if (v) return v;
199
+ }
200
+ return void 0;
201
+ }
202
+ function readJmpPublicEnvFromProcessEnv() {
203
+ if (typeof process === "undefined" || !process.env) {
204
+ return {};
205
+ }
206
+ const { env } = process;
207
+ const analyticsUrl = firstDefined(
208
+ env.NEXT_PUBLIC_JMP_ANALYTICS_URL,
209
+ env.PUBLIC_JMP_ANALYTICS_URL
210
+ );
211
+ const trackingKey = firstDefined(
212
+ env.NEXT_PUBLIC_JMP_TRACKING_KEY,
213
+ env.PUBLIC_JMP_TRACKING_KEY
214
+ );
215
+ const requireConsentRaw = firstDefined(
216
+ env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT,
217
+ env.PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT
218
+ );
219
+ const autoContactRaw = firstDefined(
220
+ env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS,
221
+ env.PUBLIC_JMP_AUTO_CONTACT_LINKS
222
+ );
223
+ return {
224
+ analyticsUrl,
225
+ trackingKey,
226
+ requireConsent: requireConsentRaw === "true",
227
+ autoContactLinks: autoContactRaw === "true"
228
+ };
229
+ }
230
+ function readJmpPublicEnvFromProcess(overrides) {
231
+ const fromEnv = readJmpPublicEnvFromProcessEnv();
232
+ return {
233
+ analyticsUrl: firstDefined(overrides?.analyticsUrl, fromEnv.analyticsUrl),
234
+ trackingKey: firstDefined(overrides?.trackingKey, fromEnv.trackingKey),
235
+ requireConsent: overrides?.requireConsent ?? fromEnv.requireConsent,
236
+ autoContactLinks: overrides?.autoContactLinks ?? fromEnv.autoContactLinks
237
+ };
238
+ }
239
+
193
240
  // src/contact-link-classifier.ts
194
241
  var BOOKING_LINK_HOSTS = [
195
242
  "calendly.com",
@@ -309,49 +356,11 @@ function classifyContactHref(href) {
309
356
  return null;
310
357
  }
311
358
 
312
- // src/env-public.ts
313
- function readProcessEnv(name) {
314
- if (typeof process === "undefined" || !process.env) return void 0;
315
- const v = process.env[name];
316
- return typeof v === "string" && v.length > 0 ? v : void 0;
317
- }
318
- function firstDefined(...values) {
319
- for (const v of values) {
320
- if (v) return v;
321
- }
322
- return void 0;
323
- }
324
- function readJmpPublicEnvFromProcess(overrides) {
325
- const analyticsUrl = firstDefined(
326
- overrides?.analyticsUrl,
327
- readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_URL"),
328
- readProcessEnv("PUBLIC_JMP_ANALYTICS_URL")
329
- );
330
- const trackingKey = firstDefined(
331
- overrides?.trackingKey,
332
- readProcessEnv("NEXT_PUBLIC_JMP_TRACKING_KEY"),
333
- readProcessEnv("PUBLIC_JMP_TRACKING_KEY")
334
- );
335
- const requireConsentRaw = firstDefined(
336
- overrides?.requireConsent !== void 0 ? String(overrides.requireConsent) : void 0,
337
- readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT"),
338
- readProcessEnv("PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT")
339
- );
340
- const autoContactRaw = firstDefined(
341
- overrides?.autoContactLinks !== void 0 ? String(overrides.autoContactLinks) : void 0,
342
- readProcessEnv("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS"),
343
- readProcessEnv("PUBLIC_JMP_AUTO_CONTACT_LINKS")
344
- );
345
- return {
346
- analyticsUrl,
347
- trackingKey,
348
- requireConsent: requireConsentRaw === "true",
349
- autoContactLinks: autoContactRaw === "true"
350
- };
351
- }
352
-
353
- // src/index.ts
359
+ // src/constants.ts
354
360
  var JMP_TRACKING_CONSENT_STORAGE_KEY = "jmp_analytics_consent_v1";
361
+ var DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS = 800;
362
+
363
+ // src/consent.ts
355
364
  var moduleTrackingConsentGranted = true;
356
365
  var trackingConsentListeners = /* @__PURE__ */ new Set();
357
366
  function readStoredTrackingConsent() {
@@ -364,6 +373,9 @@ function readStoredTrackingConsent() {
364
373
  return false;
365
374
  }
366
375
  }
376
+ function initJmpTrackingConsent(requireConsent) {
377
+ moduleTrackingConsentGranted = requireConsent ? readStoredTrackingConsent() : true;
378
+ }
367
379
  function isJmpTrackingConsentGranted() {
368
380
  return moduleTrackingConsentGranted;
369
381
  }
@@ -394,6 +406,43 @@ function setJmpTrackingConsent(granted) {
394
406
  listener();
395
407
  }
396
408
  }
409
+
410
+ // src/http.ts
411
+ function responseLooksLikeHtml(body) {
412
+ const s = body.trimStart();
413
+ return s.startsWith("<!") || s.toLowerCase().startsWith("<html") || s.startsWith("<") && /<html[\s>]/i.test(s.slice(0, 500));
414
+ }
415
+ function normalizeBaseUrl(baseUrl) {
416
+ return baseUrl.replace(/\/$/, "");
417
+ }
418
+ function resolveFetch(fetchImpl, context) {
419
+ const resolved = fetchImpl ?? (typeof globalThis !== "undefined" && globalThis.fetch ? globalThis.fetch.bind(globalThis) : void 0);
420
+ if (!resolved) {
421
+ throw new Error(`${context}: fetch is not available; pass fetchImpl in config`);
422
+ }
423
+ return resolved;
424
+ }
425
+ function formatApiErrorMessage(status, text, prefix) {
426
+ if (responseLooksLikeHtml(text)) {
427
+ return `${prefix} HTTP ${status} \u2014 response was HTML (not the JSON API). Check baseUrl points at the JMP Analytics dashboard.`;
428
+ }
429
+ let parsed = {};
430
+ try {
431
+ parsed = JSON.parse(text);
432
+ } catch {
433
+ parsed = { error: text };
434
+ }
435
+ const detail = parsed.error ?? text;
436
+ return [
437
+ `${prefix} HTTP ${status}`,
438
+ parsed.code ? `[${parsed.code}]` : null,
439
+ detail,
440
+ parsed.hint ? `Hint: ${parsed.hint}` : null,
441
+ parsed.expectedDomain ? `Domain in JMP admin: ${parsed.expectedDomain}` : null
442
+ ].filter(Boolean).join(" \u2014 ");
443
+ }
444
+
445
+ // src/tracker/helpers.ts
397
446
  function captureAndGetLandingReferer() {
398
447
  if (typeof window === "undefined") {
399
448
  return null;
@@ -421,31 +470,20 @@ function splitPathAndSearch(pathInput) {
421
470
  search: pathInput.slice(qIndex + 1)
422
471
  };
423
472
  }
424
- function responseLooksLikeHtml(body) {
425
- const s = body.trimStart();
426
- return s.startsWith("<!") || s.toLowerCase().startsWith("<html") || s.startsWith("<") && /<html[\s>]/i.test(s.slice(0, 500));
427
- }
428
- function normalizeBaseUrl(baseUrl) {
429
- return baseUrl.replace(/\/$/, "");
430
- }
431
473
  function inferDevice() {
432
474
  if (typeof window === "undefined") {
433
475
  return "unknown";
434
476
  }
435
477
  return window.innerWidth < 768 ? "mobile" : "desktop";
436
478
  }
479
+
480
+ // src/tracker/create-jmp-analytics.ts
437
481
  function createJmpAnalytics(config) {
438
482
  const baseUrl = normalizeBaseUrl(config.baseUrl);
439
- const resolvedFetch = config.fetchImpl ?? (typeof globalThis !== "undefined" && globalThis.fetch ? globalThis.fetch.bind(globalThis) : void 0);
440
- if (!resolvedFetch) {
441
- throw new Error(
442
- "createJmpAnalytics: fetch is not available; pass fetchImpl in config"
443
- );
444
- }
445
- const fetchFn = resolvedFetch;
446
- moduleTrackingConsentGranted = config.requireConsent ? readStoredTrackingConsent() : true;
483
+ const fetchFn = resolveFetch(config.fetchImpl, "createJmpAnalytics");
484
+ initJmpTrackingConsent(config.requireConsent);
447
485
  function canSend() {
448
- return moduleTrackingConsentGranted;
486
+ return isJmpTrackingConsentGranted();
449
487
  }
450
488
  let lastDedupePath = "";
451
489
  let lastDedupeAt = 0;
@@ -477,32 +515,9 @@ function createJmpAnalytics(config) {
477
515
  });
478
516
  if (!res.ok) {
479
517
  const text = await res.text();
480
- if (responseLooksLikeHtml(text)) {
481
- throw new Error(
482
- `JMP Analytics HTTP ${res.status} \u2014 ${url} returned HTML (not the JSON API). Set baseUrl / NEXT_PUBLIC_JMP_ANALYTICS_URL to your JMP Analytics dashboard origin (the deployment that includes POST /api/events), not a marketing or client site unless that codebase ships the same API route.`
483
- );
484
- }
485
- let parsed = {};
486
- try {
487
- parsed = JSON.parse(text);
488
- } catch {
489
- parsed = { error: text };
490
- }
491
- const detail = parsed.error ?? text;
492
- const segments = [
493
- `JMP Analytics HTTP ${res.status}`,
494
- parsed.code ? `[${parsed.code}]` : null,
495
- detail,
496
- parsed.hint ? `Hint: ${parsed.hint}` : null,
497
- parsed.expectedDomain ? `Domain in JMP admin: ${parsed.expectedDomain}` : null
498
- ].filter(Boolean);
499
- const message = segments.join(" \u2014 ");
518
+ const message = formatApiErrorMessage(res.status, text, "JMP Analytics");
500
519
  if (config.debug) {
501
- console.debug("[@jmp-technologies/analytics]", "error response", {
502
- status: res.status,
503
- ...parsed,
504
- raw: text
505
- });
520
+ console.debug("[@jmp-technologies/analytics]", "error response", { status: res.status, raw: text });
506
521
  }
507
522
  throw new Error(message);
508
523
  }
@@ -529,32 +544,9 @@ function createJmpAnalytics(config) {
529
544
  });
530
545
  if (!res.ok) {
531
546
  const text = await res.text();
532
- if (responseLooksLikeHtml(text)) {
533
- throw new Error(
534
- `JMP Analytics HTTP ${res.status} \u2014 ${url} returned HTML (not the JSON API). Set baseUrl / NEXT_PUBLIC_JMP_ANALYTICS_URL to your JMP Analytics dashboard origin (the deployment that includes POST /api/leads).`
535
- );
536
- }
537
- let parsed = {};
538
- try {
539
- parsed = JSON.parse(text);
540
- } catch {
541
- parsed = { error: text };
542
- }
543
- const detail = parsed.error ?? text;
544
- const segments = [
545
- `JMP Analytics HTTP ${res.status}`,
546
- parsed.code ? `[${parsed.code}]` : null,
547
- detail,
548
- parsed.hint ? `Hint: ${parsed.hint}` : null,
549
- parsed.expectedDomain ? `Domain in JMP admin: ${parsed.expectedDomain}` : null
550
- ].filter(Boolean);
551
- const message = segments.join(" \u2014 ");
547
+ const message = formatApiErrorMessage(res.status, text, "JMP Analytics");
552
548
  if (config.debug) {
553
- console.debug("[@jmp-technologies/analytics]", "error response", {
554
- status: res.status,
555
- ...parsed,
556
- raw: text
557
- });
549
+ console.debug("[@jmp-technologies/analytics]", "error response", { status: res.status, raw: text });
558
550
  }
559
551
  throw new Error(message);
560
552
  }
@@ -818,13 +810,16 @@ function createJmpAnalytics(config) {
818
810
  isTrackingConsentGranted: isJmpTrackingConsentGranted
819
811
  };
820
812
  }
821
- var DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS = 800;
813
+
814
+ // src/env/browser.ts
822
815
  function getJmpBrowserAnalyticsConfigFromEnv(overrides) {
823
816
  const pub = readJmpPublicEnvFromProcess();
824
- if (!pub.analyticsUrl || !pub.trackingKey) return null;
817
+ const baseUrl = overrides?.baseUrl ?? pub.analyticsUrl;
818
+ const trackingKey = overrides?.trackingKey ?? pub.trackingKey;
819
+ if (!baseUrl || !trackingKey) return null;
825
820
  return {
826
- baseUrl: pub.analyticsUrl,
827
- trackingKey: pub.trackingKey,
821
+ baseUrl,
822
+ trackingKey,
828
823
  pageViewDedupeMs: DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS,
829
824
  ...overrides,
830
825
  requireConsent: overrides?.requireConsent ?? pub.requireConsent,
@@ -841,11 +836,37 @@ function getOrCreateJmpAnalyticsFromBrowserEnv(overrides) {
841
836
  return jmpAnalyticsBrowserSingleton;
842
837
  }
843
838
 
839
+ // src/env/browser-next.ts
840
+ function readNextAutoContactLinksEnv() {
841
+ if (typeof process === "undefined" || !process.env) {
842
+ return void 0;
843
+ }
844
+ const { env } = process;
845
+ const raw = env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS ?? env.PUBLIC_JMP_AUTO_CONTACT_LINKS;
846
+ return typeof raw === "string" && raw.length > 0 ? raw : void 0;
847
+ }
848
+ function getJmpNextAnalyticsConfigOverrides() {
849
+ const autoEnv = readNextAutoContactLinksEnv();
850
+ const autoContactLinks = autoEnv === "false" ? false : autoEnv === "true" ? true : true;
851
+ return { autoTrackContactLinks: autoContactLinks };
852
+ }
853
+ function getOrCreateJmpAnalyticsForNextApp(overrides) {
854
+ return getOrCreateJmpAnalyticsFromBrowserEnv({
855
+ ...getJmpNextAnalyticsConfigOverrides(),
856
+ ...overrides
857
+ });
858
+ }
859
+
844
860
  // src/react.tsx
845
861
  var import_react = require("react");
846
862
  var import_jsx_runtime = require("react/jsx-runtime");
847
- function useJmpAnalytics() {
848
- return (0, import_react.useMemo)(() => getOrCreateJmpAnalyticsFromBrowserEnv(), []);
863
+ function trackCallClickFromCurrentPath() {
864
+ const path = typeof window !== "undefined" ? window.location.pathname : "/";
865
+ void getOrCreateJmpAnalyticsFromBrowserEnv()?.trackCallClick(path);
866
+ }
867
+ function trackEmailClickFromCurrentPath() {
868
+ const path = typeof window !== "undefined" ? window.location.pathname : "/";
869
+ void getOrCreateJmpAnalyticsFromBrowserEnv()?.trackEmailClick(path);
849
870
  }
850
871
  function JmpTrackedTelLink({
851
872
  href,
@@ -858,9 +879,7 @@ function JmpTrackedTelLink({
858
879
  href,
859
880
  ...rest,
860
881
  onClick: (e) => {
861
- const client = getOrCreateJmpAnalyticsFromBrowserEnv();
862
- const path = typeof window !== "undefined" ? window.location.pathname : "/";
863
- void client?.trackCallClick(path);
882
+ trackCallClickFromCurrentPath();
864
883
  onClick?.(e);
865
884
  }
866
885
  }
@@ -877,9 +896,7 @@ function JmpTrackedMailtoLink({
877
896
  href,
878
897
  ...rest,
879
898
  onClick: (e) => {
880
- const client = getOrCreateJmpAnalyticsFromBrowserEnv();
881
- const path = typeof window !== "undefined" ? window.location.pathname : "/";
882
- void client?.trackEmailClick(path);
899
+ trackEmailClickFromCurrentPath();
883
900
  onClick?.(e);
884
901
  }
885
902
  }
@@ -888,8 +905,11 @@ function JmpTrackedMailtoLink({
888
905
 
889
906
  // src/next.tsx
890
907
  var import_jsx_runtime2 = require("react/jsx-runtime");
908
+ function useJmpAnalytics() {
909
+ return (0, import_react2.useMemo)(() => getOrCreateJmpAnalyticsForNextApp(), []);
910
+ }
891
911
  function JmpLandingCaptureScript({
892
- trackingKey = process.env.NEXT_PUBLIC_JMP_TRACKING_KEY
912
+ trackingKey = readJmpPublicEnvFromProcess().trackingKey
893
913
  } = {}) {
894
914
  if (!trackingKey?.trim()) {
895
915
  return null;
@@ -911,7 +931,7 @@ function JmpNextPageViewTrackerInner() {
911
931
  const query = searchParams?.toString() ?? "";
912
932
  const path = query ? `${pathname}?${query}` : pathname;
913
933
  (0, import_react2.useLayoutEffect)(() => {
914
- const client = getOrCreateJmpAnalyticsFromBrowserEnv();
934
+ const client = getOrCreateJmpAnalyticsForNextApp();
915
935
  void client?.trackPageView({ path });
916
936
  }, [path]);
917
937
  return null;
@@ -927,14 +947,21 @@ function useJmpTrackingActive(deferUntilConsent) {
927
947
  );
928
948
  return !deferUntilConsent || consentGranted;
929
949
  }
950
+ function JmpNextAnalyticsBootstrap() {
951
+ (0, import_react2.useLayoutEffect)(() => {
952
+ getOrCreateJmpAnalyticsForNextApp();
953
+ }, []);
954
+ return null;
955
+ }
930
956
  function JmpNextAnalytics({
931
- deferUntilConsent = process.env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT === "true"
957
+ deferUntilConsent = readJmpPublicEnvFromProcess().requireConsent === true
932
958
  } = {}) {
933
959
  const active = useJmpTrackingActive(deferUntilConsent);
934
960
  if (!active) {
935
961
  return null;
936
962
  }
937
963
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
964
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(JmpNextAnalyticsBootstrap, {}),
938
965
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(JmpLandingCaptureScript, {}),
939
966
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(JmpNextPageViewTracker, {})
940
967
  ] });
@@ -957,7 +984,9 @@ function JmpSiteRoot({
957
984
  JmpTrackedMailtoLink,
958
985
  JmpTrackedTelLink,
959
986
  buildLandingCaptureInlineScript,
987
+ getOrCreateJmpAnalyticsForNextApp,
960
988
  isJmpTrackingConsentGranted,
989
+ readJmpPublicEnvFromProcess,
961
990
  setJmpTrackingConsent,
962
991
  subscribeJmpTrackingConsent,
963
992
  useJmpAnalytics