@jmp-technologies/analytics 0.1.35 → 0.1.37
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 +82 -42
- package/dist/astro/client.cjs.map +1 -1
- package/dist/astro/client.d.cts +18 -0
- package/dist/astro/client.d.ts +18 -0
- package/dist/astro/client.js +2 -2
- package/dist/astro/content.cjs +99 -69
- package/dist/astro/content.cjs.map +1 -1
- package/dist/astro/content.d.cts +53 -0
- package/dist/astro/content.d.ts +53 -0
- package/dist/astro/content.js +3 -3
- package/dist/astro/integration.cjs +100 -66
- package/dist/astro/integration.cjs.map +1 -1
- package/dist/astro/integration.d.cts +36 -0
- package/dist/astro/integration.d.ts +36 -0
- package/dist/astro/integration.js +3 -3
- package/dist/astro/middleware.cjs +93 -66
- package/dist/astro/middleware.cjs.map +1 -1
- package/dist/astro/middleware.d.cts +19 -0
- package/dist/astro/middleware.d.ts +19 -0
- package/dist/astro/middleware.js +2 -2
- package/dist/astro/register.cjs +100 -66
- package/dist/astro/register.cjs.map +1 -1
- package/dist/astro/register.d.cts +7 -0
- package/dist/astro/register.d.ts +7 -0
- package/dist/astro/register.js +3 -3
- package/dist/{chunk-VUCOCFVE.js → chunk-D43AEUXU.js} +3 -3
- package/dist/{chunk-AIFJ7DVO.js → chunk-EMZXL6VF.js} +193 -105
- package/dist/chunk-EMZXL6VF.js.map +1 -0
- package/dist/{chunk-HFLU7HQE.js → chunk-PTXPNIMF.js} +2 -2
- package/dist/{chunk-6SMPRPQ3.js → chunk-RT2YYDCK.js} +12 -8
- package/dist/chunk-RT2YYDCK.js.map +1 -0
- package/dist/{chunk-4ZUW24F6.js → chunk-TN6PGIB5.js} +2 -2
- package/dist/{chunk-3ET7F6MZ.js → chunk-UHXWHKHJ.js} +3 -3
- package/dist/chunk-UHXWHKHJ.js.map +1 -0
- package/dist/{chunk-G322JCI3.js → chunk-VQF6QYLR.js} +3 -3
- package/dist/create-jmp-analytics-Bz0-K0Af.d.cts +69 -0
- package/dist/create-jmp-analytics-DRjrlWUn.d.ts +69 -0
- package/dist/env-public-B6Y0DG68.d.cts +14 -0
- package/dist/env-public-B6Y0DG68.d.ts +14 -0
- package/dist/index.cjs +105 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +110 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.js +2 -2
- package/dist/landing-capture-C8pyZWuF.d.cts +4 -0
- package/dist/landing-capture-C8pyZWuF.d.ts +4 -0
- package/dist/next/content.cjs +99 -69
- package/dist/next/content.cjs.map +1 -1
- package/dist/next/content.d.cts +23 -0
- package/dist/next/content.d.ts +23 -0
- package/dist/next/content.js +3 -3
- package/dist/next/google-tag.d.cts +17 -0
- package/dist/next/google-tag.d.ts +17 -0
- package/dist/next/instrumentation.cjs +100 -66
- package/dist/next/instrumentation.cjs.map +1 -1
- package/dist/next/instrumentation.d.cts +7 -0
- package/dist/next/instrumentation.d.ts +7 -0
- package/dist/next/instrumentation.js +2 -2
- package/dist/next/landing-capture-script-server.d.cts +14 -0
- package/dist/next/landing-capture-script-server.d.ts +14 -0
- package/dist/next/landing-pages.cjs +151 -129
- package/dist/next/landing-pages.cjs.map +1 -1
- package/dist/next/landing-pages.d.cts +92 -0
- package/dist/next/landing-pages.d.ts +92 -0
- package/dist/next/landing-pages.js +7 -8
- package/dist/next/landing-pages.js.map +1 -1
- package/dist/next/locations.cjs +110 -88
- package/dist/next/locations.cjs.map +1 -1
- package/dist/next/locations.d.cts +55 -0
- package/dist/next/locations.d.ts +55 -0
- package/dist/next/locations.js +7 -8
- package/dist/next/locations.js.map +1 -1
- package/dist/next/middleware.cjs +93 -66
- package/dist/next/middleware.cjs.map +1 -1
- package/dist/next/middleware.d.cts +10 -0
- package/dist/next/middleware.d.ts +10 -0
- package/dist/next/middleware.js +2 -2
- package/dist/next/site-root-server.cjs +99 -69
- package/dist/next/site-root-server.cjs.map +1 -1
- package/dist/next/site-root-server.d.cts +24 -0
- package/dist/next/site-root-server.d.ts +24 -0
- package/dist/next/site-root-server.js +4 -4
- package/dist/next.cjs +36 -2
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +50 -0
- package/dist/next.d.ts +50 -0
- package/dist/next.js +4 -4
- package/dist/react.cjs +87 -53
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +22 -0
- package/dist/react.d.ts +22 -0
- package/dist/react.js +3 -3
- package/dist/site-config-BxEmJxBB.d.ts +74 -0
- package/dist/site-config-Cgq67uQ1.d.cts +74 -0
- package/dist/track-page-view-74Su6lQY.d.ts +12 -0
- package/dist/track-page-view-BCX1Dsfk.d.cts +12 -0
- package/dist/types-yNgoakwk.d.cts +397 -0
- package/dist/types-yNgoakwk.d.ts +397 -0
- package/dist/utils-BLoWWfSw.d.ts +15 -0
- package/dist/utils-UPTIdK1D.d.cts +15 -0
- package/package.json +3 -2
- package/dist/chunk-3ET7F6MZ.js.map +0 -1
- package/dist/chunk-6SMPRPQ3.js.map +0 -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-VUCOCFVE.js.map → chunk-D43AEUXU.js.map} +0 -0
- /package/dist/{chunk-HFLU7HQE.js.map → chunk-PTXPNIMF.js.map} +0 -0
- /package/dist/{chunk-4ZUW24F6.js.map → chunk-TN6PGIB5.js.map} +0 -0
- /package/dist/{chunk-G322JCI3.js.map → chunk-VQF6QYLR.js.map} +0 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { Metadata } from 'next';
|
|
3
|
+
import { ComponentType, ReactNode } from 'react';
|
|
4
|
+
import { d as JmpLandingPageKind, e as JmpLandingPageSitemapEntry } from '../types-yNgoakwk.js';
|
|
5
|
+
export { a as absoluteJmpSiteUrl, f as filterJmpLandingPagesForDefaultLocale, b as filterJmpLandingPagesForLocalizedRoutes, j as jmpLocalizedLandingStaticParams, p as plainTextFromMarkdown, r as resolveJmpSiteUrl } from '../utils-BLoWWfSw.js';
|
|
6
|
+
|
|
7
|
+
/** `generateStaticParams` for `app/{areas|services}/[slug]/page.tsx` (default locale). */
|
|
8
|
+
declare function generateJmpLandingStaticParams(kind: JmpLandingPageKind): Promise<{
|
|
9
|
+
slug: string;
|
|
10
|
+
}[]>;
|
|
11
|
+
/** `generateStaticParams` for `app/[locale]/{areas|services}/[slug]/page.tsx`. */
|
|
12
|
+
declare function generateJmpLocalizedLandingStaticParams(kind: JmpLandingPageKind): Promise<{
|
|
13
|
+
locale: string;
|
|
14
|
+
slug: string;
|
|
15
|
+
}[]>;
|
|
16
|
+
|
|
17
|
+
type JmpLandingSitemapRoute = {
|
|
18
|
+
url: string;
|
|
19
|
+
lastModified?: Date;
|
|
20
|
+
changeFrequency?: "always" | "hourly" | "daily" | "weekly" | "monthly" | "yearly" | "never";
|
|
21
|
+
priority?: number;
|
|
22
|
+
alternates?: {
|
|
23
|
+
languages?: Record<string, string>;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
type BuildJmpLandingSitemapRoutesOptions = {
|
|
27
|
+
siteUrl: string;
|
|
28
|
+
/** Default 0.7 location, 0.68 service */
|
|
29
|
+
priorityByKind?: Partial<Record<JmpLandingPageKind, number>>;
|
|
30
|
+
changeFrequency?: JmpLandingSitemapRoute["changeFrequency"];
|
|
31
|
+
};
|
|
32
|
+
declare function buildJmpLandingSitemapRoutes(entries: JmpLandingPageSitemapEntry[], options: BuildJmpLandingSitemapRoutesOptions): JmpLandingSitemapRoute[];
|
|
33
|
+
|
|
34
|
+
type JmpLandingHubConfig = {
|
|
35
|
+
title: string;
|
|
36
|
+
path: string;
|
|
37
|
+
description: string;
|
|
38
|
+
breadcrumb: string;
|
|
39
|
+
segment: string;
|
|
40
|
+
};
|
|
41
|
+
declare const JMP_LANDING_HUB: Record<JmpLandingPageKind, JmpLandingHubConfig>;
|
|
42
|
+
declare function jmpLandingKindSegment(kind: JmpLandingPageKind): string;
|
|
43
|
+
|
|
44
|
+
type JmpBreadcrumbItem = {
|
|
45
|
+
name: string;
|
|
46
|
+
path: string;
|
|
47
|
+
};
|
|
48
|
+
declare function jmpBreadcrumbListJsonLd(items: JmpBreadcrumbItem[], siteUrl?: string): Record<string, unknown>;
|
|
49
|
+
|
|
50
|
+
type JmpLandingPageClassNames = {
|
|
51
|
+
excerpt?: string;
|
|
52
|
+
title?: string;
|
|
53
|
+
relatedTitle?: string;
|
|
54
|
+
hubDescription?: string;
|
|
55
|
+
emptyState?: string;
|
|
56
|
+
list?: string;
|
|
57
|
+
listItem?: string;
|
|
58
|
+
};
|
|
59
|
+
type JmpLandingDetailPageProps = {
|
|
60
|
+
kind: JmpLandingPageKind;
|
|
61
|
+
slug: string;
|
|
62
|
+
locale?: string;
|
|
63
|
+
siteUrl?: string;
|
|
64
|
+
components?: JmpLandingPageComponents;
|
|
65
|
+
className?: string;
|
|
66
|
+
classNames?: JmpLandingPageClassNames;
|
|
67
|
+
};
|
|
68
|
+
type JmpLandingIndexPageProps = {
|
|
69
|
+
kind: JmpLandingPageKind;
|
|
70
|
+
components?: JmpLandingPageComponents;
|
|
71
|
+
className?: string;
|
|
72
|
+
classNames?: JmpLandingPageClassNames;
|
|
73
|
+
};
|
|
74
|
+
type JmpLandingPageComponents = {
|
|
75
|
+
Link?: ComponentType<{
|
|
76
|
+
href: string;
|
|
77
|
+
className?: string;
|
|
78
|
+
children: ReactNode;
|
|
79
|
+
}>;
|
|
80
|
+
renderBody?: (body: string) => ReactNode;
|
|
81
|
+
renderBreadcrumbs?: (items: {
|
|
82
|
+
name: string;
|
|
83
|
+
path: string;
|
|
84
|
+
}[]) => ReactNode;
|
|
85
|
+
renderJsonLd?: (data: Record<string, unknown>[], id: string) => ReactNode;
|
|
86
|
+
};
|
|
87
|
+
declare function buildJmpLandingMetadata({ kind, slug, locale, siteUrl, }: JmpLandingDetailPageProps): Promise<Metadata>;
|
|
88
|
+
declare function buildJmpLandingIndexMetadata(kind: JmpLandingPageKind, siteUrl?: string): Metadata;
|
|
89
|
+
declare function JmpLandingDetailPage({ kind, slug, locale, siteUrl, components, className, classNames, }: JmpLandingDetailPageProps): Promise<react_jsx_runtime.JSX.Element>;
|
|
90
|
+
declare function JmpLandingIndexPage({ kind, components, className, classNames, }: JmpLandingIndexPageProps): Promise<react_jsx_runtime.JSX.Element>;
|
|
91
|
+
|
|
92
|
+
export { type BuildJmpLandingSitemapRoutesOptions, JMP_LANDING_HUB, type JmpBreadcrumbItem, JmpLandingDetailPage, type JmpLandingDetailPageProps, JmpLandingIndexPage, type JmpLandingIndexPageProps, type JmpLandingPageClassNames, type JmpLandingPageComponents, type JmpLandingSitemapRoute, buildJmpLandingIndexMetadata, buildJmpLandingMetadata, buildJmpLandingSitemapRoutes, generateJmpLandingStaticParams, generateJmpLocalizedLandingStaticParams, jmpBreadcrumbListJsonLd, jmpLandingKindSegment };
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
loadLandingPageDetail,
|
|
3
|
+
loadLandingPages
|
|
4
|
+
} from "../chunk-UHXWHKHJ.js";
|
|
5
|
+
import "../chunk-RT2YYDCK.js";
|
|
6
|
+
import "../chunk-TCZ6TC2L.js";
|
|
1
7
|
import {
|
|
2
8
|
JMP_LANDING_HUB,
|
|
3
9
|
absoluteJmpSiteUrl,
|
|
@@ -7,14 +13,7 @@ import {
|
|
|
7
13
|
jmpLocalizedLandingStaticParams,
|
|
8
14
|
plainTextFromMarkdown,
|
|
9
15
|
resolveJmpSiteUrl
|
|
10
|
-
} from "../chunk-
|
|
11
|
-
import {
|
|
12
|
-
loadLandingPageDetail,
|
|
13
|
-
loadLandingPages
|
|
14
|
-
} from "../chunk-3ET7F6MZ.js";
|
|
15
|
-
import "../chunk-6SMPRPQ3.js";
|
|
16
|
-
import "../chunk-TCZ6TC2L.js";
|
|
17
|
-
import "../chunk-AIFJ7DVO.js";
|
|
16
|
+
} from "../chunk-EMZXL6VF.js";
|
|
18
17
|
|
|
19
18
|
// src/next/landing-pages.tsx
|
|
20
19
|
import Link from "next/link";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/landing-pages.tsx","../../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 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 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 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 { 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
|
+
{"version":3,"sources":["../../src/next/landing-pages.tsx","../../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 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 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 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 { 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":";;;;;;;;;;;;;;;;;;AACA,OAAO,UAAU;AACjB,SAAS,gBAAgB;;;ACElB,SAAS,wBACd,OACA,SACyB;AACzB,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,iBAAiB,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,MAC3C,SAAS;AAAA,MACT,UAAU,QAAQ;AAAA,MAClB,MAAM,KAAK;AAAA,MACX,MAAM,mBAAmB,KAAK,MAAM,OAAO;AAAA,IAC7C,EAAE;AAAA,EACJ;AACF;;;ACVA,eAAsB,+BACpB,MAC6B;AAC7B,QAAM,QAAQ,MAAM,iBAAiB,EAAE,KAAK,CAAC;AAC7C,SAAO,sCAAsC,OAAO,IAAI,EAAE,IAAI,CAAC,UAAU;AAAA,IACvE,MAAM,KAAK;AAAA,EACb,EAAE;AACJ;AAGA,eAAsB,wCACpB,MAC6C;AAC7C,QAAM,QAAQ,MAAM,iBAAiB,EAAE,KAAK,CAAC;AAC7C,SAAO,gCAAgC,OAAO,IAAI;AACpD;;;ACLO,SAAS,6BACd,SACA,SAC0B;AAC1B,QAAM,EAAE,SAAS,kBAAkB,UAAU,IAAI;AACjD,QAAM,kBAAsD;AAAA,IAC1D,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAEA,SAAO,QAAQ,IAAI,CAAC,UAAU;AAC5B,UAAM,WACJ,QAAQ,iBAAiB,MAAM,IAAI,KAAK,gBAAgB,MAAM,IAAI;AACpE,UAAM,YACJ,MAAM,WAAW,SAAS,IACtB,OAAO;AAAA,MACL,MAAM,WAAW,IAAI,CAAC,QAAQ;AAAA,QAC5B,IAAI;AAAA,QACJ,mBAAmB,IAAI,MAAM,OAAO;AAAA,MACtC,CAAC;AAAA,IACH,IACA;AAEN,WAAO;AAAA,MACL,KAAK,mBAAmB,MAAM,MAAM,OAAO;AAAA,MAC3C,cAAc,MAAM,aAAa,IAAI,KAAK,MAAM,UAAU,IAAI;AAAA,MAC9D;AAAA,MACA;AAAA,MACA,YAAY,YAAY,EAAE,UAAU,IAAI;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;;;AHiGI,mBAEI,KAqBE,YAvBN;AArEJ,eAAsB,wBAAwB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,SAAS,MAAM,sBAAsB,MAAM,MAAM,MAAM;AAC7D,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,OAAO,YAAY;AAAA,EAC9B;AAEA,QAAM,EAAE,MAAM,WAAW,IAAI;AAC7B,QAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,KAAK;AAC7C,QAAM,cACJ,KAAK,kBAAkB,KAAK,KAC5B,KAAK,SAAS,KAAK,KACnB,sBAAsB,KAAK,MAAM,GAAG,KACpC,KAAK;AAEP,QAAM,YAAoC,CAAC;AAC3C,aAAW,OAAO,YAAY;AAC5B,cAAU,IAAI,MAAM,IAAI,mBAAmB,IAAI,MAAM,OAAO;AAAA,EAC9D;AAEA,QAAM,YAAY,mBAAmB,KAAK,MAAM,OAAO;AAEvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AAAA,MACV;AAAA,MACA,WAAW,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,YAAY;AAAA,IAC7D;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,6BACd,MACA,SACU;AACV,QAAM,MAAM,gBAAgB,IAAI;AAChC,SAAO;AAAA,IACL,OAAO,IAAI;AAAA,IACX,aAAa,IAAI;AAAA,IACjB,YAAY;AAAA,MACV,WAAW,mBAAmB,IAAI,MAAM,OAAO;AAAA,IACjD;AAAA,EACF;AACF;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAGG;AACD,SACE,gCACG,eAAK,IAAI,CAAC,MAAM,UACf;AAAA,IAAC;AAAA;AAAA,MAEC,MAAK;AAAA,MACL,yBAAyB,EAAE,QAAQ,KAAK,UAAU,IAAI,EAAE;AAAA;AAAA,IAFnD,GAAG,EAAE,IAAI,KAAK;AAAA,EAGrB,CACD,GACH;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AACF,GAGG;AACD,SACE,oBAAC,SAAI,cAAW,cACd,8BAAC,QAAG,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,UAAU,WAAW,QAAQ,SAAS,EAAE,GAC1F,gBAAM,IAAI,CAAC,MAAM,UAChB,qBAAC,QACE;AAAA,YAAQ,IAAI,oBAAC,UAAK,eAAY,QAAO,iBAAG,IAAU;AAAA,IAClD,QAAQ,MAAM,SAAS,IACtB,oBAAC,iBAAc,MAAM,KAAK,MAAO,eAAK,MAAK,IAE3C,oBAAC,UAAM,eAAK,MAAK;AAAA,OALZ,KAAK,IAOd,CACD,GACH,GACF;AAEJ;AAEA,SAAS,kBAAkB,YAAuC;AAChE,QAAM,gBAAgB,YAAY,QAAQ;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YACE,YAAY,eACX,CAAC,SACA,oBAAC,aACC,8BAAC,SAAI,OAAO,EAAE,YAAY,YAAY,YAAY,UAAU,GAAI,gBAAK,GACvE;AAAA,IAEJ,mBACE,YAAY,sBACX,CAAC,UACA,oBAAC,sBAAmB,OAAc,eAA8B;AAAA,IAEpE,cACE,YAAY,iBACX,CAAC,MAAiC,OACjC,oBAAC,iBAAc,MAAY,IAAQ;AAAA,EAEzC;AACF;AAEA,eAAsB,qBAAqB;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,SAAS,MAAM,sBAAsB,MAAM,MAAM,MAAM;AAC7D,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,EACX;AAEA,QAAM,KAAK,kBAAkB,UAAU;AACvC,QAAM,kBAAkB,kBAAkB,OAAO,KAAK;AACtD,QAAM,EAAE,MAAM,eAAe,IAAI;AACjC,QAAM,MAAM,gBAAgB,IAAI;AAChC,QAAM,eAAe,KAAK,UAAU,KAAK,KAAK,KAAK;AACnD,QAAM,kBAAkB;AAAA,IACtB,EAAE,MAAM,QAAQ,MAAM,IAAI;AAAA,IAC1B,EAAE,MAAM,IAAI,YAAY,MAAM,IAAI,KAAK;AAAA,IACvC,EAAE,MAAM,KAAK,OAAO,MAAM,KAAK,KAAK;AAAA,EACtC;AAEA,QAAM,UAAU;AAAA,IACd,MAAM,iBAAiB,EAAE,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF,EAAE,OAAO,CAAC,SAAS,KAAK,OAAO,KAAK,MAAM,KAAK,WAAW,KAAK,MAAM;AAErE,QAAM,eAA0C;AAAA,IAC9C,GAAI,kBAAkB,CAAC;AAAA,IACvB,wBAAwB,iBAAiB,eAAe;AAAA,EAC1D;AAEA,SACE,qBAAC,UAAK,WACH;AAAA,OAAG,aAAa,cAAc,eAAe,KAAK,EAAE,UAAU;AAAA,IAC9D,GAAG,kBAAkB,eAAe;AAAA,IAEpC,KAAK,UACJ,oBAAC,OAAE,WAAW,YAAY,SAAU,eAAK,SAAQ,IAC/C;AAAA,IAEJ,oBAAC,QAAG,WAAW,YAAY,OAAQ,wBAAa;AAAA,IAE/C,KAAK,OAAO,GAAG,WAAW,KAAK,IAAI,IAAI;AAAA,IAEvC,QAAQ,SAAS,IAChB,qBAAC,aACC;AAAA,2BAAC,QAAG,WAAW,YAAY,cAAc;AAAA;AAAA,QACjC,IAAI,WAAW,YAAY;AAAA,SACnC;AAAA,MACA,oBAAC,QAAG,WAAW,YAAY,MACxB,kBAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SACxB,oBAAC,QAAiB,WAAW,YAAY,UACvC,8BAAC,GAAG,MAAH,EAAQ,MAAM,KAAK,MAAO,eAAK,OAAM,KAD/B,KAAK,EAEd,CACD,GACH;AAAA,OACF,IACE;AAAA,KACN;AAEJ;AAEA,eAAsB,oBAAoB;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,KAAK,kBAAkB,UAAU;AACvC,QAAM,MAAM,gBAAgB,IAAI;AAChC,QAAM,QAAQ;AAAA,IACZ,MAAM,iBAAiB,EAAE,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB,EAAE,MAAM,QAAQ,MAAM,IAAI;AAAA,IAC1B,EAAE,MAAM,IAAI,YAAY,MAAM,IAAI,KAAK;AAAA,EACzC;AAEA,SACE,qBAAC,UAAK,WACH;AAAA,OAAG,kBAAkB,eAAe;AAAA,IAErC,oBAAC,QAAG,WAAW,YAAY,OAAQ,cAAI,OAAM;AAAA,IAC7C,oBAAC,OAAE,WAAW,YAAY,gBAAiB,cAAI,aAAY;AAAA,IAE1D,MAAM,SAAS,IACd,oBAAC,QAAG,WAAW,YAAY,MACxB,gBAAM,IAAI,CAAC,SACV,qBAAC,QAAiB,WAAW,YAAY,UACvC;AAAA,0BAAC,GAAG,MAAH,EAAQ,MAAM,KAAK,MAAO,eAAK,OAAM;AAAA,MACrC,KAAK,UACJ,oBAAC,OAAE,WAAW,YAAY,SAAU,eAAK,SAAQ,IAC/C;AAAA,SAJG,KAAK,EAKd,CACD,GACH,IAEA,oBAAC,OAAE,WAAW,YAAY,YAAY,yEAEtC;AAAA,KAEJ;AAEJ;","names":[]}
|
package/dist/next/locations.cjs
CHANGED
|
@@ -47,7 +47,7 @@ var import_navigation = require("next/navigation");
|
|
|
47
47
|
var LANDING_REFERER_COOKIE_MAX_AGE_SEC = 30 * 60;
|
|
48
48
|
|
|
49
49
|
// package.json
|
|
50
|
-
var version = "0.1.
|
|
50
|
+
var version = "0.1.37";
|
|
51
51
|
|
|
52
52
|
// src/constants.ts
|
|
53
53
|
var JMP_ANALYTICS_SDK_VERSION = version;
|
|
@@ -61,6 +61,108 @@ function normalizeBaseUrl(baseUrl) {
|
|
|
61
61
|
return baseUrl.replace(/\/$/, "");
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
// src/env-public.ts
|
|
65
|
+
function firstDefined(...values) {
|
|
66
|
+
for (const v of values) {
|
|
67
|
+
if (v) return v;
|
|
68
|
+
}
|
|
69
|
+
return void 0;
|
|
70
|
+
}
|
|
71
|
+
function readJmpPublicEnvFromProcessEnv() {
|
|
72
|
+
if (typeof process === "undefined" || !process.env) {
|
|
73
|
+
return {};
|
|
74
|
+
}
|
|
75
|
+
const { env } = process;
|
|
76
|
+
const analyticsUrl = firstDefined(
|
|
77
|
+
env.NEXT_PUBLIC_JMP_ANALYTICS_URL,
|
|
78
|
+
env.PUBLIC_JMP_ANALYTICS_URL
|
|
79
|
+
);
|
|
80
|
+
const trackingKey = firstDefined(
|
|
81
|
+
env.NEXT_PUBLIC_JMP_TRACKING_KEY,
|
|
82
|
+
env.PUBLIC_JMP_TRACKING_KEY
|
|
83
|
+
);
|
|
84
|
+
const requireConsentRaw = firstDefined(
|
|
85
|
+
env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT,
|
|
86
|
+
env.PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT
|
|
87
|
+
);
|
|
88
|
+
const autoContactRaw = firstDefined(
|
|
89
|
+
env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS,
|
|
90
|
+
env.PUBLIC_JMP_AUTO_CONTACT_LINKS
|
|
91
|
+
);
|
|
92
|
+
return {
|
|
93
|
+
analyticsUrl,
|
|
94
|
+
trackingKey,
|
|
95
|
+
requireConsent: requireConsentRaw === "true",
|
|
96
|
+
autoContactLinks: autoContactRaw === "true"
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function readJmpPublicEnvFromProcess(overrides) {
|
|
100
|
+
const fromEnv = readJmpPublicEnvFromProcessEnv();
|
|
101
|
+
return {
|
|
102
|
+
analyticsUrl: firstDefined(overrides?.analyticsUrl, fromEnv.analyticsUrl),
|
|
103
|
+
trackingKey: firstDefined(overrides?.trackingKey, fromEnv.trackingKey),
|
|
104
|
+
requireConsent: overrides?.requireConsent ?? fromEnv.requireConsent,
|
|
105
|
+
autoContactLinks: overrides?.autoContactLinks ?? fromEnv.autoContactLinks
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/site-config.ts
|
|
110
|
+
var registeredSite = null;
|
|
111
|
+
function getJmpSiteDefinition() {
|
|
112
|
+
return registeredSite;
|
|
113
|
+
}
|
|
114
|
+
function getJmpContentConfig() {
|
|
115
|
+
const { analyticsUrl, trackingKey } = readJmpPublicEnvFromProcess();
|
|
116
|
+
if (!analyticsUrl || !trackingKey) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const site = getJmpSiteDefinition();
|
|
120
|
+
return {
|
|
121
|
+
baseUrl: analyticsUrl,
|
|
122
|
+
trackingKey,
|
|
123
|
+
contentWrappers: site?.contentWrappers ?? void 0,
|
|
124
|
+
contentManifest: site?.contentManifest ?? void 0
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// src/landing-pages/utils.ts
|
|
129
|
+
function plainTextFromMarkdown(input, maxLength = 5e3) {
|
|
130
|
+
return input.replace(/[#*_`[\]]/g, "").trim().slice(0, maxLength);
|
|
131
|
+
}
|
|
132
|
+
function resolveJmpSiteUrl(override) {
|
|
133
|
+
const fromArg = override?.trim().replace(/\/$/, "");
|
|
134
|
+
if (fromArg) return fromArg;
|
|
135
|
+
const fromConfig = getJmpSiteDefinition()?.siteUrl?.trim().replace(/\/$/, "");
|
|
136
|
+
return fromConfig || null;
|
|
137
|
+
}
|
|
138
|
+
function absoluteJmpSiteUrl(path, siteUrl) {
|
|
139
|
+
const base = resolveJmpSiteUrl(siteUrl);
|
|
140
|
+
if (!base) {
|
|
141
|
+
return path.startsWith("/") ? path : `/${path}`;
|
|
142
|
+
}
|
|
143
|
+
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
144
|
+
return `${base}${normalized}`;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// src/request-origin.ts
|
|
148
|
+
function resolveJmpRequestOrigin() {
|
|
149
|
+
const fromSite = resolveJmpSiteUrl();
|
|
150
|
+
if (fromSite) {
|
|
151
|
+
return fromSite;
|
|
152
|
+
}
|
|
153
|
+
if (typeof process === "undefined") {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
return process.env.NEXT_PUBLIC_SITE_URL?.trim().replace(/\/$/, "") || null;
|
|
157
|
+
}
|
|
158
|
+
function withJmpOriginHeader(headers) {
|
|
159
|
+
const origin = resolveJmpRequestOrigin();
|
|
160
|
+
if (!origin) {
|
|
161
|
+
return headers;
|
|
162
|
+
}
|
|
163
|
+
return { ...headers, Origin: origin };
|
|
164
|
+
}
|
|
165
|
+
|
|
64
166
|
// src/content/manifest.ts
|
|
65
167
|
var JMP_CONTENT_MANIFEST_VERSION = 1;
|
|
66
168
|
var TRUST_SECTIONS = /* @__PURE__ */ new Set([
|
|
@@ -265,6 +367,11 @@ function inferWrapperSlotsFromManifest(manifest) {
|
|
|
265
367
|
}
|
|
266
368
|
|
|
267
369
|
// src/content/fetch.ts
|
|
370
|
+
function jmpContentRequestHeaders(config) {
|
|
371
|
+
return withJmpOriginHeader({
|
|
372
|
+
"X-JMP-Tracking-Key": config.trackingKey
|
|
373
|
+
});
|
|
374
|
+
}
|
|
268
375
|
async function getContent(config, path) {
|
|
269
376
|
const text = await getContentText(config, path);
|
|
270
377
|
try {
|
|
@@ -287,9 +394,7 @@ async function getContentText(config, path) {
|
|
|
287
394
|
}
|
|
288
395
|
const res = await resolvedFetch(url, {
|
|
289
396
|
method: "GET",
|
|
290
|
-
headers:
|
|
291
|
-
"X-JMP-Tracking-Key": config.trackingKey
|
|
292
|
-
}
|
|
397
|
+
headers: jmpContentRequestHeaders(config)
|
|
293
398
|
});
|
|
294
399
|
const text = await res.text();
|
|
295
400
|
if (!res.ok) {
|
|
@@ -465,7 +570,7 @@ async function registerJmpContentWrappers(config) {
|
|
|
465
570
|
method: "POST",
|
|
466
571
|
headers: {
|
|
467
572
|
"Content-Type": "application/json",
|
|
468
|
-
|
|
573
|
+
...jmpContentRequestHeaders(config)
|
|
469
574
|
},
|
|
470
575
|
body: JSON.stringify(body)
|
|
471
576
|
});
|
|
@@ -487,70 +592,6 @@ async function registerJmpContentWrappers(config) {
|
|
|
487
592
|
}
|
|
488
593
|
setContentWrapperSyncHandler(registerJmpContentWrappers);
|
|
489
594
|
|
|
490
|
-
// src/env-public.ts
|
|
491
|
-
function firstDefined(...values) {
|
|
492
|
-
for (const v of values) {
|
|
493
|
-
if (v) return v;
|
|
494
|
-
}
|
|
495
|
-
return void 0;
|
|
496
|
-
}
|
|
497
|
-
function readJmpPublicEnvFromProcessEnv() {
|
|
498
|
-
if (typeof process === "undefined" || !process.env) {
|
|
499
|
-
return {};
|
|
500
|
-
}
|
|
501
|
-
const { env } = process;
|
|
502
|
-
const analyticsUrl = firstDefined(
|
|
503
|
-
env.NEXT_PUBLIC_JMP_ANALYTICS_URL,
|
|
504
|
-
env.PUBLIC_JMP_ANALYTICS_URL
|
|
505
|
-
);
|
|
506
|
-
const trackingKey = firstDefined(
|
|
507
|
-
env.NEXT_PUBLIC_JMP_TRACKING_KEY,
|
|
508
|
-
env.PUBLIC_JMP_TRACKING_KEY
|
|
509
|
-
);
|
|
510
|
-
const requireConsentRaw = firstDefined(
|
|
511
|
-
env.NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT,
|
|
512
|
-
env.PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT
|
|
513
|
-
);
|
|
514
|
-
const autoContactRaw = firstDefined(
|
|
515
|
-
env.NEXT_PUBLIC_JMP_AUTO_CONTACT_LINKS,
|
|
516
|
-
env.PUBLIC_JMP_AUTO_CONTACT_LINKS
|
|
517
|
-
);
|
|
518
|
-
return {
|
|
519
|
-
analyticsUrl,
|
|
520
|
-
trackingKey,
|
|
521
|
-
requireConsent: requireConsentRaw === "true",
|
|
522
|
-
autoContactLinks: autoContactRaw === "true"
|
|
523
|
-
};
|
|
524
|
-
}
|
|
525
|
-
function readJmpPublicEnvFromProcess(overrides) {
|
|
526
|
-
const fromEnv = readJmpPublicEnvFromProcessEnv();
|
|
527
|
-
return {
|
|
528
|
-
analyticsUrl: firstDefined(overrides?.analyticsUrl, fromEnv.analyticsUrl),
|
|
529
|
-
trackingKey: firstDefined(overrides?.trackingKey, fromEnv.trackingKey),
|
|
530
|
-
requireConsent: overrides?.requireConsent ?? fromEnv.requireConsent,
|
|
531
|
-
autoContactLinks: overrides?.autoContactLinks ?? fromEnv.autoContactLinks
|
|
532
|
-
};
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
// src/site-config.ts
|
|
536
|
-
var registeredSite = null;
|
|
537
|
-
function getJmpSiteDefinition() {
|
|
538
|
-
return registeredSite;
|
|
539
|
-
}
|
|
540
|
-
function getJmpContentConfig() {
|
|
541
|
-
const { analyticsUrl, trackingKey } = readJmpPublicEnvFromProcess();
|
|
542
|
-
if (!analyticsUrl || !trackingKey) {
|
|
543
|
-
return null;
|
|
544
|
-
}
|
|
545
|
-
const site = getJmpSiteDefinition();
|
|
546
|
-
return {
|
|
547
|
-
baseUrl: analyticsUrl,
|
|
548
|
-
trackingKey,
|
|
549
|
-
contentWrappers: site?.contentWrappers ?? void 0,
|
|
550
|
-
contentManifest: site?.contentManifest ?? void 0
|
|
551
|
-
};
|
|
552
|
-
}
|
|
553
|
-
|
|
554
595
|
// src/content/site-content.ts
|
|
555
596
|
async function loadLocations() {
|
|
556
597
|
const c = getJmpContentConfig();
|
|
@@ -575,25 +616,6 @@ async function loadLocationDetail(slug) {
|
|
|
575
616
|
}
|
|
576
617
|
}
|
|
577
618
|
|
|
578
|
-
// src/landing-pages/utils.ts
|
|
579
|
-
function plainTextFromMarkdown(input, maxLength = 5e3) {
|
|
580
|
-
return input.replace(/[#*_`[\]]/g, "").trim().slice(0, maxLength);
|
|
581
|
-
}
|
|
582
|
-
function resolveJmpSiteUrl(override) {
|
|
583
|
-
const fromArg = override?.trim().replace(/\/$/, "");
|
|
584
|
-
if (fromArg) return fromArg;
|
|
585
|
-
const fromConfig = getJmpSiteDefinition()?.siteUrl?.trim().replace(/\/$/, "");
|
|
586
|
-
return fromConfig || null;
|
|
587
|
-
}
|
|
588
|
-
function absoluteJmpSiteUrl(path, siteUrl) {
|
|
589
|
-
const base = resolveJmpSiteUrl(siteUrl);
|
|
590
|
-
if (!base) {
|
|
591
|
-
return path.startsWith("/") ? path : `/${path}`;
|
|
592
|
-
}
|
|
593
|
-
const normalized = path.startsWith("/") ? path : `/${path}`;
|
|
594
|
-
return `${base}${normalized}`;
|
|
595
|
-
}
|
|
596
|
-
|
|
597
619
|
// src/next/locations.tsx
|
|
598
620
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
599
621
|
function DefaultJsonLd({
|