@jmp-technologies/analytics 0.1.18 → 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 (78) 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-W7CQ5VG2.js → chunk-ALTSW5DB.js} +2 -2
  33. package/dist/{chunk-SOHYQ5GT.js → chunk-GFCBZN6S.js} +113 -44
  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 +82 -44
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +46 -25
  44. package/dist/index.d.ts +46 -25
  45. package/dist/index.js +7 -3
  46. package/dist/next/content.cjs +365 -0
  47. package/dist/next/content.cjs.map +1 -0
  48. package/dist/next/content.d.cts +16 -0
  49. package/dist/next/content.d.ts +16 -0
  50. package/dist/next/content.js +42 -0
  51. package/dist/next/content.js.map +1 -0
  52. package/dist/next/instrumentation.cjs +162 -0
  53. package/dist/next/instrumentation.cjs.map +1 -0
  54. package/dist/next/instrumentation.d.cts +7 -0
  55. package/dist/next/instrumentation.d.ts +7 -0
  56. package/dist/next/instrumentation.js +18 -0
  57. package/dist/next/instrumentation.js.map +1 -0
  58. package/dist/next/middleware.cjs +180 -0
  59. package/dist/next/middleware.cjs.map +1 -0
  60. package/dist/next/middleware.d.cts +10 -0
  61. package/dist/next/middleware.d.ts +10 -0
  62. package/dist/next/middleware.js +14 -0
  63. package/dist/next/middleware.js.map +1 -0
  64. package/dist/next.cjs +58 -14
  65. package/dist/next.cjs.map +1 -1
  66. package/dist/next.d.cts +11 -2
  67. package/dist/next.d.ts +11 -2
  68. package/dist/next.js +17 -3
  69. package/dist/next.js.map +1 -1
  70. package/dist/react.cjs +47 -14
  71. package/dist/react.cjs.map +1 -1
  72. package/dist/react.js +2 -2
  73. package/dist/track-page-view-CoYo96n0.d.cts +9 -0
  74. package/dist/track-page-view-DAy0I0Vb.d.ts +9 -0
  75. package/docs/astro-integration.md +131 -0
  76. package/package.json +45 -2
  77. package/dist/chunk-SOHYQ5GT.js.map +0 -1
  78. /package/dist/{chunk-W7CQ5VG2.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
@@ -29,12 +29,15 @@ __export(index_exports, {
29
29
  createJmpAnalytics: () => createJmpAnalytics,
30
30
  createJmpContentClient: () => createJmpContentClient,
31
31
  createJmpContentClientFromServerEnv: () => createJmpContentClientFromServerEnv,
32
+ defineJmpSite: () => defineJmpSite,
32
33
  getJmpBlogPost: () => getJmpBlogPost,
33
34
  getJmpBlogPosts: () => getJmpBlogPosts,
34
35
  getJmpBrowserAnalyticsConfigFromEnv: () => getJmpBrowserAnalyticsConfigFromEnv,
36
+ getJmpContentConfig: () => getJmpContentConfig,
35
37
  getJmpFaqs: () => getJmpFaqs,
36
38
  getJmpRobotsTxt: () => getJmpRobotsTxt,
37
39
  getJmpServerContentConfigFromEnv: () => getJmpServerContentConfigFromEnv,
40
+ getJmpSiteDefinition: () => getJmpSiteDefinition,
38
41
  getJmpSiteProfile: () => getJmpSiteProfile,
39
42
  getJmpTrustBundle: () => getJmpTrustBundle,
40
43
  getOrCreateJmpAnalyticsFromBrowserEnv: () => getOrCreateJmpAnalyticsFromBrowserEnv,
@@ -42,7 +45,6 @@ __export(index_exports, {
42
45
  isJmpServerContentEnvConfigured: () => isJmpServerContentEnvConfigured,
43
46
  isJmpTrackingConsentGranted: () => isJmpTrackingConsentGranted,
44
47
  registerJmpContentWrappers: () => registerJmpContentWrappers,
45
- registerJmpTrustCapabilities: () => registerJmpTrustCapabilities,
46
48
  setJmpTrackingConsent: () => setJmpTrackingConsent,
47
49
  subscribeJmpTrackingConsent: () => subscribeJmpTrackingConsent,
48
50
  trackJmpServerPageView: () => trackJmpServerPageView
@@ -310,8 +312,71 @@ function classifyContactHref(href) {
310
312
  return null;
311
313
  }
312
314
 
315
+ // src/env-public.ts
316
+ function readProcessEnv(name) {
317
+ if (typeof process === "undefined" || !process.env) return void 0;
318
+ const v = process.env[name];
319
+ return typeof v === "string" && v.length > 0 ? v : void 0;
320
+ }
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
+ };
354
+ }
355
+
356
+ // src/site-config.ts
357
+ var registeredSite = null;
358
+ function defineJmpSite(definition) {
359
+ registeredSite = definition;
360
+ return definition;
361
+ }
362
+ function getJmpSiteDefinition() {
363
+ return registeredSite;
364
+ }
365
+ function getJmpContentConfig() {
366
+ const { analyticsUrl, trackingKey } = readJmpPublicEnvFromProcess();
367
+ if (!analyticsUrl || !trackingKey) {
368
+ return null;
369
+ }
370
+ const site = getJmpSiteDefinition();
371
+ return {
372
+ baseUrl: analyticsUrl,
373
+ trackingKey,
374
+ contentWrappers: site?.contentWrappers ?? void 0
375
+ };
376
+ }
377
+
313
378
  // src/index.ts
314
- var JMP_ANALYTICS_SDK_VERSION = "0.1.18";
379
+ var JMP_ANALYTICS_SDK_VERSION = "0.1.20";
315
380
  var JMP_TRACKING_CONSENT_STORAGE_KEY = "jmp_analytics_consent_v1";
316
381
  var moduleTrackingConsentGranted = true;
317
382
  var trackingConsentListeners = /* @__PURE__ */ new Set();
@@ -891,11 +956,6 @@ function resolveContentWrappersFromConfig(config) {
891
956
  if (config.contentWrappers?.length) {
892
957
  return [...config.contentWrappers];
893
958
  }
894
- if (config.trustSlots?.length) {
895
- return config.trustSlots.map(
896
- (slot) => `trust.${slot}`
897
- );
898
- }
899
959
  return [];
900
960
  }
901
961
  async function registerJmpContentWrappers(config) {
@@ -945,18 +1005,6 @@ async function registerJmpContentWrappers(config) {
945
1005
  const data = JSON.parse(text);
946
1006
  return { ok: true, wrappers: data.wrappers ?? wrappers };
947
1007
  }
948
- async function registerJmpTrustCapabilities(config) {
949
- const result = await registerJmpContentWrappers(config);
950
- if (!result.ok) {
951
- return result;
952
- }
953
- const slots = result.wrappers.filter((w) => w === "trust" || w.startsWith("trust.")).map((w) => w === "trust" ? "summary" : w.slice("trust.".length)).filter(
954
- (s) => ["summary", "testimonials", "reviews", "stats", "logos", "credentials"].includes(
955
- s
956
- )
957
- );
958
- return { ok: true, slots };
959
- }
960
1008
  function createJmpContentClient(config) {
961
1009
  return {
962
1010
  getBlogPosts: () => getJmpBlogPosts(config),
@@ -965,9 +1013,7 @@ function createJmpContentClient(config) {
965
1013
  getTrustBundle: () => getJmpTrustBundle(config),
966
1014
  getSiteProfile: () => getJmpSiteProfile(config),
967
1015
  getRobotsTxt: () => getJmpRobotsTxt(config),
968
- registerContentWrappers: () => registerJmpContentWrappers(config),
969
- /** @deprecated Use registerContentWrappers */
970
- registerTrustCapabilities: () => registerJmpTrustCapabilities(config)
1016
+ registerContentWrappers: () => registerJmpContentWrappers(config)
971
1017
  };
972
1018
  }
973
1019
  async function getContent(config, path) {
@@ -1016,36 +1062,26 @@ async function getContentText(config, path) {
1016
1062
  return text;
1017
1063
  }
1018
1064
  var DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS = 800;
1019
- function readProcessEnv(key) {
1020
- if (typeof process === "undefined" || !process.env) return void 0;
1021
- const v = process.env[key];
1022
- return typeof v === "string" && v.length > 0 ? v : void 0;
1023
- }
1024
1065
  function getJmpBrowserAnalyticsConfigFromEnv(overrides) {
1025
- const baseUrl = readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_URL");
1026
- const trackingKey = readProcessEnv("NEXT_PUBLIC_JMP_TRACKING_KEY");
1027
- if (!baseUrl || !trackingKey) return null;
1028
- const requireConsentFromEnv = readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT") === "true";
1029
- const autoTrackContactLinksFromEnv = readProcessEnv("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS") === "true";
1066
+ const pub = readJmpPublicEnvFromProcess();
1067
+ if (!pub.analyticsUrl || !pub.trackingKey) return null;
1030
1068
  return {
1031
- baseUrl,
1032
- trackingKey,
1069
+ baseUrl: pub.analyticsUrl,
1070
+ trackingKey: pub.trackingKey,
1033
1071
  pageViewDedupeMs: DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS,
1034
1072
  ...overrides,
1035
- requireConsent: overrides?.requireConsent ?? requireConsentFromEnv,
1036
- autoTrackContactLinks: overrides?.autoTrackContactLinks ?? autoTrackContactLinksFromEnv
1073
+ requireConsent: overrides?.requireConsent ?? pub.requireConsent,
1074
+ autoTrackContactLinks: overrides?.autoTrackContactLinks ?? pub.autoContactLinks
1037
1075
  };
1038
1076
  }
1039
1077
  function getJmpServerContentConfigFromEnv(overrides) {
1040
- const baseUrl = readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_URL");
1041
- const trackingKey = readProcessEnv("NEXT_PUBLIC_JMP_TRACKING_KEY");
1042
- if (!baseUrl || !trackingKey) return null;
1043
- 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 };
1044
1081
  }
1045
1082
  function isJmpBrowserAnalyticsEnvConfigured() {
1046
- return Boolean(
1047
- readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_URL") && readProcessEnv("NEXT_PUBLIC_JMP_TRACKING_KEY")
1048
- );
1083
+ const pub = readJmpPublicEnvFromProcess();
1084
+ return Boolean(pub.analyticsUrl && pub.trackingKey);
1049
1085
  }
1050
1086
  function isJmpServerContentEnvConfigured() {
1051
1087
  return isJmpBrowserAnalyticsEnvConfigured();
@@ -1075,12 +1111,15 @@ function createJmpContentClientFromServerEnv(overrides) {
1075
1111
  createJmpAnalytics,
1076
1112
  createJmpContentClient,
1077
1113
  createJmpContentClientFromServerEnv,
1114
+ defineJmpSite,
1078
1115
  getJmpBlogPost,
1079
1116
  getJmpBlogPosts,
1080
1117
  getJmpBrowserAnalyticsConfigFromEnv,
1118
+ getJmpContentConfig,
1081
1119
  getJmpFaqs,
1082
1120
  getJmpRobotsTxt,
1083
1121
  getJmpServerContentConfigFromEnv,
1122
+ getJmpSiteDefinition,
1084
1123
  getJmpSiteProfile,
1085
1124
  getJmpTrustBundle,
1086
1125
  getOrCreateJmpAnalyticsFromBrowserEnv,
@@ -1088,7 +1127,6 @@ function createJmpContentClientFromServerEnv(overrides) {
1088
1127
  isJmpServerContentEnvConfigured,
1089
1128
  isJmpTrackingConsentGranted,
1090
1129
  registerJmpContentWrappers,
1091
- registerJmpTrustCapabilities,
1092
1130
  setJmpTrackingConsent,
1093
1131
  subscribeJmpTrackingConsent,
1094
1132
  trackJmpServerPageView