@jmp-technologies/analytics 0.1.26 → 0.1.27
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 +43 -0
- package/bin/jmp-init.mjs +34 -0
- package/dist/astro/client.cjs +1 -1
- 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 +1 -1
- package/dist/astro/content.cjs +87 -1
- package/dist/astro/content.cjs.map +1 -1
- package/dist/astro/content.d.cts +9 -3
- package/dist/astro/content.d.ts +9 -3
- package/dist/astro/content.js +8 -2
- package/dist/astro/integration.cjs +1 -1
- package/dist/astro/integration.cjs.map +1 -1
- package/dist/astro/integration.js +2 -2
- package/dist/astro/middleware.d.cts +2 -2
- package/dist/astro/middleware.d.ts +2 -2
- package/dist/astro/register.cjs +1 -1
- package/dist/astro/register.cjs.map +1 -1
- package/dist/astro/register.js +2 -2
- package/dist/{chunk-PKGUBYZR.js → chunk-DNYJF7BG.js} +2 -2
- package/dist/{chunk-WFTTIRDJ.js → chunk-FNWE2DT5.js} +2 -2
- package/dist/{chunk-XQZOGWF2.js → chunk-KZ4WVDGL.js} +2 -2
- package/dist/{chunk-TFHOTBOL.js → chunk-PG3IOI5O.js} +41 -2
- package/dist/chunk-PG3IOI5O.js.map +1 -0
- package/dist/{chunk-RCOHQAGL.js → chunk-UVYF33XE.js} +55 -2
- package/dist/{chunk-RCOHQAGL.js.map → chunk-UVYF33XE.js.map} +1 -1
- package/dist/{create-jmp-analytics-Mau-oxji.d.cts → create-jmp-analytics-D4Qw_d6o.d.cts} +1 -1
- package/dist/{create-jmp-analytics-JKAsJAWb.d.ts → create-jmp-analytics-DpG5Hdl5.d.ts} +1 -1
- package/dist/index.cjs +57 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -7
- package/dist/index.d.ts +16 -7
- package/dist/index.js +7 -1
- package/dist/next/content.cjs +90 -1
- package/dist/next/content.cjs.map +1 -1
- package/dist/next/content.d.cts +7 -4
- package/dist/next/content.d.ts +7 -4
- package/dist/next/content.js +11 -2
- package/dist/next/content.js.map +1 -1
- package/dist/next/instrumentation.cjs +1 -1
- package/dist/next/instrumentation.cjs.map +1 -1
- package/dist/next/instrumentation.js +1 -1
- package/dist/next/landing-pages.cjs +659 -0
- package/dist/next/landing-pages.cjs.map +1 -0
- package/dist/next/landing-pages.d.cts +104 -0
- package/dist/next/landing-pages.d.ts +104 -0
- package/dist/next/landing-pages.js +299 -0
- package/dist/next/landing-pages.js.map +1 -0
- package/dist/next/middleware.d.cts +2 -2
- package/dist/next/middleware.d.ts +2 -2
- package/dist/next/site-root-server.cjs +1 -1
- package/dist/next/site-root-server.cjs.map +1 -1
- package/dist/next/site-root-server.js +3 -3
- package/dist/next.cjs +1 -1
- 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 +3 -3
- package/dist/react.cjs +1 -1
- 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 +2 -2
- package/dist/{site-config-CXUdGLqw.d.cts → site-config-CJqYnZm7.d.cts} +1 -1
- package/dist/{site-config-w_Db9YSk.d.ts → site-config-UTzDG-UG.d.ts} +1 -1
- package/dist/{track-page-view-QRSk8vap.d.ts → track-page-view-CMAqyhD_.d.ts} +1 -1
- package/dist/{track-page-view-CkuSYuco.d.cts → track-page-view-tX0Magkd.d.cts} +1 -1
- package/dist/{types-C1eq8E5u.d.cts → types-B-111Wht.d.cts} +41 -2
- package/dist/{types-C1eq8E5u.d.ts → types-B-111Wht.d.ts} +41 -2
- package/package.json +11 -2
- package/dist/chunk-TFHOTBOL.js.map +0 -1
- /package/dist/{chunk-PKGUBYZR.js.map → chunk-DNYJF7BG.js.map} +0 -0
- /package/dist/{chunk-WFTTIRDJ.js.map → chunk-FNWE2DT5.js.map} +0 -0
- /package/dist/{chunk-XQZOGWF2.js.map → chunk-KZ4WVDGL.js.map} +0 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadLandingPageDetail,
|
|
3
|
+
loadLandingPages
|
|
4
|
+
} from "../chunk-PG3IOI5O.js";
|
|
5
|
+
import "../chunk-UVYF33XE.js";
|
|
6
|
+
import "../chunk-TCZ6TC2L.js";
|
|
7
|
+
import {
|
|
8
|
+
getJmpSiteDefinition
|
|
9
|
+
} from "../chunk-A4RRTY5D.js";
|
|
10
|
+
|
|
11
|
+
// src/next/landing-pages.tsx
|
|
12
|
+
import Link from "next/link";
|
|
13
|
+
import { notFound } from "next/navigation";
|
|
14
|
+
|
|
15
|
+
// src/landing-pages/hub.ts
|
|
16
|
+
var JMP_LANDING_HUB = {
|
|
17
|
+
location: {
|
|
18
|
+
title: "Areas we serve",
|
|
19
|
+
path: "/areas",
|
|
20
|
+
description: "Local pages for cities and regions we work in.",
|
|
21
|
+
breadcrumb: "Areas",
|
|
22
|
+
segment: "areas"
|
|
23
|
+
},
|
|
24
|
+
service: {
|
|
25
|
+
title: "Services",
|
|
26
|
+
path: "/services",
|
|
27
|
+
description: "What we offer and how we help.",
|
|
28
|
+
breadcrumb: "Services",
|
|
29
|
+
segment: "services"
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
function jmpLandingKindSegment(kind) {
|
|
33
|
+
return JMP_LANDING_HUB[kind].segment;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/landing-pages/utils.ts
|
|
37
|
+
function plainTextFromMarkdown(input, maxLength = 5e3) {
|
|
38
|
+
return input.replace(/[#*_`[\]]/g, "").trim().slice(0, maxLength);
|
|
39
|
+
}
|
|
40
|
+
function resolveJmpSiteUrl(override) {
|
|
41
|
+
const fromArg = override?.trim().replace(/\/$/, "");
|
|
42
|
+
if (fromArg) return fromArg;
|
|
43
|
+
const fromConfig = getJmpSiteDefinition()?.siteUrl?.trim().replace(/\/$/, "");
|
|
44
|
+
return fromConfig || null;
|
|
45
|
+
}
|
|
46
|
+
function absoluteJmpSiteUrl(path, siteUrl) {
|
|
47
|
+
const base = resolveJmpSiteUrl(siteUrl);
|
|
48
|
+
if (!base) {
|
|
49
|
+
return path.startsWith("/") ? path : `/${path}`;
|
|
50
|
+
}
|
|
51
|
+
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
52
|
+
return `${base}${normalized}`;
|
|
53
|
+
}
|
|
54
|
+
function filterJmpLandingPagesForDefaultLocale(pages, kind) {
|
|
55
|
+
const segment = jmpLandingKindSegment(kind);
|
|
56
|
+
return pages.filter((page) => {
|
|
57
|
+
const parts = page.path.split("/").filter(Boolean);
|
|
58
|
+
return parts[0] === segment;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function filterJmpLandingPagesForLocalizedRoutes(pages, kind) {
|
|
62
|
+
const segment = jmpLandingKindSegment(kind);
|
|
63
|
+
return pages.filter((page) => {
|
|
64
|
+
const parts = page.path.split("/").filter(Boolean);
|
|
65
|
+
return parts.length >= 3 && parts[1] === segment;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function jmpLocalizedLandingStaticParams(pages, kind) {
|
|
69
|
+
const segment = jmpLandingKindSegment(kind);
|
|
70
|
+
return filterJmpLandingPagesForLocalizedRoutes(pages, kind).map((page) => {
|
|
71
|
+
const [locale, , slug] = page.path.split("/").filter(Boolean);
|
|
72
|
+
return { locale, slug };
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/landing-pages/json-ld.ts
|
|
77
|
+
function jmpBreadcrumbListJsonLd(items, siteUrl) {
|
|
78
|
+
return {
|
|
79
|
+
"@context": "https://schema.org",
|
|
80
|
+
"@type": "BreadcrumbList",
|
|
81
|
+
itemListElement: items.map((item, index) => ({
|
|
82
|
+
"@type": "ListItem",
|
|
83
|
+
position: index + 1,
|
|
84
|
+
name: item.name,
|
|
85
|
+
item: absoluteJmpSiteUrl(item.path, siteUrl)
|
|
86
|
+
}))
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/landing-pages/static-params.ts
|
|
91
|
+
async function generateJmpLandingStaticParams(kind) {
|
|
92
|
+
const pages = await loadLandingPages({ kind });
|
|
93
|
+
return filterJmpLandingPagesForDefaultLocale(pages, kind).map((page) => ({
|
|
94
|
+
slug: page.slug
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
async function generateJmpLocalizedLandingStaticParams(kind) {
|
|
98
|
+
const pages = await loadLandingPages({ kind });
|
|
99
|
+
return jmpLocalizedLandingStaticParams(pages, kind);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/landing-pages/sitemap.ts
|
|
103
|
+
function buildJmpLandingSitemapRoutes(entries, options) {
|
|
104
|
+
const { siteUrl, changeFrequency = "monthly" } = options;
|
|
105
|
+
const defaultPriority = {
|
|
106
|
+
location: 0.7,
|
|
107
|
+
service: 0.68
|
|
108
|
+
};
|
|
109
|
+
return entries.map((entry) => {
|
|
110
|
+
const priority = options.priorityByKind?.[entry.kind] ?? defaultPriority[entry.kind];
|
|
111
|
+
const languages = entry.alternates.length > 0 ? Object.fromEntries(
|
|
112
|
+
entry.alternates.map((alt) => [
|
|
113
|
+
alt.locale,
|
|
114
|
+
absoluteJmpSiteUrl(alt.path, siteUrl)
|
|
115
|
+
])
|
|
116
|
+
) : void 0;
|
|
117
|
+
return {
|
|
118
|
+
url: absoluteJmpSiteUrl(entry.path, siteUrl),
|
|
119
|
+
lastModified: entry.updated_at ? new Date(entry.updated_at) : void 0,
|
|
120
|
+
changeFrequency,
|
|
121
|
+
priority,
|
|
122
|
+
alternates: languages ? { languages } : void 0
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// src/next/landing-pages.tsx
|
|
128
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
129
|
+
async function buildJmpLandingMetadata({
|
|
130
|
+
kind,
|
|
131
|
+
slug,
|
|
132
|
+
locale,
|
|
133
|
+
siteUrl
|
|
134
|
+
}) {
|
|
135
|
+
const detail = await loadLandingPageDetail(kind, slug, locale);
|
|
136
|
+
if (!detail) {
|
|
137
|
+
return { title: "Not found" };
|
|
138
|
+
}
|
|
139
|
+
const { page, alternates } = detail;
|
|
140
|
+
const title = page.seo_title?.trim() || page.title;
|
|
141
|
+
const description = page.meta_description?.trim() || page.excerpt?.trim() || plainTextFromMarkdown(page.body, 160) || page.title;
|
|
142
|
+
const languages = {};
|
|
143
|
+
for (const alt of alternates) {
|
|
144
|
+
languages[alt.locale] = absoluteJmpSiteUrl(alt.path, siteUrl);
|
|
145
|
+
}
|
|
146
|
+
const canonical = absoluteJmpSiteUrl(page.path, siteUrl);
|
|
147
|
+
return {
|
|
148
|
+
title,
|
|
149
|
+
description,
|
|
150
|
+
alternates: {
|
|
151
|
+
canonical,
|
|
152
|
+
languages: Object.keys(languages).length > 0 ? languages : void 0
|
|
153
|
+
},
|
|
154
|
+
openGraph: {
|
|
155
|
+
title,
|
|
156
|
+
description,
|
|
157
|
+
type: "website",
|
|
158
|
+
url: canonical
|
|
159
|
+
},
|
|
160
|
+
twitter: {
|
|
161
|
+
card: "summary",
|
|
162
|
+
title,
|
|
163
|
+
description
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function buildJmpLandingIndexMetadata(kind, siteUrl) {
|
|
168
|
+
const hub = JMP_LANDING_HUB[kind];
|
|
169
|
+
return {
|
|
170
|
+
title: hub.title,
|
|
171
|
+
description: hub.description,
|
|
172
|
+
alternates: {
|
|
173
|
+
canonical: absoluteJmpSiteUrl(hub.path, siteUrl)
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function DefaultJsonLd({
|
|
178
|
+
data,
|
|
179
|
+
id
|
|
180
|
+
}) {
|
|
181
|
+
return /* @__PURE__ */ jsx(Fragment, { children: data.map((item, index) => /* @__PURE__ */ jsx(
|
|
182
|
+
"script",
|
|
183
|
+
{
|
|
184
|
+
type: "application/ld+json",
|
|
185
|
+
dangerouslySetInnerHTML: { __html: JSON.stringify(item) }
|
|
186
|
+
},
|
|
187
|
+
`${id}-${index}`
|
|
188
|
+
)) });
|
|
189
|
+
}
|
|
190
|
+
function DefaultBreadcrumbs({
|
|
191
|
+
items,
|
|
192
|
+
LinkComponent
|
|
193
|
+
}) {
|
|
194
|
+
return /* @__PURE__ */ jsx("nav", { "aria-label": "Breadcrumb", children: /* @__PURE__ */ jsx("ol", { style: { display: "flex", flexWrap: "wrap", gap: "0.5rem", listStyle: "none", padding: 0 }, children: items.map((item, index) => /* @__PURE__ */ jsxs("li", { children: [
|
|
195
|
+
index > 0 ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " / " }) : null,
|
|
196
|
+
index < items.length - 1 ? /* @__PURE__ */ jsx(LinkComponent, { href: item.path, children: item.name }) : /* @__PURE__ */ jsx("span", { children: item.name })
|
|
197
|
+
] }, item.path)) }) });
|
|
198
|
+
}
|
|
199
|
+
function resolveComponents(components) {
|
|
200
|
+
const LinkComponent = components?.Link ?? Link;
|
|
201
|
+
return {
|
|
202
|
+
Link: LinkComponent,
|
|
203
|
+
renderBody: components?.renderBody ?? ((body) => /* @__PURE__ */ jsx("article", { children: /* @__PURE__ */ jsx("pre", { style: { whiteSpace: "pre-wrap", fontFamily: "inherit" }, children: body }) })),
|
|
204
|
+
renderBreadcrumbs: components?.renderBreadcrumbs ?? ((items) => /* @__PURE__ */ jsx(DefaultBreadcrumbs, { items, LinkComponent })),
|
|
205
|
+
renderJsonLd: components?.renderJsonLd ?? ((data, id) => /* @__PURE__ */ jsx(DefaultJsonLd, { data, id }))
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
async function JmpLandingDetailPage({
|
|
209
|
+
kind,
|
|
210
|
+
slug,
|
|
211
|
+
locale,
|
|
212
|
+
siteUrl,
|
|
213
|
+
components,
|
|
214
|
+
className,
|
|
215
|
+
classNames
|
|
216
|
+
}) {
|
|
217
|
+
const detail = await loadLandingPageDetail(kind, slug, locale);
|
|
218
|
+
if (!detail) {
|
|
219
|
+
notFound();
|
|
220
|
+
}
|
|
221
|
+
const ui = resolveComponents(components);
|
|
222
|
+
const resolvedSiteUrl = resolveJmpSiteUrl(siteUrl) ?? void 0;
|
|
223
|
+
const { page, schema_json_ld } = detail;
|
|
224
|
+
const hub = JMP_LANDING_HUB[kind];
|
|
225
|
+
const displayTitle = page.headline?.trim() || page.title;
|
|
226
|
+
const breadcrumbItems = [
|
|
227
|
+
{ name: "Home", path: "/" },
|
|
228
|
+
{ name: hub.breadcrumb, path: hub.path },
|
|
229
|
+
{ name: page.title, path: page.path }
|
|
230
|
+
];
|
|
231
|
+
const related = filterJmpLandingPagesForDefaultLocale(
|
|
232
|
+
await loadLandingPages({ kind }),
|
|
233
|
+
kind
|
|
234
|
+
).filter((item) => item.id !== page.id && item.locale === page.locale);
|
|
235
|
+
const jsonLdBlocks = [
|
|
236
|
+
...schema_json_ld ?? [],
|
|
237
|
+
jmpBreadcrumbListJsonLd(breadcrumbItems, resolvedSiteUrl)
|
|
238
|
+
];
|
|
239
|
+
return /* @__PURE__ */ jsxs("main", { className, children: [
|
|
240
|
+
ui.renderJsonLd(jsonLdBlocks, `jmp-landing-${page.id}-ld-json`),
|
|
241
|
+
ui.renderBreadcrumbs(breadcrumbItems),
|
|
242
|
+
page.excerpt ? /* @__PURE__ */ jsx("p", { className: classNames?.excerpt, children: page.excerpt }) : null,
|
|
243
|
+
/* @__PURE__ */ jsx("h1", { className: classNames?.title, children: displayTitle }),
|
|
244
|
+
page.body ? ui.renderBody(page.body) : null,
|
|
245
|
+
related.length > 0 ? /* @__PURE__ */ jsxs("section", { children: [
|
|
246
|
+
/* @__PURE__ */ jsxs("h2", { className: classNames?.relatedTitle, children: [
|
|
247
|
+
"More ",
|
|
248
|
+
hub.breadcrumb.toLowerCase()
|
|
249
|
+
] }),
|
|
250
|
+
/* @__PURE__ */ jsx("ul", { className: classNames?.list, children: related.slice(0, 8).map((item) => /* @__PURE__ */ jsx("li", { className: classNames?.listItem, children: /* @__PURE__ */ jsx(ui.Link, { href: item.path, children: item.title }) }, item.id)) })
|
|
251
|
+
] }) : null
|
|
252
|
+
] });
|
|
253
|
+
}
|
|
254
|
+
async function JmpLandingIndexPage({
|
|
255
|
+
kind,
|
|
256
|
+
siteUrl,
|
|
257
|
+
components,
|
|
258
|
+
className,
|
|
259
|
+
classNames
|
|
260
|
+
}) {
|
|
261
|
+
const ui = resolveComponents(components);
|
|
262
|
+
const hub = JMP_LANDING_HUB[kind];
|
|
263
|
+
const pages = filterJmpLandingPagesForDefaultLocale(
|
|
264
|
+
await loadLandingPages({ kind }),
|
|
265
|
+
kind
|
|
266
|
+
);
|
|
267
|
+
const breadcrumbItems = [
|
|
268
|
+
{ name: "Home", path: "/" },
|
|
269
|
+
{ name: hub.breadcrumb, path: hub.path }
|
|
270
|
+
];
|
|
271
|
+
return /* @__PURE__ */ jsxs("main", { className, children: [
|
|
272
|
+
ui.renderBreadcrumbs(breadcrumbItems),
|
|
273
|
+
/* @__PURE__ */ jsx("h1", { className: classNames?.title, children: hub.title }),
|
|
274
|
+
/* @__PURE__ */ jsx("p", { className: classNames?.hubDescription, children: hub.description }),
|
|
275
|
+
pages.length > 0 ? /* @__PURE__ */ jsx("ul", { className: classNames?.list, children: pages.map((page) => /* @__PURE__ */ jsxs("li", { className: classNames?.listItem, children: [
|
|
276
|
+
/* @__PURE__ */ jsx(ui.Link, { href: page.path, children: page.title }),
|
|
277
|
+
page.excerpt ? /* @__PURE__ */ jsx("p", { className: classNames?.excerpt, children: page.excerpt }) : null
|
|
278
|
+
] }, page.id)) }) : /* @__PURE__ */ jsx("p", { className: classNames?.emptyState, children: "Pages will appear here once published in the JMP dashboard." })
|
|
279
|
+
] });
|
|
280
|
+
}
|
|
281
|
+
export {
|
|
282
|
+
JMP_LANDING_HUB,
|
|
283
|
+
JmpLandingDetailPage,
|
|
284
|
+
JmpLandingIndexPage,
|
|
285
|
+
absoluteJmpSiteUrl,
|
|
286
|
+
buildJmpLandingIndexMetadata,
|
|
287
|
+
buildJmpLandingMetadata,
|
|
288
|
+
buildJmpLandingSitemapRoutes,
|
|
289
|
+
filterJmpLandingPagesForDefaultLocale,
|
|
290
|
+
filterJmpLandingPagesForLocalizedRoutes,
|
|
291
|
+
generateJmpLandingStaticParams,
|
|
292
|
+
generateJmpLocalizedLandingStaticParams,
|
|
293
|
+
jmpBreadcrumbListJsonLd,
|
|
294
|
+
jmpLandingKindSegment,
|
|
295
|
+
jmpLocalizedLandingStaticParams,
|
|
296
|
+
plainTextFromMarkdown,
|
|
297
|
+
resolveJmpSiteUrl
|
|
298
|
+
};
|
|
299
|
+
//# sourceMappingURL=landing-pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/next/landing-pages.tsx","../../src/landing-pages/hub.ts","../../src/landing-pages/utils.ts","../../src/landing-pages/json-ld.ts","../../src/landing-pages/static-params.ts","../../src/landing-pages/sitemap.ts"],"sourcesContent":["import type { Metadata } from \"next\"\nimport Link from \"next/link\"\nimport { notFound } from \"next/navigation\"\nimport type { ComponentType, ReactNode } from \"react\"\n\nimport {\n loadLandingPageDetail,\n loadLandingPages,\n} from \"../content/site-content\"\nimport { JMP_LANDING_HUB } from \"../landing-pages/hub\"\nimport { jmpBreadcrumbListJsonLd } from \"../landing-pages/json-ld\"\nimport {\n buildJmpLandingSitemapRoutes,\n type BuildJmpLandingSitemapRoutesOptions,\n type JmpLandingSitemapRoute,\n} from \"../landing-pages/sitemap\"\nimport {\n generateJmpLandingStaticParams,\n generateJmpLocalizedLandingStaticParams,\n} from \"../landing-pages/static-params\"\nimport {\n absoluteJmpSiteUrl,\n filterJmpLandingPagesForDefaultLocale,\n plainTextFromMarkdown,\n resolveJmpSiteUrl,\n} from \"../landing-pages/utils\"\nimport type { JmpLandingPageKind } from \"../types\"\n\nexport {\n generateJmpLandingStaticParams,\n generateJmpLocalizedLandingStaticParams,\n} from \"../landing-pages/static-params\"\nexport {\n buildJmpLandingSitemapRoutes,\n type BuildJmpLandingSitemapRoutesOptions,\n type JmpLandingSitemapRoute,\n} from \"../landing-pages/sitemap\"\nexport {\n absoluteJmpSiteUrl,\n filterJmpLandingPagesForDefaultLocale,\n filterJmpLandingPagesForLocalizedRoutes,\n jmpLocalizedLandingStaticParams,\n plainTextFromMarkdown,\n resolveJmpSiteUrl,\n} from \"../landing-pages/utils\"\nexport { JMP_LANDING_HUB, jmpLandingKindSegment } from \"../landing-pages/hub\"\nexport { jmpBreadcrumbListJsonLd, type JmpBreadcrumbItem } from \"../landing-pages/json-ld\"\n\nexport type JmpLandingPageClassNames = {\n excerpt?: string\n title?: string\n relatedTitle?: string\n hubDescription?: string\n emptyState?: string\n list?: string\n listItem?: string\n}\n\nexport type JmpLandingDetailPageProps = {\n kind: JmpLandingPageKind\n slug: string\n locale?: string\n siteUrl?: string\n components?: JmpLandingPageComponents\n className?: string\n classNames?: JmpLandingPageClassNames\n}\n\nexport type JmpLandingIndexPageProps = {\n kind: JmpLandingPageKind\n siteUrl?: string\n components?: JmpLandingPageComponents\n className?: string\n classNames?: JmpLandingPageClassNames\n}\n\nexport type JmpLandingPageComponents = {\n Link?: ComponentType<{\n href: string\n className?: string\n children: ReactNode\n }>\n renderBody?: (body: string) => ReactNode\n renderBreadcrumbs?: (items: { name: string; path: string }[]) => ReactNode\n renderJsonLd?: (data: Record<string, unknown>[], id: string) => ReactNode\n}\n\nexport async function buildJmpLandingMetadata({\n kind,\n slug,\n locale,\n siteUrl,\n}: JmpLandingDetailPageProps): Promise<Metadata> {\n const detail = await loadLandingPageDetail(kind, slug, locale)\n if (!detail) {\n return { title: \"Not found\" }\n }\n\n const { page, alternates } = detail\n const title = page.seo_title?.trim() || page.title\n const description =\n page.meta_description?.trim() ||\n page.excerpt?.trim() ||\n plainTextFromMarkdown(page.body, 160) ||\n page.title\n\n const languages: Record<string, string> = {}\n for (const alt of alternates) {\n languages[alt.locale] = absoluteJmpSiteUrl(alt.path, siteUrl)\n }\n\n const canonical = absoluteJmpSiteUrl(page.path, siteUrl)\n\n return {\n title,\n description,\n alternates: {\n canonical,\n languages: Object.keys(languages).length > 0 ? languages : undefined,\n },\n openGraph: {\n title,\n description,\n type: \"website\",\n url: canonical,\n },\n twitter: {\n card: \"summary\",\n title,\n description,\n },\n }\n}\n\nexport function buildJmpLandingIndexMetadata(\n kind: JmpLandingPageKind,\n siteUrl?: string\n): Metadata {\n const hub = JMP_LANDING_HUB[kind]\n return {\n title: hub.title,\n description: hub.description,\n alternates: {\n canonical: absoluteJmpSiteUrl(hub.path, siteUrl),\n },\n }\n}\n\nfunction DefaultJsonLd({\n data,\n id,\n}: {\n data: Record<string, unknown>[]\n id: string\n}) {\n return (\n <>\n {data.map((item, index) => (\n <script\n key={`${id}-${index}`}\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(item) }}\n />\n ))}\n </>\n )\n}\n\nfunction DefaultBreadcrumbs({\n items,\n LinkComponent,\n}: {\n items: { name: string; path: string }[]\n LinkComponent: NonNullable<JmpLandingPageComponents[\"Link\"]>\n}) {\n return (\n <nav aria-label=\"Breadcrumb\">\n <ol style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"0.5rem\", listStyle: \"none\", padding: 0 }}>\n {items.map((item, index) => (\n <li key={item.path}>\n {index > 0 ? <span aria-hidden=\"true\"> / </span> : null}\n {index < items.length - 1 ? (\n <LinkComponent href={item.path}>{item.name}</LinkComponent>\n ) : (\n <span>{item.name}</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )\n}\n\nfunction resolveComponents(components?: JmpLandingPageComponents) {\n const LinkComponent = components?.Link ?? Link\n return {\n Link: LinkComponent,\n renderBody:\n components?.renderBody ??\n ((body: string) => (\n <article>\n <pre style={{ whiteSpace: \"pre-wrap\", fontFamily: \"inherit\" }}>{body}</pre>\n </article>\n )),\n renderBreadcrumbs:\n components?.renderBreadcrumbs ??\n ((items: { name: string; path: string }[]) => (\n <DefaultBreadcrumbs items={items} LinkComponent={LinkComponent} />\n )),\n renderJsonLd:\n components?.renderJsonLd ??\n ((data: Record<string, unknown>[], id: string) => (\n <DefaultJsonLd data={data} id={id} />\n )),\n }\n}\n\nexport async function JmpLandingDetailPage({\n kind,\n slug,\n locale,\n siteUrl,\n components,\n className,\n classNames,\n}: JmpLandingDetailPageProps) {\n const detail = await loadLandingPageDetail(kind, slug, locale)\n if (!detail) {\n notFound()\n }\n\n const ui = resolveComponents(components)\n const resolvedSiteUrl = resolveJmpSiteUrl(siteUrl) ?? undefined\n const { page, schema_json_ld } = detail\n const hub = JMP_LANDING_HUB[kind]\n const displayTitle = page.headline?.trim() || page.title\n const breadcrumbItems = [\n { name: \"Home\", path: \"/\" },\n { name: hub.breadcrumb, path: hub.path },\n { name: page.title, path: page.path },\n ]\n\n const related = filterJmpLandingPagesForDefaultLocale(\n await loadLandingPages({ kind }),\n kind\n ).filter((item) => item.id !== page.id && item.locale === page.locale)\n\n const jsonLdBlocks: Record<string, unknown>[] = [\n ...(schema_json_ld ?? []),\n jmpBreadcrumbListJsonLd(breadcrumbItems, resolvedSiteUrl),\n ]\n\n return (\n <main className={className}>\n {ui.renderJsonLd(jsonLdBlocks, `jmp-landing-${page.id}-ld-json`)}\n {ui.renderBreadcrumbs(breadcrumbItems)}\n\n {page.excerpt ? (\n <p className={classNames?.excerpt}>{page.excerpt}</p>\n ) : null}\n\n <h1 className={classNames?.title}>{displayTitle}</h1>\n\n {page.body ? ui.renderBody(page.body) : null}\n\n {related.length > 0 ? (\n <section>\n <h2 className={classNames?.relatedTitle}>\n More {hub.breadcrumb.toLowerCase()}\n </h2>\n <ul className={classNames?.list}>\n {related.slice(0, 8).map((item) => (\n <li key={item.id} className={classNames?.listItem}>\n <ui.Link href={item.path}>{item.title}</ui.Link>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n </main>\n )\n}\n\nexport async function JmpLandingIndexPage({\n kind,\n siteUrl,\n components,\n className,\n classNames,\n}: JmpLandingIndexPageProps) {\n const ui = resolveComponents(components)\n const hub = JMP_LANDING_HUB[kind]\n const pages = filterJmpLandingPagesForDefaultLocale(\n await loadLandingPages({ kind }),\n kind\n )\n\n const breadcrumbItems = [\n { name: \"Home\", path: \"/\" },\n { name: hub.breadcrumb, path: hub.path },\n ]\n\n return (\n <main className={className}>\n {ui.renderBreadcrumbs(breadcrumbItems)}\n\n <h1 className={classNames?.title}>{hub.title}</h1>\n <p className={classNames?.hubDescription}>{hub.description}</p>\n\n {pages.length > 0 ? (\n <ul className={classNames?.list}>\n {pages.map((page) => (\n <li key={page.id} className={classNames?.listItem}>\n <ui.Link href={page.path}>{page.title}</ui.Link>\n {page.excerpt ? (\n <p className={classNames?.excerpt}>{page.excerpt}</p>\n ) : null}\n </li>\n ))}\n </ul>\n ) : (\n <p className={classNames?.emptyState}>\n Pages will appear here once published in the JMP dashboard.\n </p>\n )}\n </main>\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 const segment = jmpLandingKindSegment(kind)\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 { absoluteJmpSiteUrl } from \"./utils\"\n\nexport type JmpBreadcrumbItem = { name: string; path: string }\n\nexport function jmpBreadcrumbListJsonLd(\n items: JmpBreadcrumbItem[],\n siteUrl?: string\n): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: items.map((item, index) => ({\n \"@type\": \"ListItem\",\n position: index + 1,\n name: item.name,\n item: absoluteJmpSiteUrl(item.path, siteUrl),\n })),\n }\n}\n","import { loadLandingPages } from \"../content/site-content\"\nimport type { JmpLandingPageKind } from \"../types\"\nimport {\n filterJmpLandingPagesForDefaultLocale,\n jmpLocalizedLandingStaticParams,\n} from \"./utils\"\n\n/** `generateStaticParams` for `app/{areas|services}/[slug]/page.tsx` (default locale). */\nexport async function generateJmpLandingStaticParams(\n kind: JmpLandingPageKind\n): Promise<{ slug: string }[]> {\n const pages = await loadLandingPages({ kind })\n return filterJmpLandingPagesForDefaultLocale(pages, kind).map((page) => ({\n slug: page.slug,\n }))\n}\n\n/** `generateStaticParams` for `app/[locale]/{areas|services}/[slug]/page.tsx`. */\nexport async function generateJmpLocalizedLandingStaticParams(\n kind: JmpLandingPageKind\n): Promise<{ locale: string; slug: string }[]> {\n const pages = await loadLandingPages({ kind })\n return jmpLocalizedLandingStaticParams(pages, kind)\n}\n","import type { JmpLandingPageKind, JmpLandingPageSitemapEntry } from \"../types\"\nimport { absoluteJmpSiteUrl } from \"./utils\"\n\nexport type JmpLandingSitemapRoute = {\n url: string\n lastModified?: Date\n changeFrequency?: \"always\" | \"hourly\" | \"daily\" | \"weekly\" | \"monthly\" | \"yearly\" | \"never\"\n priority?: number\n alternates?: { languages?: Record<string, string> }\n}\n\nexport type BuildJmpLandingSitemapRoutesOptions = {\n siteUrl: string\n /** Default 0.7 location, 0.68 service */\n priorityByKind?: Partial<Record<JmpLandingPageKind, number>>\n changeFrequency?: JmpLandingSitemapRoute[\"changeFrequency\"]\n}\n\nexport function buildJmpLandingSitemapRoutes(\n entries: JmpLandingPageSitemapEntry[],\n options: BuildJmpLandingSitemapRoutesOptions\n): JmpLandingSitemapRoute[] {\n const { siteUrl, changeFrequency = \"monthly\" } = options\n const defaultPriority: Record<JmpLandingPageKind, number> = {\n location: 0.7,\n service: 0.68,\n }\n\n return entries.map((entry) => {\n const priority =\n options.priorityByKind?.[entry.kind] ?? defaultPriority[entry.kind]\n const languages =\n entry.alternates.length > 0\n ? Object.fromEntries(\n entry.alternates.map((alt) => [\n alt.locale,\n absoluteJmpSiteUrl(alt.path, siteUrl),\n ])\n )\n : undefined\n\n return {\n url: absoluteJmpSiteUrl(entry.path, siteUrl),\n lastModified: entry.updated_at ? new Date(entry.updated_at) : undefined,\n changeFrequency,\n priority,\n alternates: languages ? { languages } : undefined,\n }\n })\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { j as jmpTrackServerPageView } from '../track-page-view-
|
|
1
|
+
export { k as JmpServerRequestLike } from '../types-B-111Wht.cjs';
|
|
2
|
+
export { j as jmpTrackServerPageView } from '../track-page-view-tX0Magkd.cjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Default middleware matcher string for copy-paste into the client `middleware.ts`.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { j as jmpTrackServerPageView } from '../track-page-view-
|
|
1
|
+
export { k as JmpServerRequestLike } from '../types-B-111Wht.js';
|
|
2
|
+
export { j as jmpTrackServerPageView } from '../track-page-view-CMAqyhD_.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Default middleware matcher string for copy-paste into the client `middleware.ts`.
|
|
@@ -35,7 +35,7 @@ __export(site_root_server_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(site_root_server_exports);
|
|
36
36
|
|
|
37
37
|
// src/constants.ts
|
|
38
|
-
var JMP_ANALYTICS_SDK_VERSION = "0.1.
|
|
38
|
+
var JMP_ANALYTICS_SDK_VERSION = "0.1.26";
|
|
39
39
|
var JMP_TRACKING_CONSENT_STORAGE_KEY = "jmp_analytics_consent_v1";
|
|
40
40
|
var DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS = 2500;
|
|
41
41
|
|