@jmp-technologies/analytics 0.1.39 → 0.1.41

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-XAEWXWSP.js → chunk-5SXVGQVW.js} +182 -4
  22. package/dist/chunk-5SXVGQVW.js.map +1 -0
  23. package/dist/{chunk-BXPMVR7M.js → chunk-GCEIT2ON.js} +2 -2
  24. package/dist/{chunk-OCIOQIE4.js → chunk-L6IUBEUV.js} +2 -2
  25. package/dist/{chunk-JJ3JP3RV.js → chunk-MEG7QGRF.js} +2 -2
  26. package/dist/{chunk-M66PHSBO.js → chunk-QSKTA7JD.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-BXPMVR7M.js.map → chunk-GCEIT2ON.js.map} +0 -0
  84. /package/dist/{chunk-OCIOQIE4.js.map → chunk-L6IUBEUV.js.map} +0 -0
  85. /package/dist/{chunk-JJ3JP3RV.js.map → chunk-MEG7QGRF.js.map} +0 -0
  86. /package/dist/{chunk-M66PHSBO.js.map → chunk-QSKTA7JD.js.map} +0 -0
package/dist/index.cjs CHANGED
@@ -20,12 +20,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ AI_CRAWLER_ROBOTS_USER_AGENTS: () => AI_CRAWLER_ROBOTS_USER_AGENTS,
23
24
  BOOKING_LINK_HOSTS: () => BOOKING_LINK_HOSTS,
24
25
  DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS: () => DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS,
26
+ JMP_AI_CRAWLER_WAF_USER_AGENTS: () => JMP_AI_CRAWLER_WAF_USER_AGENTS,
25
27
  JMP_ANALYTICS_SDK_VERSION: () => JMP_ANALYTICS_SDK_VERSION,
26
28
  JMP_CONTENT_CACHE_TAG: () => JMP_CONTENT_CACHE_TAG,
27
29
  JMP_CONTENT_REVALIDATE_SECONDS: () => JMP_CONTENT_REVALIDATE_SECONDS,
28
30
  JMP_TRACKING_CONSENT_STORAGE_KEY: () => JMP_TRACKING_CONSENT_STORAGE_KEY,
31
+ buildAiCrawlerRobotsTxt: () => buildAiCrawlerRobotsTxt,
29
32
  buildLandingCaptureInlineScript: () => buildLandingCaptureInlineScript,
30
33
  classifyContactHref: () => classifyContactHref,
31
34
  createJmpAnalytics: () => createJmpAnalytics,
@@ -58,7 +61,10 @@ __export(index_exports, {
58
61
  isJmpBrowserAnalyticsEnvConfigured: () => isJmpBrowserAnalyticsEnvConfigured,
59
62
  isJmpServerContentEnvConfigured: () => isJmpServerContentEnvConfigured,
60
63
  isJmpTrackingConsentGranted: () => isJmpTrackingConsentGranted,
64
+ jmpAiCrawlerVercelWafRoute: () => jmpAiCrawlerVercelWafRoute,
65
+ jmpAiCrawlerWafUserAgentPattern: () => jmpAiCrawlerWafUserAgentPattern,
61
66
  markContentWrapper: () => markContentWrapper,
67
+ mergeJmpRobotsTxt: () => mergeJmpRobotsTxt,
62
68
  normalizeJmpContentManifest: () => normalizeJmpContentManifest,
63
69
  readJmpPublicEnvFromProcess: () => readJmpPublicEnvFromProcess,
64
70
  registerJmpContentWrappers: () => registerJmpContentWrappers,
@@ -352,7 +358,7 @@ function extractMailtoTarget(href) {
352
358
  }
353
359
 
354
360
  // package.json
355
- var version = "0.1.39";
361
+ var version = "0.1.41";
356
362
 
357
363
  // src/constants.ts
358
364
  var JMP_ANALYTICS_SDK_VERSION = version;
@@ -1252,7 +1258,50 @@ function normalizeManifestDefaults(defaults) {
1252
1258
  function normalizeContact(contact) {
1253
1259
  if (!contact || typeof contact !== "object") return null;
1254
1260
  const extras = normalizeContactExtras(contact.extras);
1255
- return extras.length > 0 ? { extras } : null;
1261
+ const leadInbox = normalizeLeadInbox(contact.leadInbox);
1262
+ if (extras.length === 0 && !leadInbox) return null;
1263
+ return {
1264
+ ...extras.length > 0 ? { extras } : {},
1265
+ ...leadInbox ? { leadInbox } : {}
1266
+ };
1267
+ }
1268
+ function normalizeLeadInbox(raw) {
1269
+ if (!raw || typeof raw !== "object") return null;
1270
+ const list = normalizeInboxKeyList(raw.list, 8);
1271
+ const detail = normalizeInboxKeyList(raw.detail, 24);
1272
+ const labels = normalizeInboxLabels(raw.labels);
1273
+ if (!list && !detail && !labels) return null;
1274
+ return {
1275
+ ...list ? { list } : {},
1276
+ ...detail ? { detail } : {},
1277
+ ...labels ? { labels } : {}
1278
+ };
1279
+ }
1280
+ function normalizeInboxKeyList(raw, max) {
1281
+ if (!Array.isArray(raw)) return void 0;
1282
+ const seen = /* @__PURE__ */ new Set();
1283
+ const out = [];
1284
+ for (const item of raw) {
1285
+ if (typeof item !== "string" || out.length >= max) continue;
1286
+ const key = item.trim();
1287
+ const token = key.replace(/[^a-zA-Z0-9]+/g, "").toLowerCase();
1288
+ if (!key || !token || seen.has(token)) continue;
1289
+ seen.add(token);
1290
+ out.push(key);
1291
+ }
1292
+ return out.length > 0 ? out : void 0;
1293
+ }
1294
+ function normalizeInboxLabels(raw) {
1295
+ if (!raw || typeof raw !== "object") return void 0;
1296
+ const out = {};
1297
+ for (const [key, value] of Object.entries(raw)) {
1298
+ if (typeof value !== "string") continue;
1299
+ const label = value.trim().slice(0, 60);
1300
+ const token = key.trim();
1301
+ if (!token || !label) continue;
1302
+ out[token] = label;
1303
+ }
1304
+ return Object.keys(out).length > 0 ? out : void 0;
1256
1305
  }
1257
1306
  function normalizeContactExtras(extras) {
1258
1307
  if (!Array.isArray(extras)) return [];
@@ -1282,7 +1331,7 @@ function inferWrapperSlotsFromManifest(manifest) {
1282
1331
  slots.add(`trust.${block.section}`);
1283
1332
  slots.add("trust");
1284
1333
  }
1285
- if (manifest?.contact?.extras?.length) {
1334
+ if (manifest?.contact?.extras?.length || manifest?.contact?.leadInbox) {
1286
1335
  slots.add("contact");
1287
1336
  }
1288
1337
  return [...slots];
@@ -1828,6 +1877,135 @@ async function registerJmpContentWrappers(config) {
1828
1877
  }
1829
1878
  setContentWrapperSyncHandler(registerJmpContentWrappers);
1830
1879
 
1880
+ // ai-crawler-agents.json
1881
+ var ai_crawler_agents_default = {
1882
+ robotsUserAgents: [
1883
+ "GPTBot",
1884
+ "ChatGPT-User",
1885
+ "OAI-SearchBot",
1886
+ "OAI-AdsBot",
1887
+ "ClaudeBot",
1888
+ "Claude-User",
1889
+ "Claude-SearchBot",
1890
+ "Claude-Web",
1891
+ "PerplexityBot",
1892
+ "Perplexity-User",
1893
+ "Google-Extended",
1894
+ "GoogleOther",
1895
+ "GoogleOther-Image",
1896
+ "GoogleOther-Video",
1897
+ "Google-CloudVertexBot",
1898
+ "Meta-ExternalAgent",
1899
+ "Meta-ExternalFetcher",
1900
+ "FacebookBot",
1901
+ "Applebot",
1902
+ "Applebot-Extended",
1903
+ "CCBot",
1904
+ "Bytespider",
1905
+ "cohere-ai",
1906
+ "cohere-training-data-crawler",
1907
+ "YouBot",
1908
+ "MistralAI-User",
1909
+ "GrokBot",
1910
+ "Grok-DeepSearch",
1911
+ "xAI-Grok",
1912
+ "xAI-Bot"
1913
+ ],
1914
+ wafUserAgents: [
1915
+ "GPTBot",
1916
+ "ChatGPT-User",
1917
+ "OAI-SearchBot",
1918
+ "OAI-AdsBot",
1919
+ "ClaudeBot",
1920
+ "Claude-User",
1921
+ "Claude-SearchBot",
1922
+ "Claude-Web",
1923
+ "PerplexityBot",
1924
+ "Perplexity-User",
1925
+ "Google-Extended",
1926
+ "GoogleOther",
1927
+ "Google-CloudVertexBot",
1928
+ "Meta-ExternalAgent",
1929
+ "Meta-ExternalFetcher",
1930
+ "FacebookBot",
1931
+ "Applebot-Extended",
1932
+ "CCBot",
1933
+ "Bytespider",
1934
+ "cohere-ai",
1935
+ "cohere-training-data-crawler",
1936
+ "YouBot",
1937
+ "MistralAI-User",
1938
+ "GrokBot",
1939
+ "Grok-DeepSearch",
1940
+ "xAI-Grok",
1941
+ "xAI-Bot"
1942
+ ]
1943
+ };
1944
+
1945
+ // src/ai-crawlers.ts
1946
+ var AI_CRAWLER_ROBOTS_USER_AGENTS = ai_crawler_agents_default.robotsUserAgents;
1947
+ var JMP_AI_CRAWLER_WAF_USER_AGENTS = ai_crawler_agents_default.wafUserAgents;
1948
+ function buildAiCrawlerRobotsTxt(blockAiCrawlers) {
1949
+ if (!blockAiCrawlers) {
1950
+ return [
1951
+ "# JMP AI crawler policy",
1952
+ "# AI crawler blocking is disabled for this website.",
1953
+ ""
1954
+ ].join("\n");
1955
+ }
1956
+ return [
1957
+ "# JMP AI crawler policy",
1958
+ "# Blocks known AI training, answer, and fetch bots that honor robots.txt.",
1959
+ ...AI_CRAWLER_ROBOTS_USER_AGENTS.flatMap((agent) => [
1960
+ `User-agent: ${agent}`,
1961
+ "Disallow: /",
1962
+ ""
1963
+ ])
1964
+ ].join("\n");
1965
+ }
1966
+ function jmpAiCrawlerWafUserAgentPattern() {
1967
+ return JMP_AI_CRAWLER_WAF_USER_AGENTS.map(escapeRegExp).join("|");
1968
+ }
1969
+ function jmpAiCrawlerVercelWafRoute() {
1970
+ return {
1971
+ src: "/(.*)",
1972
+ has: [
1973
+ {
1974
+ type: "header",
1975
+ key: "user-agent",
1976
+ value: `(?i).*(${jmpAiCrawlerWafUserAgentPattern()}).*`
1977
+ }
1978
+ ],
1979
+ mitigate: { action: "deny" }
1980
+ };
1981
+ }
1982
+ function mergeJmpRobotsTxt(jmpBody, options) {
1983
+ const trimmed = jmpBody.trim();
1984
+ const sitemapLine = `Sitemap: ${options.siteUrl.replace(/\/$/, "")}/sitemap.xml`;
1985
+ const hasSitemap = /(?:^|\n)\s*Sitemap:/i.test(trimmed);
1986
+ const prefixes = options.privatePathPrefixes ?? [];
1987
+ const missingDisallows = prefixes.filter(
1988
+ (prefix) => !trimmed.includes(`Disallow: ${prefix}`)
1989
+ );
1990
+ const parts = [trimmed];
1991
+ if (options.ensureAiCrawlerDisallows && !/User-agent:\s*GPTBot/i.test(trimmed)) {
1992
+ parts.unshift(buildAiCrawlerRobotsTxt(true).trim());
1993
+ }
1994
+ if (missingDisallows.length > 0) {
1995
+ const lines = prefixes.map((prefix) => `Disallow: ${prefix}`);
1996
+ parts.push(`User-agent: *
1997
+ ${lines.join("\n")}`);
1998
+ }
1999
+ if (!hasSitemap) {
2000
+ parts.push(sitemapLine);
2001
+ }
2002
+ return `${parts.join("\n\n")}
2003
+ `;
2004
+ }
2005
+ function escapeRegExp(value) {
2006
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
2007
+ }
2008
+
1831
2009
  // src/content/client.ts
1832
2010
  function createJmpContentClient(config) {
1833
2011
  return {
@@ -1893,12 +2071,15 @@ function createJmpContentClientFromServerEnv(overrides) {
1893
2071
  }
1894
2072
  // Annotate the CommonJS export names for ESM import in node:
1895
2073
  0 && (module.exports = {
2074
+ AI_CRAWLER_ROBOTS_USER_AGENTS,
1896
2075
  BOOKING_LINK_HOSTS,
1897
2076
  DEFAULT_JMP_BROWSER_PAGE_VIEW_DEDUPE_MS,
2077
+ JMP_AI_CRAWLER_WAF_USER_AGENTS,
1898
2078
  JMP_ANALYTICS_SDK_VERSION,
1899
2079
  JMP_CONTENT_CACHE_TAG,
1900
2080
  JMP_CONTENT_REVALIDATE_SECONDS,
1901
2081
  JMP_TRACKING_CONSENT_STORAGE_KEY,
2082
+ buildAiCrawlerRobotsTxt,
1902
2083
  buildLandingCaptureInlineScript,
1903
2084
  classifyContactHref,
1904
2085
  createJmpAnalytics,
@@ -1931,7 +2112,10 @@ function createJmpContentClientFromServerEnv(overrides) {
1931
2112
  isJmpBrowserAnalyticsEnvConfigured,
1932
2113
  isJmpServerContentEnvConfigured,
1933
2114
  isJmpTrackingConsentGranted,
2115
+ jmpAiCrawlerVercelWafRoute,
2116
+ jmpAiCrawlerWafUserAgentPattern,
1934
2117
  markContentWrapper,
2118
+ mergeJmpRobotsTxt,
1935
2119
  normalizeJmpContentManifest,
1936
2120
  readJmpPublicEnvFromProcess,
1937
2121
  registerJmpContentWrappers,