@jmp-technologies/analytics 0.1.36 → 0.1.38
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 +1 -1
- package/dist/astro/client.cjs +83 -42
- package/dist/astro/client.cjs.map +1 -1
- package/dist/astro/client.d.cts +2 -2
- package/dist/astro/client.d.ts +2 -2
- package/dist/astro/client.js +2 -2
- package/dist/astro/content.cjs +137 -70
- package/dist/astro/content.cjs.map +1 -1
- package/dist/astro/content.d.cts +5 -4
- package/dist/astro/content.d.ts +5 -4
- package/dist/astro/content.js +5 -3
- package/dist/astro/integration.cjs +104 -66
- package/dist/astro/integration.cjs.map +1 -1
- package/dist/astro/integration.js +3 -3
- package/dist/astro/middleware.cjs +96 -66
- 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 +104 -66
- package/dist/astro/register.cjs.map +1 -1
- package/dist/astro/register.js +3 -3
- package/dist/{chunk-AIFJ7DVO.js → chunk-6WQMWPEY.js} +196 -105
- package/dist/chunk-6WQMWPEY.js.map +1 -0
- package/dist/{chunk-YFG3AQ35.js → chunk-EBU4DKHW.js} +47 -9
- package/dist/chunk-EBU4DKHW.js.map +1 -0
- package/dist/{chunk-AGGLRTUQ.js → chunk-JVFN7MF2.js} +2 -2
- package/dist/{chunk-3ZEMXII6.js → chunk-NCF3J4HV.js} +3 -3
- package/dist/{chunk-HFLU7HQE.js → chunk-ONIPLMOY.js} +2 -2
- package/dist/{chunk-NAQU6RAE.js → chunk-PQOTEV6O.js} +3 -3
- package/dist/{chunk-RNZTKIC6.js → chunk-WHUHCTBQ.js} +16 -3
- package/dist/chunk-WHUHCTBQ.js.map +1 -0
- package/dist/{create-jmp-analytics-Bz0-K0Af.d.cts → create-jmp-analytics-DMSXmVIH.d.cts} +1 -1
- package/dist/{create-jmp-analytics-DRjrlWUn.d.ts → create-jmp-analytics-JZ3pqNBQ.d.ts} +1 -1
- package/dist/index.cjs +145 -76
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -6
- package/dist/index.d.ts +10 -6
- package/dist/index.js +6 -2
- package/dist/next/content.cjs +138 -70
- package/dist/next/content.cjs.map +1 -1
- package/dist/next/content.d.cts +5 -4
- package/dist/next/content.d.ts +5 -4
- package/dist/next/content.js +6 -3
- package/dist/next/content.js.map +1 -1
- package/dist/next/instrumentation.cjs +104 -66
- package/dist/next/instrumentation.cjs.map +1 -1
- package/dist/next/instrumentation.js +2 -2
- package/dist/next/landing-pages.cjs +155 -129
- package/dist/next/landing-pages.cjs.map +1 -1
- package/dist/next/landing-pages.d.cts +2 -2
- package/dist/next/landing-pages.d.ts +2 -2
- package/dist/next/landing-pages.js +7 -8
- package/dist/next/landing-pages.js.map +1 -1
- package/dist/next/locations.cjs +114 -88
- package/dist/next/locations.cjs.map +1 -1
- package/dist/next/locations.d.cts +2 -2
- package/dist/next/locations.d.ts +2 -2
- package/dist/next/locations.js +7 -8
- package/dist/next/locations.js.map +1 -1
- package/dist/next/middleware.cjs +96 -66
- 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/site-root-server.cjs +103 -69
- package/dist/next/site-root-server.cjs.map +1 -1
- package/dist/next/site-root-server.js +4 -4
- package/dist/next.cjs +37 -2
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +3 -3
- package/dist/next.d.ts +3 -3
- package/dist/next.js +4 -4
- package/dist/react.cjs +88 -53
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +3 -3
- package/dist/{site-config-Cgq67uQ1.d.cts → site-config-BLnwuRC2.d.ts} +9 -3
- package/dist/{site-config-BxEmJxBB.d.ts → site-config-BZJS8Hp_.d.cts} +9 -3
- package/dist/{track-page-view-BCX1Dsfk.d.cts → track-page-view-BJQqn2Bg.d.cts} +1 -1
- package/dist/{track-page-view-74Su6lQY.d.ts → track-page-view-DGKRUIxm.d.ts} +1 -1
- package/dist/{types-yNgoakwk.d.ts → types-CYrgEwUF.d.cts} +16 -2
- package/dist/{types-yNgoakwk.d.cts → types-CYrgEwUF.d.ts} +16 -2
- package/dist/{utils-BLoWWfSw.d.ts → utils-B1Nt3sBU.d.ts} +1 -1
- package/dist/{utils-UPTIdK1D.d.cts → utils-U6TGMIAB.d.cts} +1 -1
- package/docs/legal-and-privacy.md +2 -2
- package/package.json +1 -1
- package/dist/chunk-AIFJ7DVO.js.map +0 -1
- package/dist/chunk-RI3KKDPX.js +0 -75
- package/dist/chunk-RI3KKDPX.js.map +0 -1
- package/dist/chunk-RNZTKIC6.js.map +0 -1
- package/dist/chunk-YFG3AQ35.js.map +0 -1
- /package/dist/{chunk-AGGLRTUQ.js.map → chunk-JVFN7MF2.js.map} +0 -0
- /package/dist/{chunk-3ZEMXII6.js.map → chunk-NCF3J4HV.js.map} +0 -0
- /package/dist/{chunk-HFLU7HQE.js.map → chunk-ONIPLMOY.js.map} +0 -0
- /package/dist/{chunk-NAQU6RAE.js.map → chunk-PQOTEV6O.js.map} +0 -0
|
@@ -1,3 +1,166 @@
|
|
|
1
|
+
// src/env-public.ts
|
|
2
|
+
function firstDefined(...values) {
|
|
3
|
+
for (const v of values) {
|
|
4
|
+
if (v) return v;
|
|
5
|
+
}
|
|
6
|
+
return void 0;
|
|
7
|
+
}
|
|
8
|
+
function readJmpPublicEnvFromProcessEnv() {
|
|
9
|
+
if (typeof process === "undefined" || !process.env) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
const { env } = process;
|
|
13
|
+
const analyticsUrl = firstDefined(
|
|
14
|
+
env.NEXT_PUBLIC_JMP_ANALYTICS_URL,
|
|
15
|
+
env.PUBLIC_JMP_ANALYTICS_URL
|
|
16
|
+
);
|
|
17
|
+
const trackingKey = firstDefined(
|
|
18
|
+
env.NEXT_PUBLIC_JMP_TRACKING_KEY,
|
|
19
|
+
env.PUBLIC_JMP_TRACKING_KEY
|
|
20
|
+
);
|
|
21
|
+
const requireConsentRaw = firstDefined(
|
|
22
|
+
env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT,
|
|
23
|
+
env.PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT
|
|
24
|
+
);
|
|
25
|
+
const autoContactRaw = firstDefined(
|
|
26
|
+
env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS,
|
|
27
|
+
env.PUBLIC_JMP_AUTO_CONTACT_LINKS
|
|
28
|
+
);
|
|
29
|
+
return {
|
|
30
|
+
analyticsUrl,
|
|
31
|
+
trackingKey,
|
|
32
|
+
requireConsent: requireConsentRaw === "true",
|
|
33
|
+
autoContactLinks: autoContactRaw === "true"
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function readJmpPublicEnvFromProcess(overrides) {
|
|
37
|
+
const fromEnv = readJmpPublicEnvFromProcessEnv();
|
|
38
|
+
return {
|
|
39
|
+
analyticsUrl: firstDefined(overrides?.analyticsUrl, fromEnv.analyticsUrl),
|
|
40
|
+
trackingKey: firstDefined(overrides?.trackingKey, fromEnv.trackingKey),
|
|
41
|
+
requireConsent: overrides?.requireConsent ?? fromEnv.requireConsent,
|
|
42
|
+
autoContactLinks: overrides?.autoContactLinks ?? fromEnv.autoContactLinks
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function readJmpPublicEnvFromImportMeta(meta, overrides) {
|
|
46
|
+
const get = (key) => {
|
|
47
|
+
const v = meta?.[key];
|
|
48
|
+
return typeof v === "string" && v.length > 0 ? v : void 0;
|
|
49
|
+
};
|
|
50
|
+
const analyticsUrl = firstDefined(
|
|
51
|
+
overrides?.analyticsUrl,
|
|
52
|
+
get("PUBLIC_JMP_ANALYTICS_URL"),
|
|
53
|
+
get("NEXT_PUBLIC_JMP_ANALYTICS_URL")
|
|
54
|
+
);
|
|
55
|
+
const trackingKey = firstDefined(
|
|
56
|
+
overrides?.trackingKey,
|
|
57
|
+
get("PUBLIC_JMP_TRACKING_KEY"),
|
|
58
|
+
get("NEXT_PUBLIC_JMP_TRACKING_KEY")
|
|
59
|
+
);
|
|
60
|
+
const requireConsentRaw = firstDefined(
|
|
61
|
+
overrides?.requireConsent !== void 0 ? String(overrides.requireConsent) : void 0,
|
|
62
|
+
get("PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT"),
|
|
63
|
+
get("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT")
|
|
64
|
+
);
|
|
65
|
+
const autoContactRaw = firstDefined(
|
|
66
|
+
overrides?.autoContactLinks !== void 0 ? String(overrides.autoContactLinks) : void 0,
|
|
67
|
+
get("PUBLIC_JMP_AUTO_CONTACT_LINKS"),
|
|
68
|
+
get("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS")
|
|
69
|
+
);
|
|
70
|
+
return {
|
|
71
|
+
analyticsUrl,
|
|
72
|
+
trackingKey,
|
|
73
|
+
requireConsent: requireConsentRaw === "true",
|
|
74
|
+
autoContactLinks: autoContactRaw === "true"
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// src/site-config.ts
|
|
79
|
+
var registeredSite = null;
|
|
80
|
+
function defineJmpSite(definition) {
|
|
81
|
+
registeredSite = definition;
|
|
82
|
+
return definition;
|
|
83
|
+
}
|
|
84
|
+
function getJmpSiteDefinition() {
|
|
85
|
+
return registeredSite;
|
|
86
|
+
}
|
|
87
|
+
function getJmpContentConfig() {
|
|
88
|
+
const { analyticsUrl, trackingKey } = readJmpPublicEnvFromProcess();
|
|
89
|
+
if (!analyticsUrl || !trackingKey) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const site = getJmpSiteDefinition();
|
|
93
|
+
const contentWrappers = site?.contentWrappers ?? void 0;
|
|
94
|
+
const inferredMode = contentWrappers && contentWrappers.length > 0 ? "manual" : void 0;
|
|
95
|
+
return {
|
|
96
|
+
baseUrl: analyticsUrl,
|
|
97
|
+
trackingKey,
|
|
98
|
+
contentWrappers,
|
|
99
|
+
contentManifest: site?.contentManifest ?? void 0,
|
|
100
|
+
contentWrapperMode: site?.contentWrapperMode ?? inferredMode
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// src/landing-pages/hub.ts
|
|
105
|
+
var JMP_LANDING_HUB = {
|
|
106
|
+
location: {
|
|
107
|
+
title: "Areas we serve",
|
|
108
|
+
path: "/areas",
|
|
109
|
+
description: "Local pages for cities and regions we work in.",
|
|
110
|
+
breadcrumb: "Areas",
|
|
111
|
+
segment: "areas"
|
|
112
|
+
},
|
|
113
|
+
service: {
|
|
114
|
+
title: "Services",
|
|
115
|
+
path: "/services",
|
|
116
|
+
description: "What we offer and how we help.",
|
|
117
|
+
breadcrumb: "Services",
|
|
118
|
+
segment: "services"
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
function jmpLandingKindSegment(kind) {
|
|
122
|
+
return JMP_LANDING_HUB[kind].segment;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/landing-pages/utils.ts
|
|
126
|
+
function plainTextFromMarkdown(input, maxLength = 5e3) {
|
|
127
|
+
return input.replace(/[#*_`[\]]/g, "").trim().slice(0, maxLength);
|
|
128
|
+
}
|
|
129
|
+
function resolveJmpSiteUrl(override) {
|
|
130
|
+
const fromArg = override?.trim().replace(/\/$/, "");
|
|
131
|
+
if (fromArg) return fromArg;
|
|
132
|
+
const fromConfig = getJmpSiteDefinition()?.siteUrl?.trim().replace(/\/$/, "");
|
|
133
|
+
return fromConfig || null;
|
|
134
|
+
}
|
|
135
|
+
function absoluteJmpSiteUrl(path, siteUrl) {
|
|
136
|
+
const base = resolveJmpSiteUrl(siteUrl);
|
|
137
|
+
if (!base) {
|
|
138
|
+
return path.startsWith("/") ? path : `/${path}`;
|
|
139
|
+
}
|
|
140
|
+
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
141
|
+
return `${base}${normalized}`;
|
|
142
|
+
}
|
|
143
|
+
function filterJmpLandingPagesForDefaultLocale(pages, kind) {
|
|
144
|
+
const segment = jmpLandingKindSegment(kind);
|
|
145
|
+
return pages.filter((page) => {
|
|
146
|
+
const parts = page.path.split("/").filter(Boolean);
|
|
147
|
+
return parts[0] === segment;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function filterJmpLandingPagesForLocalizedRoutes(pages, kind) {
|
|
151
|
+
const segment = jmpLandingKindSegment(kind);
|
|
152
|
+
return pages.filter((page) => {
|
|
153
|
+
const parts = page.path.split("/").filter(Boolean);
|
|
154
|
+
return parts.length >= 3 && parts[1] === segment;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function jmpLocalizedLandingStaticParams(pages, kind) {
|
|
158
|
+
return filterJmpLandingPagesForLocalizedRoutes(pages, kind).map((page) => {
|
|
159
|
+
const [locale, , slug] = page.path.split("/").filter(Boolean);
|
|
160
|
+
return { locale, slug };
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
1
164
|
// src/http.ts
|
|
2
165
|
function responseLooksLikeHtml(body) {
|
|
3
166
|
const s = body.trimStart();
|
|
@@ -58,6 +221,25 @@ function formatApiErrorMessage(status, text, prefix) {
|
|
|
58
221
|
].filter(Boolean).join(" \u2014 ");
|
|
59
222
|
}
|
|
60
223
|
|
|
224
|
+
// src/request-origin.ts
|
|
225
|
+
function resolveJmpRequestOrigin() {
|
|
226
|
+
const fromSite = resolveJmpSiteUrl();
|
|
227
|
+
if (fromSite) {
|
|
228
|
+
return fromSite;
|
|
229
|
+
}
|
|
230
|
+
if (typeof process === "undefined") {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
return process.env.NEXT_PUBLIC_SITE_URL?.trim().replace(/\/$/, "") || null;
|
|
234
|
+
}
|
|
235
|
+
function withJmpOriginHeader(headers) {
|
|
236
|
+
const origin = resolveJmpRequestOrigin();
|
|
237
|
+
if (!origin) {
|
|
238
|
+
return headers;
|
|
239
|
+
}
|
|
240
|
+
return { ...headers, Origin: origin };
|
|
241
|
+
}
|
|
242
|
+
|
|
61
243
|
// src/server/page-view.ts
|
|
62
244
|
async function trackJmpServerPageView(config, options = {}) {
|
|
63
245
|
const baseUrl = normalizeBaseUrl(config.baseUrl);
|
|
@@ -68,10 +250,10 @@ async function trackJmpServerPageView(config, options = {}) {
|
|
|
68
250
|
const visitorUserAgent = options.userAgent ?? getHeader(options.request?.headers, "user-agent");
|
|
69
251
|
const visitorReferer = options.referer ?? getHeader(options.request?.headers, "referer");
|
|
70
252
|
const path = options.path ?? pathFromRequestUrl(options.request?.url);
|
|
71
|
-
const headers = {
|
|
253
|
+
const headers = withJmpOriginHeader({
|
|
72
254
|
"Content-Type": "application/json",
|
|
73
255
|
"X-JMP-Tracking-Key": config.trackingKey
|
|
74
|
-
};
|
|
256
|
+
});
|
|
75
257
|
if (visitorUserAgent) {
|
|
76
258
|
headers["X-JMP-Visitor-User-Agent"] = visitorUserAgent;
|
|
77
259
|
}
|
|
@@ -101,117 +283,26 @@ async function trackJmpServerPageView(config, options = {}) {
|
|
|
101
283
|
}
|
|
102
284
|
}
|
|
103
285
|
|
|
104
|
-
// src/env-public.ts
|
|
105
|
-
function firstDefined(...values) {
|
|
106
|
-
for (const v of values) {
|
|
107
|
-
if (v) return v;
|
|
108
|
-
}
|
|
109
|
-
return void 0;
|
|
110
|
-
}
|
|
111
|
-
function readJmpPublicEnvFromProcessEnv() {
|
|
112
|
-
if (typeof process === "undefined" || !process.env) {
|
|
113
|
-
return {};
|
|
114
|
-
}
|
|
115
|
-
const { env } = process;
|
|
116
|
-
const analyticsUrl = firstDefined(
|
|
117
|
-
env.NEXT_PUBLIC_JMP_ANALYTICS_URL,
|
|
118
|
-
env.PUBLIC_JMP_ANALYTICS_URL
|
|
119
|
-
);
|
|
120
|
-
const trackingKey = firstDefined(
|
|
121
|
-
env.NEXT_PUBLIC_JMP_TRACKING_KEY,
|
|
122
|
-
env.PUBLIC_JMP_TRACKING_KEY
|
|
123
|
-
);
|
|
124
|
-
const requireConsentRaw = firstDefined(
|
|
125
|
-
env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT,
|
|
126
|
-
env.PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT
|
|
127
|
-
);
|
|
128
|
-
const autoContactRaw = firstDefined(
|
|
129
|
-
env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS,
|
|
130
|
-
env.PUBLIC_JMP_AUTO_CONTACT_LINKS
|
|
131
|
-
);
|
|
132
|
-
return {
|
|
133
|
-
analyticsUrl,
|
|
134
|
-
trackingKey,
|
|
135
|
-
requireConsent: requireConsentRaw === "true",
|
|
136
|
-
autoContactLinks: autoContactRaw === "true"
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
function readJmpPublicEnvFromProcess(overrides) {
|
|
140
|
-
const fromEnv = readJmpPublicEnvFromProcessEnv();
|
|
141
|
-
return {
|
|
142
|
-
analyticsUrl: firstDefined(overrides?.analyticsUrl, fromEnv.analyticsUrl),
|
|
143
|
-
trackingKey: firstDefined(overrides?.trackingKey, fromEnv.trackingKey),
|
|
144
|
-
requireConsent: overrides?.requireConsent ?? fromEnv.requireConsent,
|
|
145
|
-
autoContactLinks: overrides?.autoContactLinks ?? fromEnv.autoContactLinks
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
function readJmpPublicEnvFromImportMeta(meta, overrides) {
|
|
149
|
-
const get = (key) => {
|
|
150
|
-
const v = meta?.[key];
|
|
151
|
-
return typeof v === "string" && v.length > 0 ? v : void 0;
|
|
152
|
-
};
|
|
153
|
-
const analyticsUrl = firstDefined(
|
|
154
|
-
overrides?.analyticsUrl,
|
|
155
|
-
get("PUBLIC_JMP_ANALYTICS_URL"),
|
|
156
|
-
get("NEXT_PUBLIC_JMP_ANALYTICS_URL")
|
|
157
|
-
);
|
|
158
|
-
const trackingKey = firstDefined(
|
|
159
|
-
overrides?.trackingKey,
|
|
160
|
-
get("PUBLIC_JMP_TRACKING_KEY"),
|
|
161
|
-
get("NEXT_PUBLIC_JMP_TRACKING_KEY")
|
|
162
|
-
);
|
|
163
|
-
const requireConsentRaw = firstDefined(
|
|
164
|
-
overrides?.requireConsent !== void 0 ? String(overrides.requireConsent) : void 0,
|
|
165
|
-
get("PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT"),
|
|
166
|
-
get("NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT")
|
|
167
|
-
);
|
|
168
|
-
const autoContactRaw = firstDefined(
|
|
169
|
-
overrides?.autoContactLinks !== void 0 ? String(overrides.autoContactLinks) : void 0,
|
|
170
|
-
get("PUBLIC_JMP_AUTO_CONTACT_LINKS"),
|
|
171
|
-
get("NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS")
|
|
172
|
-
);
|
|
173
|
-
return {
|
|
174
|
-
analyticsUrl,
|
|
175
|
-
trackingKey,
|
|
176
|
-
requireConsent: requireConsentRaw === "true",
|
|
177
|
-
autoContactLinks: autoContactRaw === "true"
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// src/site-config.ts
|
|
182
|
-
var registeredSite = null;
|
|
183
|
-
function defineJmpSite(definition) {
|
|
184
|
-
registeredSite = definition;
|
|
185
|
-
return definition;
|
|
186
|
-
}
|
|
187
|
-
function getJmpSiteDefinition() {
|
|
188
|
-
return registeredSite;
|
|
189
|
-
}
|
|
190
|
-
function getJmpContentConfig() {
|
|
191
|
-
const { analyticsUrl, trackingKey } = readJmpPublicEnvFromProcess();
|
|
192
|
-
if (!analyticsUrl || !trackingKey) {
|
|
193
|
-
return null;
|
|
194
|
-
}
|
|
195
|
-
const site = getJmpSiteDefinition();
|
|
196
|
-
return {
|
|
197
|
-
baseUrl: analyticsUrl,
|
|
198
|
-
trackingKey,
|
|
199
|
-
contentWrappers: site?.contentWrappers ?? void 0,
|
|
200
|
-
contentManifest: site?.contentManifest ?? void 0
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
|
|
204
286
|
export {
|
|
205
287
|
responseLooksLikeHtml,
|
|
206
288
|
normalizeBaseUrl,
|
|
207
289
|
getHeader,
|
|
208
290
|
resolveFetch,
|
|
209
291
|
formatApiErrorMessage,
|
|
210
|
-
trackJmpServerPageView,
|
|
211
292
|
readJmpPublicEnvFromProcess,
|
|
212
293
|
readJmpPublicEnvFromImportMeta,
|
|
213
294
|
defineJmpSite,
|
|
214
295
|
getJmpSiteDefinition,
|
|
215
|
-
getJmpContentConfig
|
|
296
|
+
getJmpContentConfig,
|
|
297
|
+
JMP_LANDING_HUB,
|
|
298
|
+
jmpLandingKindSegment,
|
|
299
|
+
plainTextFromMarkdown,
|
|
300
|
+
resolveJmpSiteUrl,
|
|
301
|
+
absoluteJmpSiteUrl,
|
|
302
|
+
filterJmpLandingPagesForDefaultLocale,
|
|
303
|
+
filterJmpLandingPagesForLocalizedRoutes,
|
|
304
|
+
jmpLocalizedLandingStaticParams,
|
|
305
|
+
withJmpOriginHeader,
|
|
306
|
+
trackJmpServerPageView
|
|
216
307
|
};
|
|
217
|
-
//# sourceMappingURL=chunk-
|
|
308
|
+
//# sourceMappingURL=chunk-6WQMWPEY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/env-public.ts","../src/site-config.ts","../src/landing-pages/hub.ts","../src/landing-pages/utils.ts","../src/http.ts","../src/request-origin.ts","../src/server/page-view.ts"],"sourcesContent":["/**\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 firstDefined(...values: (string | undefined)[]): string | undefined {\n for (const v of values) {\n if (v) return v\n }\n return undefined\n}\n\n/** Static reads so Next.js / Vite inline `NEXT_PUBLIC_*` into client bundles. */\nfunction readJmpPublicEnvFromProcessEnv(): Omit<JmpPublicEnv, never> {\n if (typeof process === \"undefined\" || !process.env) {\n return {}\n }\n const { env } = process\n const analyticsUrl = firstDefined(\n env.NEXT_PUBLIC_JMP_ANALYTICS_URL,\n env.PUBLIC_JMP_ANALYTICS_URL,\n )\n const trackingKey = firstDefined(\n env.NEXT_PUBLIC_JMP_TRACKING_KEY,\n env.PUBLIC_JMP_TRACKING_KEY,\n )\n const requireConsentRaw = firstDefined(\n env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT,\n env.PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT,\n )\n const autoContactRaw = firstDefined(\n env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS,\n env.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 dashboard URL + tracking key from Node / build-time env. */\nexport function readJmpPublicEnvFromProcess(\n overrides?: Partial<JmpPublicEnv>,\n): JmpPublicEnv {\n const fromEnv = readJmpPublicEnvFromProcessEnv()\n\n return {\n analyticsUrl: firstDefined(overrides?.analyticsUrl, fromEnv.analyticsUrl),\n trackingKey: firstDefined(overrides?.trackingKey, fromEnv.trackingKey),\n requireConsent: overrides?.requireConsent ?? fromEnv.requireConsent,\n autoContactLinks:\n overrides?.autoContactLinks ?? fromEnv.autoContactLinks,\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 { JmpContentManifest } from \"./content/manifest\"\nimport type { JmpContentConfig, JmpContentWrapper } from \"./types\"\nimport { readJmpPublicEnvFromProcess } from \"./env-public\"\n\nexport type JmpSiteSocialLinks = {\n linkedin: string | null\n instagram: string | null\n facebook: string | null\n x: string | null\n youtube: string | null\n}\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 instagram?: string | null\n facebook?: string | null\n x?: string | null\n youtube?: string | null\n hours?: string | null\n serviceArea?: string | null\n address?: string | null\n googleMapsUrl?: string | null\n googleMapsEmbedUrl?: string | null\n dashboardDemoUrl?: string\n profilePhotoSrc?: string\n privacyUrl?: string\n termsUrl?: string\n}\n\nexport type JmpSiteDefinition = {\n /**\n * Content areas this site actually renders. When set, capabilities report\n * this list (manual mode) so unused dashboard editors stay hidden.\n * List granular Trust slots (`trust.summary`, `trust.reviews`) instead of\n * a bare `trust` wrapper.\n */\n contentWrappers?: JmpContentWrapper[]\n /**\n * Override report mode. Defaults to `manual` when `contentWrappers` is set.\n */\n contentWrapperMode?: JmpContentConfig[\"contentWrapperMode\"]\n /**\n * Routes, trust block order, and contact extras for dashboard layout sync.\n * Reported with capabilities when the site loads content from the portal.\n */\n contentManifest?: JmpContentManifest\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 /**\n * JMP dashboard origin (no trailing slash), e.g. `https://portal.example.com`.\n * Fallback when `NEXT_PUBLIC_JMP_ANALYTICS_URL` is missing from the client bundle.\n */\n analyticsPortalUrl?: 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 googleMapsEmbedUrl?: 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 const contentWrappers = site?.contentWrappers ?? undefined\n const inferredMode =\n contentWrappers && contentWrappers.length > 0 ? \"manual\" : undefined\n return {\n baseUrl: analyticsUrl,\n trackingKey,\n contentWrappers,\n contentManifest: site?.contentManifest ?? undefined,\n contentWrapperMode: site?.contentWrapperMode ?? inferredMode,\n }\n}\n","import type { JmpLandingPageKind } from \"../types\"\n\nexport type JmpLandingHubConfig = {\n title: string\n path: string\n description: string\n breadcrumb: string\n segment: string\n}\n\nexport const JMP_LANDING_HUB: Record<JmpLandingPageKind, JmpLandingHubConfig> = {\n location: {\n title: \"Areas we serve\",\n path: \"/areas\",\n description: \"Local pages for cities and regions we work in.\",\n breadcrumb: \"Areas\",\n segment: \"areas\",\n },\n service: {\n title: \"Services\",\n path: \"/services\",\n description: \"What we offer and how we help.\",\n breadcrumb: \"Services\",\n segment: \"services\",\n },\n}\n\nexport function jmpLandingKindSegment(kind: JmpLandingPageKind): string {\n return JMP_LANDING_HUB[kind].segment\n}\n","import { getJmpSiteDefinition } from \"../site-config\"\nimport type { JmpLandingPage, JmpLandingPageKind } from \"../types\"\nimport { jmpLandingKindSegment } from \"./hub\"\n\n/** Strip lightweight markdown for meta descriptions and schema text fields. */\nexport function plainTextFromMarkdown(input: string, maxLength = 5000): string {\n return input.replace(/[#*_`[\\]]/g, \"\").trim().slice(0, maxLength)\n}\n\nexport function resolveJmpSiteUrl(override?: string): string | null {\n const fromArg = override?.trim().replace(/\\/$/, \"\")\n if (fromArg) return fromArg\n const fromConfig = getJmpSiteDefinition()?.siteUrl?.trim().replace(/\\/$/, \"\")\n return fromConfig || null\n}\n\nexport function absoluteJmpSiteUrl(path: string, siteUrl?: string): string {\n const base = resolveJmpSiteUrl(siteUrl)\n if (!base) {\n return path.startsWith(\"/\") ? path : `/${path}`\n }\n const normalized = path.startsWith(\"/\") ? path : `/${path}`\n return `${base}${normalized}`\n}\n\nexport function filterJmpLandingPagesForDefaultLocale(\n pages: JmpLandingPage[],\n kind: JmpLandingPageKind\n): JmpLandingPage[] {\n const segment = jmpLandingKindSegment(kind)\n return pages.filter((page) => {\n const parts = page.path.split(\"/\").filter(Boolean)\n return parts[0] === segment\n })\n}\n\n/** Pages whose path is `/{locale}/{areas|services}/{slug}` (three+ segments). */\nexport function filterJmpLandingPagesForLocalizedRoutes(\n pages: JmpLandingPage[],\n kind: JmpLandingPageKind\n): JmpLandingPage[] {\n const segment = jmpLandingKindSegment(kind)\n return pages.filter((page) => {\n const parts = page.path.split(\"/\").filter(Boolean)\n return parts.length >= 3 && parts[1] === segment\n })\n}\n\nexport function jmpLocalizedLandingStaticParams(\n pages: JmpLandingPage[],\n kind: JmpLandingPageKind\n): { locale: string; slug: string }[] {\n return filterJmpLandingPagesForLocalizedRoutes(pages, kind).map((page) => {\n const [locale, , slug] = page.path.split(\"/\").filter(Boolean)\n return { locale: locale!, slug: slug! }\n })\n}\n","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 { resolveJmpSiteUrl } from \"./landing-pages/utils\"\n\n/**\n * Site origin for server-to-server JMP API calls (content + ingest).\n * Prefer `defineJmpSite({ siteUrl })`, then `NEXT_PUBLIC_SITE_URL`.\n */\nexport function resolveJmpRequestOrigin(): string | null {\n const fromSite = resolveJmpSiteUrl()\n if (fromSite) {\n return fromSite\n }\n if (typeof process === \"undefined\") {\n return null\n }\n return process.env.NEXT_PUBLIC_SITE_URL?.trim().replace(/\\/$/, \"\") || null\n}\n\n/** Adds `Origin` when a site URL is known (required for production write/ingest checks). */\nexport function withJmpOriginHeader(\n headers: Record<string, string>\n): Record<string, string> {\n const origin = resolveJmpRequestOrigin()\n if (!origin) {\n return headers\n }\n return { ...headers, Origin: origin }\n}\n","import {\n getHeader,\n normalizeBaseUrl,\n pathFromRequestUrl,\n} from \"../http\"\nimport { withJmpOriginHeader } from \"../request-origin\"\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> = withJmpOriginHeader({\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"],"mappings":"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","names":[]}
|
|
@@ -9,8 +9,9 @@ import {
|
|
|
9
9
|
normalizeBaseUrl,
|
|
10
10
|
readJmpPublicEnvFromProcess,
|
|
11
11
|
resolveFetch,
|
|
12
|
-
responseLooksLikeHtml
|
|
13
|
-
|
|
12
|
+
responseLooksLikeHtml,
|
|
13
|
+
withJmpOriginHeader
|
|
14
|
+
} from "./chunk-6WQMWPEY.js";
|
|
14
15
|
|
|
15
16
|
// src/contact-link-classifier.ts
|
|
16
17
|
var BOOKING_LINK_HOSTS = [
|
|
@@ -152,7 +153,7 @@ function extractMailtoTarget(href) {
|
|
|
152
153
|
}
|
|
153
154
|
|
|
154
155
|
// package.json
|
|
155
|
-
var version = "0.1.
|
|
156
|
+
var version = "0.1.38";
|
|
156
157
|
|
|
157
158
|
// src/constants.ts
|
|
158
159
|
var JMP_ANALYTICS_SDK_VERSION = version;
|
|
@@ -805,6 +806,11 @@ function inferWrapperSlotsFromManifest(manifest) {
|
|
|
805
806
|
}
|
|
806
807
|
|
|
807
808
|
// src/content/fetch.ts
|
|
809
|
+
function jmpContentRequestHeaders(config) {
|
|
810
|
+
return withJmpOriginHeader({
|
|
811
|
+
"X-JMP-Tracking-Key": config.trackingKey
|
|
812
|
+
});
|
|
813
|
+
}
|
|
808
814
|
async function getContent(config, path) {
|
|
809
815
|
const text = await getContentText(config, path);
|
|
810
816
|
try {
|
|
@@ -827,9 +833,7 @@ async function getContentText(config, path) {
|
|
|
827
833
|
}
|
|
828
834
|
const res = await resolvedFetch(url, {
|
|
829
835
|
method: "GET",
|
|
830
|
-
headers:
|
|
831
|
-
"X-JMP-Tracking-Key": config.trackingKey
|
|
832
|
-
}
|
|
836
|
+
headers: jmpContentRequestHeaders(config)
|
|
833
837
|
});
|
|
834
838
|
const text = await res.text();
|
|
835
839
|
if (!res.ok) {
|
|
@@ -856,6 +860,7 @@ var WRAPPER_SLOT_ORDER = [
|
|
|
856
860
|
"blog",
|
|
857
861
|
"faq",
|
|
858
862
|
"contact",
|
|
863
|
+
"legal",
|
|
859
864
|
"trust",
|
|
860
865
|
"trust.summary",
|
|
861
866
|
"trust.testimonials",
|
|
@@ -882,7 +887,7 @@ function markTrustBundleWrappers(bundle) {
|
|
|
882
887
|
}
|
|
883
888
|
}
|
|
884
889
|
function inferTrustWrapperSlots(bundle) {
|
|
885
|
-
const slots = /* @__PURE__ */ new Set(
|
|
890
|
+
const slots = /* @__PURE__ */ new Set();
|
|
886
891
|
const { summary, testimonials, stats, logos, credentials } = bundle;
|
|
887
892
|
const hasSummary = summary.google_rating != null || summary.google_review_count != null || Boolean(summary.google_reviews_url?.trim()) || Boolean(summary.yelp_url?.trim()) || Boolean(summary.trustpilot_url?.trim()) || Boolean(summary.disclaimer?.trim());
|
|
888
893
|
if (hasSummary) {
|
|
@@ -1060,6 +1065,35 @@ async function getJmpFaqs(config, filters) {
|
|
|
1060
1065
|
afterContentWrapperUse(config);
|
|
1061
1066
|
return data.faqs;
|
|
1062
1067
|
}
|
|
1068
|
+
async function getJmpLegalDocument(config, slug) {
|
|
1069
|
+
const key = slug.trim().toLowerCase();
|
|
1070
|
+
if (!key) {
|
|
1071
|
+
return null;
|
|
1072
|
+
}
|
|
1073
|
+
try {
|
|
1074
|
+
const data = await getContent(
|
|
1075
|
+
config,
|
|
1076
|
+
`/api/content/legal?slug=${encodeURIComponent(key)}`
|
|
1077
|
+
);
|
|
1078
|
+
markContentWrapper("legal");
|
|
1079
|
+
afterContentWrapperUse(config);
|
|
1080
|
+
return data.document;
|
|
1081
|
+
} catch (error) {
|
|
1082
|
+
if (error instanceof Error && error.message.includes("HTTP 404")) {
|
|
1083
|
+
return null;
|
|
1084
|
+
}
|
|
1085
|
+
throw error;
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
async function getJmpLegalDocuments(config) {
|
|
1089
|
+
const data = await getContent(
|
|
1090
|
+
config,
|
|
1091
|
+
"/api/content/legal"
|
|
1092
|
+
);
|
|
1093
|
+
markContentWrapper("legal");
|
|
1094
|
+
afterContentWrapperUse(config);
|
|
1095
|
+
return data.documents;
|
|
1096
|
+
}
|
|
1063
1097
|
async function getJmpFaqDetail(config, slug, locale) {
|
|
1064
1098
|
try {
|
|
1065
1099
|
const params = new URLSearchParams();
|
|
@@ -1227,7 +1261,7 @@ async function registerJmpContentWrappers(config) {
|
|
|
1227
1261
|
method: "POST",
|
|
1228
1262
|
headers: {
|
|
1229
1263
|
"Content-Type": "application/json",
|
|
1230
|
-
|
|
1264
|
+
...jmpContentRequestHeaders(config)
|
|
1231
1265
|
},
|
|
1232
1266
|
body: JSON.stringify(body)
|
|
1233
1267
|
});
|
|
@@ -1255,6 +1289,8 @@ function createJmpContentClient(config) {
|
|
|
1255
1289
|
getBlogPosts: (filters) => getJmpBlogPosts(config, filters),
|
|
1256
1290
|
getBlogPost: (slug, locale) => getJmpBlogPost(config, slug, locale),
|
|
1257
1291
|
getFaqs: (filters) => getJmpFaqs(config, filters),
|
|
1292
|
+
getLegalDocument: (slug) => getJmpLegalDocument(config, slug),
|
|
1293
|
+
getLegalDocuments: () => getJmpLegalDocuments(config),
|
|
1258
1294
|
getLandingPages: (filters) => getJmpLandingPages(config, filters),
|
|
1259
1295
|
getLandingPageDetail: (kind, slug, locale) => getJmpLandingPageDetail(config, kind, slug, locale),
|
|
1260
1296
|
getLandingPageSitemap: () => getJmpLandingPageSitemap(config),
|
|
@@ -1333,6 +1369,8 @@ export {
|
|
|
1333
1369
|
getJmpBlogPost,
|
|
1334
1370
|
getJmpBlogPostDetail,
|
|
1335
1371
|
getJmpFaqs,
|
|
1372
|
+
getJmpLegalDocument,
|
|
1373
|
+
getJmpLegalDocuments,
|
|
1336
1374
|
getJmpFaqDetail,
|
|
1337
1375
|
getJmpLandingPages,
|
|
1338
1376
|
getJmpLandingPageDetail,
|
|
@@ -1352,4 +1390,4 @@ export {
|
|
|
1352
1390
|
getOrCreateJmpAnalyticsFromBrowserEnv,
|
|
1353
1391
|
createJmpContentClientFromServerEnv
|
|
1354
1392
|
};
|
|
1355
|
-
//# sourceMappingURL=chunk-
|
|
1393
|
+
//# sourceMappingURL=chunk-EBU4DKHW.js.map
|