@jmp-technologies/analytics 0.1.21 → 0.1.23

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 (67) hide show
  1. package/README.md +7 -7
  2. package/dist/astro/client.cjs +36 -18
  3. package/dist/astro/client.cjs.map +1 -1
  4. package/dist/astro/client.d.cts +1 -11
  5. package/dist/astro/client.d.ts +1 -11
  6. package/dist/astro/client.js +2 -2
  7. package/dist/astro/content.cjs +22 -18
  8. package/dist/astro/content.cjs.map +1 -1
  9. package/dist/astro/content.js +3 -3
  10. package/dist/astro/integration.cjs +23 -19
  11. package/dist/astro/integration.cjs.map +1 -1
  12. package/dist/astro/integration.js +3 -3
  13. package/dist/astro/middleware.cjs +61 -18
  14. package/dist/astro/middleware.cjs.map +1 -1
  15. package/dist/astro/middleware.d.cts +1 -1
  16. package/dist/astro/middleware.d.ts +1 -1
  17. package/dist/astro/middleware.js +2 -2
  18. package/dist/astro/register.cjs +23 -19
  19. package/dist/astro/register.cjs.map +1 -1
  20. package/dist/astro/register.js +3 -3
  21. package/dist/chunk-776LXUWH.js +59 -0
  22. package/dist/chunk-776LXUWH.js.map +1 -0
  23. package/dist/{chunk-GLEOJIKL.js → chunk-B3FYJIXY.js} +24 -19
  24. package/dist/chunk-B3FYJIXY.js.map +1 -0
  25. package/dist/{chunk-DXHJGKIL.js → chunk-G3SNRG7J.js} +14 -8
  26. package/dist/chunk-G3SNRG7J.js.map +1 -0
  27. package/dist/{chunk-6TDPOZMJ.js → chunk-HIJ6OV4S.js} +3 -3
  28. package/dist/{chunk-XA55GBSU.js → chunk-QUNCGUEE.js} +3 -3
  29. package/dist/{chunk-PDOQ2XBW.js → chunk-W6VYMD2P.js} +48 -26
  30. package/dist/chunk-W6VYMD2P.js.map +1 -0
  31. package/dist/env-public-B6Y0DG68.d.cts +14 -0
  32. package/dist/env-public-B6Y0DG68.d.ts +14 -0
  33. package/dist/index.cjs +70 -42
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +3 -2
  36. package/dist/index.d.ts +3 -2
  37. package/dist/index.js +4 -2
  38. package/dist/next/content.cjs +22 -18
  39. package/dist/next/content.cjs.map +1 -1
  40. package/dist/next/content.js +3 -3
  41. package/dist/next/instrumentation.cjs +23 -19
  42. package/dist/next/instrumentation.cjs.map +1 -1
  43. package/dist/next/instrumentation.js +2 -2
  44. package/dist/next/middleware.cjs +61 -18
  45. package/dist/next/middleware.cjs.map +1 -1
  46. package/dist/next/middleware.d.cts +1 -1
  47. package/dist/next/middleware.d.ts +1 -1
  48. package/dist/next/middleware.js +2 -2
  49. package/dist/next.cjs +138 -76
  50. package/dist/next.cjs.map +1 -1
  51. package/dist/next.d.cts +13 -3
  52. package/dist/next.d.ts +13 -3
  53. package/dist/next.js +45 -8
  54. package/dist/next.js.map +1 -1
  55. package/dist/react.cjs +75 -45
  56. package/dist/react.cjs.map +1 -1
  57. package/dist/react.js +3 -3
  58. package/dist/{track-page-view-BLS0YfL-.d.ts → track-page-view-CcPlzQNB.d.ts} +3 -0
  59. package/dist/{track-page-view-DfCyWHqe.d.cts → track-page-view-Cr8I4Unm.d.cts} +3 -0
  60. package/package.json +1 -1
  61. package/dist/chunk-DXHJGKIL.js.map +0 -1
  62. package/dist/chunk-GLEOJIKL.js.map +0 -1
  63. package/dist/chunk-PDOQ2XBW.js.map +0 -1
  64. package/dist/chunk-TK4VRDMO.js +0 -19
  65. package/dist/chunk-TK4VRDMO.js.map +0 -1
  66. /package/dist/{chunk-6TDPOZMJ.js.map → chunk-HIJ6OV4S.js.map} +0 -0
  67. /package/dist/{chunk-XA55GBSU.js.map → chunk-QUNCGUEE.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  jmpTrackServerPageView
3
- } from "../chunk-TK4VRDMO.js";
4
- import "../chunk-GLEOJIKL.js";
3
+ } from "../chunk-776LXUWH.js";
4
+ import "../chunk-B3FYJIXY.js";
5
5
 
6
6
  // src/next/middleware.ts
7
7
  var JMP_MIDDLEWARE_MATCHER = [
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,86 @@ 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
+
240
+ // src/constants.ts
241
+ var JMP_TRACKING_CONSENT_STORAGE_KEY = "jmp_analytics_consent_v1";
242
+ var DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS = 2500;
243
+
244
+ // src/tracker/page-view-dedupe.ts
245
+ var JMP_PAGE_VIEW_DEDUPE_STORAGE_KEY = "jmp_analytics_last_pv";
246
+ var moduleLastPath = "";
247
+ var moduleLastAt = 0;
248
+ function shouldDedupeBrowserPageView(pathname, dedupeMs, storage = null) {
249
+ if (dedupeMs <= 0) {
250
+ return false;
251
+ }
252
+ const now = Date.now();
253
+ if (pathname === moduleLastPath && now - moduleLastAt < dedupeMs) {
254
+ return true;
255
+ }
256
+ try {
257
+ const raw = storage?.getItem(JMP_PAGE_VIEW_DEDUPE_STORAGE_KEY);
258
+ if (raw) {
259
+ const prev = JSON.parse(raw);
260
+ if (prev.path === pathname && now - prev.at < dedupeMs) {
261
+ return true;
262
+ }
263
+ }
264
+ storage?.setItem(
265
+ JMP_PAGE_VIEW_DEDUPE_STORAGE_KEY,
266
+ JSON.stringify({ path: pathname, at: now })
267
+ );
268
+ } catch {
269
+ }
270
+ moduleLastPath = pathname;
271
+ moduleLastAt = now;
272
+ return false;
273
+ }
274
+
193
275
  // src/contact-link-classifier.ts
194
276
  var BOOKING_LINK_HOSTS = [
195
277
  "calendly.com",
@@ -309,10 +391,6 @@ function classifyContactHref(href) {
309
391
  return null;
310
392
  }
311
393
 
312
- // src/constants.ts
313
- var JMP_TRACKING_CONSENT_STORAGE_KEY = "jmp_analytics_consent_v1";
314
- var DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS = 800;
315
-
316
394
  // src/consent.ts
317
395
  var moduleTrackingConsentGranted = true;
318
396
  var trackingConsentListeners = /* @__PURE__ */ new Set();
@@ -438,8 +516,6 @@ function createJmpAnalytics(config) {
438
516
  function canSend() {
439
517
  return isJmpTrackingConsentGranted();
440
518
  }
441
- let lastDedupePath = "";
442
- let lastDedupeAt = 0;
443
519
  async function send(body) {
444
520
  if (!canSend()) {
445
521
  return;
@@ -504,19 +580,6 @@ function createJmpAnalytics(config) {
504
580
  throw new Error(message);
505
581
  }
506
582
  }
507
- function shouldDedupePageView(path) {
508
- const ms = config.pageViewDedupeMs ?? 0;
509
- if (ms <= 0 || typeof window === "undefined") {
510
- return false;
511
- }
512
- const now = Date.now();
513
- if (path === lastDedupePath && now - lastDedupeAt < ms) {
514
- return true;
515
- }
516
- lastDedupePath = path;
517
- lastDedupeAt = now;
518
- return false;
519
- }
520
583
  function trackPageView(options) {
521
584
  if (!canSend()) {
522
585
  return Promise.resolve();
@@ -536,7 +599,9 @@ function createJmpAnalytics(config) {
536
599
  search = window.location.search.replace(/^\?/, "");
537
600
  }
538
601
  const path = search ? `${pathname}?${search}` : pathname;
539
- if (shouldDedupePageView(pathname)) {
602
+ const dedupeMs = config.pageViewDedupeMs ?? DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS;
603
+ const storage = typeof window !== "undefined" ? window.sessionStorage : null;
604
+ if (shouldDedupeBrowserPageView(pathname, dedupeMs, storage)) {
540
605
  return Promise.resolve();
541
606
  }
542
607
  const metadata = options?.metadata && typeof options.metadata === "object" ? { ...options.metadata } : {};
@@ -698,7 +763,7 @@ function createJmpAnalytics(config) {
698
763
  if (!(anchor instanceof HTMLAnchorElement)) {
699
764
  return;
700
765
  }
701
- if (anchor.closest("[data-jmp-no-track]")) {
766
+ if (anchor.closest("[data-jmp-no-track]") || anchor.closest("[data-jmp-tracked]")) {
702
767
  return;
703
768
  }
704
769
  const href = anchor.getAttribute("href") ?? "";
@@ -764,54 +829,15 @@ function createJmpAnalytics(config) {
764
829
  };
765
830
  }
766
831
 
767
- // src/env-public.ts
768
- function readProcessEnv(name) {
769
- if (typeof process === "undefined" || !process.env) return void 0;
770
- const v = process.env[name];
771
- return typeof v === "string" && v.length > 0 ? v : void 0;
772
- }
773
- function firstDefined(...values) {
774
- for (const v of values) {
775
- if (v) return v;
776
- }
777
- return void 0;
778
- }
779
- function readJmpPublicEnvFromProcess(overrides) {
780
- const analyticsUrl = firstDefined(
781
- overrides?.analyticsUrl,
782
- readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_URL"),
783
- readProcessEnv("PUBLIC_JMP_ANALYTICS_URL")
784
- );
785
- const trackingKey = firstDefined(
786
- overrides?.trackingKey,
787
- readProcessEnv("NEXT_PUBLIC_JMP_TRACKING_KEY"),
788
- readProcessEnv("PUBLIC_JMP_TRACKING_KEY")
789
- );
790
- const requireConsentRaw = firstDefined(
791
- overrides?.requireConsent !== void 0 ? String(overrides.requireConsent) : void 0,
792
- readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT"),
793
- readProcessEnv("PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT")
794
- );
795
- const autoContactRaw = firstDefined(
796
- overrides?.autoContactLinks !== void 0 ? String(overrides.autoContactLinks) : void 0,
797
- readProcessEnv("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS"),
798
- readProcessEnv("PUBLIC_JMP_AUTO_CONTACT_LINKS")
799
- );
800
- return {
801
- analyticsUrl,
802
- trackingKey,
803
- requireConsent: requireConsentRaw === "true",
804
- autoContactLinks: autoContactRaw === "true"
805
- };
806
- }
807
-
808
832
  // src/env/browser.ts
809
833
  function getJmpBrowserAnalyticsConfigFromEnv(overrides) {
810
834
  const pub = readJmpPublicEnvFromProcess();
811
- if (!pub.analyticsUrl || !pub.trackingKey) return null;
835
+ const baseUrl = overrides?.baseUrl ?? pub.analyticsUrl;
836
+ const trackingKey = overrides?.trackingKey ?? pub.trackingKey;
837
+ if (!baseUrl || !trackingKey) return null;
812
838
  return {
813
- baseUrl: pub.analyticsUrl,
814
- trackingKey: pub.trackingKey,
839
+ baseUrl,
840
+ trackingKey,
815
841
  pageViewDedupeMs: DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS,
816
842
  ...overrides,
817
843
  requireConsent: overrides?.requireConsent ?? pub.requireConsent,
@@ -828,11 +854,37 @@ function getOrCreateJmpAnalyticsFromBrowserEnv(overrides) {
828
854
  return jmpAnalyticsBrowserSingleton;
829
855
  }
830
856
 
857
+ // src/env/browser-next.ts
858
+ function readNextAutoContactLinksEnv() {
859
+ if (typeof process === "undefined" || !process.env) {
860
+ return void 0;
861
+ }
862
+ const { env } = process;
863
+ const raw = env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS ?? env.PUBLIC_JMP_AUTO_CONTACT_LINKS;
864
+ return typeof raw === "string" && raw.length > 0 ? raw : void 0;
865
+ }
866
+ function getJmpNextAnalyticsConfigOverrides() {
867
+ const autoEnv = readNextAutoContactLinksEnv();
868
+ const autoContactLinks = autoEnv === "false" ? false : autoEnv === "true" ? true : true;
869
+ return { autoTrackContactLinks: autoContactLinks };
870
+ }
871
+ function getOrCreateJmpAnalyticsForNextApp(overrides) {
872
+ return getOrCreateJmpAnalyticsFromBrowserEnv({
873
+ ...getJmpNextAnalyticsConfigOverrides(),
874
+ ...overrides
875
+ });
876
+ }
877
+
831
878
  // src/react.tsx
832
879
  var import_react = require("react");
833
880
  var import_jsx_runtime = require("react/jsx-runtime");
834
- function useJmpAnalytics() {
835
- return (0, import_react.useMemo)(() => getOrCreateJmpAnalyticsFromBrowserEnv(), []);
881
+ function trackCallClickFromCurrentPath() {
882
+ const path = typeof window !== "undefined" ? window.location.pathname : "/";
883
+ void getOrCreateJmpAnalyticsFromBrowserEnv()?.trackCallClick(path);
884
+ }
885
+ function trackEmailClickFromCurrentPath() {
886
+ const path = typeof window !== "undefined" ? window.location.pathname : "/";
887
+ void getOrCreateJmpAnalyticsFromBrowserEnv()?.trackEmailClick(path);
836
888
  }
837
889
  function JmpTrackedTelLink({
838
890
  href,
@@ -843,11 +895,10 @@ function JmpTrackedTelLink({
843
895
  "a",
844
896
  {
845
897
  href,
898
+ "data-jmp-tracked": "true",
846
899
  ...rest,
847
900
  onClick: (e) => {
848
- const client = getOrCreateJmpAnalyticsFromBrowserEnv();
849
- const path = typeof window !== "undefined" ? window.location.pathname : "/";
850
- void client?.trackCallClick(path);
901
+ trackCallClickFromCurrentPath();
851
902
  onClick?.(e);
852
903
  }
853
904
  }
@@ -862,11 +913,10 @@ function JmpTrackedMailtoLink({
862
913
  "a",
863
914
  {
864
915
  href,
916
+ "data-jmp-tracked": "true",
865
917
  ...rest,
866
918
  onClick: (e) => {
867
- const client = getOrCreateJmpAnalyticsFromBrowserEnv();
868
- const path = typeof window !== "undefined" ? window.location.pathname : "/";
869
- void client?.trackEmailClick(path);
919
+ trackEmailClickFromCurrentPath();
870
920
  onClick?.(e);
871
921
  }
872
922
  }
@@ -875,8 +925,11 @@ function JmpTrackedMailtoLink({
875
925
 
876
926
  // src/next.tsx
877
927
  var import_jsx_runtime2 = require("react/jsx-runtime");
928
+ function useJmpAnalytics() {
929
+ return (0, import_react2.useMemo)(() => getOrCreateJmpAnalyticsForNextApp(), []);
930
+ }
878
931
  function JmpLandingCaptureScript({
879
- trackingKey = process.env.NEXT_PUBLIC_JMP_TRACKING_KEY
932
+ trackingKey = readJmpPublicEnvFromProcess().trackingKey
880
933
  } = {}) {
881
934
  if (!trackingKey?.trim()) {
882
935
  return null;
@@ -898,7 +951,7 @@ function JmpNextPageViewTrackerInner() {
898
951
  const query = searchParams?.toString() ?? "";
899
952
  const path = query ? `${pathname}?${query}` : pathname;
900
953
  (0, import_react2.useLayoutEffect)(() => {
901
- const client = getOrCreateJmpAnalyticsFromBrowserEnv();
954
+ const client = getOrCreateJmpAnalyticsForNextApp();
902
955
  void client?.trackPageView({ path });
903
956
  }, [path]);
904
957
  return null;
@@ -914,14 +967,21 @@ function useJmpTrackingActive(deferUntilConsent) {
914
967
  );
915
968
  return !deferUntilConsent || consentGranted;
916
969
  }
970
+ function JmpNextAnalyticsBootstrap() {
971
+ (0, import_react2.useLayoutEffect)(() => {
972
+ getOrCreateJmpAnalyticsForNextApp();
973
+ }, []);
974
+ return null;
975
+ }
917
976
  function JmpNextAnalytics({
918
- deferUntilConsent = process.env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT === "true"
977
+ deferUntilConsent = readJmpPublicEnvFromProcess().requireConsent === true
919
978
  } = {}) {
920
979
  const active = useJmpTrackingActive(deferUntilConsent);
921
980
  if (!active) {
922
981
  return null;
923
982
  }
924
983
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
984
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(JmpNextAnalyticsBootstrap, {}),
925
985
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(JmpLandingCaptureScript, {}),
926
986
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(JmpNextPageViewTracker, {})
927
987
  ] });
@@ -944,7 +1004,9 @@ function JmpSiteRoot({
944
1004
  JmpTrackedMailtoLink,
945
1005
  JmpTrackedTelLink,
946
1006
  buildLandingCaptureInlineScript,
1007
+ getOrCreateJmpAnalyticsForNextApp,
947
1008
  isJmpTrackingConsentGranted,
1009
+ readJmpPublicEnvFromProcess,
948
1010
  setJmpTrackingConsent,
949
1011
  subscribeJmpTrackingConsent,
950
1012
  useJmpAnalytics