@jmp-technologies/analytics 0.1.36 → 0.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +1 -1
  2. package/dist/astro/client.cjs +83 -42
  3. package/dist/astro/client.cjs.map +1 -1
  4. package/dist/astro/client.d.cts +2 -2
  5. package/dist/astro/client.d.ts +2 -2
  6. package/dist/astro/client.js +2 -2
  7. package/dist/astro/content.cjs +137 -70
  8. package/dist/astro/content.cjs.map +1 -1
  9. package/dist/astro/content.d.cts +5 -4
  10. package/dist/astro/content.d.ts +5 -4
  11. package/dist/astro/content.js +5 -3
  12. package/dist/astro/integration.cjs +104 -66
  13. package/dist/astro/integration.cjs.map +1 -1
  14. package/dist/astro/integration.js +3 -3
  15. package/dist/astro/middleware.cjs +96 -66
  16. package/dist/astro/middleware.cjs.map +1 -1
  17. package/dist/astro/middleware.d.cts +2 -2
  18. package/dist/astro/middleware.d.ts +2 -2
  19. package/dist/astro/middleware.js +2 -2
  20. package/dist/astro/register.cjs +104 -66
  21. package/dist/astro/register.cjs.map +1 -1
  22. package/dist/astro/register.js +3 -3
  23. package/dist/{chunk-AIFJ7DVO.js → chunk-6WQMWPEY.js} +196 -105
  24. package/dist/chunk-6WQMWPEY.js.map +1 -0
  25. package/dist/{chunk-YFG3AQ35.js → chunk-EBU4DKHW.js} +47 -9
  26. package/dist/chunk-EBU4DKHW.js.map +1 -0
  27. package/dist/{chunk-AGGLRTUQ.js → chunk-JVFN7MF2.js} +2 -2
  28. package/dist/{chunk-3ZEMXII6.js → chunk-NCF3J4HV.js} +3 -3
  29. package/dist/{chunk-HFLU7HQE.js → chunk-ONIPLMOY.js} +2 -2
  30. package/dist/{chunk-NAQU6RAE.js → chunk-PQOTEV6O.js} +3 -3
  31. package/dist/{chunk-RNZTKIC6.js → chunk-WHUHCTBQ.js} +16 -3
  32. package/dist/chunk-WHUHCTBQ.js.map +1 -0
  33. package/dist/{create-jmp-analytics-Bz0-K0Af.d.cts → create-jmp-analytics-DMSXmVIH.d.cts} +1 -1
  34. package/dist/{create-jmp-analytics-DRjrlWUn.d.ts → create-jmp-analytics-JZ3pqNBQ.d.ts} +1 -1
  35. package/dist/index.cjs +145 -76
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +10 -6
  38. package/dist/index.d.ts +10 -6
  39. package/dist/index.js +6 -2
  40. package/dist/next/content.cjs +138 -70
  41. package/dist/next/content.cjs.map +1 -1
  42. package/dist/next/content.d.cts +5 -4
  43. package/dist/next/content.d.ts +5 -4
  44. package/dist/next/content.js +6 -3
  45. package/dist/next/content.js.map +1 -1
  46. package/dist/next/instrumentation.cjs +104 -66
  47. package/dist/next/instrumentation.cjs.map +1 -1
  48. package/dist/next/instrumentation.js +2 -2
  49. package/dist/next/landing-pages.cjs +155 -129
  50. package/dist/next/landing-pages.cjs.map +1 -1
  51. package/dist/next/landing-pages.d.cts +2 -2
  52. package/dist/next/landing-pages.d.ts +2 -2
  53. package/dist/next/landing-pages.js +7 -8
  54. package/dist/next/landing-pages.js.map +1 -1
  55. package/dist/next/locations.cjs +114 -88
  56. package/dist/next/locations.cjs.map +1 -1
  57. package/dist/next/locations.d.cts +2 -2
  58. package/dist/next/locations.d.ts +2 -2
  59. package/dist/next/locations.js +7 -8
  60. package/dist/next/locations.js.map +1 -1
  61. package/dist/next/middleware.cjs +96 -66
  62. package/dist/next/middleware.cjs.map +1 -1
  63. package/dist/next/middleware.d.cts +2 -2
  64. package/dist/next/middleware.d.ts +2 -2
  65. package/dist/next/middleware.js +2 -2
  66. package/dist/next/site-root-server.cjs +103 -69
  67. package/dist/next/site-root-server.cjs.map +1 -1
  68. package/dist/next/site-root-server.js +4 -4
  69. package/dist/next.cjs +37 -2
  70. package/dist/next.cjs.map +1 -1
  71. package/dist/next.d.cts +3 -3
  72. package/dist/next.d.ts +3 -3
  73. package/dist/next.js +4 -4
  74. package/dist/react.cjs +88 -53
  75. package/dist/react.cjs.map +1 -1
  76. package/dist/react.d.cts +2 -2
  77. package/dist/react.d.ts +2 -2
  78. package/dist/react.js +3 -3
  79. package/dist/{site-config-Cgq67uQ1.d.cts → site-config-BLnwuRC2.d.ts} +9 -3
  80. package/dist/{site-config-BxEmJxBB.d.ts → site-config-BZJS8Hp_.d.cts} +9 -3
  81. package/dist/{track-page-view-BCX1Dsfk.d.cts → track-page-view-BJQqn2Bg.d.cts} +1 -1
  82. package/dist/{track-page-view-74Su6lQY.d.ts → track-page-view-DGKRUIxm.d.ts} +1 -1
  83. package/dist/{types-yNgoakwk.d.ts → types-CYrgEwUF.d.cts} +16 -2
  84. package/dist/{types-yNgoakwk.d.cts → types-CYrgEwUF.d.ts} +16 -2
  85. package/dist/{utils-BLoWWfSw.d.ts → utils-B1Nt3sBU.d.ts} +1 -1
  86. package/dist/{utils-UPTIdK1D.d.cts → utils-U6TGMIAB.d.cts} +1 -1
  87. package/docs/legal-and-privacy.md +2 -2
  88. package/package.json +1 -1
  89. package/dist/chunk-AIFJ7DVO.js.map +0 -1
  90. package/dist/chunk-RI3KKDPX.js +0 -75
  91. package/dist/chunk-RI3KKDPX.js.map +0 -1
  92. package/dist/chunk-RNZTKIC6.js.map +0 -1
  93. package/dist/chunk-YFG3AQ35.js.map +0 -1
  94. /package/dist/{chunk-AGGLRTUQ.js.map → chunk-JVFN7MF2.js.map} +0 -0
  95. /package/dist/{chunk-3ZEMXII6.js.map → chunk-NCF3J4HV.js.map} +0 -0
  96. /package/dist/{chunk-HFLU7HQE.js.map → chunk-ONIPLMOY.js.map} +0 -0
  97. /package/dist/{chunk-NAQU6RAE.js.map → chunk-PQOTEV6O.js.map} +0 -0
@@ -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":"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","names":[]}
@@ -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.36";
50
+ var version = "0.1.38";
51
51
 
52
52
  // src/constants.ts
53
53
  var JMP_ANALYTICS_SDK_VERSION = version;
@@ -61,6 +61,111 @@ 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
+ const contentWrappers = site?.contentWrappers ?? void 0;
121
+ const inferredMode = contentWrappers && contentWrappers.length > 0 ? "manual" : void 0;
122
+ return {
123
+ baseUrl: analyticsUrl,
124
+ trackingKey,
125
+ contentWrappers,
126
+ contentManifest: site?.contentManifest ?? void 0,
127
+ contentWrapperMode: site?.contentWrapperMode ?? inferredMode
128
+ };
129
+ }
130
+
131
+ // src/landing-pages/utils.ts
132
+ function plainTextFromMarkdown(input, maxLength = 5e3) {
133
+ return input.replace(/[#*_`[\]]/g, "").trim().slice(0, maxLength);
134
+ }
135
+ function resolveJmpSiteUrl(override) {
136
+ const fromArg = override?.trim().replace(/\/$/, "");
137
+ if (fromArg) return fromArg;
138
+ const fromConfig = getJmpSiteDefinition()?.siteUrl?.trim().replace(/\/$/, "");
139
+ return fromConfig || null;
140
+ }
141
+ function absoluteJmpSiteUrl(path, siteUrl) {
142
+ const base = resolveJmpSiteUrl(siteUrl);
143
+ if (!base) {
144
+ return path.startsWith("/") ? path : `/${path}`;
145
+ }
146
+ const normalized = path.startsWith("/") ? path : `/${path}`;
147
+ return `${base}${normalized}`;
148
+ }
149
+
150
+ // src/request-origin.ts
151
+ function resolveJmpRequestOrigin() {
152
+ const fromSite = resolveJmpSiteUrl();
153
+ if (fromSite) {
154
+ return fromSite;
155
+ }
156
+ if (typeof process === "undefined") {
157
+ return null;
158
+ }
159
+ return process.env.NEXT_PUBLIC_SITE_URL?.trim().replace(/\/$/, "") || null;
160
+ }
161
+ function withJmpOriginHeader(headers) {
162
+ const origin = resolveJmpRequestOrigin();
163
+ if (!origin) {
164
+ return headers;
165
+ }
166
+ return { ...headers, Origin: origin };
167
+ }
168
+
64
169
  // src/content/manifest.ts
65
170
  var JMP_CONTENT_MANIFEST_VERSION = 1;
66
171
  var TRUST_SECTIONS = /* @__PURE__ */ new Set([
@@ -265,6 +370,11 @@ function inferWrapperSlotsFromManifest(manifest) {
265
370
  }
266
371
 
267
372
  // src/content/fetch.ts
373
+ function jmpContentRequestHeaders(config) {
374
+ return withJmpOriginHeader({
375
+ "X-JMP-Tracking-Key": config.trackingKey
376
+ });
377
+ }
268
378
  async function getContent(config, path) {
269
379
  const text = await getContentText(config, path);
270
380
  try {
@@ -287,9 +397,7 @@ async function getContentText(config, path) {
287
397
  }
288
398
  const res = await resolvedFetch(url, {
289
399
  method: "GET",
290
- headers: {
291
- "X-JMP-Tracking-Key": config.trackingKey
292
- }
400
+ headers: jmpContentRequestHeaders(config)
293
401
  });
294
402
  const text = await res.text();
295
403
  if (!res.ok) {
@@ -316,6 +424,7 @@ var WRAPPER_SLOT_ORDER = [
316
424
  "blog",
317
425
  "faq",
318
426
  "contact",
427
+ "legal",
319
428
  "trust",
320
429
  "trust.summary",
321
430
  "trust.testimonials",
@@ -465,7 +574,7 @@ async function registerJmpContentWrappers(config) {
465
574
  method: "POST",
466
575
  headers: {
467
576
  "Content-Type": "application/json",
468
- "X-JMP-Tracking-Key": config.trackingKey
577
+ ...jmpContentRequestHeaders(config)
469
578
  },
470
579
  body: JSON.stringify(body)
471
580
  });
@@ -487,70 +596,6 @@ async function registerJmpContentWrappers(config) {
487
596
  }
488
597
  setContentWrapperSyncHandler(registerJmpContentWrappers);
489
598
 
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
599
  // src/content/site-content.ts
555
600
  async function loadLocations() {
556
601
  const c = getJmpContentConfig();
@@ -575,25 +620,6 @@ async function loadLocationDetail(slug) {
575
620
  }
576
621
  }
577
622
 
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
623
  // src/next/locations.tsx
598
624
  var import_jsx_runtime = require("react/jsx-runtime");
599
625
  function DefaultJsonLd({