@jmp-technologies/analytics 0.1.39 → 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.
Files changed (86) hide show
  1. package/README.md +6 -2
  2. package/ai-crawler-agents.json +63 -0
  3. package/dist/astro/client.cjs +115 -3
  4. package/dist/astro/client.cjs.map +1 -1
  5. package/dist/astro/client.d.cts +2 -2
  6. package/dist/astro/client.d.ts +2 -2
  7. package/dist/astro/client.js +1 -1
  8. package/dist/astro/content.cjs +115 -3
  9. package/dist/astro/content.cjs.map +1 -1
  10. package/dist/astro/content.d.cts +3 -3
  11. package/dist/astro/content.d.ts +3 -3
  12. package/dist/astro/content.js +2 -2
  13. package/dist/astro/integration.cjs +115 -3
  14. package/dist/astro/integration.cjs.map +1 -1
  15. package/dist/astro/integration.js +2 -2
  16. package/dist/astro/middleware.d.cts +2 -2
  17. package/dist/astro/middleware.d.ts +2 -2
  18. package/dist/astro/register.cjs +115 -3
  19. package/dist/astro/register.cjs.map +1 -1
  20. package/dist/astro/register.js +2 -2
  21. package/dist/{chunk-M66PHSBO.js → chunk-34LFIP3R.js} +2 -2
  22. package/dist/{chunk-BXPMVR7M.js → chunk-BRLCGVFJ.js} +2 -2
  23. package/dist/{chunk-OCIOQIE4.js → chunk-IY6Y636W.js} +2 -2
  24. package/dist/{chunk-XAEWXWSP.js → chunk-JC3G4XNR.js} +182 -4
  25. package/dist/chunk-JC3G4XNR.js.map +1 -0
  26. package/dist/{chunk-JJ3JP3RV.js → chunk-VSZRQSUN.js} +2 -2
  27. package/dist/{create-jmp-analytics-C1IH32ZF.d.cts → create-jmp-analytics-B7VqQJca.d.cts} +1 -1
  28. package/dist/{create-jmp-analytics-CjVYSmPJ.d.ts → create-jmp-analytics-BGt16QGY.d.ts} +1 -1
  29. package/dist/index.cjs +187 -3
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +30 -6
  32. package/dist/index.d.ts +30 -6
  33. package/dist/index.js +13 -1
  34. package/dist/next/content.cjs +115 -3
  35. package/dist/next/content.cjs.map +1 -1
  36. package/dist/next/content.d.cts +2 -2
  37. package/dist/next/content.d.ts +2 -2
  38. package/dist/next/content.js +2 -2
  39. package/dist/next/instrumentation.cjs +115 -3
  40. package/dist/next/instrumentation.cjs.map +1 -1
  41. package/dist/next/instrumentation.js +1 -1
  42. package/dist/next/landing-pages.cjs +115 -3
  43. package/dist/next/landing-pages.cjs.map +1 -1
  44. package/dist/next/landing-pages.d.cts +2 -2
  45. package/dist/next/landing-pages.d.ts +2 -2
  46. package/dist/next/landing-pages.js +2 -2
  47. package/dist/next/locations.cjs +116 -4
  48. package/dist/next/locations.cjs.map +1 -1
  49. package/dist/next/locations.d.cts +3 -3
  50. package/dist/next/locations.d.ts +3 -3
  51. package/dist/next/locations.js +3 -3
  52. package/dist/next/locations.js.map +1 -1
  53. package/dist/next/middleware.cjs.map +1 -1
  54. package/dist/next/middleware.d.cts +2 -2
  55. package/dist/next/middleware.d.ts +2 -2
  56. package/dist/next/middleware.js.map +1 -1
  57. package/dist/next/site-root-server.cjs +115 -3
  58. package/dist/next/site-root-server.cjs.map +1 -1
  59. package/dist/next/site-root-server.d.cts +1 -1
  60. package/dist/next/site-root-server.d.ts +1 -1
  61. package/dist/next/site-root-server.js +3 -3
  62. package/dist/next/site-root-server.js.map +1 -1
  63. package/dist/next.cjs +115 -3
  64. package/dist/next.cjs.map +1 -1
  65. package/dist/next.d.cts +3 -3
  66. package/dist/next.d.ts +3 -3
  67. package/dist/next.js +3 -3
  68. package/dist/react.cjs +115 -3
  69. package/dist/react.cjs.map +1 -1
  70. package/dist/react.d.cts +2 -2
  71. package/dist/react.d.ts +2 -2
  72. package/dist/react.js +2 -2
  73. package/dist/{site-config-BN6Z2zIf.d.cts → site-config-CZl4PIbg.d.cts} +1 -1
  74. package/dist/{site-config-BEaYpZ3X.d.ts → site-config-Cq5K8hUp.d.ts} +1 -1
  75. package/dist/{track-page-view-B3OwUOYl.d.ts → track-page-view-BSlE0yI9.d.ts} +1 -1
  76. package/dist/{track-page-view-BeVjC-pV.d.cts → track-page-view-M9y_5WqT.d.cts} +1 -1
  77. package/dist/{types-uwXEaMD6.d.ts → types-DH_8sBu9.d.cts} +6 -0
  78. package/dist/{types-uwXEaMD6.d.cts → types-DH_8sBu9.d.ts} +6 -0
  79. package/dist/{utils-6a6lNKsg.d.ts → utils-C2JRomti.d.ts} +1 -1
  80. package/dist/{utils-Cbb3CO3i.d.cts → utils-JfjoqC-z.d.cts} +1 -1
  81. package/package.json +2 -1
  82. package/dist/chunk-XAEWXWSP.js.map +0 -1
  83. /package/dist/{chunk-M66PHSBO.js.map → chunk-34LFIP3R.js.map} +0 -0
  84. /package/dist/{chunk-BXPMVR7M.js.map → chunk-BRLCGVFJ.js.map} +0 -0
  85. /package/dist/{chunk-OCIOQIE4.js.map → chunk-IY6Y636W.js.map} +0 -0
  86. /package/dist/{chunk-JJ3JP3RV.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 (Content → Contact, admin)
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 (Content → Contact, admin)
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-BXPMVR7M.js";
6
+ } from "../chunk-BRLCGVFJ.js";
7
7
  import {
8
8
  JmpGoogleTag
9
9
  } from "../chunk-2KAGOVRZ.js";
10
- import "../chunk-JJ3JP3RV.js";
10
+ import "../chunk-VSZRQSUN.js";
11
11
  import {
12
12
  getJmpSiteProfile
13
- } from "../chunk-XAEWXWSP.js";
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 (Content → Contact, admin)\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":[]}
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.39";
98
+ var version = "0.1.40";
99
99
 
100
100
  // src/constants.ts
101
101
  var JMP_ANALYTICS_SDK_VERSION = version;
@@ -1148,7 +1148,50 @@ function normalizeManifestDefaults(defaults) {
1148
1148
  function normalizeContact(contact) {
1149
1149
  if (!contact || typeof contact !== "object") return null;
1150
1150
  const extras = normalizeContactExtras(contact.extras);
1151
- return extras.length > 0 ? { extras } : null;
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;
1152
1195
  }
1153
1196
  function normalizeContactExtras(extras) {
1154
1197
  if (!Array.isArray(extras)) return [];
@@ -1178,7 +1221,7 @@ function inferWrapperSlotsFromManifest(manifest) {
1178
1221
  slots.add(`trust.${block.section}`);
1179
1222
  slots.add("trust");
1180
1223
  }
1181
- if (manifest?.contact?.extras?.length) {
1224
+ if (manifest?.contact?.extras?.length || manifest?.contact?.leadInbox) {
1182
1225
  slots.add("contact");
1183
1226
  }
1184
1227
  return [...slots];
@@ -1406,6 +1449,75 @@ function getOrCreateJmpAnalyticsForNextApp(overrides) {
1406
1449
  });
1407
1450
  }
1408
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
+
1409
1521
  // src/react.tsx
1410
1522
  var import_react = require("react");
1411
1523
  var import_jsx_runtime = require("react/jsx-runtime");