@jmp-technologies/analytics 0.1.19 → 0.1.21

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 (88) hide show
  1. package/README.md +11 -0
  2. package/dist/astro/client.cjs +840 -0
  3. package/dist/astro/client.cjs.map +1 -0
  4. package/dist/astro/client.d.cts +28 -0
  5. package/dist/astro/client.d.ts +28 -0
  6. package/dist/astro/client.js +69 -0
  7. package/dist/astro/client.js.map +1 -0
  8. package/dist/astro/content.cjs +356 -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 +30 -0
  13. package/dist/astro/content.js.map +1 -0
  14. package/dist/astro/integration.cjs +193 -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 +36 -0
  19. package/dist/astro/integration.js.map +1 -0
  20. package/dist/astro/middleware.cjs +180 -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 +166 -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 +9 -0
  31. package/dist/astro/register.js.map +1 -0
  32. package/dist/chunk-6TDPOZMJ.js +173 -0
  33. package/dist/chunk-6TDPOZMJ.js.map +1 -0
  34. package/dist/{chunk-EPNF76VK.js → chunk-DXHJGKIL.js} +2 -2
  35. package/dist/chunk-GLEOJIKL.js +211 -0
  36. package/dist/chunk-GLEOJIKL.js.map +1 -0
  37. package/dist/{chunk-GB37RVJJ.js → chunk-PDOQ2XBW.js} +82 -242
  38. package/dist/chunk-PDOQ2XBW.js.map +1 -0
  39. package/dist/chunk-TK4VRDMO.js +19 -0
  40. package/dist/chunk-TK4VRDMO.js.map +1 -0
  41. package/dist/chunk-XA55GBSU.js +21 -0
  42. package/dist/chunk-XA55GBSU.js.map +1 -0
  43. package/dist/create-jmp-analytics-BdGOgPxl.d.ts +70 -0
  44. package/dist/create-jmp-analytics-DxhHOmtR.d.cts +70 -0
  45. package/dist/index.cjs +199 -197
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.d.cts +16 -341
  48. package/dist/index.d.ts +16 -341
  49. package/dist/index.js +7 -5
  50. package/dist/landing-capture-C8pyZWuF.d.cts +4 -0
  51. package/dist/landing-capture-C8pyZWuF.d.ts +4 -0
  52. package/dist/next/content.cjs +135 -88
  53. package/dist/next/content.cjs.map +1 -1
  54. package/dist/next/content.d.cts +15 -35
  55. package/dist/next/content.d.ts +15 -35
  56. package/dist/next/content.js +30 -159
  57. package/dist/next/content.js.map +1 -1
  58. package/dist/next/instrumentation.cjs +64 -29
  59. package/dist/next/instrumentation.cjs.map +1 -1
  60. package/dist/next/instrumentation.js +4 -2
  61. package/dist/next/instrumentation.js.map +1 -1
  62. package/dist/next/middleware.cjs +68 -36
  63. package/dist/next/middleware.cjs.map +1 -1
  64. package/dist/next/middleware.d.cts +6 -9
  65. package/dist/next/middleware.d.ts +6 -9
  66. package/dist/next/middleware.js +3 -11
  67. package/dist/next/middleware.js.map +1 -1
  68. package/dist/next.cjs +99 -93
  69. package/dist/next.cjs.map +1 -1
  70. package/dist/next.d.cts +3 -1
  71. package/dist/next.d.ts +3 -1
  72. package/dist/next.js +3 -2
  73. package/dist/next.js.map +1 -1
  74. package/dist/react.cjs +99 -93
  75. package/dist/react.cjs.map +1 -1
  76. package/dist/react.d.cts +2 -1
  77. package/dist/react.d.ts +2 -1
  78. package/dist/react.js +3 -2
  79. package/dist/site-config-BRuZWGSW.d.cts +46 -0
  80. package/dist/site-config-hkGMSeT7.d.ts +46 -0
  81. package/dist/track-page-view-BLS0YfL-.d.ts +9 -0
  82. package/dist/track-page-view-DfCyWHqe.d.cts +9 -0
  83. package/dist/types-BtiK_Acj.d.cts +224 -0
  84. package/dist/types-BtiK_Acj.d.ts +224 -0
  85. package/docs/astro-integration.md +131 -0
  86. package/package.json +31 -5
  87. package/dist/chunk-GB37RVJJ.js.map +0 -1
  88. /package/dist/{chunk-EPNF76VK.js.map → chunk-DXHJGKIL.js.map} +0 -0
@@ -0,0 +1,173 @@
1
+ import {
2
+ getJmpBlogPost,
3
+ getJmpBlogPosts,
4
+ getJmpFaqs,
5
+ getJmpSiteProfile,
6
+ getJmpTrustBundle
7
+ } from "./chunk-PDOQ2XBW.js";
8
+ import {
9
+ getJmpContentConfig,
10
+ getJmpSiteDefinition
11
+ } from "./chunk-GLEOJIKL.js";
12
+
13
+ // src/content/site-content.ts
14
+ var DEFAULT_EXTRA_KEYS = {
15
+ founderName: ["founder-name", "founder_name"],
16
+ dashboardDemoUrl: ["dashboard-demo-url", "sample-dashboard-url"],
17
+ profilePhotoSrc: ["profile-photo-url", "profile_photo_url"],
18
+ hours: ["hours", "business-hours"],
19
+ serviceArea: ["service-area", "service_area", "service-area-text"]
20
+ };
21
+ function sortBlogPosts(posts) {
22
+ return [...posts].sort((a, b) => {
23
+ const da = a.published_at ?? a.updated_at;
24
+ const db = b.published_at ?? b.updated_at;
25
+ return db.localeCompare(da);
26
+ });
27
+ }
28
+ function sortFaqs(items) {
29
+ return [...items].sort((a, b) => a.sort_order - b.sort_order);
30
+ }
31
+ function readProfileExtra(profile, keys) {
32
+ for (const key of keys) {
33
+ const value = profile?.extras?.[key]?.trim();
34
+ if (value) {
35
+ return value;
36
+ }
37
+ }
38
+ return null;
39
+ }
40
+ function absoluteSiteAssetUrl(src) {
41
+ const trimmed = src.trim();
42
+ if (trimmed.startsWith("http://") || trimmed.startsWith("https://")) {
43
+ return trimmed;
44
+ }
45
+ const siteUrl = getJmpSiteDefinition()?.siteUrl?.replace(/\/$/, "");
46
+ if (!siteUrl) {
47
+ return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
48
+ }
49
+ return `${siteUrl}${trimmed.startsWith("/") ? trimmed : `/${trimmed}`}`;
50
+ }
51
+ async function loadSiteProfile() {
52
+ const config = getJmpContentConfig();
53
+ if (!config) {
54
+ return null;
55
+ }
56
+ try {
57
+ return await getJmpSiteProfile(config);
58
+ } catch {
59
+ return null;
60
+ }
61
+ }
62
+ function resolveSiteContact(profile) {
63
+ const site = getJmpSiteDefinition();
64
+ const fallback = site?.contactFallback ?? {};
65
+ const extraKeys = {
66
+ ...DEFAULT_EXTRA_KEYS,
67
+ ...site?.contactExtraKeys
68
+ };
69
+ const email = profile?.email?.trim() || fallback.email || "";
70
+ const linkedin = profile?.social?.linkedin?.trim() || fallback.linkedin || null;
71
+ const phone = profile?.phone?.trim() || fallback.phone || null;
72
+ return {
73
+ displayName: profile?.display_name?.trim() || profile?.name?.trim() || fallback.displayName || "",
74
+ founderName: readProfileExtra(profile, extraKeys.founderName ?? []) || fallback.founderName || "",
75
+ dashboardDemoUrl: readProfileExtra(profile, extraKeys.dashboardDemoUrl ?? []) || fallback.dashboardDemoUrl || "",
76
+ profilePhotoSrc: readProfileExtra(profile, extraKeys.profilePhotoSrc ?? []) || fallback.profilePhotoSrc || "",
77
+ email,
78
+ linkedin,
79
+ phone,
80
+ hours: readProfileExtra(profile, extraKeys.hours ?? []) || fallback.hours || null,
81
+ serviceArea: readProfileExtra(profile, extraKeys.serviceArea ?? []) || fallback.serviceArea || null,
82
+ privacyUrl: profile?.legal?.privacy_policy_url?.trim() || fallback.privacyUrl || "/privacy",
83
+ termsUrl: profile?.legal?.terms_url?.trim() || fallback.termsUrl || "/terms",
84
+ cta: {
85
+ label: profile?.cta?.label?.trim() || null,
86
+ url: profile?.cta?.url?.trim() || null
87
+ }
88
+ };
89
+ }
90
+ async function getResolvedSiteContact() {
91
+ const profile = await loadSiteProfile();
92
+ return resolveSiteContact(profile);
93
+ }
94
+ async function loadBlogPosts() {
95
+ const c = getJmpContentConfig();
96
+ if (!c) {
97
+ return [];
98
+ }
99
+ try {
100
+ const posts = await getJmpBlogPosts(c);
101
+ return sortBlogPosts(posts);
102
+ } catch {
103
+ return [];
104
+ }
105
+ }
106
+ async function loadBlogPost(slug) {
107
+ const c = getJmpContentConfig();
108
+ if (!c) {
109
+ return null;
110
+ }
111
+ try {
112
+ return await getJmpBlogPost(c, slug);
113
+ } catch {
114
+ return null;
115
+ }
116
+ }
117
+ async function loadFaqs() {
118
+ const c = getJmpContentConfig();
119
+ if (!c) {
120
+ return [];
121
+ }
122
+ try {
123
+ const faqs = await getJmpFaqs(c);
124
+ return sortFaqs(faqs);
125
+ } catch {
126
+ return [];
127
+ }
128
+ }
129
+ async function loadFaqBySlug(slug) {
130
+ const normalized = slug.trim();
131
+ if (!normalized) {
132
+ return null;
133
+ }
134
+ const items = await loadFaqs();
135
+ return items.find((item) => item.slug === normalized || item.id === normalized) ?? null;
136
+ }
137
+ async function loadTrustBundle() {
138
+ const c = getJmpContentConfig();
139
+ if (!c) {
140
+ return null;
141
+ }
142
+ try {
143
+ return await getJmpTrustBundle(c);
144
+ } catch {
145
+ return null;
146
+ }
147
+ }
148
+ function filterFeaturedTrustQuotes(testimonials, placement, limit = 2) {
149
+ return testimonials.filter((item) => {
150
+ if (!item.featured) {
151
+ return false;
152
+ }
153
+ const bucket = item.placement?.trim().toLowerCase();
154
+ if (placement === "reviews") {
155
+ return bucket === "reviews";
156
+ }
157
+ return !bucket || bucket === "testimonials";
158
+ }).sort((a, b) => a.sort_order - b.sort_order).slice(0, limit);
159
+ }
160
+
161
+ export {
162
+ absoluteSiteAssetUrl,
163
+ loadSiteProfile,
164
+ resolveSiteContact,
165
+ getResolvedSiteContact,
166
+ loadBlogPosts,
167
+ loadBlogPost,
168
+ loadFaqs,
169
+ loadFaqBySlug,
170
+ loadTrustBundle,
171
+ filterFeaturedTrustQuotes
172
+ };
173
+ //# sourceMappingURL=chunk-6TDPOZMJ.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":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getOrCreateJmpAnalyticsFromBrowserEnv
3
- } from "./chunk-GB37RVJJ.js";
3
+ } from "./chunk-PDOQ2XBW.js";
4
4
 
5
5
  // src/react.tsx
6
6
  import { useMemo } from "react";
@@ -52,4 +52,4 @@ export {
52
52
  JmpTrackedTelLink,
53
53
  JmpTrackedMailtoLink
54
54
  };
55
- //# sourceMappingURL=chunk-EPNF76VK.js.map
55
+ //# sourceMappingURL=chunk-DXHJGKIL.js.map
@@ -0,0 +1,211 @@
1
+ // src/http.ts
2
+ function responseLooksLikeHtml(body) {
3
+ const s = body.trimStart();
4
+ return s.startsWith("<!") || s.toLowerCase().startsWith("<html") || s.startsWith("<") && /<html[\s>]/i.test(s.slice(0, 500));
5
+ }
6
+ function normalizeBaseUrl(baseUrl) {
7
+ return baseUrl.replace(/\/$/, "");
8
+ }
9
+ function getHeader(headers, key) {
10
+ if (!headers) {
11
+ return null;
12
+ }
13
+ if (typeof headers.get === "function") {
14
+ return headers.get(key);
15
+ }
16
+ const record = headers;
17
+ const direct = record[key] ?? record[key.toLowerCase()];
18
+ if (Array.isArray(direct)) {
19
+ return direct[0] ?? null;
20
+ }
21
+ return direct ?? null;
22
+ }
23
+ function pathFromRequestUrl(url) {
24
+ if (!url) {
25
+ return "/";
26
+ }
27
+ try {
28
+ const u = new URL(url);
29
+ return `${u.pathname}${u.search}`;
30
+ } catch {
31
+ return url.startsWith("/") ? url : "/";
32
+ }
33
+ }
34
+ function resolveFetch(fetchImpl, context) {
35
+ const resolved = fetchImpl ?? (typeof globalThis !== "undefined" && globalThis.fetch ? globalThis.fetch.bind(globalThis) : void 0);
36
+ if (!resolved) {
37
+ throw new Error(`${context}: fetch is not available; pass fetchImpl in config`);
38
+ }
39
+ return resolved;
40
+ }
41
+ function formatApiErrorMessage(status, text, prefix) {
42
+ if (responseLooksLikeHtml(text)) {
43
+ return `${prefix} HTTP ${status} \u2014 response was HTML (not the JSON API). Check baseUrl points at the JMP Analytics dashboard.`;
44
+ }
45
+ let parsed = {};
46
+ try {
47
+ parsed = JSON.parse(text);
48
+ } catch {
49
+ parsed = { error: text };
50
+ }
51
+ const detail = parsed.error ?? text;
52
+ return [
53
+ `${prefix} HTTP ${status}`,
54
+ parsed.code ? `[${parsed.code}]` : null,
55
+ detail,
56
+ parsed.hint ? `Hint: ${parsed.hint}` : null,
57
+ parsed.expectedDomain ? `Domain in JMP admin: ${parsed.expectedDomain}` : null
58
+ ].filter(Boolean).join(" \u2014 ");
59
+ }
60
+
61
+ // src/server/page-view.ts
62
+ async function trackJmpServerPageView(config, options = {}) {
63
+ const baseUrl = normalizeBaseUrl(config.baseUrl);
64
+ const resolvedFetch = config.fetchImpl ?? (typeof globalThis !== "undefined" && globalThis.fetch ? globalThis.fetch.bind(globalThis) : void 0);
65
+ if (!resolvedFetch) {
66
+ throw new Error("JMP server analytics: fetch is not available; pass fetchImpl in config");
67
+ }
68
+ const visitorUserAgent = options.userAgent ?? getHeader(options.request?.headers, "user-agent");
69
+ const visitorReferer = options.referer ?? getHeader(options.request?.headers, "referer");
70
+ const path = options.path ?? pathFromRequestUrl(options.request?.url);
71
+ const headers = {
72
+ "Content-Type": "application/json",
73
+ "X-JMP-Tracking-Key": config.trackingKey
74
+ };
75
+ if (visitorUserAgent) {
76
+ headers["X-JMP-Visitor-User-Agent"] = visitorUserAgent;
77
+ }
78
+ if (visitorReferer) {
79
+ headers["X-JMP-Visitor-Referer"] = visitorReferer;
80
+ }
81
+ const payload = {
82
+ type: "page_view",
83
+ path: path || "/",
84
+ metadata: options.metadata && typeof options.metadata === "object" ? options.metadata : {}
85
+ };
86
+ if (options.sessionId) {
87
+ payload.sessionId = options.sessionId;
88
+ }
89
+ const url = `${baseUrl}/api/events`;
90
+ if (config.debug) {
91
+ console.debug("[@jmp-technologies/analytics]", "POST", url, payload);
92
+ }
93
+ const res = await resolvedFetch(url, {
94
+ method: "POST",
95
+ headers,
96
+ body: JSON.stringify(payload)
97
+ });
98
+ if (!res.ok) {
99
+ const text = await res.text();
100
+ throw new Error(`JMP server analytics HTTP ${res.status} \u2014 ${text}`);
101
+ }
102
+ }
103
+
104
+ // src/env-public.ts
105
+ function readProcessEnv(name) {
106
+ if (typeof process === "undefined" || !process.env) return void 0;
107
+ const v = process.env[name];
108
+ return typeof v === "string" && v.length > 0 ? v : void 0;
109
+ }
110
+ function firstDefined(...values) {
111
+ for (const v of values) {
112
+ if (v) return v;
113
+ }
114
+ return void 0;
115
+ }
116
+ function readJmpPublicEnvFromProcess(overrides) {
117
+ const analyticsUrl = firstDefined(
118
+ overrides?.analyticsUrl,
119
+ readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_URL"),
120
+ readProcessEnv("PUBLIC_JMP_ANALYTICS_URL")
121
+ );
122
+ const trackingKey = firstDefined(
123
+ overrides?.trackingKey,
124
+ readProcessEnv("NEXT_PUBLIC_JMP_TRACKING_KEY"),
125
+ readProcessEnv("PUBLIC_JMP_TRACKING_KEY")
126
+ );
127
+ const requireConsentRaw = firstDefined(
128
+ overrides?.requireConsent !== void 0 ? String(overrides.requireConsent) : void 0,
129
+ readProcessEnv("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT"),
130
+ readProcessEnv("PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT")
131
+ );
132
+ const autoContactRaw = firstDefined(
133
+ overrides?.autoContactLinks !== void 0 ? String(overrides.autoContactLinks) : void 0,
134
+ readProcessEnv("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS"),
135
+ readProcessEnv("PUBLIC_JMP_AUTO_CONTACT_LINKS")
136
+ );
137
+ return {
138
+ analyticsUrl,
139
+ trackingKey,
140
+ requireConsent: requireConsentRaw === "true",
141
+ autoContactLinks: autoContactRaw === "true"
142
+ };
143
+ }
144
+ function readJmpPublicEnvFromImportMeta(meta, overrides) {
145
+ const get = (key) => {
146
+ const v = meta?.[key];
147
+ return typeof v === "string" && v.length > 0 ? v : void 0;
148
+ };
149
+ const analyticsUrl = firstDefined(
150
+ overrides?.analyticsUrl,
151
+ get("PUBLIC_JMP_ANALYTICS_URL"),
152
+ get("NEXT_PUBLIC_JMP_ANALYTICS_URL")
153
+ );
154
+ const trackingKey = firstDefined(
155
+ overrides?.trackingKey,
156
+ get("PUBLIC_JMP_TRACKING_KEY"),
157
+ get("NEXT_PUBLIC_JMP_TRACKING_KEY")
158
+ );
159
+ const requireConsentRaw = firstDefined(
160
+ overrides?.requireConsent !== void 0 ? String(overrides.requireConsent) : void 0,
161
+ get("PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT"),
162
+ get("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT")
163
+ );
164
+ const autoContactRaw = firstDefined(
165
+ overrides?.autoContactLinks !== void 0 ? String(overrides.autoContactLinks) : void 0,
166
+ get("PUBLIC_JMP_AUTO_CONTACT_LINKS"),
167
+ get("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS")
168
+ );
169
+ return {
170
+ analyticsUrl,
171
+ trackingKey,
172
+ requireConsent: requireConsentRaw === "true",
173
+ autoContactLinks: autoContactRaw === "true"
174
+ };
175
+ }
176
+
177
+ // src/site-config.ts
178
+ var registeredSite = null;
179
+ function defineJmpSite(definition) {
180
+ registeredSite = definition;
181
+ return definition;
182
+ }
183
+ function getJmpSiteDefinition() {
184
+ return registeredSite;
185
+ }
186
+ function getJmpContentConfig() {
187
+ const { analyticsUrl, trackingKey } = readJmpPublicEnvFromProcess();
188
+ if (!analyticsUrl || !trackingKey) {
189
+ return null;
190
+ }
191
+ const site = getJmpSiteDefinition();
192
+ return {
193
+ baseUrl: analyticsUrl,
194
+ trackingKey,
195
+ contentWrappers: site?.contentWrappers ?? void 0
196
+ };
197
+ }
198
+
199
+ export {
200
+ responseLooksLikeHtml,
201
+ normalizeBaseUrl,
202
+ resolveFetch,
203
+ formatApiErrorMessage,
204
+ trackJmpServerPageView,
205
+ readJmpPublicEnvFromProcess,
206
+ readJmpPublicEnvFromImportMeta,
207
+ defineJmpSite,
208
+ getJmpSiteDefinition,
209
+ getJmpContentConfig
210
+ };
211
+ //# sourceMappingURL=chunk-GLEOJIKL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http.ts","../src/server/page-view.ts","../src/env-public.ts","../src/site-config.ts"],"sourcesContent":["import type { JmpServerRequestLike } from \"./types\"\n\n/** CDN / Next.js often return HTML error pages; API errors are JSON */\nexport function responseLooksLikeHtml(body: string): boolean {\n const s = body.trimStart()\n return (\n s.startsWith(\"<!\") ||\n s.toLowerCase().startsWith(\"<html\") ||\n (s.startsWith(\"<\") && /<html[\\s>]/i.test(s.slice(0, 500)))\n )\n}\n\nexport function normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/$/, \"\")\n}\n\nexport function getHeader(\n headers: JmpServerRequestLike[\"headers\"] | undefined,\n key: string\n): string | null {\n if (!headers) {\n return null\n }\n if (typeof (headers as Pick<Headers, \"get\">).get === \"function\") {\n return (headers as Pick<Headers, \"get\">).get(key)\n }\n const record = headers as Record<string, string | string[] | undefined | null>\n const direct = record[key] ?? record[key.toLowerCase()]\n if (Array.isArray(direct)) {\n return direct[0] ?? null\n }\n return direct ?? null\n}\n\nexport function pathFromRequestUrl(url: string | undefined): string {\n if (!url) {\n return \"/\"\n }\n try {\n const u = new URL(url)\n return `${u.pathname}${u.search}`\n } catch {\n return url.startsWith(\"/\") ? url : \"/\"\n }\n}\n\nexport function resolveFetch(\n fetchImpl: typeof fetch | undefined,\n context: string\n): typeof fetch {\n const resolved =\n fetchImpl ??\n (typeof globalThis !== \"undefined\" && globalThis.fetch\n ? globalThis.fetch.bind(globalThis)\n : undefined)\n if (!resolved) {\n throw new Error(`${context}: fetch is not available; pass fetchImpl in config`)\n }\n return resolved\n}\n\ntype ApiErrorJson = {\n error?: string\n code?: string\n hint?: string\n expectedDomain?: string\n}\n\nexport function formatApiErrorMessage(\n status: number,\n text: string,\n prefix: string\n): string {\n if (responseLooksLikeHtml(text)) {\n return `${prefix} HTTP ${status} — response was HTML (not the JSON API). Check baseUrl points at the JMP Analytics dashboard.`\n }\n let parsed: ApiErrorJson = {}\n try {\n parsed = JSON.parse(text) as ApiErrorJson\n } catch {\n parsed = { error: text }\n }\n const detail = parsed.error ?? text\n return [\n `${prefix} HTTP ${status}`,\n parsed.code ? `[${parsed.code}]` : null,\n detail,\n parsed.hint ? `Hint: ${parsed.hint}` : null,\n parsed.expectedDomain\n ? `Domain in JMP admin: ${parsed.expectedDomain}`\n : null,\n ]\n .filter(Boolean)\n .join(\" — \")\n}\n","import {\n getHeader,\n normalizeBaseUrl,\n pathFromRequestUrl,\n resolveFetch,\n} from \"../http\"\nimport type { JmpContentConfig, TrackServerPageViewOptions } from \"../types\"\n\nexport async function trackJmpServerPageView(\n config: JmpContentConfig,\n options: TrackServerPageViewOptions = {}\n): Promise<void> {\n const baseUrl = normalizeBaseUrl(config.baseUrl)\n const resolvedFetch =\n config.fetchImpl ??\n (typeof globalThis !== \"undefined\" && globalThis.fetch\n ? globalThis.fetch.bind(globalThis)\n : undefined)\n\n if (!resolvedFetch) {\n throw new Error(\"JMP server analytics: fetch is not available; pass fetchImpl in config\")\n }\n\n const visitorUserAgent =\n options.userAgent ?? getHeader(options.request?.headers, \"user-agent\")\n const visitorReferer =\n options.referer ?? getHeader(options.request?.headers, \"referer\")\n const path = options.path ?? pathFromRequestUrl(options.request?.url)\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-JMP-Tracking-Key\": config.trackingKey,\n }\n if (visitorUserAgent) {\n headers[\"X-JMP-Visitor-User-Agent\"] = visitorUserAgent\n }\n if (visitorReferer) {\n headers[\"X-JMP-Visitor-Referer\"] = visitorReferer\n }\n\n const payload: Record<string, unknown> = {\n type: \"page_view\",\n path: path || \"/\",\n metadata:\n options.metadata && typeof options.metadata === \"object\"\n ? options.metadata\n : {},\n }\n if (options.sessionId) {\n payload.sessionId = options.sessionId\n }\n\n const url = `${baseUrl}/api/events`\n if (config.debug) {\n console.debug(\"[@jmp-technologies/analytics]\", \"POST\", url, payload)\n }\n\n const res = await resolvedFetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n })\n\n if (!res.ok) {\n const text = await res.text()\n throw new Error(`JMP server analytics HTTP ${res.status} — ${text}`)\n }\n}\n","/**\n * Public env vars for JMP — supports Next.js (`NEXT_PUBLIC_*`) and Astro (`PUBLIC_*`).\n * Server/build: `process.env`. Astro client bundles: pass overrides from `import.meta.env`.\n */\n\nexport type JmpPublicEnv = {\n analyticsUrl?: string\n trackingKey?: string\n requireConsent?: boolean\n autoContactLinks?: boolean\n}\n\nfunction readProcessEnv(name: string): string | undefined {\n if (typeof process === \"undefined\" || !process.env) return undefined\n const v = process.env[name]\n return typeof v === \"string\" && v.length > 0 ? v : undefined\n}\n\nfunction firstDefined(...values: (string | undefined)[]): string | undefined {\n for (const v of values) {\n if (v) return v\n }\n return undefined\n}\n\n/** Read dashboard URL + tracking key from Node / build-time env. */\nexport function readJmpPublicEnvFromProcess(\n overrides?: Partial<JmpPublicEnv>,\n): JmpPublicEnv {\n const analyticsUrl = firstDefined(\n overrides?.analyticsUrl,\n readProcessEnv(\"NEXT_PUBLIC_JMP_ANALYTICS_URL\"),\n readProcessEnv(\"PUBLIC_JMP_ANALYTICS_URL\"),\n )\n const trackingKey = firstDefined(\n overrides?.trackingKey,\n readProcessEnv(\"NEXT_PUBLIC_JMP_TRACKING_KEY\"),\n readProcessEnv(\"PUBLIC_JMP_TRACKING_KEY\"),\n )\n const requireConsentRaw = firstDefined(\n overrides?.requireConsent !== undefined\n ? String(overrides.requireConsent)\n : undefined,\n readProcessEnv(\"NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT\"),\n readProcessEnv(\"PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT\"),\n )\n const autoContactRaw = firstDefined(\n overrides?.autoContactLinks !== undefined\n ? String(overrides.autoContactLinks)\n : undefined,\n readProcessEnv(\"NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS\"),\n readProcessEnv(\"PUBLIC_JMP_AUTO_CONTACT_LINKS\"),\n )\n\n return {\n analyticsUrl,\n trackingKey,\n requireConsent: requireConsentRaw === \"true\",\n autoContactLinks: autoContactRaw === \"true\",\n }\n}\n\n/** Read from Astro/Vite `import.meta.env` in client scripts. */\nexport function readJmpPublicEnvFromImportMeta(\n meta: Record<string, unknown> | undefined,\n overrides?: Partial<JmpPublicEnv>,\n): JmpPublicEnv {\n const get = (key: string): string | undefined => {\n const v = meta?.[key]\n return typeof v === \"string\" && v.length > 0 ? v : undefined\n }\n\n const analyticsUrl = firstDefined(\n overrides?.analyticsUrl,\n get(\"PUBLIC_JMP_ANALYTICS_URL\"),\n get(\"NEXT_PUBLIC_JMP_ANALYTICS_URL\"),\n )\n const trackingKey = firstDefined(\n overrides?.trackingKey,\n get(\"PUBLIC_JMP_TRACKING_KEY\"),\n get(\"NEXT_PUBLIC_JMP_TRACKING_KEY\"),\n )\n const requireConsentRaw = firstDefined(\n overrides?.requireConsent !== undefined\n ? String(overrides.requireConsent)\n : undefined,\n get(\"PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT\"),\n get(\"NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT\"),\n )\n const autoContactRaw = firstDefined(\n overrides?.autoContactLinks !== undefined\n ? String(overrides.autoContactLinks)\n : undefined,\n get(\"PUBLIC_JMP_AUTO_CONTACT_LINKS\"),\n get(\"NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS\"),\n )\n\n return {\n analyticsUrl,\n trackingKey,\n requireConsent: requireConsentRaw === \"true\",\n autoContactLinks: autoContactRaw === \"true\",\n }\n}\n","import type { JmpContentConfig, JmpContentWrapper } from \"./types\"\nimport { readJmpPublicEnvFromProcess } from \"./env-public\"\n\n/** Per-site values used when the dashboard profile is missing or fields are empty. */\nexport type JmpSiteContactFallback = {\n displayName?: string\n founderName?: string\n email?: string\n phone?: string | null\n linkedin?: string | null\n hours?: string | null\n serviceArea?: string | null\n dashboardDemoUrl?: string\n profilePhotoSrc?: string\n privacyUrl?: string\n termsUrl?: string\n}\n\nexport type JmpSiteDefinition = {\n /** Content tabs this site uses — reported via instrumentation capabilities. */\n contentWrappers: JmpContentWrapper[]\n /**\n * Public site origin (no trailing slash), e.g. `https://example.com`.\n * Used to resolve relative profile image paths in structured data.\n */\n siteUrl?: string\n contactFallback?: JmpSiteContactFallback\n /**\n * `extras` keys to read from the dashboard site profile (hyphenated keys from admin).\n */\n contactExtraKeys?: {\n founderName?: readonly string[]\n dashboardDemoUrl?: readonly string[]\n profilePhotoSrc?: readonly string[]\n hours?: readonly string[]\n serviceArea?: readonly string[]\n }\n}\n\nlet registeredSite: JmpSiteDefinition | null = null\n\n/**\n * Register site-specific JMP integration options once (typically from `jmp.config.ts`).\n * Call at module load time before server content or instrumentation runs.\n */\nexport function defineJmpSite(definition: JmpSiteDefinition): JmpSiteDefinition {\n registeredSite = definition\n return definition\n}\n\nexport function getJmpSiteDefinition(): JmpSiteDefinition | null {\n return registeredSite\n}\n\n/** Server content + lead config: env vars + wrappers from {@link defineJmpSite}. */\nexport function getJmpContentConfig(): JmpContentConfig | null {\n const { analyticsUrl, trackingKey } = readJmpPublicEnvFromProcess()\n if (!analyticsUrl || !trackingKey) {\n return null\n }\n const site = getJmpSiteDefinition()\n return {\n baseUrl: analyticsUrl,\n trackingKey,\n contentWrappers: site?.contentWrappers ?? undefined,\n }\n}\n"],"mappings":"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","names":[]}