@jmp-technologies/analytics 0.1.19 → 0.1.20

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 (72) hide show
  1. package/README.md +11 -0
  2. package/dist/astro/client.cjs +855 -0
  3. package/dist/astro/client.cjs.map +1 -0
  4. package/dist/astro/client.d.cts +27 -0
  5. package/dist/astro/client.d.ts +27 -0
  6. package/dist/astro/client.js +67 -0
  7. package/dist/astro/client.js.map +1 -0
  8. package/dist/astro/content.cjs +352 -0
  9. package/dist/astro/content.cjs.map +1 -0
  10. package/dist/astro/content.d.cts +33 -0
  11. package/dist/astro/content.d.ts +33 -0
  12. package/dist/astro/content.js +29 -0
  13. package/dist/astro/content.js.map +1 -0
  14. package/dist/astro/integration.cjs +189 -0
  15. package/dist/astro/integration.cjs.map +1 -0
  16. package/dist/astro/integration.d.cts +36 -0
  17. package/dist/astro/integration.d.ts +36 -0
  18. package/dist/astro/integration.js +35 -0
  19. package/dist/astro/integration.js.map +1 -0
  20. package/dist/astro/middleware.cjs +181 -0
  21. package/dist/astro/middleware.cjs.map +1 -0
  22. package/dist/astro/middleware.d.cts +19 -0
  23. package/dist/astro/middleware.d.ts +19 -0
  24. package/dist/astro/middleware.js +15 -0
  25. package/dist/astro/middleware.js.map +1 -0
  26. package/dist/astro/register.cjs +162 -0
  27. package/dist/astro/register.cjs.map +1 -0
  28. package/dist/astro/register.d.cts +7 -0
  29. package/dist/astro/register.d.ts +7 -0
  30. package/dist/astro/register.js +8 -0
  31. package/dist/astro/register.js.map +1 -0
  32. package/dist/{chunk-EPNF76VK.js → chunk-ALTSW5DB.js} +2 -2
  33. package/dist/{chunk-GB37RVJJ.js → chunk-GFCBZN6S.js} +90 -50
  34. package/dist/chunk-GFCBZN6S.js.map +1 -0
  35. package/dist/chunk-NZS4M3V3.js +19 -0
  36. package/dist/chunk-NZS4M3V3.js.map +1 -0
  37. package/dist/chunk-QIWGUF7V.js +171 -0
  38. package/dist/chunk-QIWGUF7V.js.map +1 -0
  39. package/dist/chunk-UDNKWFBM.js +19 -0
  40. package/dist/chunk-UDNKWFBM.js.map +1 -0
  41. package/dist/index.cjs +56 -49
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +2 -2
  44. package/dist/index.d.ts +2 -2
  45. package/dist/index.js +1 -1
  46. package/dist/next/content.cjs +77 -34
  47. package/dist/next/content.cjs.map +1 -1
  48. package/dist/next/content.d.cts +14 -35
  49. package/dist/next/content.d.ts +14 -35
  50. package/dist/next/content.js +29 -159
  51. package/dist/next/content.js.map +1 -1
  52. package/dist/next/instrumentation.cjs +45 -14
  53. package/dist/next/instrumentation.cjs.map +1 -1
  54. package/dist/next/instrumentation.js +1 -1
  55. package/dist/next/middleware.cjs +50 -17
  56. package/dist/next/middleware.cjs.map +1 -1
  57. package/dist/next/middleware.d.cts +6 -9
  58. package/dist/next/middleware.d.ts +6 -9
  59. package/dist/next/middleware.js +3 -11
  60. package/dist/next/middleware.js.map +1 -1
  61. package/dist/next.cjs +47 -28
  62. package/dist/next.cjs.map +1 -1
  63. package/dist/next.js +2 -2
  64. package/dist/react.cjs +47 -28
  65. package/dist/react.cjs.map +1 -1
  66. package/dist/react.js +2 -2
  67. package/dist/track-page-view-CoYo96n0.d.cts +9 -0
  68. package/dist/track-page-view-DAy0I0Vb.d.ts +9 -0
  69. package/docs/astro-integration.md +131 -0
  70. package/package.json +30 -2
  71. package/dist/chunk-GB37RVJJ.js.map +0 -1
  72. /package/dist/{chunk-EPNF76VK.js.map → chunk-ALTSW5DB.js.map} +0 -0
@@ -0,0 +1,171 @@
1
+ import {
2
+ getJmpBlogPost,
3
+ getJmpBlogPosts,
4
+ getJmpContentConfig,
5
+ getJmpFaqs,
6
+ getJmpSiteDefinition,
7
+ getJmpSiteProfile,
8
+ getJmpTrustBundle
9
+ } from "./chunk-GFCBZN6S.js";
10
+
11
+ // src/content/site-content.ts
12
+ var DEFAULT_EXTRA_KEYS = {
13
+ founderName: ["founder-name", "founder_name"],
14
+ dashboardDemoUrl: ["dashboard-demo-url", "sample-dashboard-url"],
15
+ profilePhotoSrc: ["profile-photo-url", "profile_photo_url"],
16
+ hours: ["hours", "business-hours"],
17
+ serviceArea: ["service-area", "service_area", "service-area-text"]
18
+ };
19
+ function sortBlogPosts(posts) {
20
+ return [...posts].sort((a, b) => {
21
+ const da = a.published_at ?? a.updated_at;
22
+ const db = b.published_at ?? b.updated_at;
23
+ return db.localeCompare(da);
24
+ });
25
+ }
26
+ function sortFaqs(items) {
27
+ return [...items].sort((a, b) => a.sort_order - b.sort_order);
28
+ }
29
+ function readProfileExtra(profile, keys) {
30
+ for (const key of keys) {
31
+ const value = profile?.extras?.[key]?.trim();
32
+ if (value) {
33
+ return value;
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+ function absoluteSiteAssetUrl(src) {
39
+ const trimmed = src.trim();
40
+ if (trimmed.startsWith("http://") || trimmed.startsWith("https://")) {
41
+ return trimmed;
42
+ }
43
+ const siteUrl = getJmpSiteDefinition()?.siteUrl?.replace(/\/$/, "");
44
+ if (!siteUrl) {
45
+ return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
46
+ }
47
+ return `${siteUrl}${trimmed.startsWith("/") ? trimmed : `/${trimmed}`}`;
48
+ }
49
+ async function loadSiteProfile() {
50
+ const config = getJmpContentConfig();
51
+ if (!config) {
52
+ return null;
53
+ }
54
+ try {
55
+ return await getJmpSiteProfile(config);
56
+ } catch {
57
+ return null;
58
+ }
59
+ }
60
+ function resolveSiteContact(profile) {
61
+ const site = getJmpSiteDefinition();
62
+ const fallback = site?.contactFallback ?? {};
63
+ const extraKeys = {
64
+ ...DEFAULT_EXTRA_KEYS,
65
+ ...site?.contactExtraKeys
66
+ };
67
+ const email = profile?.email?.trim() || fallback.email || "";
68
+ const linkedin = profile?.social?.linkedin?.trim() || fallback.linkedin || null;
69
+ const phone = profile?.phone?.trim() || fallback.phone || null;
70
+ return {
71
+ displayName: profile?.display_name?.trim() || profile?.name?.trim() || fallback.displayName || "",
72
+ founderName: readProfileExtra(profile, extraKeys.founderName ?? []) || fallback.founderName || "",
73
+ dashboardDemoUrl: readProfileExtra(profile, extraKeys.dashboardDemoUrl ?? []) || fallback.dashboardDemoUrl || "",
74
+ profilePhotoSrc: readProfileExtra(profile, extraKeys.profilePhotoSrc ?? []) || fallback.profilePhotoSrc || "",
75
+ email,
76
+ linkedin,
77
+ phone,
78
+ hours: readProfileExtra(profile, extraKeys.hours ?? []) || fallback.hours || null,
79
+ serviceArea: readProfileExtra(profile, extraKeys.serviceArea ?? []) || fallback.serviceArea || null,
80
+ privacyUrl: profile?.legal?.privacy_policy_url?.trim() || fallback.privacyUrl || "/privacy",
81
+ termsUrl: profile?.legal?.terms_url?.trim() || fallback.termsUrl || "/terms",
82
+ cta: {
83
+ label: profile?.cta?.label?.trim() || null,
84
+ url: profile?.cta?.url?.trim() || null
85
+ }
86
+ };
87
+ }
88
+ async function getResolvedSiteContact() {
89
+ const profile = await loadSiteProfile();
90
+ return resolveSiteContact(profile);
91
+ }
92
+ async function loadBlogPosts() {
93
+ const c = getJmpContentConfig();
94
+ if (!c) {
95
+ return [];
96
+ }
97
+ try {
98
+ const posts = await getJmpBlogPosts(c);
99
+ return sortBlogPosts(posts);
100
+ } catch {
101
+ return [];
102
+ }
103
+ }
104
+ async function loadBlogPost(slug) {
105
+ const c = getJmpContentConfig();
106
+ if (!c) {
107
+ return null;
108
+ }
109
+ try {
110
+ return await getJmpBlogPost(c, slug);
111
+ } catch {
112
+ return null;
113
+ }
114
+ }
115
+ async function loadFaqs() {
116
+ const c = getJmpContentConfig();
117
+ if (!c) {
118
+ return [];
119
+ }
120
+ try {
121
+ const faqs = await getJmpFaqs(c);
122
+ return sortFaqs(faqs);
123
+ } catch {
124
+ return [];
125
+ }
126
+ }
127
+ async function loadFaqBySlug(slug) {
128
+ const normalized = slug.trim();
129
+ if (!normalized) {
130
+ return null;
131
+ }
132
+ const items = await loadFaqs();
133
+ return items.find((item) => item.slug === normalized || item.id === normalized) ?? null;
134
+ }
135
+ async function loadTrustBundle() {
136
+ const c = getJmpContentConfig();
137
+ if (!c) {
138
+ return null;
139
+ }
140
+ try {
141
+ return await getJmpTrustBundle(c);
142
+ } catch {
143
+ return null;
144
+ }
145
+ }
146
+ function filterFeaturedTrustQuotes(testimonials, placement, limit = 2) {
147
+ return testimonials.filter((item) => {
148
+ if (!item.featured) {
149
+ return false;
150
+ }
151
+ const bucket = item.placement?.trim().toLowerCase();
152
+ if (placement === "reviews") {
153
+ return bucket === "reviews";
154
+ }
155
+ return !bucket || bucket === "testimonials";
156
+ }).sort((a, b) => a.sort_order - b.sort_order).slice(0, limit);
157
+ }
158
+
159
+ export {
160
+ absoluteSiteAssetUrl,
161
+ loadSiteProfile,
162
+ resolveSiteContact,
163
+ getResolvedSiteContact,
164
+ loadBlogPosts,
165
+ loadBlogPost,
166
+ loadFaqs,
167
+ loadFaqBySlug,
168
+ loadTrustBundle,
169
+ filterFeaturedTrustQuotes
170
+ };
171
+ //# sourceMappingURL=chunk-QIWGUF7V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/content/site-content.ts"],"sourcesContent":["import {\n getJmpBlogPost,\n getJmpBlogPosts,\n getJmpFaqs,\n getJmpSiteProfile,\n getJmpTrustBundle,\n type JmpBlogPost,\n type JmpFaqItem,\n type JmpSiteProfile,\n type JmpTestimonial,\n type JmpTrustBundle,\n} from \"../index\"\nimport { getJmpContentConfig, getJmpSiteDefinition } from \"../site-config\"\n\nexport type {\n JmpBlogPost,\n JmpFaqItem,\n JmpSiteProfile,\n JmpTestimonial,\n JmpTrustBundle,\n}\n\nexport { getJmpContentConfig } from \"../site-config\"\n\nexport type ResolvedSiteContact = {\n displayName: string\n email: string\n founderName: string\n dashboardDemoUrl: string\n profilePhotoSrc: string\n linkedin: string | null\n phone: string | null\n hours: string | null\n serviceArea: string | null\n privacyUrl: string\n termsUrl: string\n cta: { label: string | null; url: string | null }\n}\n\nconst DEFAULT_EXTRA_KEYS = {\n founderName: [\"founder-name\", \"founder_name\"],\n dashboardDemoUrl: [\"dashboard-demo-url\", \"sample-dashboard-url\"],\n profilePhotoSrc: [\"profile-photo-url\", \"profile_photo_url\"],\n hours: [\"hours\", \"business-hours\"],\n serviceArea: [\"service-area\", \"service_area\", \"service-area-text\"],\n} as const\n\nfunction sortBlogPosts(posts: JmpBlogPost[]): JmpBlogPost[] {\n return [...posts].sort((a, b) => {\n const da = a.published_at ?? a.updated_at\n const db = b.published_at ?? b.updated_at\n return db.localeCompare(da)\n })\n}\n\nfunction sortFaqs(items: JmpFaqItem[]): JmpFaqItem[] {\n return [...items].sort((a, b) => a.sort_order - b.sort_order)\n}\n\nfunction readProfileExtra(\n profile: JmpSiteProfile | null,\n keys: readonly string[],\n): string | null {\n for (const key of keys) {\n const value = profile?.extras?.[key]?.trim()\n if (value) {\n return value\n }\n }\n return null\n}\n\n/** Resolve a path or URL against {@link defineJmpSite}'s `siteUrl`. */\nexport function absoluteSiteAssetUrl(src: string): string {\n const trimmed = src.trim()\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n return trimmed\n }\n const siteUrl = getJmpSiteDefinition()?.siteUrl?.replace(/\\/$/, \"\")\n if (!siteUrl) {\n return trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`\n }\n return `${siteUrl}${trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`}`\n}\n\nexport async function loadSiteProfile(): Promise<JmpSiteProfile | null> {\n const config = getJmpContentConfig()\n if (!config) {\n return null\n }\n try {\n return await getJmpSiteProfile(config)\n } catch {\n return null\n }\n}\n\nexport function resolveSiteContact(profile: JmpSiteProfile | null): ResolvedSiteContact {\n const site = getJmpSiteDefinition()\n const fallback = site?.contactFallback ?? {}\n const extraKeys = {\n ...DEFAULT_EXTRA_KEYS,\n ...site?.contactExtraKeys,\n }\n\n const email = profile?.email?.trim() || fallback.email || \"\"\n const linkedin =\n profile?.social?.linkedin?.trim() || fallback.linkedin || null\n const phone = profile?.phone?.trim() || fallback.phone || null\n\n return {\n displayName:\n profile?.display_name?.trim() ||\n profile?.name?.trim() ||\n fallback.displayName ||\n \"\",\n founderName:\n readProfileExtra(profile, extraKeys.founderName ?? []) ||\n fallback.founderName ||\n \"\",\n dashboardDemoUrl:\n readProfileExtra(profile, extraKeys.dashboardDemoUrl ?? []) ||\n fallback.dashboardDemoUrl ||\n \"\",\n profilePhotoSrc:\n readProfileExtra(profile, extraKeys.profilePhotoSrc ?? []) ||\n fallback.profilePhotoSrc ||\n \"\",\n email,\n linkedin,\n phone,\n hours:\n readProfileExtra(profile, extraKeys.hours ?? []) || fallback.hours || null,\n serviceArea:\n readProfileExtra(profile, extraKeys.serviceArea ?? []) ||\n fallback.serviceArea ||\n null,\n privacyUrl: profile?.legal?.privacy_policy_url?.trim() || fallback.privacyUrl || \"/privacy\",\n termsUrl: profile?.legal?.terms_url?.trim() || fallback.termsUrl || \"/terms\",\n cta: {\n label: profile?.cta?.label?.trim() || null,\n url: profile?.cta?.url?.trim() || null,\n },\n }\n}\n\nexport async function getResolvedSiteContact(): Promise<ResolvedSiteContact> {\n const profile = await loadSiteProfile()\n return resolveSiteContact(profile)\n}\n\nexport async function loadBlogPosts(): Promise<JmpBlogPost[]> {\n const c = getJmpContentConfig()\n if (!c) {\n return []\n }\n try {\n const posts = await getJmpBlogPosts(c)\n return sortBlogPosts(posts)\n } catch {\n return []\n }\n}\n\nexport async function loadBlogPost(slug: string): Promise<JmpBlogPost | null> {\n const c = getJmpContentConfig()\n if (!c) {\n return null\n }\n try {\n return await getJmpBlogPost(c, slug)\n } catch {\n return null\n }\n}\n\nexport async function loadFaqs(): Promise<JmpFaqItem[]> {\n const c = getJmpContentConfig()\n if (!c) {\n return []\n }\n try {\n const faqs = await getJmpFaqs(c)\n return sortFaqs(faqs)\n } catch {\n return []\n }\n}\n\nexport async function loadFaqBySlug(slug: string): Promise<JmpFaqItem | null> {\n const normalized = slug.trim()\n if (!normalized) {\n return null\n }\n const items = await loadFaqs()\n return (\n items.find((item) => item.slug === normalized || item.id === normalized) ?? null\n )\n}\n\nexport async function loadTrustBundle(): Promise<JmpTrustBundle | null> {\n const c = getJmpContentConfig()\n if (!c) {\n return null\n }\n try {\n return await getJmpTrustBundle(c)\n } catch {\n return null\n }\n}\n\nexport function filterFeaturedTrustQuotes(\n testimonials: JmpTestimonial[],\n placement: \"testimonials\" | \"reviews\",\n limit = 2,\n): JmpTestimonial[] {\n return testimonials\n .filter((item) => {\n if (!item.featured) {\n return false\n }\n const bucket = item.placement?.trim().toLowerCase()\n if (placement === \"reviews\") {\n return bucket === \"reviews\"\n }\n return !bucket || bucket === \"testimonials\"\n })\n .sort((a, b) => a.sort_order - b.sort_order)\n .slice(0, limit)\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ import {
2
+ getJmpContentConfig,
3
+ registerJmpContentWrappers
4
+ } from "./chunk-GFCBZN6S.js";
5
+
6
+ // src/astro/register.ts
7
+ async function registerJmpAstroContent() {
8
+ const config = getJmpContentConfig();
9
+ if (!config) {
10
+ return;
11
+ }
12
+ await registerJmpContentWrappers(config).catch(() => {
13
+ });
14
+ }
15
+
16
+ export {
17
+ registerJmpAstroContent
18
+ };
19
+ //# sourceMappingURL=chunk-UDNKWFBM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/astro/register.ts"],"sourcesContent":["import { registerJmpContentWrappers } from \"../index\"\nimport { getJmpContentConfig } from \"../site-config\"\n\n/**\n * Register content wrappers with the dashboard (call once per build).\n * Import `./jmp.config` in `astro.config.mjs` before calling this, or use {@link jmpAnalytics} integration.\n */\nexport async function registerJmpAstroContent(): Promise<void> {\n const config = getJmpContentConfig()\n if (!config) {\n return\n }\n await registerJmpContentWrappers(config).catch(() => {})\n}\n"],"mappings":";;;;;;AAOA,eAAsB,0BAAyC;AAC7D,QAAM,SAAS,oBAAoB;AACnC,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AACA,QAAM,2BAA2B,MAAM,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACzD;","names":[]}
package/dist/index.cjs CHANGED
@@ -312,19 +312,49 @@ function classifyContactHref(href) {
312
312
  return null;
313
313
  }
314
314
 
315
- // src/site-config.ts
316
- var registeredSite = null;
317
- function readNextPublicEnv(key) {
315
+ // src/env-public.ts
316
+ function readProcessEnv(name) {
318
317
  if (typeof process === "undefined" || !process.env) return void 0;
319
- const v = key === "NEXT_PUBLIC_JMP_ANALYTICS_URL" ? process.env.NEXT_PUBLIC_JMP_ANALYTICS_URL : process.env.NEXT_PUBLIC_JMP_TRACKING_KEY;
318
+ const v = process.env[name];
320
319
  return typeof v === "string" && v.length > 0 ? v : void 0;
321
320
  }
322
- function getServerConfigFromEnv() {
323
- const baseUrl = readNextPublicEnv("NEXT_PUBLIC_JMP_ANALYTICS_URL");
324
- const trackingKey = readNextPublicEnv("NEXT_PUBLIC_JMP_TRACKING_KEY");
325
- if (!baseUrl || !trackingKey) return null;
326
- return { baseUrl, trackingKey };
321
+ function firstDefined(...values) {
322
+ for (const v of values) {
323
+ if (v) return v;
324
+ }
325
+ return void 0;
326
+ }
327
+ function readJmpPublicEnvFromProcess(overrides) {
328
+ const analyticsUrl = firstDefined(
329
+ overrides?.analyticsUrl,
330
+ readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_URL"),
331
+ readProcessEnv("PUBLIC_JMP_ANALYTICS_URL")
332
+ );
333
+ const trackingKey = firstDefined(
334
+ overrides?.trackingKey,
335
+ readProcessEnv("NEXT_PUBLIC_JMP_TRACKING_KEY"),
336
+ readProcessEnv("PUBLIC_JMP_TRACKING_KEY")
337
+ );
338
+ const requireConsentRaw = firstDefined(
339
+ overrides?.requireConsent !== void 0 ? String(overrides.requireConsent) : void 0,
340
+ readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT"),
341
+ readProcessEnv("PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT")
342
+ );
343
+ const autoContactRaw = firstDefined(
344
+ overrides?.autoContactLinks !== void 0 ? String(overrides.autoContactLinks) : void 0,
345
+ readProcessEnv("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS"),
346
+ readProcessEnv("PUBLIC_JMP_AUTO_CONTACT_LINKS")
347
+ );
348
+ return {
349
+ analyticsUrl,
350
+ trackingKey,
351
+ requireConsent: requireConsentRaw === "true",
352
+ autoContactLinks: autoContactRaw === "true"
353
+ };
327
354
  }
355
+
356
+ // src/site-config.ts
357
+ var registeredSite = null;
328
358
  function defineJmpSite(definition) {
329
359
  registeredSite = definition;
330
360
  return definition;
@@ -333,19 +363,20 @@ function getJmpSiteDefinition() {
333
363
  return registeredSite;
334
364
  }
335
365
  function getJmpContentConfig() {
336
- const fromEnv = getServerConfigFromEnv();
337
- if (!fromEnv) {
366
+ const { analyticsUrl, trackingKey } = readJmpPublicEnvFromProcess();
367
+ if (!analyticsUrl || !trackingKey) {
338
368
  return null;
339
369
  }
340
370
  const site = getJmpSiteDefinition();
341
371
  return {
342
- ...fromEnv,
343
- contentWrappers: site?.contentWrappers ?? fromEnv.contentWrappers
372
+ baseUrl: analyticsUrl,
373
+ trackingKey,
374
+ contentWrappers: site?.contentWrappers ?? void 0
344
375
  };
345
376
  }
346
377
 
347
378
  // src/index.ts
348
- var JMP_ANALYTICS_SDK_VERSION = "0.1.19";
379
+ var JMP_ANALYTICS_SDK_VERSION = "0.1.20";
349
380
  var JMP_TRACKING_CONSENT_STORAGE_KEY = "jmp_analytics_consent_v1";
350
381
  var moduleTrackingConsentGranted = true;
351
382
  var trackingConsentListeners = /* @__PURE__ */ new Set();
@@ -1031,50 +1062,26 @@ async function getContentText(config, path) {
1031
1062
  return text;
1032
1063
  }
1033
1064
  var DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS = 800;
1034
- function readNextPublicEnv2(key) {
1035
- if (typeof process === "undefined" || !process.env) return void 0;
1036
- let v;
1037
- switch (key) {
1038
- case "NEXT_PUBLIC_JMP_ANALYTICS_URL":
1039
- v = process.env.NEXT_PUBLIC_JMP_ANALYTICS_URL;
1040
- break;
1041
- case "NEXT_PUBLIC_JMP_TRACKING_KEY":
1042
- v = process.env.NEXT_PUBLIC_JMP_TRACKING_KEY;
1043
- break;
1044
- case "NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT":
1045
- v = process.env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT;
1046
- break;
1047
- case "NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS":
1048
- v = process.env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS;
1049
- break;
1050
- }
1051
- return typeof v === "string" && v.length > 0 ? v : void 0;
1052
- }
1053
1065
  function getJmpBrowserAnalyticsConfigFromEnv(overrides) {
1054
- const baseUrl = readNextPublicEnv2("NEXT_PUBLIC_JMP_ANALYTICS_URL");
1055
- const trackingKey = readNextPublicEnv2("NEXT_PUBLIC_JMP_TRACKING_KEY");
1056
- if (!baseUrl || !trackingKey) return null;
1057
- const requireConsentFromEnv = readNextPublicEnv2("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT") === "true";
1058
- const autoTrackContactLinksFromEnv = readNextPublicEnv2("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS") === "true";
1066
+ const pub = readJmpPublicEnvFromProcess();
1067
+ if (!pub.analyticsUrl || !pub.trackingKey) return null;
1059
1068
  return {
1060
- baseUrl,
1061
- trackingKey,
1069
+ baseUrl: pub.analyticsUrl,
1070
+ trackingKey: pub.trackingKey,
1062
1071
  pageViewDedupeMs: DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS,
1063
1072
  ...overrides,
1064
- requireConsent: overrides?.requireConsent ?? requireConsentFromEnv,
1065
- autoTrackContactLinks: overrides?.autoTrackContactLinks ?? autoTrackContactLinksFromEnv
1073
+ requireConsent: overrides?.requireConsent ?? pub.requireConsent,
1074
+ autoTrackContactLinks: overrides?.autoTrackContactLinks ?? pub.autoContactLinks
1066
1075
  };
1067
1076
  }
1068
1077
  function getJmpServerContentConfigFromEnv(overrides) {
1069
- const baseUrl = readNextPublicEnv2("NEXT_PUBLIC_JMP_ANALYTICS_URL");
1070
- const trackingKey = readNextPublicEnv2("NEXT_PUBLIC_JMP_TRACKING_KEY");
1071
- if (!baseUrl || !trackingKey) return null;
1072
- return { baseUrl, trackingKey, ...overrides };
1078
+ const pub = readJmpPublicEnvFromProcess();
1079
+ if (!pub.analyticsUrl || !pub.trackingKey) return null;
1080
+ return { baseUrl: pub.analyticsUrl, trackingKey: pub.trackingKey, ...overrides };
1073
1081
  }
1074
1082
  function isJmpBrowserAnalyticsEnvConfigured() {
1075
- return Boolean(
1076
- readNextPublicEnv2("NEXT_PUBLIC_JMP_ANALYTICS_URL") && readNextPublicEnv2("NEXT_PUBLIC_JMP_TRACKING_KEY")
1077
- );
1083
+ const pub = readJmpPublicEnvFromProcess();
1084
+ return Boolean(pub.analyticsUrl && pub.trackingKey);
1078
1085
  }
1079
1086
  function isJmpServerContentEnvConfigured() {
1080
1087
  return isJmpBrowserAnalyticsEnvConfigured();