@jmp-technologies/analytics 0.1.35 → 0.1.36
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/dist/astro/client.cjs +1 -1
- 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 +1 -1
- package/dist/astro/content.cjs +1 -1
- 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 +2 -2
- package/dist/astro/integration.cjs +1 -1
- 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 +2 -2
- package/dist/astro/middleware.d.cts +19 -0
- package/dist/astro/middleware.d.ts +19 -0
- package/dist/astro/register.cjs +1 -1
- 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 +2 -2
- package/dist/{chunk-VUCOCFVE.js → chunk-3ZEMXII6.js} +2 -2
- package/dist/{chunk-4ZUW24F6.js → chunk-AGGLRTUQ.js} +2 -2
- package/dist/{chunk-G322JCI3.js → chunk-NAQU6RAE.js} +2 -2
- package/dist/{chunk-3ET7F6MZ.js → chunk-RNZTKIC6.js} +2 -2
- package/dist/chunk-RNZTKIC6.js.map +1 -0
- package/dist/{chunk-6SMPRPQ3.js → chunk-YFG3AQ35.js} +2 -2
- package/dist/chunk-YFG3AQ35.js.map +1 -0
- 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 +1 -1
- 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 +1 -1
- package/dist/landing-capture-C8pyZWuF.d.cts +4 -0
- package/dist/landing-capture-C8pyZWuF.d.ts +4 -0
- package/dist/next/content.cjs +1 -1
- 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 +2 -2
- package/dist/next/google-tag.d.cts +17 -0
- package/dist/next/google-tag.d.ts +17 -0
- package/dist/next/instrumentation.cjs +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +2 -2
- package/dist/next/locations.cjs +1 -1
- 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 +2 -2
- package/dist/next/middleware.d.cts +10 -0
- package/dist/next/middleware.d.ts +10 -0
- package/dist/next/site-root-server.cjs +1 -1
- package/dist/next/site-root-server.cjs.map +1 -1
- package/dist/next/site-root-server.d.cts +24 -0
- package/dist/next/site-root-server.d.ts +24 -0
- package/dist/next/site-root-server.js +3 -3
- package/dist/next.cjs +1 -1
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +50 -0
- package/dist/next.d.ts +50 -0
- package/dist/next.js +3 -3
- package/dist/react.cjs +1 -1
- 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 +2 -2
- 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-VUCOCFVE.js.map → chunk-3ZEMXII6.js.map} +0 -0
- /package/dist/{chunk-4ZUW24F6.js.map → chunk-AGGLRTUQ.js.map} +0 -0
- /package/dist/{chunk-G322JCI3.js.map → chunk-NAQU6RAE.js.map} +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { l as JmpContentWrapper, m as JmpContentManifest, n as JmpContentConfig } from './types-yNgoakwk.js';
|
|
2
|
+
|
|
3
|
+
type JmpSiteSocialLinks = {
|
|
4
|
+
linkedin: string | null;
|
|
5
|
+
instagram: string | null;
|
|
6
|
+
facebook: string | null;
|
|
7
|
+
x: string | null;
|
|
8
|
+
youtube: string | null;
|
|
9
|
+
};
|
|
10
|
+
/** Per-site values used when the dashboard profile is missing or fields are empty. */
|
|
11
|
+
type JmpSiteContactFallback = {
|
|
12
|
+
displayName?: string;
|
|
13
|
+
founderName?: string;
|
|
14
|
+
email?: string;
|
|
15
|
+
phone?: string | null;
|
|
16
|
+
linkedin?: string | null;
|
|
17
|
+
instagram?: string | null;
|
|
18
|
+
facebook?: string | null;
|
|
19
|
+
x?: string | null;
|
|
20
|
+
youtube?: string | null;
|
|
21
|
+
hours?: string | null;
|
|
22
|
+
serviceArea?: string | null;
|
|
23
|
+
address?: string | null;
|
|
24
|
+
googleMapsUrl?: string | null;
|
|
25
|
+
googleMapsEmbedUrl?: string | null;
|
|
26
|
+
dashboardDemoUrl?: string;
|
|
27
|
+
profilePhotoSrc?: string;
|
|
28
|
+
privacyUrl?: string;
|
|
29
|
+
termsUrl?: string;
|
|
30
|
+
};
|
|
31
|
+
type JmpSiteDefinition = {
|
|
32
|
+
/**
|
|
33
|
+
* Optional override. Wrappers are auto-discovered when content loaders run
|
|
34
|
+
* (`loadBlogPosts`, `loadFaqs`, etc.) and reported to the dashboard.
|
|
35
|
+
*/
|
|
36
|
+
contentWrappers?: JmpContentWrapper[];
|
|
37
|
+
/**
|
|
38
|
+
* Routes, trust block order, and contact extras for dashboard layout sync.
|
|
39
|
+
* Reported with capabilities when the site loads content from the portal.
|
|
40
|
+
*/
|
|
41
|
+
contentManifest?: JmpContentManifest;
|
|
42
|
+
/**
|
|
43
|
+
* Public site origin (no trailing slash), e.g. `https://example.com`.
|
|
44
|
+
* Used to resolve relative profile image paths in structured data.
|
|
45
|
+
*/
|
|
46
|
+
siteUrl?: string;
|
|
47
|
+
/**
|
|
48
|
+
* JMP dashboard origin (no trailing slash), e.g. `https://portal.example.com`.
|
|
49
|
+
* Fallback when `NEXT_PUBLIC_JMP_ANALYTICS_URL` is missing from the client bundle.
|
|
50
|
+
*/
|
|
51
|
+
analyticsPortalUrl?: string;
|
|
52
|
+
contactFallback?: JmpSiteContactFallback;
|
|
53
|
+
/**
|
|
54
|
+
* `extras` keys to read from the dashboard site profile (hyphenated keys from admin).
|
|
55
|
+
*/
|
|
56
|
+
contactExtraKeys?: {
|
|
57
|
+
founderName?: readonly string[];
|
|
58
|
+
dashboardDemoUrl?: readonly string[];
|
|
59
|
+
profilePhotoSrc?: readonly string[];
|
|
60
|
+
hours?: readonly string[];
|
|
61
|
+
serviceArea?: readonly string[];
|
|
62
|
+
googleMapsEmbedUrl?: readonly string[];
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Register site-specific JMP integration options once (typically from `jmp.config.ts`).
|
|
67
|
+
* Call at module load time before server content or instrumentation runs.
|
|
68
|
+
*/
|
|
69
|
+
declare function defineJmpSite(definition: JmpSiteDefinition): JmpSiteDefinition;
|
|
70
|
+
declare function getJmpSiteDefinition(): JmpSiteDefinition | null;
|
|
71
|
+
/** Server content + lead config: env vars + wrappers from {@link defineJmpSite}. */
|
|
72
|
+
declare function getJmpContentConfig(): JmpContentConfig | null;
|
|
73
|
+
|
|
74
|
+
export { type JmpSiteSocialLinks as J, type JmpSiteContactFallback as a, type JmpSiteDefinition as b, getJmpSiteDefinition as c, defineJmpSite as d, getJmpContentConfig as g };
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { l as JmpContentWrapper, m as JmpContentManifest, n as JmpContentConfig } from './types-yNgoakwk.cjs';
|
|
2
|
+
|
|
3
|
+
type JmpSiteSocialLinks = {
|
|
4
|
+
linkedin: string | null;
|
|
5
|
+
instagram: string | null;
|
|
6
|
+
facebook: string | null;
|
|
7
|
+
x: string | null;
|
|
8
|
+
youtube: string | null;
|
|
9
|
+
};
|
|
10
|
+
/** Per-site values used when the dashboard profile is missing or fields are empty. */
|
|
11
|
+
type JmpSiteContactFallback = {
|
|
12
|
+
displayName?: string;
|
|
13
|
+
founderName?: string;
|
|
14
|
+
email?: string;
|
|
15
|
+
phone?: string | null;
|
|
16
|
+
linkedin?: string | null;
|
|
17
|
+
instagram?: string | null;
|
|
18
|
+
facebook?: string | null;
|
|
19
|
+
x?: string | null;
|
|
20
|
+
youtube?: string | null;
|
|
21
|
+
hours?: string | null;
|
|
22
|
+
serviceArea?: string | null;
|
|
23
|
+
address?: string | null;
|
|
24
|
+
googleMapsUrl?: string | null;
|
|
25
|
+
googleMapsEmbedUrl?: string | null;
|
|
26
|
+
dashboardDemoUrl?: string;
|
|
27
|
+
profilePhotoSrc?: string;
|
|
28
|
+
privacyUrl?: string;
|
|
29
|
+
termsUrl?: string;
|
|
30
|
+
};
|
|
31
|
+
type JmpSiteDefinition = {
|
|
32
|
+
/**
|
|
33
|
+
* Optional override. Wrappers are auto-discovered when content loaders run
|
|
34
|
+
* (`loadBlogPosts`, `loadFaqs`, etc.) and reported to the dashboard.
|
|
35
|
+
*/
|
|
36
|
+
contentWrappers?: JmpContentWrapper[];
|
|
37
|
+
/**
|
|
38
|
+
* Routes, trust block order, and contact extras for dashboard layout sync.
|
|
39
|
+
* Reported with capabilities when the site loads content from the portal.
|
|
40
|
+
*/
|
|
41
|
+
contentManifest?: JmpContentManifest;
|
|
42
|
+
/**
|
|
43
|
+
* Public site origin (no trailing slash), e.g. `https://example.com`.
|
|
44
|
+
* Used to resolve relative profile image paths in structured data.
|
|
45
|
+
*/
|
|
46
|
+
siteUrl?: string;
|
|
47
|
+
/**
|
|
48
|
+
* JMP dashboard origin (no trailing slash), e.g. `https://portal.example.com`.
|
|
49
|
+
* Fallback when `NEXT_PUBLIC_JMP_ANALYTICS_URL` is missing from the client bundle.
|
|
50
|
+
*/
|
|
51
|
+
analyticsPortalUrl?: string;
|
|
52
|
+
contactFallback?: JmpSiteContactFallback;
|
|
53
|
+
/**
|
|
54
|
+
* `extras` keys to read from the dashboard site profile (hyphenated keys from admin).
|
|
55
|
+
*/
|
|
56
|
+
contactExtraKeys?: {
|
|
57
|
+
founderName?: readonly string[];
|
|
58
|
+
dashboardDemoUrl?: readonly string[];
|
|
59
|
+
profilePhotoSrc?: readonly string[];
|
|
60
|
+
hours?: readonly string[];
|
|
61
|
+
serviceArea?: readonly string[];
|
|
62
|
+
googleMapsEmbedUrl?: readonly string[];
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Register site-specific JMP integration options once (typically from `jmp.config.ts`).
|
|
67
|
+
* Call at module load time before server content or instrumentation runs.
|
|
68
|
+
*/
|
|
69
|
+
declare function defineJmpSite(definition: JmpSiteDefinition): JmpSiteDefinition;
|
|
70
|
+
declare function getJmpSiteDefinition(): JmpSiteDefinition | null;
|
|
71
|
+
/** Server content + lead config: env vars + wrappers from {@link defineJmpSite}. */
|
|
72
|
+
declare function getJmpContentConfig(): JmpContentConfig | null;
|
|
73
|
+
|
|
74
|
+
export { type JmpSiteSocialLinks as J, type JmpSiteContactFallback as a, type JmpSiteDefinition as b, getJmpSiteDefinition as c, defineJmpSite as d, getJmpContentConfig as g };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { o as JmpServerRequestLike } from './types-yNgoakwk.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Records a server-side page view when JMP env is configured.
|
|
5
|
+
* Framework-agnostic — pass any `Request`-like object (Next middleware, Astro `context.request`).
|
|
6
|
+
*
|
|
7
|
+
* Skips Next.js RSC/prefetch requests. When using {@link JmpSiteRoot} for browser
|
|
8
|
+
* page views, do not call this from middleware — it duplicates counts and omits `sessionId`.
|
|
9
|
+
*/
|
|
10
|
+
declare function jmpTrackServerPageView(request: JmpServerRequestLike): Promise<void>;
|
|
11
|
+
|
|
12
|
+
export { jmpTrackServerPageView as j };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { o as JmpServerRequestLike } from './types-yNgoakwk.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Records a server-side page view when JMP env is configured.
|
|
5
|
+
* Framework-agnostic — pass any `Request`-like object (Next middleware, Astro `context.request`).
|
|
6
|
+
*
|
|
7
|
+
* Skips Next.js RSC/prefetch requests. When using {@link JmpSiteRoot} for browser
|
|
8
|
+
* page views, do not call this from middleware — it duplicates counts and omits `sessionId`.
|
|
9
|
+
*/
|
|
10
|
+
declare function jmpTrackServerPageView(request: JmpServerRequestLike): Promise<void>;
|
|
11
|
+
|
|
12
|
+
export { jmpTrackServerPageView as j };
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
type JmpTrustSection = "summary" | "testimonials" | "reviews" | "stats" | "logos" | "credentials";
|
|
2
|
+
type JmpContentRouteManifest = {
|
|
3
|
+
wrapper: string;
|
|
4
|
+
pattern: string;
|
|
5
|
+
index?: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
};
|
|
8
|
+
type JmpTrustBlockManifest = {
|
|
9
|
+
section: JmpTrustSection;
|
|
10
|
+
label?: string;
|
|
11
|
+
};
|
|
12
|
+
type JmpContactExtraManifest = {
|
|
13
|
+
key: string;
|
|
14
|
+
label: string;
|
|
15
|
+
};
|
|
16
|
+
type JmpExternalSanitySourceManifest = {
|
|
17
|
+
studioUrl?: string;
|
|
18
|
+
};
|
|
19
|
+
type JmpExternalShopifySourceManifest = {
|
|
20
|
+
adminUrl?: string;
|
|
21
|
+
storeUrl?: string;
|
|
22
|
+
};
|
|
23
|
+
type JmpExternalAdminLinkManifest = {
|
|
24
|
+
id: string;
|
|
25
|
+
label: string;
|
|
26
|
+
url: string;
|
|
27
|
+
};
|
|
28
|
+
type JmpExternalSourcesManifest = {
|
|
29
|
+
sanity?: JmpExternalSanitySourceManifest;
|
|
30
|
+
shopify?: JmpExternalShopifySourceManifest;
|
|
31
|
+
links?: JmpExternalAdminLinkManifest[];
|
|
32
|
+
};
|
|
33
|
+
type JmpContentManifest = {
|
|
34
|
+
version?: number;
|
|
35
|
+
routes?: JmpContentRouteManifest[];
|
|
36
|
+
externalSources?: JmpExternalSourcesManifest;
|
|
37
|
+
trust?: {
|
|
38
|
+
blocks?: JmpTrustBlockManifest[];
|
|
39
|
+
labels?: Partial<Record<JmpTrustSection, string>>;
|
|
40
|
+
mergeTestimonialsReviews?: boolean;
|
|
41
|
+
};
|
|
42
|
+
contact?: {
|
|
43
|
+
extras?: JmpContactExtraManifest[];
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
declare function normalizeJmpContentManifest(input: JmpContentManifest | null | undefined): JmpContentManifest | null;
|
|
47
|
+
declare function stableJmpManifestFingerprint(manifest: JmpContentManifest | null): string;
|
|
48
|
+
|
|
49
|
+
type JmpEventType = "page_view" | "form_submit" | "call_click" | "email_click" | "contact_click";
|
|
50
|
+
type JmpAnalyticsConfig = {
|
|
51
|
+
/** Dashboard origin, e.g. https://analytics.example.com (no trailing slash) */
|
|
52
|
+
baseUrl: string;
|
|
53
|
+
/** Per-website key from JMP admin */
|
|
54
|
+
trackingKey: string;
|
|
55
|
+
/** Log requests to console */
|
|
56
|
+
debug?: boolean;
|
|
57
|
+
/** Override fetch (tests, React Native) */
|
|
58
|
+
fetchImpl?: typeof fetch;
|
|
59
|
+
/**
|
|
60
|
+
* Suppress duplicate `page_view` for the same path within this window (ms).
|
|
61
|
+
* Helps with React Strict Mode double-mount; typical: 500–1000.
|
|
62
|
+
*/
|
|
63
|
+
pageViewDedupeMs?: number;
|
|
64
|
+
/**
|
|
65
|
+
* When true, no events are sent until {@link setJmpTrackingConsent}(true).
|
|
66
|
+
* Pair with your cookie banner; see `NEXT_PUBLIC_JMP_ANALYTICS_REQUIRE_CONSENT`.
|
|
67
|
+
*/
|
|
68
|
+
requireConsent?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* When true, register a single delegated `click` listener that classifies links
|
|
71
|
+
* (SMS, WhatsApp, maps, scheduling) and records them via {@link trackContactClick}.
|
|
72
|
+
*
|
|
73
|
+
* Off by default — pair with privacy disclosure / consent before enabling.
|
|
74
|
+
* `tel:` / `mailto:` continue to use {@link trackCallClick} / {@link trackEmailClick}.
|
|
75
|
+
*
|
|
76
|
+
* Opt out per-link with `data-jmp-no-track` on an `<a>` (or an ancestor).
|
|
77
|
+
*/
|
|
78
|
+
autoTrackContactLinks?: boolean;
|
|
79
|
+
};
|
|
80
|
+
type JmpContentWrapperReportMode = "auto" | "manual"
|
|
81
|
+
/** @deprecated Use manual — only report {@link JmpContentConfig.contentWrappers}. */
|
|
82
|
+
| "explicit-only";
|
|
83
|
+
|
|
84
|
+
type JmpContentConfig = Pick<JmpAnalyticsConfig, "baseUrl" | "trackingKey" | "debug" | "fetchImpl"> & {
|
|
85
|
+
/**
|
|
86
|
+
* Optional override list. By default wrappers are discovered when
|
|
87
|
+
* {@link getJmpBlogPosts}, {@link getJmpFaqs}, etc. run, then reported via
|
|
88
|
+
* POST /api/content/capabilities.
|
|
89
|
+
*/
|
|
90
|
+
contentWrappers?: JmpContentWrapper[];
|
|
91
|
+
/**
|
|
92
|
+
* `auto` (default): union of discovered usage + `contentWrappers`.
|
|
93
|
+
* `manual`: only `contentWrappers`.
|
|
94
|
+
*/
|
|
95
|
+
contentWrapperMode?: JmpContentWrapperReportMode;
|
|
96
|
+
/**
|
|
97
|
+
* How content is structured on this site (routes, trust block order, contact
|
|
98
|
+
* extras). Sent with POST /api/content/capabilities so the dashboard matches
|
|
99
|
+
* the live template.
|
|
100
|
+
*/
|
|
101
|
+
contentManifest?: JmpContentManifest;
|
|
102
|
+
};
|
|
103
|
+
/** Top-level and trust sub-wrappers the client can declare. */
|
|
104
|
+
type JmpContentWrapper = "blog" | "faq" | "landing" | "locations" | "contact" | "trust" | "trust.summary" | "trust.testimonials" | "trust.reviews" | "trust.stats" | "trust.logos" | "trust.credentials";
|
|
105
|
+
type JmpBlogPost = {
|
|
106
|
+
id: string;
|
|
107
|
+
title: string;
|
|
108
|
+
slug: string;
|
|
109
|
+
locale: string;
|
|
110
|
+
translation_group_id?: string;
|
|
111
|
+
path?: string;
|
|
112
|
+
excerpt: string | null;
|
|
113
|
+
body: string;
|
|
114
|
+
seo_title: string | null;
|
|
115
|
+
meta_description: string | null;
|
|
116
|
+
featured_image_url: string | null;
|
|
117
|
+
author_name: string | null;
|
|
118
|
+
author_descriptor: string | null;
|
|
119
|
+
tags: string[];
|
|
120
|
+
published_at: string | null;
|
|
121
|
+
updated_at: string;
|
|
122
|
+
};
|
|
123
|
+
type JmpContentLocaleAlternate = {
|
|
124
|
+
locale: string;
|
|
125
|
+
slug: string;
|
|
126
|
+
path: string;
|
|
127
|
+
};
|
|
128
|
+
type JmpBlogPostDetail = {
|
|
129
|
+
post: JmpBlogPost;
|
|
130
|
+
alternates: JmpContentLocaleAlternate[];
|
|
131
|
+
};
|
|
132
|
+
type JmpFaqItem = {
|
|
133
|
+
id: string;
|
|
134
|
+
slug: string;
|
|
135
|
+
locale: string;
|
|
136
|
+
translation_group_id?: string;
|
|
137
|
+
path?: string;
|
|
138
|
+
question: string;
|
|
139
|
+
answer: string;
|
|
140
|
+
category?: string | null;
|
|
141
|
+
sort_order: number;
|
|
142
|
+
updated_at: string;
|
|
143
|
+
};
|
|
144
|
+
type JmpFaqItemDetail = {
|
|
145
|
+
faq: JmpFaqItem;
|
|
146
|
+
alternates: JmpContentLocaleAlternate[];
|
|
147
|
+
};
|
|
148
|
+
type JmpPopularPage = {
|
|
149
|
+
path: string;
|
|
150
|
+
views: number;
|
|
151
|
+
slug: string | null;
|
|
152
|
+
};
|
|
153
|
+
type JmpPopularPagesResult = {
|
|
154
|
+
pages: JmpPopularPage[];
|
|
155
|
+
days: number;
|
|
156
|
+
prefix: string | null;
|
|
157
|
+
limit: number;
|
|
158
|
+
};
|
|
159
|
+
type JmpLandingPageKind = "service" | "location";
|
|
160
|
+
type JmpLandingPage = {
|
|
161
|
+
id: string;
|
|
162
|
+
kind: JmpLandingPageKind;
|
|
163
|
+
locale: string;
|
|
164
|
+
slug: string;
|
|
165
|
+
translation_group_id: string;
|
|
166
|
+
title: string;
|
|
167
|
+
seo_title: string | null;
|
|
168
|
+
meta_description: string | null;
|
|
169
|
+
headline: string | null;
|
|
170
|
+
excerpt: string | null;
|
|
171
|
+
body: string;
|
|
172
|
+
featured_image_url: string | null;
|
|
173
|
+
location_label: string | null;
|
|
174
|
+
region_code: string | null;
|
|
175
|
+
service_category: string | null;
|
|
176
|
+
published_at: string | null;
|
|
177
|
+
updated_at: string;
|
|
178
|
+
path: string;
|
|
179
|
+
};
|
|
180
|
+
type JmpLandingPageAlternate = {
|
|
181
|
+
locale: string;
|
|
182
|
+
slug: string;
|
|
183
|
+
path: string;
|
|
184
|
+
};
|
|
185
|
+
type JmpLandingPageDetail = {
|
|
186
|
+
page: JmpLandingPage;
|
|
187
|
+
alternates: JmpLandingPageAlternate[];
|
|
188
|
+
schema_json_ld: Record<string, unknown>[] | null;
|
|
189
|
+
};
|
|
190
|
+
type JmpLandingPageSitemapEntry = {
|
|
191
|
+
kind: JmpLandingPageKind;
|
|
192
|
+
locale: string;
|
|
193
|
+
slug: string;
|
|
194
|
+
path: string;
|
|
195
|
+
updated_at: string;
|
|
196
|
+
alternates: JmpLandingPageAlternate[];
|
|
197
|
+
};
|
|
198
|
+
type JmpWebsiteLocation = {
|
|
199
|
+
id: string;
|
|
200
|
+
slug: string;
|
|
201
|
+
name: string;
|
|
202
|
+
is_primary: boolean;
|
|
203
|
+
sort_order: number;
|
|
204
|
+
address: string | null;
|
|
205
|
+
phone: string | null;
|
|
206
|
+
email: string | null;
|
|
207
|
+
hours: string | null;
|
|
208
|
+
google_maps_url: string | null;
|
|
209
|
+
geo: {
|
|
210
|
+
lat: number;
|
|
211
|
+
lng: number;
|
|
212
|
+
} | null;
|
|
213
|
+
seo_title: string | null;
|
|
214
|
+
meta_description: string | null;
|
|
215
|
+
excerpt: string | null;
|
|
216
|
+
body: string;
|
|
217
|
+
published_at: string | null;
|
|
218
|
+
updated_at: string;
|
|
219
|
+
/** Client contact detail route, e.g. /contact/logan */
|
|
220
|
+
path: string;
|
|
221
|
+
};
|
|
222
|
+
type JmpWebsiteLocationDetail = {
|
|
223
|
+
location: JmpWebsiteLocation;
|
|
224
|
+
schema_json_ld: Record<string, unknown>[] | null;
|
|
225
|
+
};
|
|
226
|
+
type JmpTrustSummary = {
|
|
227
|
+
google_rating: number | null;
|
|
228
|
+
google_review_count: number | null;
|
|
229
|
+
google_reviews_url: string | null;
|
|
230
|
+
/** Minimum Google star rating (1–5) imported during sync. */
|
|
231
|
+
google_reviews_min_stars?: number | null;
|
|
232
|
+
/** When false, synced reviews are saved as drafts for manual curation. */
|
|
233
|
+
google_reviews_auto_publish?: boolean | null;
|
|
234
|
+
yelp_url: string | null;
|
|
235
|
+
trustpilot_url: string | null;
|
|
236
|
+
disclaimer: string | null;
|
|
237
|
+
};
|
|
238
|
+
type JmpTestimonial = {
|
|
239
|
+
id: string;
|
|
240
|
+
slug: string;
|
|
241
|
+
body: string;
|
|
242
|
+
author_name: string;
|
|
243
|
+
author_descriptor: string | null;
|
|
244
|
+
location: string | null;
|
|
245
|
+
/** 1–10 (half-star steps on a 5-star scale; 10 = 5.0 stars). */
|
|
246
|
+
rating: number | null;
|
|
247
|
+
image_url: string | null;
|
|
248
|
+
video_url: string | null;
|
|
249
|
+
/** Optional topic or service line (e.g. roofing). */
|
|
250
|
+
category: string | null;
|
|
251
|
+
/** Site section key — filter like FAQ `category` (e.g. testimonials, reviews). */
|
|
252
|
+
placement: string | null;
|
|
253
|
+
source: string | null;
|
|
254
|
+
/** Optional link to the original review on Google, Yelp, etc. */
|
|
255
|
+
source_url: string | null;
|
|
256
|
+
featured: boolean;
|
|
257
|
+
sort_order: number;
|
|
258
|
+
updated_at: string;
|
|
259
|
+
};
|
|
260
|
+
type JmpTrustStat = {
|
|
261
|
+
id: string;
|
|
262
|
+
slug: string;
|
|
263
|
+
label: string;
|
|
264
|
+
value: string;
|
|
265
|
+
sort_order: number;
|
|
266
|
+
updated_at: string;
|
|
267
|
+
};
|
|
268
|
+
type JmpPartnerLogo = {
|
|
269
|
+
id: string;
|
|
270
|
+
slug: string;
|
|
271
|
+
name: string;
|
|
272
|
+
image_url: string | null;
|
|
273
|
+
link_url: string | null;
|
|
274
|
+
sort_order: number;
|
|
275
|
+
updated_at: string;
|
|
276
|
+
};
|
|
277
|
+
type JmpCredential = {
|
|
278
|
+
id: string;
|
|
279
|
+
slug: string;
|
|
280
|
+
title: string;
|
|
281
|
+
issuer: string | null;
|
|
282
|
+
year: string | null;
|
|
283
|
+
image_url: string | null;
|
|
284
|
+
category: string | null;
|
|
285
|
+
sort_order: number;
|
|
286
|
+
updated_at: string;
|
|
287
|
+
};
|
|
288
|
+
type JmpTrustBundle = {
|
|
289
|
+
summary: JmpTrustSummary;
|
|
290
|
+
testimonials: JmpTestimonial[];
|
|
291
|
+
stats: JmpTrustStat[];
|
|
292
|
+
logos: JmpPartnerLogo[];
|
|
293
|
+
credentials: JmpCredential[];
|
|
294
|
+
};
|
|
295
|
+
type JmpSiteProfile = {
|
|
296
|
+
name: string;
|
|
297
|
+
display_name: string | null;
|
|
298
|
+
email: string | null;
|
|
299
|
+
phone: string | null;
|
|
300
|
+
address: string | null;
|
|
301
|
+
hours: string | null;
|
|
302
|
+
service_area: string | null;
|
|
303
|
+
google_maps_url: string | null;
|
|
304
|
+
social: {
|
|
305
|
+
linkedin: string | null;
|
|
306
|
+
instagram: string | null;
|
|
307
|
+
facebook: string | null;
|
|
308
|
+
x: string | null;
|
|
309
|
+
youtube: string | null;
|
|
310
|
+
};
|
|
311
|
+
cta: {
|
|
312
|
+
label: string | null;
|
|
313
|
+
url: string | null;
|
|
314
|
+
};
|
|
315
|
+
legal: {
|
|
316
|
+
privacy_policy_url: string | null;
|
|
317
|
+
terms_url: string | null;
|
|
318
|
+
};
|
|
319
|
+
/** Developer-defined keys; values filled by the client. */
|
|
320
|
+
extras: Record<string, string | null>;
|
|
321
|
+
/** GA4 measurement ID from jmp-dashboard (null = no portal-managed GA tag). */
|
|
322
|
+
ga_measurement_id: string | null;
|
|
323
|
+
/** Site default locale (BCP 47). Omitted prefix on public URLs. */
|
|
324
|
+
default_locale?: string;
|
|
325
|
+
/** Locales this site may publish content in. */
|
|
326
|
+
enabled_locales?: string[];
|
|
327
|
+
};
|
|
328
|
+
type TrackPageViewOptions = {
|
|
329
|
+
path?: string;
|
|
330
|
+
source?: string;
|
|
331
|
+
device?: string;
|
|
332
|
+
country?: string;
|
|
333
|
+
metadata?: Record<string, unknown>;
|
|
334
|
+
};
|
|
335
|
+
type TrackLeadOptions = {
|
|
336
|
+
/** Path where the lead was submitted, e.g. /contact */
|
|
337
|
+
path?: string;
|
|
338
|
+
name?: string;
|
|
339
|
+
email?: string;
|
|
340
|
+
phone?: string;
|
|
341
|
+
company?: string;
|
|
342
|
+
website?: string;
|
|
343
|
+
subject?: string;
|
|
344
|
+
message?: string;
|
|
345
|
+
/**
|
|
346
|
+
* Optional flexible metadata for dynamic lead forms.
|
|
347
|
+
* Prefer the normalized envelope (formId/formVersion/answers/derived/attribution),
|
|
348
|
+
* but unknown keys are also accepted by the API.
|
|
349
|
+
*/
|
|
350
|
+
metadata?: LeadMetadata;
|
|
351
|
+
/**
|
|
352
|
+
* Optional session id (from createJmpAnalytics internal session) if your app wants to pass it explicitly.
|
|
353
|
+
* Most callers should omit this.
|
|
354
|
+
*/
|
|
355
|
+
sessionId?: string;
|
|
356
|
+
};
|
|
357
|
+
type LeadMetadataValue = string | number | boolean | null | undefined | LeadMetadataValue[] | {
|
|
358
|
+
[key: string]: LeadMetadataValue;
|
|
359
|
+
};
|
|
360
|
+
type LeadMetadata = {
|
|
361
|
+
formId?: string;
|
|
362
|
+
formVersion?: string;
|
|
363
|
+
leadKind?: string;
|
|
364
|
+
answers?: Record<string, LeadMetadataValue>;
|
|
365
|
+
derived?: Record<string, LeadMetadataValue>;
|
|
366
|
+
attribution?: {
|
|
367
|
+
utm_source?: string;
|
|
368
|
+
utm_medium?: string;
|
|
369
|
+
utm_campaign?: string;
|
|
370
|
+
utm_content?: string;
|
|
371
|
+
utm_term?: string;
|
|
372
|
+
gclid?: string;
|
|
373
|
+
fbclid?: string;
|
|
374
|
+
msclkid?: string;
|
|
375
|
+
ttclid?: string;
|
|
376
|
+
[key: string]: LeadMetadataValue | undefined;
|
|
377
|
+
};
|
|
378
|
+
tags?: string[];
|
|
379
|
+
[key: string]: LeadMetadataValue | undefined;
|
|
380
|
+
};
|
|
381
|
+
type JmpServerRequestLike = {
|
|
382
|
+
url?: string;
|
|
383
|
+
headers: Pick<Headers, "get"> | Record<string, string | string[] | undefined | null>;
|
|
384
|
+
};
|
|
385
|
+
type TrackServerPageViewOptions = {
|
|
386
|
+
request?: JmpServerRequestLike;
|
|
387
|
+
/** Overrides request URL path. Use pathname + search when possible. */
|
|
388
|
+
path?: string;
|
|
389
|
+
/** Original visitor user agent. Useful when not passing `request`. */
|
|
390
|
+
userAgent?: string | null;
|
|
391
|
+
/** Original visitor referrer. Useful when not passing `request`. */
|
|
392
|
+
referer?: string | null;
|
|
393
|
+
metadata?: Record<string, unknown>;
|
|
394
|
+
sessionId?: string;
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
export { type JmpPartnerLogo as A, type JmpPopularPage as B, type JmpTrustBlockManifest as C, type JmpTrustSection as D, type JmpTrustStat as E, type JmpTrustSummary as F, type LeadMetadataValue as G, normalizeJmpContentManifest as H, stableJmpManifestFingerprint as I, type JmpBlogPost as J, type LeadMetadata as L, type TrackPageViewOptions as T, type JmpFaqItem as a, type JmpLandingPage as b, type JmpLandingPageDetail as c, type JmpLandingPageKind as d, type JmpLandingPageSitemapEntry as e, type JmpPopularPagesResult as f, type JmpSiteProfile as g, type JmpTestimonial as h, type JmpTrustBundle as i, type JmpWebsiteLocation as j, type JmpWebsiteLocationDetail as k, type JmpContentWrapper as l, type JmpContentManifest as m, type JmpContentConfig as n, type JmpServerRequestLike as o, type JmpAnalyticsConfig as p, type JmpEventType as q, type TrackLeadOptions as r, type TrackServerPageViewOptions as s, type JmpBlogPostDetail as t, type JmpFaqItemDetail as u, type JmpContactExtraManifest as v, type JmpContentLocaleAlternate as w, type JmpContentRouteManifest as x, type JmpContentWrapperReportMode as y, type JmpCredential as z };
|