@jmp-technologies/analytics 0.1.38 → 0.1.40
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 +6 -2
- package/ai-crawler-agents.json +63 -0
- package/dist/astro/client.cjs +257 -6
- package/dist/astro/client.cjs.map +1 -1
- package/dist/astro/client.d.cts +2 -2
- package/dist/astro/client.d.ts +2 -2
- package/dist/astro/client.js +1 -1
- package/dist/astro/content.cjs +264 -7
- package/dist/astro/content.cjs.map +1 -1
- package/dist/astro/content.d.cts +3 -3
- package/dist/astro/content.d.ts +3 -3
- package/dist/astro/content.js +2 -2
- package/dist/astro/integration.cjs +257 -6
- package/dist/astro/integration.cjs.map +1 -1
- package/dist/astro/integration.js +2 -2
- package/dist/astro/middleware.d.cts +2 -2
- package/dist/astro/middleware.d.ts +2 -2
- package/dist/astro/register.cjs +257 -6
- package/dist/astro/register.cjs.map +1 -1
- package/dist/astro/register.js +2 -2
- package/dist/{chunk-WHUHCTBQ.js → chunk-34LFIP3R.js} +2 -2
- package/dist/{chunk-NCF3J4HV.js → chunk-BRLCGVFJ.js} +2 -2
- package/dist/{chunk-PQOTEV6O.js → chunk-IY6Y636W.js} +2 -2
- package/dist/{chunk-EBU4DKHW.js → chunk-JC3G4XNR.js} +333 -8
- package/dist/chunk-JC3G4XNR.js.map +1 -0
- package/dist/{chunk-JVFN7MF2.js → chunk-VSZRQSUN.js} +2 -2
- package/dist/constants-DTZMYgi4.d.cts +12 -0
- package/dist/constants-DTZMYgi4.d.ts +12 -0
- package/dist/{create-jmp-analytics-DMSXmVIH.d.cts → create-jmp-analytics-B7VqQJca.d.cts} +1 -1
- package/dist/{create-jmp-analytics-JZ3pqNBQ.d.ts → create-jmp-analytics-BGt16QGY.d.ts} +1 -1
- package/dist/index.cjs +340 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -13
- package/dist/index.d.ts +31 -13
- package/dist/index.js +17 -1
- package/dist/next/content.cjs +268 -7
- package/dist/next/content.cjs.map +1 -1
- package/dist/next/content.d.cts +3 -2
- package/dist/next/content.d.ts +3 -2
- package/dist/next/content.js +7 -2
- package/dist/next/content.js.map +1 -1
- package/dist/next/instrumentation.cjs +257 -6
- package/dist/next/instrumentation.cjs.map +1 -1
- package/dist/next/instrumentation.js +1 -1
- package/dist/next/landing-pages.cjs +264 -7
- package/dist/next/landing-pages.cjs.map +1 -1
- package/dist/next/landing-pages.d.cts +2 -2
- package/dist/next/landing-pages.d.ts +2 -2
- package/dist/next/landing-pages.js +2 -2
- package/dist/next/locations.cjs +265 -8
- package/dist/next/locations.cjs.map +1 -1
- package/dist/next/locations.d.cts +3 -3
- package/dist/next/locations.d.ts +3 -3
- package/dist/next/locations.js +3 -3
- package/dist/next/locations.js.map +1 -1
- package/dist/next/middleware.cjs.map +1 -1
- package/dist/next/middleware.d.cts +2 -2
- package/dist/next/middleware.d.ts +2 -2
- package/dist/next/middleware.js.map +1 -1
- package/dist/next/site-root-server.cjs +264 -7
- package/dist/next/site-root-server.cjs.map +1 -1
- package/dist/next/site-root-server.d.cts +1 -1
- package/dist/next/site-root-server.d.ts +1 -1
- package/dist/next/site-root-server.js +3 -3
- package/dist/next/site-root-server.js.map +1 -1
- package/dist/next.cjs +257 -6
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +3 -3
- package/dist/next.d.ts +3 -3
- package/dist/next.js +3 -3
- package/dist/react.cjs +257 -6
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +2 -2
- package/dist/{site-config-BZJS8Hp_.d.cts → site-config-CZl4PIbg.d.cts} +1 -1
- package/dist/{site-config-BLnwuRC2.d.ts → site-config-Cq5K8hUp.d.ts} +1 -1
- package/dist/{track-page-view-DGKRUIxm.d.ts → track-page-view-BSlE0yI9.d.ts} +1 -1
- package/dist/{track-page-view-BJQqn2Bg.d.cts → track-page-view-M9y_5WqT.d.cts} +1 -1
- package/dist/{types-CYrgEwUF.d.ts → types-DH_8sBu9.d.cts} +35 -0
- package/dist/{types-CYrgEwUF.d.cts → types-DH_8sBu9.d.ts} +35 -0
- package/dist/{utils-B1Nt3sBU.d.ts → utils-C2JRomti.d.ts} +1 -1
- package/dist/{utils-U6TGMIAB.d.cts → utils-JfjoqC-z.d.cts} +1 -1
- package/package.json +2 -1
- package/dist/chunk-EBU4DKHW.js.map +0 -1
- /package/dist/{chunk-WHUHCTBQ.js.map → chunk-34LFIP3R.js.map} +0 -0
- /package/dist/{chunk-NCF3J4HV.js.map → chunk-BRLCGVFJ.js.map} +0 -0
- /package/dist/{chunk-PQOTEV6O.js.map → chunk-IY6Y636W.js.map} +0 -0
- /package/dist/{chunk-JVFN7MF2.js.map → chunk-VSZRQSUN.js.map} +0 -0
|
@@ -16,7 +16,7 @@ type JmpSiteRootServerProps = {
|
|
|
16
16
|
* directly — fixes missing `POST /api/events` when env vars are not inlined into
|
|
17
17
|
* client chunks (common on Vercel if vars were added after build or mis-scoped).
|
|
18
18
|
*
|
|
19
|
-
* Optional GA4: set `ga_measurement_id` in jmp-dashboard (
|
|
19
|
+
* Optional GA4: set `ga_measurement_id` in jmp-dashboard (Dashboard setup)
|
|
20
20
|
* or `NEXT_PUBLIC_GA_MEASUREMENT_ID` on the client site (env wins).
|
|
21
21
|
*/
|
|
22
22
|
declare function JmpSiteRootServer({ children, deferUntilConsent, gaFromPortal, }: JmpSiteRootServerProps): Promise<react_jsx_runtime.JSX.Element>;
|
|
@@ -16,7 +16,7 @@ type JmpSiteRootServerProps = {
|
|
|
16
16
|
* directly — fixes missing `POST /api/events` when env vars are not inlined into
|
|
17
17
|
* client chunks (common on Vercel if vars were added after build or mis-scoped).
|
|
18
18
|
*
|
|
19
|
-
* Optional GA4: set `ga_measurement_id` in jmp-dashboard (
|
|
19
|
+
* Optional GA4: set `ga_measurement_id` in jmp-dashboard (Dashboard setup)
|
|
20
20
|
* or `NEXT_PUBLIC_GA_MEASUREMENT_ID` on the client site (env wins).
|
|
21
21
|
*/
|
|
22
22
|
declare function JmpSiteRootServer({ children, deferUntilConsent, gaFromPortal, }: JmpSiteRootServerProps): Promise<react_jsx_runtime.JSX.Element>;
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
} from "../chunk-G5BMWPQ6.js";
|
|
4
4
|
import {
|
|
5
5
|
JmpSiteRoot
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-BRLCGVFJ.js";
|
|
7
7
|
import {
|
|
8
8
|
JmpGoogleTag
|
|
9
9
|
} from "../chunk-2KAGOVRZ.js";
|
|
10
|
-
import "../chunk-
|
|
10
|
+
import "../chunk-VSZRQSUN.js";
|
|
11
11
|
import {
|
|
12
12
|
getJmpSiteProfile
|
|
13
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-JC3G4XNR.js";
|
|
14
14
|
import "../chunk-TCZ6TC2L.js";
|
|
15
15
|
import {
|
|
16
16
|
getJmpContentConfig,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/site-root-server.tsx"],"sourcesContent":["import type { ReactNode } from \"react\"\n\nimport { getJmpSiteProfile } from \"../content/api\"\nimport { readJmpPublicEnvFromProcess } from \"../env-public\"\nimport { getJmpContentConfig, getJmpSiteDefinition } from \"../site-config\"\nimport { JmpSiteRoot } from \"../next\"\nimport { JmpLandingCaptureScriptServer } from \"./landing-capture-script-server\"\nimport { JmpGoogleTag } from \"./google-tag\"\n\nexport type JmpSiteRootServerProps = {\n children: ReactNode\n deferUntilConsent?: boolean\n /**\n * When true (default), loads GA4 from the dashboard site profile when\n * `NEXT_PUBLIC_GA_MEASUREMENT_ID` is unset. Set false to use env-only GA.\n */\n gaFromPortal?: boolean\n}\n\nasync function resolveGaMeasurementId(\n gaFromPortal: boolean\n): Promise<string | null> {\n const fromEnv = process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID?.trim()\n if (fromEnv) {\n return fromEnv\n }\n if (!gaFromPortal) {\n return null\n }\n const config = getJmpContentConfig()\n if (!config) {\n return null\n }\n try {\n const profile = await getJmpSiteProfile(config)\n return profile.ga_measurement_id?.trim() || null\n } catch {\n return null\n }\n}\n\n/**\n * Server Component: reads `process.env` at request time and passes config into the\n * client tracker. Use this in `app/layout.tsx` instead of importing `JmpSiteRoot`\n * directly — fixes missing `POST /api/events` when env vars are not inlined into\n * client chunks (common on Vercel if vars were added after build or mis-scoped).\n *\n * Optional GA4: set `ga_measurement_id` in jmp-dashboard (
|
|
1
|
+
{"version":3,"sources":["../../src/next/site-root-server.tsx"],"sourcesContent":["import type { ReactNode } from \"react\"\n\nimport { getJmpSiteProfile } from \"../content/api\"\nimport { readJmpPublicEnvFromProcess } from \"../env-public\"\nimport { getJmpContentConfig, getJmpSiteDefinition } from \"../site-config\"\nimport { JmpSiteRoot } from \"../next\"\nimport { JmpLandingCaptureScriptServer } from \"./landing-capture-script-server\"\nimport { JmpGoogleTag } from \"./google-tag\"\n\nexport type JmpSiteRootServerProps = {\n children: ReactNode\n deferUntilConsent?: boolean\n /**\n * When true (default), loads GA4 from the dashboard site profile when\n * `NEXT_PUBLIC_GA_MEASUREMENT_ID` is unset. Set false to use env-only GA.\n */\n gaFromPortal?: boolean\n}\n\nasync function resolveGaMeasurementId(\n gaFromPortal: boolean\n): Promise<string | null> {\n const fromEnv = process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID?.trim()\n if (fromEnv) {\n return fromEnv\n }\n if (!gaFromPortal) {\n return null\n }\n const config = getJmpContentConfig()\n if (!config) {\n return null\n }\n try {\n const profile = await getJmpSiteProfile(config)\n return profile.ga_measurement_id?.trim() || null\n } catch {\n return null\n }\n}\n\n/**\n * Server Component: reads `process.env` at request time and passes config into the\n * client tracker. Use this in `app/layout.tsx` instead of importing `JmpSiteRoot`\n * directly — fixes missing `POST /api/events` when env vars are not inlined into\n * client chunks (common on Vercel if vars were added after build or mis-scoped).\n *\n * Optional GA4: set `ga_measurement_id` in jmp-dashboard (Dashboard setup)\n * or `NEXT_PUBLIC_GA_MEASUREMENT_ID` on the client site (env wins).\n */\nexport async function JmpSiteRootServer({\n children,\n deferUntilConsent,\n gaFromPortal = true,\n}: JmpSiteRootServerProps) {\n const pub = readJmpPublicEnvFromProcess()\n const site = getJmpSiteDefinition()\n const gaId = await resolveGaMeasurementId(gaFromPortal)\n\n return (\n <>\n <JmpLandingCaptureScriptServer trackingKey={pub.trackingKey} />\n {gaId ? <JmpGoogleTag gaId={gaId} /> : null}\n <JmpSiteRoot\n analyticsUrl={pub.analyticsUrl ?? site?.analyticsPortalUrl}\n trackingKey={pub.trackingKey}\n deferUntilConsent={deferUntilConsent}\n >\n {children}\n </JmpSiteRoot>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4DI,mBACE,KADF;AAzCJ,eAAe,uBACb,cACwB;AACxB,QAAM,UAAU,QAAQ,IAAI,+BAA+B,KAAK;AAChE,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,oBAAoB;AACnC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,UAAU,MAAM,kBAAkB,MAAM;AAC9C,WAAO,QAAQ,mBAAmB,KAAK,KAAK;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWA,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAA2B;AACzB,QAAM,MAAM,4BAA4B;AACxC,QAAM,OAAO,qBAAqB;AAClC,QAAM,OAAO,MAAM,uBAAuB,YAAY;AAEtD,SACE,iCACE;AAAA,wBAAC,iCAA8B,aAAa,IAAI,aAAa;AAAA,IAC5D,OAAO,oBAAC,gBAAa,MAAY,IAAK;AAAA,IACvC;AAAA,MAAC;AAAA;AAAA,QACC,cAAc,IAAI,gBAAgB,MAAM;AAAA,QACxC,aAAa,IAAI;AAAA,QACjB;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;","names":[]}
|
package/dist/next.cjs
CHANGED
|
@@ -95,7 +95,7 @@ function readJmpPublicEnvFromProcess(overrides) {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
// package.json
|
|
98
|
-
var version = "0.1.
|
|
98
|
+
var version = "0.1.40";
|
|
99
99
|
|
|
100
100
|
// src/constants.ts
|
|
101
101
|
var JMP_ANALYTICS_SDK_VERSION = version;
|
|
@@ -992,7 +992,8 @@ function normalizeJmpContentManifest(input) {
|
|
|
992
992
|
const externalSources = normalizeExternalSources(input.externalSources);
|
|
993
993
|
const trust = normalizeTrust(input.trust);
|
|
994
994
|
const contact = normalizeContact(input.contact);
|
|
995
|
-
|
|
995
|
+
const defaults = normalizeManifestDefaults(input.defaults);
|
|
996
|
+
if (routes.length === 0 && !externalSources && !trust && !contact && !defaults) {
|
|
996
997
|
return null;
|
|
997
998
|
}
|
|
998
999
|
return {
|
|
@@ -1000,7 +1001,8 @@ function normalizeJmpContentManifest(input) {
|
|
|
1000
1001
|
...routes.length > 0 ? { routes } : {},
|
|
1001
1002
|
...externalSources ? { externalSources } : {},
|
|
1002
1003
|
...trust ? { trust } : {},
|
|
1003
|
-
...contact ? { contact } : {}
|
|
1004
|
+
...contact ? { contact } : {},
|
|
1005
|
+
...defaults ? { defaults } : {}
|
|
1004
1006
|
};
|
|
1005
1007
|
}
|
|
1006
1008
|
function normalizeRoutes(routes) {
|
|
@@ -1064,10 +1066,132 @@ function normalizeTrustLabels(labels) {
|
|
|
1064
1066
|
}
|
|
1065
1067
|
return Object.keys(out).length > 0 ? out : null;
|
|
1066
1068
|
}
|
|
1069
|
+
function readDefaultText(value, max = 500) {
|
|
1070
|
+
if (typeof value !== "string") return void 0;
|
|
1071
|
+
const trimmed = value.trim();
|
|
1072
|
+
if (!trimmed) return void 0;
|
|
1073
|
+
return trimmed.slice(0, max);
|
|
1074
|
+
}
|
|
1075
|
+
function normalizeManifestDefaults(defaults) {
|
|
1076
|
+
if (!defaults || typeof defaults !== "object") return null;
|
|
1077
|
+
const contactRaw = defaults.contact;
|
|
1078
|
+
const contact = {};
|
|
1079
|
+
if (contactRaw && typeof contactRaw === "object") {
|
|
1080
|
+
const displayName = readDefaultText(contactRaw.displayName, 120);
|
|
1081
|
+
const email = readDefaultText(contactRaw.email, 200);
|
|
1082
|
+
const phone = readDefaultText(contactRaw.phone, 40);
|
|
1083
|
+
const address = readDefaultText(contactRaw.address, 400);
|
|
1084
|
+
const hours = readDefaultText(contactRaw.hours, 400);
|
|
1085
|
+
const serviceArea = readDefaultText(contactRaw.serviceArea, 200);
|
|
1086
|
+
const googleMapsUrl = readDefaultText(contactRaw.googleMapsUrl, 2048);
|
|
1087
|
+
const linkedinUrl = readDefaultText(contactRaw.linkedinUrl, 2048);
|
|
1088
|
+
const instagramUrl = readDefaultText(contactRaw.instagramUrl, 2048);
|
|
1089
|
+
const facebookUrl = readDefaultText(contactRaw.facebookUrl, 2048);
|
|
1090
|
+
const xUrl = readDefaultText(contactRaw.xUrl, 2048);
|
|
1091
|
+
const youtubeUrl = readDefaultText(contactRaw.youtubeUrl, 2048);
|
|
1092
|
+
if (displayName) contact.displayName = displayName;
|
|
1093
|
+
if (email) contact.email = email;
|
|
1094
|
+
if (phone) contact.phone = phone;
|
|
1095
|
+
if (address) contact.address = address;
|
|
1096
|
+
if (hours) contact.hours = hours;
|
|
1097
|
+
if (serviceArea) contact.serviceArea = serviceArea;
|
|
1098
|
+
if (googleMapsUrl) contact.googleMapsUrl = googleMapsUrl;
|
|
1099
|
+
if (linkedinUrl) contact.linkedinUrl = linkedinUrl;
|
|
1100
|
+
if (instagramUrl) contact.instagramUrl = instagramUrl;
|
|
1101
|
+
if (facebookUrl) contact.facebookUrl = facebookUrl;
|
|
1102
|
+
if (xUrl) contact.xUrl = xUrl;
|
|
1103
|
+
if (youtubeUrl) contact.youtubeUrl = youtubeUrl;
|
|
1104
|
+
if (contactRaw.extras && typeof contactRaw.extras === "object") {
|
|
1105
|
+
const extras = {};
|
|
1106
|
+
for (const [rawKey, rawValue] of Object.entries(contactRaw.extras)) {
|
|
1107
|
+
if (Object.keys(extras).length >= 10) break;
|
|
1108
|
+
const key = normalizeKey(rawKey);
|
|
1109
|
+
const value = readDefaultText(rawValue, 200);
|
|
1110
|
+
if (key && isValidExtraKey(key) && value) extras[key] = value;
|
|
1111
|
+
}
|
|
1112
|
+
if (Object.keys(extras).length > 0) contact.extras = extras;
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
const faq = [];
|
|
1116
|
+
if (Array.isArray(defaults.faq)) {
|
|
1117
|
+
for (const raw of defaults.faq) {
|
|
1118
|
+
if (!raw || typeof raw !== "object" || faq.length >= 40) continue;
|
|
1119
|
+
const question = readDefaultText(raw.question, 300);
|
|
1120
|
+
const answer = readDefaultText(raw.answer, 8e3);
|
|
1121
|
+
if (!question || !answer) continue;
|
|
1122
|
+
const category = readDefaultText(raw.category, 80);
|
|
1123
|
+
faq.push({ question, answer, ...category ? { category } : {} });
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
const trustRaw = defaults.trust;
|
|
1127
|
+
const trust = {};
|
|
1128
|
+
if (trustRaw && typeof trustRaw === "object") {
|
|
1129
|
+
const assign = (key, max) => {
|
|
1130
|
+
const value = readDefaultText(trustRaw[key], max);
|
|
1131
|
+
if (value) trust[key] = value;
|
|
1132
|
+
};
|
|
1133
|
+
assign("googleReviewsUrl", 2048);
|
|
1134
|
+
assign("googlePlaceId", 128);
|
|
1135
|
+
assign("yelpUrl", 2048);
|
|
1136
|
+
assign("trustpilotUrl", 2048);
|
|
1137
|
+
assign("disclaimer", 1e3);
|
|
1138
|
+
}
|
|
1139
|
+
const hasContact = Object.keys(contact).length > 0;
|
|
1140
|
+
const hasTrust = Object.keys(trust).length > 0;
|
|
1141
|
+
if (!hasContact && faq.length === 0 && !hasTrust) return null;
|
|
1142
|
+
return {
|
|
1143
|
+
...hasContact ? { contact } : {},
|
|
1144
|
+
...faq.length > 0 ? { faq } : {},
|
|
1145
|
+
...hasTrust ? { trust } : {}
|
|
1146
|
+
};
|
|
1147
|
+
}
|
|
1067
1148
|
function normalizeContact(contact) {
|
|
1068
1149
|
if (!contact || typeof contact !== "object") return null;
|
|
1069
1150
|
const extras = normalizeContactExtras(contact.extras);
|
|
1070
|
-
|
|
1151
|
+
const leadInbox = normalizeLeadInbox(contact.leadInbox);
|
|
1152
|
+
if (extras.length === 0 && !leadInbox) return null;
|
|
1153
|
+
return {
|
|
1154
|
+
...extras.length > 0 ? { extras } : {},
|
|
1155
|
+
...leadInbox ? { leadInbox } : {}
|
|
1156
|
+
};
|
|
1157
|
+
}
|
|
1158
|
+
function normalizeLeadInbox(raw) {
|
|
1159
|
+
if (!raw || typeof raw !== "object") return null;
|
|
1160
|
+
const list = normalizeInboxKeyList(raw.list, 8);
|
|
1161
|
+
const detail = normalizeInboxKeyList(raw.detail, 24);
|
|
1162
|
+
const labels = normalizeInboxLabels(raw.labels);
|
|
1163
|
+
if (!list && !detail && !labels) return null;
|
|
1164
|
+
return {
|
|
1165
|
+
...list ? { list } : {},
|
|
1166
|
+
...detail ? { detail } : {},
|
|
1167
|
+
...labels ? { labels } : {}
|
|
1168
|
+
};
|
|
1169
|
+
}
|
|
1170
|
+
function normalizeInboxKeyList(raw, max) {
|
|
1171
|
+
if (!Array.isArray(raw)) return void 0;
|
|
1172
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1173
|
+
const out = [];
|
|
1174
|
+
for (const item of raw) {
|
|
1175
|
+
if (typeof item !== "string" || out.length >= max) continue;
|
|
1176
|
+
const key = item.trim();
|
|
1177
|
+
const token = key.replace(/[^a-zA-Z0-9]+/g, "").toLowerCase();
|
|
1178
|
+
if (!key || !token || seen.has(token)) continue;
|
|
1179
|
+
seen.add(token);
|
|
1180
|
+
out.push(key);
|
|
1181
|
+
}
|
|
1182
|
+
return out.length > 0 ? out : void 0;
|
|
1183
|
+
}
|
|
1184
|
+
function normalizeInboxLabels(raw) {
|
|
1185
|
+
if (!raw || typeof raw !== "object") return void 0;
|
|
1186
|
+
const out = {};
|
|
1187
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
1188
|
+
if (typeof value !== "string") continue;
|
|
1189
|
+
const label = value.trim().slice(0, 60);
|
|
1190
|
+
const token = key.trim();
|
|
1191
|
+
if (!token || !label) continue;
|
|
1192
|
+
out[token] = label;
|
|
1193
|
+
}
|
|
1194
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
1071
1195
|
}
|
|
1072
1196
|
function normalizeContactExtras(extras) {
|
|
1073
1197
|
if (!Array.isArray(extras)) return [];
|
|
@@ -1097,7 +1221,7 @@ function inferWrapperSlotsFromManifest(manifest) {
|
|
|
1097
1221
|
slots.add(`trust.${block.section}`);
|
|
1098
1222
|
slots.add("trust");
|
|
1099
1223
|
}
|
|
1100
|
-
if (manifest?.contact?.extras?.length) {
|
|
1224
|
+
if (manifest?.contact?.extras?.length || manifest?.contact?.leadInbox) {
|
|
1101
1225
|
slots.add("contact");
|
|
1102
1226
|
}
|
|
1103
1227
|
return [...slots];
|
|
@@ -1124,7 +1248,65 @@ function getDiscoveredContentWrappers() {
|
|
|
1124
1248
|
return sortWrapperSlots([...discovered]);
|
|
1125
1249
|
}
|
|
1126
1250
|
function resolveContentManifestForReport(config) {
|
|
1127
|
-
|
|
1251
|
+
const site = getJmpSiteDefinition();
|
|
1252
|
+
const fallback = site?.contactFallback;
|
|
1253
|
+
const existing = config.contentManifest;
|
|
1254
|
+
const fromFallback = fallbackToManifestDefaults(fallback);
|
|
1255
|
+
if (!existing && !fromFallback) {
|
|
1256
|
+
return null;
|
|
1257
|
+
}
|
|
1258
|
+
const merged = {
|
|
1259
|
+
...existing ?? {},
|
|
1260
|
+
defaults: {
|
|
1261
|
+
...fromFallback ?? {},
|
|
1262
|
+
...existing?.defaults ?? {},
|
|
1263
|
+
contact: {
|
|
1264
|
+
...fromFallback?.contact ?? {},
|
|
1265
|
+
...existing?.defaults?.contact ?? {},
|
|
1266
|
+
extras: {
|
|
1267
|
+
...fromFallback?.contact?.extras ?? {},
|
|
1268
|
+
...existing?.defaults?.contact?.extras ?? {}
|
|
1269
|
+
}
|
|
1270
|
+
},
|
|
1271
|
+
trust: {
|
|
1272
|
+
...fromFallback?.trust ?? {},
|
|
1273
|
+
...existing?.defaults?.trust ?? {}
|
|
1274
|
+
},
|
|
1275
|
+
faq: existing?.defaults?.faq?.length ? existing.defaults.faq : fromFallback?.faq
|
|
1276
|
+
}
|
|
1277
|
+
};
|
|
1278
|
+
return normalizeJmpContentManifest(merged);
|
|
1279
|
+
}
|
|
1280
|
+
function fallbackToManifestDefaults(fallback) {
|
|
1281
|
+
if (!fallback) return null;
|
|
1282
|
+
const contact = {};
|
|
1283
|
+
if (fallback.displayName?.trim()) contact.displayName = fallback.displayName.trim();
|
|
1284
|
+
if (fallback.email?.trim()) contact.email = fallback.email.trim();
|
|
1285
|
+
if (typeof fallback.phone === "string" && fallback.phone.trim()) {
|
|
1286
|
+
contact.phone = fallback.phone.trim();
|
|
1287
|
+
}
|
|
1288
|
+
if (fallback.address?.trim()) contact.address = fallback.address.trim();
|
|
1289
|
+
if (fallback.hours?.trim()) contact.hours = fallback.hours.trim();
|
|
1290
|
+
if (fallback.serviceArea?.trim()) contact.serviceArea = fallback.serviceArea.trim();
|
|
1291
|
+
if (fallback.googleMapsUrl?.trim()) {
|
|
1292
|
+
contact.googleMapsUrl = fallback.googleMapsUrl.trim();
|
|
1293
|
+
}
|
|
1294
|
+
if (fallback.linkedin?.trim()) contact.linkedinUrl = fallback.linkedin.trim();
|
|
1295
|
+
if (fallback.instagram?.trim()) contact.instagramUrl = fallback.instagram.trim();
|
|
1296
|
+
if (fallback.facebook?.trim()) contact.facebookUrl = fallback.facebook.trim();
|
|
1297
|
+
if (fallback.x?.trim()) contact.xUrl = fallback.x.trim();
|
|
1298
|
+
if (fallback.youtube?.trim()) contact.youtubeUrl = fallback.youtube.trim();
|
|
1299
|
+
const trust = {};
|
|
1300
|
+
if (fallback.googleMapsUrl?.trim()) {
|
|
1301
|
+
trust.googleReviewsUrl = fallback.googleMapsUrl.trim();
|
|
1302
|
+
}
|
|
1303
|
+
const hasContact = Object.keys(contact).length > 0;
|
|
1304
|
+
const hasTrust = Object.keys(trust).length > 0;
|
|
1305
|
+
if (!hasContact && !hasTrust) return null;
|
|
1306
|
+
return {
|
|
1307
|
+
...hasContact ? { contact } : {},
|
|
1308
|
+
...hasTrust ? { trust } : {}
|
|
1309
|
+
};
|
|
1128
1310
|
}
|
|
1129
1311
|
function resolveContentWrappersForReport(config) {
|
|
1130
1312
|
const explicit = config.contentWrappers ?? [];
|
|
@@ -1267,6 +1449,75 @@ function getOrCreateJmpAnalyticsForNextApp(overrides) {
|
|
|
1267
1449
|
});
|
|
1268
1450
|
}
|
|
1269
1451
|
|
|
1452
|
+
// ai-crawler-agents.json
|
|
1453
|
+
var ai_crawler_agents_default = {
|
|
1454
|
+
robotsUserAgents: [
|
|
1455
|
+
"GPTBot",
|
|
1456
|
+
"ChatGPT-User",
|
|
1457
|
+
"OAI-SearchBot",
|
|
1458
|
+
"OAI-AdsBot",
|
|
1459
|
+
"ClaudeBot",
|
|
1460
|
+
"Claude-User",
|
|
1461
|
+
"Claude-SearchBot",
|
|
1462
|
+
"Claude-Web",
|
|
1463
|
+
"PerplexityBot",
|
|
1464
|
+
"Perplexity-User",
|
|
1465
|
+
"Google-Extended",
|
|
1466
|
+
"GoogleOther",
|
|
1467
|
+
"GoogleOther-Image",
|
|
1468
|
+
"GoogleOther-Video",
|
|
1469
|
+
"Google-CloudVertexBot",
|
|
1470
|
+
"Meta-ExternalAgent",
|
|
1471
|
+
"Meta-ExternalFetcher",
|
|
1472
|
+
"FacebookBot",
|
|
1473
|
+
"Applebot",
|
|
1474
|
+
"Applebot-Extended",
|
|
1475
|
+
"CCBot",
|
|
1476
|
+
"Bytespider",
|
|
1477
|
+
"cohere-ai",
|
|
1478
|
+
"cohere-training-data-crawler",
|
|
1479
|
+
"YouBot",
|
|
1480
|
+
"MistralAI-User",
|
|
1481
|
+
"GrokBot",
|
|
1482
|
+
"Grok-DeepSearch",
|
|
1483
|
+
"xAI-Grok",
|
|
1484
|
+
"xAI-Bot"
|
|
1485
|
+
],
|
|
1486
|
+
wafUserAgents: [
|
|
1487
|
+
"GPTBot",
|
|
1488
|
+
"ChatGPT-User",
|
|
1489
|
+
"OAI-SearchBot",
|
|
1490
|
+
"OAI-AdsBot",
|
|
1491
|
+
"ClaudeBot",
|
|
1492
|
+
"Claude-User",
|
|
1493
|
+
"Claude-SearchBot",
|
|
1494
|
+
"Claude-Web",
|
|
1495
|
+
"PerplexityBot",
|
|
1496
|
+
"Perplexity-User",
|
|
1497
|
+
"Google-Extended",
|
|
1498
|
+
"GoogleOther",
|
|
1499
|
+
"Google-CloudVertexBot",
|
|
1500
|
+
"Meta-ExternalAgent",
|
|
1501
|
+
"Meta-ExternalFetcher",
|
|
1502
|
+
"FacebookBot",
|
|
1503
|
+
"Applebot-Extended",
|
|
1504
|
+
"CCBot",
|
|
1505
|
+
"Bytespider",
|
|
1506
|
+
"cohere-ai",
|
|
1507
|
+
"cohere-training-data-crawler",
|
|
1508
|
+
"YouBot",
|
|
1509
|
+
"MistralAI-User",
|
|
1510
|
+
"GrokBot",
|
|
1511
|
+
"Grok-DeepSearch",
|
|
1512
|
+
"xAI-Grok",
|
|
1513
|
+
"xAI-Bot"
|
|
1514
|
+
]
|
|
1515
|
+
};
|
|
1516
|
+
|
|
1517
|
+
// src/ai-crawlers.ts
|
|
1518
|
+
var AI_CRAWLER_ROBOTS_USER_AGENTS = ai_crawler_agents_default.robotsUserAgents;
|
|
1519
|
+
var JMP_AI_CRAWLER_WAF_USER_AGENTS = ai_crawler_agents_default.wafUserAgents;
|
|
1520
|
+
|
|
1270
1521
|
// src/react.tsx
|
|
1271
1522
|
var import_react = require("react");
|
|
1272
1523
|
var import_jsx_runtime = require("react/jsx-runtime");
|