@bagelink/blox 1.18.11 → 1.19.2

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.
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Provider-neutral browser attribution capture for Blox marketing sites.
3
+ *
4
+ * Campaign context is stored in one first-party cookie for 90 days. A visit
5
+ * carrying any campaign parameter replaces the previous snapshot; ordinary
6
+ * navigation retains it. Runtime fields (form page, device, browser, consent)
7
+ * are derived again whenever a form request is sent.
8
+ */
9
+ export declare const ATTRIBUTION_CAMPAIGN_KEYS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content", "gclid", "gbraid", "wbraid", "fbclid", "msclkid", "ttclid", "li_fat_id"];
10
+ export interface AttributionSnapshot {
11
+ utm_source: string;
12
+ utm_medium: string;
13
+ utm_campaign: string;
14
+ utm_term: string;
15
+ utm_content: string;
16
+ gclid: string;
17
+ gbraid: string;
18
+ wbraid: string;
19
+ fbclid: string;
20
+ msclkid: string;
21
+ ttclid: string;
22
+ li_fat_id: string;
23
+ fbp: string;
24
+ fbc: string;
25
+ ga_client_id: string;
26
+ ga_session_id: string;
27
+ landing_page: string;
28
+ referrer: string;
29
+ form_page: string;
30
+ device_type: string;
31
+ device_os: string;
32
+ browser: string;
33
+ user_agent_raw: string;
34
+ in_app_source: string;
35
+ ad_consent: string;
36
+ }
37
+ export interface AttributionBrowser {
38
+ href: string;
39
+ search: string;
40
+ referrer: string;
41
+ userAgent: string;
42
+ cookie: string;
43
+ now: () => number;
44
+ writeCookie: (value: string) => void;
45
+ adConsent?: () => string;
46
+ }
47
+ export interface AttributionOptions {
48
+ cookieName?: string;
49
+ maxAgeSeconds?: number;
50
+ browser?: AttributionBrowser;
51
+ }
52
+ /** Capture or read attribution and return a complete, empty-string-safe wire object. */
53
+ export declare function captureAttribution(options?: AttributionOptions): AttributionSnapshot;
54
+ //# sourceMappingURL=attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/analytics/attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,yBAAyB,2JAG5B,CAAA;AAEV,MAAM,WAAW,mBAAmB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;CAClB;AASD,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,SAAS,CAAC,EAAE,MAAM,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,kBAAkB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAC5B;AAsGD,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,kBAAuB,GAAG,mBAAmB,CAqDxF"}
package/dist/index.cjs CHANGED
@@ -431,6 +431,179 @@ function createBloxApp(options) {
431
431
  });
432
432
  return { app, router, blox };
433
433
  }
434
+ const ATTRIBUTION_CAMPAIGN_KEYS = [
435
+ "utm_source",
436
+ "utm_medium",
437
+ "utm_campaign",
438
+ "utm_term",
439
+ "utm_content",
440
+ "gclid",
441
+ "gbraid",
442
+ "wbraid",
443
+ "fbclid",
444
+ "msclkid",
445
+ "ttclid",
446
+ "li_fat_id"
447
+ ];
448
+ const DEFAULT_COOKIE = "blox_attribution";
449
+ const DEFAULT_MAX_AGE = 60 * 60 * 24 * 90;
450
+ const empty = () => ({
451
+ utm_source: "",
452
+ utm_medium: "",
453
+ utm_campaign: "",
454
+ utm_term: "",
455
+ utm_content: "",
456
+ gclid: "",
457
+ gbraid: "",
458
+ wbraid: "",
459
+ fbclid: "",
460
+ msclkid: "",
461
+ ttclid: "",
462
+ li_fat_id: "",
463
+ fbp: "",
464
+ fbc: "",
465
+ ga_client_id: "",
466
+ ga_session_id: "",
467
+ landing_page: "",
468
+ referrer: "",
469
+ form_page: "",
470
+ device_type: "",
471
+ device_os: "",
472
+ browser: "",
473
+ user_agent_raw: "",
474
+ in_app_source: "",
475
+ ad_consent: ""
476
+ });
477
+ function cookieMap(raw) {
478
+ return new Map(raw.split(";").flatMap((item) => {
479
+ const [name, ...parts] = item.trim().split("=");
480
+ return name ? [[name, decodeURIComponent(parts.join("="))]] : [];
481
+ }));
482
+ }
483
+ function defaultAdConsent() {
484
+ var _a, _b;
485
+ const target = globalThis;
486
+ const marketing = (_b = (_a = target.Cookiebot) == null ? void 0 : _a.consent) == null ? void 0 : _b.marketing;
487
+ return marketing === true ? "granted" : marketing === false ? "denied" : "";
488
+ }
489
+ function browser() {
490
+ if (typeof window === "undefined" || typeof document === "undefined") return void 0;
491
+ return {
492
+ href: window.location.href,
493
+ search: window.location.search,
494
+ referrer: document.referrer,
495
+ userAgent: navigator.userAgent,
496
+ cookie: document.cookie,
497
+ now: () => Date.now(),
498
+ writeCookie: (value) => {
499
+ document.cookie = value;
500
+ },
501
+ adConsent: defaultAdConsent
502
+ };
503
+ }
504
+ function readStored(cookies, name) {
505
+ try {
506
+ const parsed = JSON.parse(cookies.get(name) ?? "");
507
+ return parsed && typeof parsed === "object" && typeof parsed.captured_at === "number" ? parsed : void 0;
508
+ } catch {
509
+ return void 0;
510
+ }
511
+ }
512
+ function googleClickId(value) {
513
+ const parts = value.split(".");
514
+ return parts[0] === "GCL" && parts.length >= 3 ? parts.slice(2).join(".") : "";
515
+ }
516
+ function gaClientId(value) {
517
+ var _a;
518
+ const parts = value.split(".");
519
+ return parts.length >= 4 && ((_a = parts[0]) == null ? void 0 : _a.startsWith("GA")) ? parts.slice(-2).join(".") : "";
520
+ }
521
+ function gaSessionId(value) {
522
+ var _a;
523
+ if (value.startsWith("GS1")) return value.split(".")[2] ?? "";
524
+ if (value.startsWith("GS2")) return ((_a = value.match(/(?:^|\.)s(\d+)(?:\$|$)/)) == null ? void 0 : _a[1]) ?? "";
525
+ return "";
526
+ }
527
+ function deviceType(ua) {
528
+ if (/iPad|Tablet|Android(?!.*Mobile)/i.test(ua)) return "tablet";
529
+ if (/Mobi|Android|iPhone|iPod/i.test(ua)) return "mobile";
530
+ return "desktop";
531
+ }
532
+ function operatingSystem(ua) {
533
+ if (/iPhone|iPad|iPod/i.test(ua)) return "iOS";
534
+ if (/Android/i.test(ua)) return "Android";
535
+ if (/Windows/i.test(ua)) return "Windows";
536
+ if (/Macintosh|Mac OS X/i.test(ua)) return "macOS";
537
+ if (/Linux/i.test(ua)) return "Linux";
538
+ return "";
539
+ }
540
+ function browserName(ua) {
541
+ if (/SamsungBrowser/i.test(ua)) return "Samsung Internet";
542
+ if (/Edg\//i.test(ua)) return "Edge";
543
+ if (/CriOS|Chrome\//i.test(ua)) return "Chrome";
544
+ if (/FxiOS|Firefox\//i.test(ua)) return "Firefox";
545
+ if (/Safari\//i.test(ua)) return "Safari";
546
+ return "";
547
+ }
548
+ function inAppSource(ua) {
549
+ if (/Instagram/i.test(ua)) return "instagram";
550
+ if (/FBAN|FBAV/i.test(ua)) return "facebook";
551
+ if (/TikTok|BytedanceWebview|musical_ly/i.test(ua)) return "tiktok";
552
+ return "";
553
+ }
554
+ function captureAttribution(options = {}) {
555
+ var _a, _b;
556
+ const env = options.browser ?? browser();
557
+ if (!env) return empty();
558
+ const cookieName = options.cookieName ?? DEFAULT_COOKIE;
559
+ const maxAge = options.maxAgeSeconds ?? DEFAULT_MAX_AGE;
560
+ const cookies = cookieMap(env.cookie);
561
+ const params = new URLSearchParams(env.search);
562
+ const incoming = Object.fromEntries(ATTRIBUTION_CAMPAIGN_KEYS.flatMap((key) => {
563
+ var _a2;
564
+ const value = (_a2 = params.get(key)) == null ? void 0 : _a2.trim();
565
+ return value ? [[key, value]] : [];
566
+ }));
567
+ const startsCampaign = Object.keys(incoming).length > 0;
568
+ let stored = readStored(cookies, cookieName);
569
+ if (!stored || startsCampaign) {
570
+ stored = {
571
+ captured_at: env.now(),
572
+ landing_page: env.href,
573
+ referrer: env.referrer,
574
+ campaign: incoming
575
+ };
576
+ const secure = env.href.startsWith("https:") ? "; Secure" : "";
577
+ env.writeCookie(
578
+ `${cookieName}=${encodeURIComponent(JSON.stringify(stored))}; Path=/; Max-Age=${maxAge}; SameSite=Lax${secure}`
579
+ );
580
+ }
581
+ const campaign = stored.campaign;
582
+ const gclid = campaign.gclid || googleClickId(cookies.get("_gcl_aw") ?? "");
583
+ const fbclid = campaign.fbclid ?? "";
584
+ const fbp = cookies.get("_fbp") ?? "";
585
+ const fbc = cookies.get("_fbc") || (fbclid ? `fb.1.${env.now()}.${fbclid}` : "");
586
+ const gaCookie = ((_a = [...cookies.entries()].find(([key]) => /^_ga_[A-Z0-9]+$/.test(key))) == null ? void 0 : _a[1]) ?? "";
587
+ return {
588
+ ...empty(),
589
+ ...campaign,
590
+ gclid,
591
+ fbclid,
592
+ fbp,
593
+ fbc,
594
+ ga_client_id: gaClientId(cookies.get("_ga") ?? ""),
595
+ ga_session_id: gaSessionId(gaCookie),
596
+ landing_page: stored.landing_page,
597
+ referrer: stored.referrer,
598
+ form_page: env.href,
599
+ device_type: deviceType(env.userAgent),
600
+ device_os: operatingSystem(env.userAgent),
601
+ browser: browserName(env.userAgent),
602
+ user_agent_raw: env.userAgent,
603
+ in_app_source: inAppSource(env.userAgent),
604
+ ad_consent: ((_b = env.adConsent) == null ? void 0 : _b.call(env)) ?? ""
605
+ };
606
+ }
434
607
  function defineBloxSite(config) {
435
608
  return config;
436
609
  }
@@ -559,8 +732,10 @@ exports.readBloxHydration = ssg_client.readBloxHydration;
559
732
  exports.getPageSlugMap = localeStrategy.getPageSlugMap;
560
733
  exports.localizePageSlug = localeStrategy.localizePageSlug;
561
734
  exports.setPageSlugMap = localeStrategy.setPageSlugMap;
735
+ exports.ATTRIBUTION_CAMPAIGN_KEYS = ATTRIBUTION_CAMPAIGN_KEYS;
562
736
  exports.BloxRouterView = _sfc_main;
563
737
  exports.buildBloxManifest = buildBloxManifest;
738
+ exports.captureAttribution = captureAttribution;
564
739
  exports.createBloxApp = createBloxApp;
565
740
  exports.defineBlock = defineBlock;
566
741
  exports.defineBloxSite = defineBloxSite;
package/dist/index.d.ts CHANGED
@@ -27,6 +27,8 @@ export { createBloxApp, injectPlausible } from './createBloxApp';
27
27
  export type { BloxAppResult, CreateBloxAppOptions, PlausibleOptions } from './createBloxApp';
28
28
  export { injectGtm, installGtm, isGtmInstalled } from './analytics/gtm';
29
29
  export type { GtmOptions, GtmStrategy } from './analytics/gtm';
30
+ export { ATTRIBUTION_CAMPAIGN_KEYS, captureAttribution } from './analytics/attribution';
31
+ export type { AttributionBrowser, AttributionOptions, AttributionSnapshot, } from './analytics/attribution';
30
32
  export { defineBloxSite } from './siteConfig';
31
33
  export type { BloxSiteConfig } from './siteConfig';
32
34
  export { defineBlock } from './defineBlock';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACzL,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKlF,YAAY,EACX,cAAc,EACd,KAAK,EAEL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,cAAc,EACd,QAAQ,EACR,eAAe,EACf,cAAc,EACd,WAAW,GACX,MAAM,aAAa,CAAA;AAIpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACtD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAI9E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAK3E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACjH,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAK7D,OAAO,EACN,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACX,cAAc,GACd,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAK5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAKxD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAKlD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAEnG,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAKjD,OAAO,EACN,aAAa,EACb,aAAa,EACb,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,iBAAiB,GACjB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAEhG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAK1E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKlE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAI5E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC/H,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAClG,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACzL,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKlF,YAAY,EACX,cAAc,EACd,KAAK,EAEL,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,cAAc,EACd,QAAQ,EACR,eAAe,EACf,cAAc,EACd,WAAW,GACX,MAAM,aAAa,CAAA;AAIpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACtD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAI9E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAK3E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAKjD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACjH,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAK7D,OAAO,EACN,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACX,cAAc,GACd,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAK5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAKxD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACvF,YAAY,EACX,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAKlD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAEnG,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAKjD,OAAO,EACN,aAAa,EACb,aAAa,EACb,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,iBAAiB,GACjB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAEhG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAK1E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKlE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAI5E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC/H,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAClG,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA"}
package/dist/index.mjs CHANGED
@@ -432,6 +432,179 @@ function createBloxApp(options) {
432
432
  });
433
433
  return { app, router, blox };
434
434
  }
435
+ const ATTRIBUTION_CAMPAIGN_KEYS = [
436
+ "utm_source",
437
+ "utm_medium",
438
+ "utm_campaign",
439
+ "utm_term",
440
+ "utm_content",
441
+ "gclid",
442
+ "gbraid",
443
+ "wbraid",
444
+ "fbclid",
445
+ "msclkid",
446
+ "ttclid",
447
+ "li_fat_id"
448
+ ];
449
+ const DEFAULT_COOKIE = "blox_attribution";
450
+ const DEFAULT_MAX_AGE = 60 * 60 * 24 * 90;
451
+ const empty = () => ({
452
+ utm_source: "",
453
+ utm_medium: "",
454
+ utm_campaign: "",
455
+ utm_term: "",
456
+ utm_content: "",
457
+ gclid: "",
458
+ gbraid: "",
459
+ wbraid: "",
460
+ fbclid: "",
461
+ msclkid: "",
462
+ ttclid: "",
463
+ li_fat_id: "",
464
+ fbp: "",
465
+ fbc: "",
466
+ ga_client_id: "",
467
+ ga_session_id: "",
468
+ landing_page: "",
469
+ referrer: "",
470
+ form_page: "",
471
+ device_type: "",
472
+ device_os: "",
473
+ browser: "",
474
+ user_agent_raw: "",
475
+ in_app_source: "",
476
+ ad_consent: ""
477
+ });
478
+ function cookieMap(raw) {
479
+ return new Map(raw.split(";").flatMap((item) => {
480
+ const [name, ...parts] = item.trim().split("=");
481
+ return name ? [[name, decodeURIComponent(parts.join("="))]] : [];
482
+ }));
483
+ }
484
+ function defaultAdConsent() {
485
+ var _a, _b;
486
+ const target = globalThis;
487
+ const marketing = (_b = (_a = target.Cookiebot) == null ? void 0 : _a.consent) == null ? void 0 : _b.marketing;
488
+ return marketing === true ? "granted" : marketing === false ? "denied" : "";
489
+ }
490
+ function browser() {
491
+ if (typeof window === "undefined" || typeof document === "undefined") return void 0;
492
+ return {
493
+ href: window.location.href,
494
+ search: window.location.search,
495
+ referrer: document.referrer,
496
+ userAgent: navigator.userAgent,
497
+ cookie: document.cookie,
498
+ now: () => Date.now(),
499
+ writeCookie: (value) => {
500
+ document.cookie = value;
501
+ },
502
+ adConsent: defaultAdConsent
503
+ };
504
+ }
505
+ function readStored(cookies, name) {
506
+ try {
507
+ const parsed = JSON.parse(cookies.get(name) ?? "");
508
+ return parsed && typeof parsed === "object" && typeof parsed.captured_at === "number" ? parsed : void 0;
509
+ } catch {
510
+ return void 0;
511
+ }
512
+ }
513
+ function googleClickId(value) {
514
+ const parts = value.split(".");
515
+ return parts[0] === "GCL" && parts.length >= 3 ? parts.slice(2).join(".") : "";
516
+ }
517
+ function gaClientId(value) {
518
+ var _a;
519
+ const parts = value.split(".");
520
+ return parts.length >= 4 && ((_a = parts[0]) == null ? void 0 : _a.startsWith("GA")) ? parts.slice(-2).join(".") : "";
521
+ }
522
+ function gaSessionId(value) {
523
+ var _a;
524
+ if (value.startsWith("GS1")) return value.split(".")[2] ?? "";
525
+ if (value.startsWith("GS2")) return ((_a = value.match(/(?:^|\.)s(\d+)(?:\$|$)/)) == null ? void 0 : _a[1]) ?? "";
526
+ return "";
527
+ }
528
+ function deviceType(ua) {
529
+ if (/iPad|Tablet|Android(?!.*Mobile)/i.test(ua)) return "tablet";
530
+ if (/Mobi|Android|iPhone|iPod/i.test(ua)) return "mobile";
531
+ return "desktop";
532
+ }
533
+ function operatingSystem(ua) {
534
+ if (/iPhone|iPad|iPod/i.test(ua)) return "iOS";
535
+ if (/Android/i.test(ua)) return "Android";
536
+ if (/Windows/i.test(ua)) return "Windows";
537
+ if (/Macintosh|Mac OS X/i.test(ua)) return "macOS";
538
+ if (/Linux/i.test(ua)) return "Linux";
539
+ return "";
540
+ }
541
+ function browserName(ua) {
542
+ if (/SamsungBrowser/i.test(ua)) return "Samsung Internet";
543
+ if (/Edg\//i.test(ua)) return "Edge";
544
+ if (/CriOS|Chrome\//i.test(ua)) return "Chrome";
545
+ if (/FxiOS|Firefox\//i.test(ua)) return "Firefox";
546
+ if (/Safari\//i.test(ua)) return "Safari";
547
+ return "";
548
+ }
549
+ function inAppSource(ua) {
550
+ if (/Instagram/i.test(ua)) return "instagram";
551
+ if (/FBAN|FBAV/i.test(ua)) return "facebook";
552
+ if (/TikTok|BytedanceWebview|musical_ly/i.test(ua)) return "tiktok";
553
+ return "";
554
+ }
555
+ function captureAttribution(options = {}) {
556
+ var _a, _b;
557
+ const env = options.browser ?? browser();
558
+ if (!env) return empty();
559
+ const cookieName = options.cookieName ?? DEFAULT_COOKIE;
560
+ const maxAge = options.maxAgeSeconds ?? DEFAULT_MAX_AGE;
561
+ const cookies = cookieMap(env.cookie);
562
+ const params = new URLSearchParams(env.search);
563
+ const incoming = Object.fromEntries(ATTRIBUTION_CAMPAIGN_KEYS.flatMap((key) => {
564
+ var _a2;
565
+ const value = (_a2 = params.get(key)) == null ? void 0 : _a2.trim();
566
+ return value ? [[key, value]] : [];
567
+ }));
568
+ const startsCampaign = Object.keys(incoming).length > 0;
569
+ let stored = readStored(cookies, cookieName);
570
+ if (!stored || startsCampaign) {
571
+ stored = {
572
+ captured_at: env.now(),
573
+ landing_page: env.href,
574
+ referrer: env.referrer,
575
+ campaign: incoming
576
+ };
577
+ const secure = env.href.startsWith("https:") ? "; Secure" : "";
578
+ env.writeCookie(
579
+ `${cookieName}=${encodeURIComponent(JSON.stringify(stored))}; Path=/; Max-Age=${maxAge}; SameSite=Lax${secure}`
580
+ );
581
+ }
582
+ const campaign = stored.campaign;
583
+ const gclid = campaign.gclid || googleClickId(cookies.get("_gcl_aw") ?? "");
584
+ const fbclid = campaign.fbclid ?? "";
585
+ const fbp = cookies.get("_fbp") ?? "";
586
+ const fbc = cookies.get("_fbc") || (fbclid ? `fb.1.${env.now()}.${fbclid}` : "");
587
+ const gaCookie = ((_a = [...cookies.entries()].find(([key]) => /^_ga_[A-Z0-9]+$/.test(key))) == null ? void 0 : _a[1]) ?? "";
588
+ return {
589
+ ...empty(),
590
+ ...campaign,
591
+ gclid,
592
+ fbclid,
593
+ fbp,
594
+ fbc,
595
+ ga_client_id: gaClientId(cookies.get("_ga") ?? ""),
596
+ ga_session_id: gaSessionId(gaCookie),
597
+ landing_page: stored.landing_page,
598
+ referrer: stored.referrer,
599
+ form_page: env.href,
600
+ device_type: deviceType(env.userAgent),
601
+ device_os: operatingSystem(env.userAgent),
602
+ browser: browserName(env.userAgent),
603
+ user_agent_raw: env.userAgent,
604
+ in_app_source: inAppSource(env.userAgent),
605
+ ad_consent: ((_b = env.adConsent) == null ? void 0 : _b.call(env)) ?? ""
606
+ };
607
+ }
435
608
  function defineBloxSite(config) {
436
609
  return config;
437
610
  }
@@ -501,6 +674,7 @@ function buildBloxManifest(blox) {
501
674
  return serializeRegistry(blox.getRegistry());
502
675
  }
503
676
  export {
677
+ ATTRIBUTION_CAMPAIGN_KEYS,
504
678
  _2 as AdminEditBar,
505
679
  t as BLOX_ADMIN_CONFIG_KEY,
506
680
  v as BLOX_CONFIG_KEY,
@@ -518,6 +692,7 @@ export {
518
692
  P as PreviewRenderer,
519
693
  D as applyLayoutChrome,
520
694
  buildBloxManifest,
695
+ captureAttribution,
521
696
  E as classifyLink,
522
697
  c as collectBloxData,
523
698
  a2 as collectBloxSeo,
package/dist/ssg/cli.mjs CHANGED
File without changes
package/package.json CHANGED
@@ -1,125 +1,126 @@
1
1
  {
2
- "name": "@bagelink/blox",
3
- "type": "module",
4
- "version": "1.18.11",
5
- "description": "Blox page builder library for drag-and-drop page building and static data management",
6
- "author": {
7
- "name": "Bagel Studio",
8
- "email": "info@bagelstudio.co.il",
9
- "url": "https://bagelstudio.co.il"
10
- },
11
- "license": "MIT",
12
- "homepage": "https://github.com/bageldb/bagelink/tree/master/packages/blox#readme",
13
- "repository": {
14
- "type": "git",
15
- "url": "git+https://github.com/bageldb/bagelink.git",
16
- "directory": "packages/blox"
17
- },
18
- "bugs": "https://github.com/bageldb/bagelink/issues",
19
- "keywords": [
20
- "blox",
21
- "page-builder",
22
- "preview",
23
- "external-preview",
24
- "cms",
25
- "vue",
26
- "component-library",
27
- "drag-and-drop",
28
- "static-pages"
29
- ],
30
- "bin": {
31
- "blox-ssg": "dist/ssg/cli.mjs"
32
- },
33
- "sideEffects": [
34
- "**/*.css",
35
- "**/*.vue"
36
- ],
37
- "exports": {
38
- "./package.json": "./package.json",
39
- "./vite": {
40
- "types": "./dist/vite-plugin.d.ts",
41
- "import": "./dist/vite-plugin.mjs"
42
- },
43
- ".": {
44
- "types": "./dist/index.d.ts",
45
- "require": "./dist/index.cjs",
46
- "import": "./dist/index.mjs"
47
- },
48
- "./ssg": {
49
- "types": "./dist/ssg/index.d.ts",
50
- "import": "./dist/ssg/index.mjs"
51
- },
52
- "./ssg/client": {
53
- "types": "./dist/ssg/client.d.ts",
54
- "import": "./dist/ssg/client.mjs"
55
- },
56
- "./ssg/build-grant": {
57
- "types": "./dist/ssg/build-grant.d.ts",
58
- "import": "./dist/ssg/build-grant.mjs"
59
- },
60
- "./style.css": "./dist/style.css",
61
- "./dist/style.css": "./dist/style.css"
62
- },
63
- "main": "./dist/index.cjs",
64
- "module": "./dist/index.mjs",
65
- "types": "./dist/index.d.ts",
66
- "typesVersions": {
67
- "*": {
68
- "*": [
69
- "./dist/*",
70
- "./dist/index.d.ts"
71
- ]
72
- }
73
- },
74
- "files": [
75
- "dist",
76
- "core",
77
- "components",
78
- "config",
79
- "ssg",
80
- "utils",
81
- "views",
82
- "setup.ts",
83
- "index.ts",
84
- "README.md"
85
- ],
86
- "publishConfig": {
87
- "access": "public"
88
- },
89
- "peerDependencies": {
90
- "@bagelink/vue": "*",
91
- "happy-dom": ">=14.0.0",
92
- "vite": ">=5.0.0",
93
- "vue": "^3.3.0",
94
- "vue-router": "^4.0.0"
95
- },
96
- "peerDependenciesMeta": {
97
- "happy-dom": {
98
- "optional": true
99
- },
100
- "vite": {
101
- "optional": true
102
- }
103
- },
104
- "devDependencies": {
105
- "@vitejs/plugin-vue": "^5.2.4",
106
- "@vue/tsconfig": "^0.7.0",
107
- "typescript": "^5.9.3",
108
- "vite": "^5.4.21",
109
- "vite-plugin-dts": "^4.5.4",
110
- "vite-tsconfig-paths": "^5.1.4",
111
- "vitest": "^3.2.7",
112
- "vue": "^3.5.43",
113
- "vue-router": "^4.6.4",
114
- "vue-tsc": "^2.2.12"
115
- },
116
- "dependencies": {
117
- "magic-string": "^0.30.21",
118
- "pinia": "^3.0.4"
119
- },
120
- "scripts": {
121
- "dev": "vite build --watch",
122
- "build": "vite build",
123
- "typecheck": "vue-tsc --noEmit"
124
- }
125
- }
2
+ "name": "@bagelink/blox",
3
+ "type": "module",
4
+ "version": "1.19.2",
5
+ "description": "Blox page builder library for drag-and-drop page building and static data management",
6
+ "author": {
7
+ "name": "Bagel Studio",
8
+ "email": "info@bagelstudio.co.il",
9
+ "url": "https://bagelstudio.co.il"
10
+ },
11
+ "license": "MIT",
12
+ "homepage": "https://github.com/bageldb/bagelink/tree/master/packages/blox#readme",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/bageldb/bagelink.git",
16
+ "directory": "packages/blox"
17
+ },
18
+ "bugs": "https://github.com/bageldb/bagelink/issues",
19
+ "keywords": [
20
+ "blox",
21
+ "page-builder",
22
+ "preview",
23
+ "external-preview",
24
+ "cms",
25
+ "vue",
26
+ "component-library",
27
+ "drag-and-drop",
28
+ "static-pages"
29
+ ],
30
+ "bin": {
31
+ "blox-ssg": "dist/ssg/cli.mjs"
32
+ },
33
+ "sideEffects": [
34
+ "**/*.css",
35
+ "**/*.vue"
36
+ ],
37
+ "exports": {
38
+ "./package.json": "./package.json",
39
+ "./vite": {
40
+ "types": "./dist/vite-plugin.d.ts",
41
+ "import": "./dist/vite-plugin.mjs"
42
+ },
43
+ ".": {
44
+ "types": "./dist/index.d.ts",
45
+ "require": "./dist/index.cjs",
46
+ "import": "./dist/index.mjs"
47
+ },
48
+ "./ssg": {
49
+ "types": "./dist/ssg/index.d.ts",
50
+ "import": "./dist/ssg/index.mjs"
51
+ },
52
+ "./ssg/client": {
53
+ "types": "./dist/ssg/client.d.ts",
54
+ "import": "./dist/ssg/client.mjs"
55
+ },
56
+ "./ssg/build-grant": {
57
+ "types": "./dist/ssg/build-grant.d.ts",
58
+ "import": "./dist/ssg/build-grant.mjs"
59
+ },
60
+ "./style.css": "./dist/style.css",
61
+ "./dist/style.css": "./dist/style.css"
62
+ },
63
+ "main": "./dist/index.cjs",
64
+ "module": "./dist/index.mjs",
65
+ "types": "./dist/index.d.ts",
66
+ "typesVersions": {
67
+ "*": {
68
+ "*": [
69
+ "./dist/*",
70
+ "./dist/index.d.ts"
71
+ ]
72
+ }
73
+ },
74
+ "files": [
75
+ "dist",
76
+ "core",
77
+ "components",
78
+ "config",
79
+ "ssg",
80
+ "utils",
81
+ "views",
82
+ "setup.ts",
83
+ "index.ts",
84
+ "README.md"
85
+ ],
86
+ "scripts": {
87
+ "prepublishOnly": "pnpm build",
88
+ "dev": "vite build --watch",
89
+ "build": "vite build",
90
+ "typecheck": "vue-tsc --noEmit"
91
+ },
92
+ "publishConfig": {
93
+ "access": "public"
94
+ },
95
+ "peerDependencies": {
96
+ "@bagelink/vue": "*",
97
+ "happy-dom": ">=14.0.0",
98
+ "vite": ">=5.0.0",
99
+ "vue": "^3.3.0",
100
+ "vue-router": "^4.0.0"
101
+ },
102
+ "peerDependenciesMeta": {
103
+ "happy-dom": {
104
+ "optional": true
105
+ },
106
+ "vite": {
107
+ "optional": true
108
+ }
109
+ },
110
+ "devDependencies": {
111
+ "@vitejs/plugin-vue": "^5.2.4",
112
+ "@vue/tsconfig": "^0.7.0",
113
+ "typescript": "^5.9.3",
114
+ "vite": "^5.4.21",
115
+ "vite-plugin-dts": "^4.5.4",
116
+ "vite-tsconfig-paths": "^5.1.4",
117
+ "vitest": "^3.2.7",
118
+ "vue": "^3.5.43",
119
+ "vue-router": "^4.6.4",
120
+ "vue-tsc": "^2.2.12"
121
+ },
122
+ "dependencies": {
123
+ "magic-string": "^0.30.21",
124
+ "pinia": "^3.0.4"
125
+ }
126
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2023 Bagel Studio
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.