@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.
Files changed (75) hide show
  1. package/README.md +43 -0
  2. package/bin/jmp-init.mjs +34 -0
  3. package/dist/astro/client.cjs +1 -1
  4. package/dist/astro/client.cjs.map +1 -1
  5. package/dist/astro/client.d.cts +2 -2
  6. package/dist/astro/client.d.ts +2 -2
  7. package/dist/astro/client.js +1 -1
  8. package/dist/astro/content.cjs +87 -1
  9. package/dist/astro/content.cjs.map +1 -1
  10. package/dist/astro/content.d.cts +9 -3
  11. package/dist/astro/content.d.ts +9 -3
  12. package/dist/astro/content.js +8 -2
  13. package/dist/astro/integration.cjs +1 -1
  14. package/dist/astro/integration.cjs.map +1 -1
  15. package/dist/astro/integration.js +2 -2
  16. package/dist/astro/middleware.d.cts +2 -2
  17. package/dist/astro/middleware.d.ts +2 -2
  18. package/dist/astro/register.cjs +1 -1
  19. package/dist/astro/register.cjs.map +1 -1
  20. package/dist/astro/register.js +2 -2
  21. package/dist/{chunk-PKGUBYZR.js → chunk-DNYJF7BG.js} +2 -2
  22. package/dist/{chunk-WFTTIRDJ.js → chunk-FNWE2DT5.js} +2 -2
  23. package/dist/{chunk-XQZOGWF2.js → chunk-KZ4WVDGL.js} +2 -2
  24. package/dist/{chunk-TFHOTBOL.js → chunk-PG3IOI5O.js} +41 -2
  25. package/dist/chunk-PG3IOI5O.js.map +1 -0
  26. package/dist/{chunk-RCOHQAGL.js → chunk-UVYF33XE.js} +55 -2
  27. package/dist/{chunk-RCOHQAGL.js.map → chunk-UVYF33XE.js.map} +1 -1
  28. package/dist/{create-jmp-analytics-Mau-oxji.d.cts → create-jmp-analytics-D4Qw_d6o.d.cts} +1 -1
  29. package/dist/{create-jmp-analytics-JKAsJAWb.d.ts → create-jmp-analytics-DpG5Hdl5.d.ts} +1 -1
  30. package/dist/index.cjs +57 -1
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +16 -7
  33. package/dist/index.d.ts +16 -7
  34. package/dist/index.js +7 -1
  35. package/dist/next/content.cjs +90 -1
  36. package/dist/next/content.cjs.map +1 -1
  37. package/dist/next/content.d.cts +7 -4
  38. package/dist/next/content.d.ts +7 -4
  39. package/dist/next/content.js +11 -2
  40. package/dist/next/content.js.map +1 -1
  41. package/dist/next/instrumentation.cjs +1 -1
  42. package/dist/next/instrumentation.cjs.map +1 -1
  43. package/dist/next/instrumentation.js +1 -1
  44. package/dist/next/landing-pages.cjs +659 -0
  45. package/dist/next/landing-pages.cjs.map +1 -0
  46. package/dist/next/landing-pages.d.cts +104 -0
  47. package/dist/next/landing-pages.d.ts +104 -0
  48. package/dist/next/landing-pages.js +299 -0
  49. package/dist/next/landing-pages.js.map +1 -0
  50. package/dist/next/middleware.d.cts +2 -2
  51. package/dist/next/middleware.d.ts +2 -2
  52. package/dist/next/site-root-server.cjs +1 -1
  53. package/dist/next/site-root-server.cjs.map +1 -1
  54. package/dist/next/site-root-server.js +3 -3
  55. package/dist/next.cjs +1 -1
  56. package/dist/next.cjs.map +1 -1
  57. package/dist/next.d.cts +3 -3
  58. package/dist/next.d.ts +3 -3
  59. package/dist/next.js +3 -3
  60. package/dist/react.cjs +1 -1
  61. package/dist/react.cjs.map +1 -1
  62. package/dist/react.d.cts +2 -2
  63. package/dist/react.d.ts +2 -2
  64. package/dist/react.js +2 -2
  65. package/dist/{site-config-CXUdGLqw.d.cts → site-config-CJqYnZm7.d.cts} +1 -1
  66. package/dist/{site-config-w_Db9YSk.d.ts → site-config-UTzDG-UG.d.ts} +1 -1
  67. package/dist/{track-page-view-QRSk8vap.d.ts → track-page-view-CMAqyhD_.d.ts} +1 -1
  68. package/dist/{track-page-view-CkuSYuco.d.cts → track-page-view-tX0Magkd.d.cts} +1 -1
  69. package/dist/{types-C1eq8E5u.d.cts → types-B-111Wht.d.cts} +41 -2
  70. package/dist/{types-C1eq8E5u.d.ts → types-B-111Wht.d.ts} +41 -2
  71. package/package.json +11 -2
  72. package/dist/chunk-TFHOTBOL.js.map +0 -1
  73. /package/dist/{chunk-PKGUBYZR.js.map → chunk-DNYJF7BG.js.map} +0 -0
  74. /package/dist/{chunk-WFTTIRDJ.js.map → chunk-FNWE2DT5.js.map} +0 -0
  75. /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 { g as JmpServerRequestLike } from '../types-C1eq8E5u.cjs';
2
- export { j as jmpTrackServerPageView } from '../track-page-view-CkuSYuco.cjs';
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 { g as JmpServerRequestLike } from '../types-C1eq8E5u.js';
2
- export { j as jmpTrackServerPageView } from '../track-page-view-QRSk8vap.js';
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.25";
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