@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.
- package/README.md +7 -7
- package/dist/astro/client.cjs +93 -108
- package/dist/astro/client.cjs.map +1 -1
- package/dist/astro/client.d.cts +3 -12
- package/dist/astro/client.d.ts +3 -12
- package/dist/astro/client.js +4 -2
- package/dist/astro/client.js.map +1 -1
- package/dist/astro/content.cjs +106 -98
- package/dist/astro/content.cjs.map +1 -1
- package/dist/astro/content.d.cts +2 -2
- package/dist/astro/content.d.ts +2 -2
- package/dist/astro/content.js +3 -2
- package/dist/astro/integration.cjs +68 -60
- package/dist/astro/integration.cjs.map +1 -1
- package/dist/astro/integration.js +3 -2
- package/dist/astro/integration.js.map +1 -1
- package/dist/astro/middleware.cjs +66 -63
- package/dist/astro/middleware.cjs.map +1 -1
- package/dist/astro/middleware.d.cts +2 -2
- package/dist/astro/middleware.d.ts +2 -2
- package/dist/astro/middleware.js +2 -2
- package/dist/astro/register.cjs +68 -60
- package/dist/astro/register.cjs.map +1 -1
- package/dist/astro/register.js +3 -2
- package/dist/{chunk-UDNKWFBM.js → chunk-3U2BSIYX.js} +5 -3
- package/dist/{chunk-UDNKWFBM.js.map → chunk-3U2BSIYX.js.map} +1 -1
- package/dist/chunk-4OOWA55U.js +215 -0
- package/dist/chunk-4OOWA55U.js.map +1 -0
- package/dist/{chunk-GFCBZN6S.js → chunk-AHRVNEFV.js} +80 -276
- package/dist/chunk-AHRVNEFV.js.map +1 -0
- package/dist/{chunk-ALTSW5DB.js → chunk-DQ6A6HTY.js} +12 -8
- package/dist/chunk-DQ6A6HTY.js.map +1 -0
- package/dist/{chunk-QIWGUF7V.js → chunk-IYFVJ2EY.js} +6 -4
- package/dist/{chunk-QIWGUF7V.js.map → chunk-IYFVJ2EY.js.map} +1 -1
- package/dist/{chunk-NZS4M3V3.js → chunk-TEFKM3GW.js} +2 -2
- package/dist/chunk-TEFKM3GW.js.map +1 -0
- package/dist/create-jmp-analytics-BdGOgPxl.d.ts +70 -0
- package/dist/create-jmp-analytics-DxhHOmtR.d.cts +70 -0
- package/dist/env-public-B6Y0DG68.d.cts +14 -0
- package/dist/env-public-B6Y0DG68.d.ts +14 -0
- package/dist/index.cjs +203 -198
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -340
- package/dist/index.d.ts +16 -340
- package/dist/index.js +9 -5
- package/dist/landing-capture-C8pyZWuF.d.cts +4 -0
- package/dist/landing-capture-C8pyZWuF.d.ts +4 -0
- package/dist/next/content.cjs +106 -98
- package/dist/next/content.cjs.map +1 -1
- package/dist/next/content.d.cts +2 -1
- package/dist/next/content.d.ts +2 -1
- package/dist/next/content.js +3 -2
- package/dist/next/content.js.map +1 -1
- package/dist/next/instrumentation.cjs +68 -60
- package/dist/next/instrumentation.cjs.map +1 -1
- package/dist/next/instrumentation.js +4 -2
- package/dist/next/instrumentation.js.map +1 -1
- package/dist/next/middleware.cjs +66 -63
- package/dist/next/middleware.cjs.map +1 -1
- package/dist/next/middleware.d.cts +2 -2
- package/dist/next/middleware.d.ts +2 -2
- package/dist/next/middleware.js +2 -2
- package/dist/next.cjs +152 -123
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +15 -3
- package/dist/next.d.ts +15 -3
- package/dist/next.js +45 -7
- package/dist/next.js.map +1 -1
- package/dist/react.cjs +115 -118
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +2 -1
- package/dist/react.d.ts +2 -1
- package/dist/react.js +3 -2
- package/dist/site-config-BRuZWGSW.d.cts +46 -0
- package/dist/site-config-hkGMSeT7.d.ts +46 -0
- package/dist/{track-page-view-CoYo96n0.d.cts → track-page-view-BLS0YfL-.d.ts} +1 -1
- package/dist/{track-page-view-DAy0I0Vb.d.ts → track-page-view-DfCyWHqe.d.cts} +1 -1
- package/dist/types-BtiK_Acj.d.cts +224 -0
- package/dist/types-BtiK_Acj.d.ts +224 -0
- package/package.json +2 -4
- package/dist/chunk-ALTSW5DB.js.map +0 -1
- package/dist/chunk-GFCBZN6S.js.map +0 -1
- 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/
|
|
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
|
|
440
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
813
|
+
|
|
814
|
+
// src/env/browser.ts
|
|
822
815
|
function getJmpBrowserAnalyticsConfigFromEnv(overrides) {
|
|
823
816
|
const pub = readJmpPublicEnvFromProcess();
|
|
824
|
-
|
|
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
|
|
827
|
-
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
|
|
848
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|