@walkeros/web-core 4.3.0 → 4.3.1
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/CHANGELOG.md +13 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @walkeros/web-core
|
|
2
2
|
|
|
3
|
+
## 4.3.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 74eacdd: The session source now accepts a `domain` setting to store session
|
|
8
|
+
and device ID cookies on a parent domain, e.g. `example.com`, so subdomains
|
|
9
|
+
share the same IDs, and its settings schema accepts `cookie` as a storage
|
|
10
|
+
type. `storageDelete` gained a `domain` parameter (third, before `env`) to
|
|
11
|
+
remove cookies written with a domain attribute.
|
|
12
|
+
- Updated dependencies [f2030ab]
|
|
13
|
+
- Updated dependencies [2d6ab82]
|
|
14
|
+
- @walkeros/core@4.3.1
|
|
15
|
+
|
|
3
16
|
## 4.3.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -185,7 +185,7 @@ interface StorageEnv {
|
|
|
185
185
|
window?: Window & typeof globalThis;
|
|
186
186
|
document?: Document;
|
|
187
187
|
}
|
|
188
|
-
declare function storageDelete(key: string, storage?: StorageType, env?: StorageEnv): void;
|
|
188
|
+
declare function storageDelete(key: string, storage?: StorageType, domain?: string, env?: StorageEnv): void;
|
|
189
189
|
declare function storageRead(key: string, storage?: StorageType, env?: StorageEnv): WalkerOS.PropertyType;
|
|
190
190
|
declare function storageWrite(key: string, value: WalkerOS.PropertyType, maxAgeInMinutes?: number, storage?: StorageType, domain?: string, env?: StorageEnv): WalkerOS.PropertyType;
|
|
191
191
|
|
package/dist/index.d.ts
CHANGED
|
@@ -185,7 +185,7 @@ interface StorageEnv {
|
|
|
185
185
|
window?: Window & typeof globalThis;
|
|
186
186
|
document?: Document;
|
|
187
187
|
}
|
|
188
|
-
declare function storageDelete(key: string, storage?: StorageType, env?: StorageEnv): void;
|
|
188
|
+
declare function storageDelete(key: string, storage?: StorageType, domain?: string, env?: StorageEnv): void;
|
|
189
189
|
declare function storageRead(key: string, storage?: StorageType, env?: StorageEnv): WalkerOS.PropertyType;
|
|
190
190
|
declare function storageWrite(key: string, value: WalkerOS.PropertyType, maxAgeInMinutes?: number, storage?: StorageType, domain?: string, env?: StorageEnv): WalkerOS.PropertyType;
|
|
191
191
|
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,s={};((e,o)=>{for(var n in o)t(e,n,{get:o[n],enumerable:!0})})(s,{DestinationWeb:()=>I,Elb:()=>D,SourceWeb:()=>P,Walker:()=>H,WebCollector:()=>j,composedAncestors:()=>v,deepElementFromPoint:()=>S,elb:()=>m,getAttribute:()=>a,getEnv:()=>h,getHashWeb:()=>y,getLanguage:()=>d,getScreenSize:()=>g,getTimezone:()=>f,isVisible:()=>k,parseInlineConfig:()=>l,sendWeb:()=>O,sendWebAsBeacon:()=>x,sendWebAsFetch:()=>U,sendWebAsXhr:()=>$,shadowHostsAbove:()=>C,splitAttribute:()=>c,splitKeyVal:()=>u,storageDelete:()=>N,storageRead:()=>T,storageWrite:()=>W}),module.exports=(e=s,((e,s,i,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))r.call(e,c)||c===i||t(e,c,{get:()=>s[c],enumerable:!(a=o(s,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var i=require("@walkeros/core");function a(e,t){return(e.getAttribute(t)||"").trim()}function c(e,t=";"){if(!e)return[];const o=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(o)||[]}function u(e){const[t,o]=e.split(/:(.+)/,2);return[(0,i.trim)(t||""),(0,i.trim)(o||"")]}function l(e){const t={};return c(e).forEach(e=>{const[o,n]=u(e);o&&("true"===n?t[o]=!0:"false"===n?t[o]=!1:n&&/^\d+$/.test(n)?t[o]=parseInt(n,10):n&&/^\d+\.\d+$/.test(n)?t[o]=parseFloat(n):t[o]=n||!0)}),t}function d(e){return e.language}function f(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function g(e){return`${e.screen.width}x${e.screen.height}`}var m=function(){const e=window;(e.elbLayer=e.elbLayer||[]).push(arguments)},w=require("@walkeros/core");function p(e,t,o,n){const r=new Map;return new Proxy(e,{get(e,s){if("string"!=typeof s)return Reflect.get(e,s,e);const i=r.get(s);if(void 0!==i)return i;if(t.some(e=>1===e.length&&e[0]===s)){const t=Reflect.get(e,s,e);if("function"!=typeof t)return t;const i=`${n}.${s}`,a=(...n)=>{try{o(i,n)}catch{}return t.apply(e,n)};return r.set(s,a),a}const a=t.filter(e=>e.length>1&&e[0]===s).map(e=>e.slice(1));if(a.length>0){const t=Reflect.get(e,s,e);if(null===t||"object"!=typeof t)return t;const i=p(t,a,o,`${n}.${s}`);return r.set(s,i),i}return Reflect.get(e,s,e)}})}function h(e){const t={window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document,...e},o=e&&e[w.OBSERVE_ENV_KEY];if((0,w.isEnvObserve)(o)){delete t[w.OBSERVE_ENV_KEY];const e=new Map;for(const t of o.paths){const o=(0,w.parseCallPath)(t),n=o[0];if(void 0===n)continue;const r=e.get(n)??[];r.push(o.slice(1)),e.set(n,r)}for(const[n,r]of e){const e=t[n];null!==e&&"object"==typeof e&&(t[n]=p(e,r,o.record,n))}}return t}var b=require("@walkeros/core");async function y(e,t){return(await async function(e){const t=(0,b.isDefined)(window)&&window.crypto?window.crypto:void 0;if(!t||!t.subtle||!TextEncoder)return;const o=(new TextEncoder).encode(e),n=await t.subtle.digest("SHA-256",o);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")}(e)||"").slice(0,t)}function S(e,t,o){let n=e.elementFromPoint(t,o);for(;n&&n.shadowRoot;){const e=n.shadowRoot.elementFromPoint(t,o);if(!e||e===n)break;n=e}return n}function v(e,t){const o=[];let n=e;for(;n;){let e=n.parentElement;if(!e){const o=n.getRootNode();o instanceof t.self.ShadowRoot&&(e=o.host)}if(!e)break;o.push(e),n=e}return o}function C(e,t){const o=[];let n=e.getRootNode();for(;n instanceof t.self.ShadowRoot;)o.push(n.host),n=n.host.getRootNode();return o}function k(e,t,o){if(!function(e,t){const o=t.getComputedStyle(e);if("none"===o.display)return!1;if("visible"!==o.visibility)return!1;let n=e;for(;n;){const e=t.getComputedStyle(n).opacity;if(e&&Number(e)<.1)return!1;const o=n.parentElement;if(o){n=o;continue}const r=n.getRootNode();n=r instanceof t.self.ShadowRoot?r.host:null}return!0}(e,t))return!1;const n=e.getBoundingClientRect(),r=o.documentElement.clientWidth||t.innerWidth,s=o.documentElement.clientHeight||t.innerHeight,i=Math.max(n.left,0),a=Math.max(n.top,0),c=Math.min(n.right,r),u=Math.min(n.bottom,s);if(c<=i||u<=a)return!1;const l=S(o,(i+c)/2,(a+u)/2);return!!l&&(l===e||(!!v(l,t).includes(e)||!!C(e,t).includes(l)))}var R=require("@walkeros/core"),E=1e4;function O(e,t,o={transport:"fetch"}){switch(o.transport||"fetch"){case"beacon":return x(e,t);case"xhr":return $(e,t,o);default:return U(e,t,o)}}async function U(e,t,o={}){const n=(0,R.getHeaders)(o.headers),r=(0,R.transformData)(t),s=o.timeout,i="number"==typeof s&&Number.isFinite(s)&&s>0?s:E,a=new AbortController,c=setTimeout(()=>a.abort(),i);return(0,R.tryCatchAsync)(async()=>{try{const t=await fetch(e,{method:o.method||"POST",headers:n,keepalive:!0,credentials:o.credentials||"same-origin",mode:o.noCors?"no-cors":"cors",body:r,signal:a.signal}),s=o.noCors?"":await t.text();return{ok:t.ok,data:s,error:t.ok?void 0:t.statusText}}finally{clearTimeout(c)}},e=>(clearTimeout(c),{ok:!1,error:e.message}))()}function x(e,t){const o=(0,R.transformData)(t),n=navigator.sendBeacon(e,o);return{ok:n,error:n?void 0:"Failed to send beacon"}}function $(e,t,o={}){const n=(0,R.getHeaders)(o.headers),r=o.method||"POST",s=(0,R.transformData)(t);return(0,R.tryCatch)(()=>{const t=new XMLHttpRequest;t.open(r,e,!1);for(const e in n)t.setRequestHeader(e,n[e]);t.send(s);const o=t.status>=200&&t.status<300;return{ok:o,data:(0,R.tryCatch)(JSON.parse,()=>t.response)(t.response),error:o?void 0:`${t.status} ${t.statusText}`}},e=>({ok:!1,error:e.message}))()}var A=require("@walkeros/core");function N(e,t=A.Const.Utils.Storage.Session,o){try{switch(t){case A.Const.Utils.Storage.Cookie:W(e,"",0,t,
|
|
1
|
+
"use strict";var e,t=Object.defineProperty,o=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,s={};((e,o)=>{for(var n in o)t(e,n,{get:o[n],enumerable:!0})})(s,{DestinationWeb:()=>I,Elb:()=>D,SourceWeb:()=>P,Walker:()=>H,WebCollector:()=>j,composedAncestors:()=>v,deepElementFromPoint:()=>S,elb:()=>m,getAttribute:()=>a,getEnv:()=>h,getHashWeb:()=>y,getLanguage:()=>d,getScreenSize:()=>g,getTimezone:()=>f,isVisible:()=>k,parseInlineConfig:()=>l,sendWeb:()=>O,sendWebAsBeacon:()=>x,sendWebAsFetch:()=>U,sendWebAsXhr:()=>$,shadowHostsAbove:()=>C,splitAttribute:()=>c,splitKeyVal:()=>u,storageDelete:()=>N,storageRead:()=>T,storageWrite:()=>W}),module.exports=(e=s,((e,s,i,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))r.call(e,c)||c===i||t(e,c,{get:()=>s[c],enumerable:!(a=o(s,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var i=require("@walkeros/core");function a(e,t){return(e.getAttribute(t)||"").trim()}function c(e,t=";"){if(!e)return[];const o=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(o)||[]}function u(e){const[t,o]=e.split(/:(.+)/,2);return[(0,i.trim)(t||""),(0,i.trim)(o||"")]}function l(e){const t={};return c(e).forEach(e=>{const[o,n]=u(e);o&&("true"===n?t[o]=!0:"false"===n?t[o]=!1:n&&/^\d+$/.test(n)?t[o]=parseInt(n,10):n&&/^\d+\.\d+$/.test(n)?t[o]=parseFloat(n):t[o]=n||!0)}),t}function d(e){return e.language}function f(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function g(e){return`${e.screen.width}x${e.screen.height}`}var m=function(){const e=window;(e.elbLayer=e.elbLayer||[]).push(arguments)},w=require("@walkeros/core");function p(e,t,o,n){const r=new Map;return new Proxy(e,{get(e,s){if("string"!=typeof s)return Reflect.get(e,s,e);const i=r.get(s);if(void 0!==i)return i;if(t.some(e=>1===e.length&&e[0]===s)){const t=Reflect.get(e,s,e);if("function"!=typeof t)return t;const i=`${n}.${s}`,a=(...n)=>{try{o(i,n)}catch{}return t.apply(e,n)};return r.set(s,a),a}const a=t.filter(e=>e.length>1&&e[0]===s).map(e=>e.slice(1));if(a.length>0){const t=Reflect.get(e,s,e);if(null===t||"object"!=typeof t)return t;const i=p(t,a,o,`${n}.${s}`);return r.set(s,i),i}return Reflect.get(e,s,e)}})}function h(e){const t={window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document,...e},o=e&&e[w.OBSERVE_ENV_KEY];if((0,w.isEnvObserve)(o)){delete t[w.OBSERVE_ENV_KEY];const e=new Map;for(const t of o.paths){const o=(0,w.parseCallPath)(t),n=o[0];if(void 0===n)continue;const r=e.get(n)??[];r.push(o.slice(1)),e.set(n,r)}for(const[n,r]of e){const e=t[n];null!==e&&"object"==typeof e&&(t[n]=p(e,r,o.record,n))}}return t}var b=require("@walkeros/core");async function y(e,t){return(await async function(e){const t=(0,b.isDefined)(window)&&window.crypto?window.crypto:void 0;if(!t||!t.subtle||!TextEncoder)return;const o=(new TextEncoder).encode(e),n=await t.subtle.digest("SHA-256",o);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")}(e)||"").slice(0,t)}function S(e,t,o){let n=e.elementFromPoint(t,o);for(;n&&n.shadowRoot;){const e=n.shadowRoot.elementFromPoint(t,o);if(!e||e===n)break;n=e}return n}function v(e,t){const o=[];let n=e;for(;n;){let e=n.parentElement;if(!e){const o=n.getRootNode();o instanceof t.self.ShadowRoot&&(e=o.host)}if(!e)break;o.push(e),n=e}return o}function C(e,t){const o=[];let n=e.getRootNode();for(;n instanceof t.self.ShadowRoot;)o.push(n.host),n=n.host.getRootNode();return o}function k(e,t,o){if(!function(e,t){const o=t.getComputedStyle(e);if("none"===o.display)return!1;if("visible"!==o.visibility)return!1;let n=e;for(;n;){const e=t.getComputedStyle(n).opacity;if(e&&Number(e)<.1)return!1;const o=n.parentElement;if(o){n=o;continue}const r=n.getRootNode();n=r instanceof t.self.ShadowRoot?r.host:null}return!0}(e,t))return!1;const n=e.getBoundingClientRect(),r=o.documentElement.clientWidth||t.innerWidth,s=o.documentElement.clientHeight||t.innerHeight,i=Math.max(n.left,0),a=Math.max(n.top,0),c=Math.min(n.right,r),u=Math.min(n.bottom,s);if(c<=i||u<=a)return!1;const l=S(o,(i+c)/2,(a+u)/2);return!!l&&(l===e||(!!v(l,t).includes(e)||!!C(e,t).includes(l)))}var R=require("@walkeros/core"),E=1e4;function O(e,t,o={transport:"fetch"}){switch(o.transport||"fetch"){case"beacon":return x(e,t);case"xhr":return $(e,t,o);default:return U(e,t,o)}}async function U(e,t,o={}){const n=(0,R.getHeaders)(o.headers),r=(0,R.transformData)(t),s=o.timeout,i="number"==typeof s&&Number.isFinite(s)&&s>0?s:E,a=new AbortController,c=setTimeout(()=>a.abort(),i);return(0,R.tryCatchAsync)(async()=>{try{const t=await fetch(e,{method:o.method||"POST",headers:n,keepalive:!0,credentials:o.credentials||"same-origin",mode:o.noCors?"no-cors":"cors",body:r,signal:a.signal}),s=o.noCors?"":await t.text();return{ok:t.ok,data:s,error:t.ok?void 0:t.statusText}}finally{clearTimeout(c)}},e=>(clearTimeout(c),{ok:!1,error:e.message}))()}function x(e,t){const o=(0,R.transformData)(t),n=navigator.sendBeacon(e,o);return{ok:n,error:n?void 0:"Failed to send beacon"}}function $(e,t,o={}){const n=(0,R.getHeaders)(o.headers),r=o.method||"POST",s=(0,R.transformData)(t);return(0,R.tryCatch)(()=>{const t=new XMLHttpRequest;t.open(r,e,!1);for(const e in n)t.setRequestHeader(e,n[e]);t.send(s);const o=t.status>=200&&t.status<300;return{ok:o,data:(0,R.tryCatch)(JSON.parse,()=>t.response)(t.response),error:o?void 0:`${t.status} ${t.statusText}`}},e=>({ok:!1,error:e.message}))()}var A=require("@walkeros/core");function N(e,t=A.Const.Utils.Storage.Session,o,n){try{switch(t){case A.Const.Utils.Storage.Cookie:W(e,"",0,t,o,n);break;case A.Const.Utils.Storage.Local:(n?.window??window).localStorage.removeItem(e);break;case A.Const.Utils.Storage.Session:(n?.window??window).sessionStorage.removeItem(e)}}catch(e){}}function T(e,t=A.Const.Utils.Storage.Session,o){function n(e){try{return JSON.parse(e||"")}catch(t){let o=1,n="";return e&&(o=0,n=e),{e:o,v:n}}}let r,s;try{switch(t){case A.Const.Utils.Storage.Cookie:r=decodeURIComponent((o?.document??document).cookie.split("; ").find(t=>t.startsWith(e+"="))?.split("=")[1]||"");break;case A.Const.Utils.Storage.Local:s=n((o?.window??window).localStorage.getItem(e));break;case A.Const.Utils.Storage.Session:s=n((o?.window??window).sessionStorage.getItem(e))}}catch(e){return(0,A.castValue)("")}return s&&(r=s.v,0!=s.e&&s.e<Date.now()&&(N(e,t,void 0,o),r="")),(0,A.castValue)(r||"")}function W(e,t,o=30,n=A.Const.Utils.Storage.Session,r,s){const i={e:Date.now()+6e4*o,v:String(t)},a=JSON.stringify(i);try{switch(n){case A.Const.Utils.Storage.Cookie:{t="object"==typeof t?JSON.stringify(t):t;let n=`${e}=${encodeURIComponent(t)}; max-age=${60*o}; path=/; SameSite=Lax; secure`;r&&(n+="; domain="+r),(s?.document??document).cookie=n;break}case A.Const.Utils.Storage.Local:(s?.window??window).localStorage.setItem(e,a);break;case A.Const.Utils.Storage.Session:(s?.window??window).sessionStorage.setItem(e,a)}}catch(e){return(0,A.castValue)("")}return T(e,n,s)}var I={},P={},D={},j={},H={};//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/attributes.ts","../src/browser.ts","../src/elb.ts","../src/environment.ts","../src/getHashWeb.ts","../src/isVisible.ts","../src/sendWeb.ts","../src/storage.ts","../src/types/destination.ts","../src/types/source.ts","../src/types/elb.ts","../src/types/collector.ts","../src/types/walker.ts"],"sourcesContent":["export * from './attributes';\nexport * from './browser';\nexport * from './elb';\nexport * from './environment';\nexport * from './getHashWeb';\nexport * from './isVisible';\nexport * from './sendWeb';\nexport * from './storage';\n\n// Export web-specific types\nexport * from './types';\n","import { trim } from '@walkeros/core';\n\n/**\n * Get attribute value from element\n * @param element - DOM element\n * @param name - Attribute name\n * @returns Trimmed attribute value or empty string\n */\nexport function getAttribute(element: Element, name: string): string {\n return (element.getAttribute(name) || '').trim();\n}\n\n/**\n * Split attribute string by separator (semicolon by default)\n * Handles quoted values containing the separator\n * @param str - String to split\n * @param separator - Separator character (default: ';')\n * @returns Array of attribute strings\n */\nexport function splitAttribute(str: string, separator = ';'): string[] {\n if (!str) return [];\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\n/**\n * Split key-value pair by first colon\n * @param str - String in format \"key:value\"\n * @returns Tuple of [key, value]\n */\nexport function splitKeyVal(str: string): [string, string] {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key || ''), trim(value || '')];\n}\n\n/**\n * Parse inline configuration string into object\n * Supports type conversion for boolean and numeric values\n * @param str - Configuration string (e.g., \"elb:track;run:false;port:3000\")\n * @returns Parsed configuration object\n */\nexport function parseInlineConfig(str: string): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n\n splitAttribute(str).forEach((pair) => {\n const [key, value] = splitKeyVal(pair);\n if (key) {\n // Type conversion\n if (value === 'true') {\n config[key] = true;\n } else if (value === 'false') {\n config[key] = false;\n } else if (value && /^\\d+$/.test(value)) {\n config[key] = parseInt(value, 10);\n } else if (value && /^\\d+\\.\\d+$/.test(value)) {\n config[key] = parseFloat(value);\n } else if (value) {\n config[key] = value;\n } else {\n // Key without value defaults to true\n config[key] = true;\n }\n }\n });\n\n return config;\n}\n","export function getLanguage(navigatorRef: Navigator): string | undefined {\n return navigatorRef.language;\n}\n\nexport function getTimezone(): string | undefined {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function getScreenSize(windowRef: Window): string {\n return `${windowRef.screen.width}x${windowRef.screen.height}`;\n}\n","import type { Elb } from '@walkeros/core';\n\nexport const elb: Elb.Fn<void> = function () {\n const w = window as unknown as Record<string, unknown[]>;\n (w.elbLayer = w.elbLayer || []).push(arguments);\n};\n","import type { Env } from './types/destination';\nimport type { Destination } from '@walkeros/core';\nimport { OBSERVE_ENV_KEY, isEnvObserve, parseCallPath } from '@walkeros/core';\n\n/**\n * Transparent recording Proxy over a resolved env root (`window`, `document`,\n * or an env override). `subPaths` are the tracked dot-path segments AFTER the\n * root, so a leaf is a length-1 remainder and a longer remainder is an\n * intermediate to recurse into.\n *\n * Only a get-trap: writes fall through to the real target so patterns like\n * gtm's `window[dataLayerName] = ...` mutate the actual global. `Reflect.get`\n * uses `t` (never the proxy) as receiver so native accessors keep their brand\n * checks (`window.document`, `window.location`). Wrappers and child proxies are\n * memoized per proxy so repeated reads return the same reference and untracked\n * globals are never bound.\n */\nfunction wrapRoot(\n target: object,\n subPaths: string[][],\n record: Destination.EnvObserve['record'],\n prefix: string,\n): object {\n const memo = new Map<string, unknown>();\n\n return new Proxy(target, {\n get(t, prop) {\n if (typeof prop !== 'string') return Reflect.get(t, prop, t);\n\n const cached = memo.get(prop);\n if (cached !== undefined) return cached;\n\n // Leaf: this prop is the final tracked segment — record its calls.\n if (subPaths.some((sp) => sp.length === 1 && sp[0] === prop)) {\n const original: unknown = Reflect.get(t, prop, t);\n if (typeof original !== 'function') return original;\n\n const fullPath = `${prefix}.${prop}`;\n const wrapper = (...args: unknown[]): unknown => {\n try {\n record(fullPath, args);\n } catch {\n // Telemetry must never suppress the real vendor call.\n }\n return original.apply(t, args);\n };\n memo.set(prop, wrapper);\n return wrapper;\n }\n\n // Intermediate: navigate deeper, keeping the same recorder.\n const interRests = subPaths\n .filter((sp) => sp.length > 1 && sp[0] === prop)\n .map((sp) => sp.slice(1));\n if (interRests.length > 0) {\n const child: unknown = Reflect.get(t, prop, t);\n if (child === null || typeof child !== 'object') return child;\n\n const childProxy = wrapRoot(\n child,\n interRests,\n record,\n `${prefix}.${prop}`,\n );\n memo.set(prop, childProxy);\n return childProxy;\n }\n\n return Reflect.get(t, prop, t);\n },\n });\n}\n\n/**\n * Helper function to get environment globals with fallbacks\n *\n * Returns window and document by default, with optional environment overrides.\n * Generic over the caller's `Env` so a destination that narrows `window`/\n * `document` (and augments the DOM globals via `declare global`) gets those\n * narrowed types back without casting at the call site.\n *\n * When the collector injects an observe recorder under `OBSERVE_ENV_KEY` (trace\n * level, live-web paths wrapEnv could not resolve), the resolved roots are\n * wrapped in a transparent recording Proxy and the key is stripped before the\n * env reaches the destination. Outside trace the key is absent, so the guard is\n * a single property read with no wrapping cost.\n *\n * @param env - Optional environment overrides\n * @returns Env with window/document defaults and any provided overrides\n */\nexport function getEnv<E extends Env = Env>(env?: E) {\n // The DOM globals (typed `Window`/`Document`) are merged with the caller's\n // narrowed `Env` overrides. This intersection is asserted once here, at the\n // single boundary where the loose `Record`-typed base meets the real DOM\n // globals, so no destination has to cast `window`/`document` per call.\n const merged: Record<string, unknown> = {\n window: typeof window !== 'undefined' ? window : globalThis.window,\n document: typeof document !== 'undefined' ? document : globalThis.document,\n ...env,\n };\n\n const observe = env && env[OBSERVE_ENV_KEY];\n if (isEnvObserve(observe)) {\n // Strip the recorder so it never reaches the destination (mirrors wrapEnv\n // stripping `simulation`).\n delete merged[OBSERVE_ENV_KEY];\n\n // Group tracked paths by root segment through the shared grammar so the\n // fallback wrapper and wrapEnv cannot drift.\n const subPathsByRoot = new Map<string, string[][]>();\n for (const raw of observe.paths) {\n const segments = parseCallPath(raw);\n const root = segments[0];\n // W5 filters malformed paths already; guard against an empty parse.\n if (root === undefined) continue;\n const group = subPathsByRoot.get(root) ?? [];\n group.push(segments.slice(1));\n subPathsByRoot.set(root, group);\n }\n\n // Wrap each present, navigable root; a missing or non-object root is left\n // as-is (its leaf stays unresolvable, matching wrapEnv).\n for (const [root, subPaths] of subPathsByRoot) {\n const target = merged[root];\n if (target !== null && typeof target === 'object') {\n merged[root] = wrapRoot(target, subPaths, observe.record, root);\n }\n }\n }\n\n return merged as Omit<E, 'window' | 'document'> & {\n window: Window & NonNullable<E['window']>;\n document: Document & NonNullable<E['document']>;\n };\n}\n","import { isDefined } from '@walkeros/core';\n\nasync function sha256(message: string): Promise<string | undefined> {\n const crypto: Crypto | undefined =\n isDefined(window) && window.crypto ? window.crypto : undefined;\n\n // Crypto API not available\n if (!crypto || !crypto.subtle || !TextEncoder) return;\n\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hashHex;\n}\n\nexport async function getHashWeb(\n str: string,\n length?: number,\n): Promise<string> {\n return ((await sha256(str)) || '').slice(0, length);\n}\n","/**\n * Resolve the topmost element at a point, descending into shadow trees.\n * `elementFromPoint` does not pierce shadow boundaries, so this re-probes each\n * open shadow root's own `elementFromPoint`. It descends through open roots and\n * stops at a closed host, whose `shadowRoot` is null.\n * @param root - Document or shadow root to probe from\n * @param x - Viewport x coordinate\n * @param y - Viewport y coordinate\n * @returns Deepest element at the point, or null when nothing is hit\n */\nexport function deepElementFromPoint(\n root: DocumentOrShadowRoot,\n x: number,\n y: number,\n): Element | null {\n let el = root.elementFromPoint(x, y);\n while (el && el.shadowRoot) {\n const inner = el.shadowRoot.elementFromPoint(x, y);\n if (!inner || inner === el) break;\n el = inner;\n }\n return el;\n}\n\n/**\n * Collect the composed ancestor chain of an element, walking `parentElement`\n * and hopping across shadow-host boundaries when a shadow root is reached.\n * Ancestry follows the flattened tree by DOM containment; it does not resolve\n * slot distribution (slotted light-DOM parents are not tracked).\n * @param node - Element to walk up from\n * @param win - Window owning the element, used for its realm's ShadowRoot\n * @returns Ancestors from nearest to furthest\n */\nexport function composedAncestors(node: Element, win: Window): Element[] {\n const chain: Element[] = [];\n let current: Element | null = node;\n while (current) {\n let parent: Element | null = current.parentElement;\n if (!parent) {\n const root = current.getRootNode();\n // `win.self` is load-bearing: the ShadowRoot constructor lives on\n // `Window & typeof globalThis` (the type of `win.self`), not the bare\n // `Window` parameter, so `win.ShadowRoot` would fail typecheck.\n if (root instanceof win.self.ShadowRoot) parent = root.host;\n }\n if (!parent) break;\n chain.push(parent);\n current = parent;\n }\n return chain;\n}\n\n/**\n * Collect the shadow hosts enclosing an element, crossing only shadow-host\n * boundaries. Unlike composedAncestors, plain light-DOM parents are skipped, so\n * the result contains hosts alone, ordered from innermost to outermost.\n * @param node - Element to walk up from\n * @param win - Window owning the element, used for its realm's ShadowRoot\n * @returns Enclosing shadow hosts, innermost first\n */\nexport function shadowHostsAbove(node: Element, win: Window): Element[] {\n const hosts: Element[] = [];\n let root = node.getRootNode();\n // `win.self` is load-bearing: the ShadowRoot constructor lives on\n // `Window & typeof globalThis` (the type of `win.self`), not the bare\n // `Window` parameter, so `win.ShadowRoot` would fail typecheck.\n while (root instanceof win.self.ShadowRoot) {\n hosts.push(root.host);\n root = root.host.getRootNode();\n }\n return hosts;\n}\n\n/**\n * True when the composed chain renders the element at all. `visibility`\n * inherits, so the element's own computed value is enough. `opacity` does NOT\n * inherit: a transparent ancestor leaves the element's own opacity at 1 while\n * hiding it, and elementFromPoint does not help because a transparent element\n * is still hit-testable. Walk the chain, crossing shadow-host boundaries.\n */\nfunction isRendered(element: HTMLElement, win: Window): boolean {\n const style = win.getComputedStyle(element);\n if (style.display === 'none') return false;\n if (style.visibility !== 'visible') return false;\n\n let current: Element | null = element;\n while (current) {\n const opacity = win.getComputedStyle(current).opacity;\n if (opacity && Number(opacity) < 0.1) return false;\n\n const parent: Element | null = current.parentElement;\n if (parent) {\n current = parent;\n continue;\n }\n const root = current.getRootNode();\n current = root instanceof win.self.ShadowRoot ? root.host : null;\n }\n\n return true;\n}\n\n/**\n * Whether the element is actually seen by the user: rendered, on screen, and\n * not painted over. Geometry (how much of it is showing) is decided by the\n * IntersectionObserver, which computes it during layout for free; this function\n * answers only the two questions the observer is blind to, so it runs once per\n * candidate impression rather than on every scroll frame.\n */\nexport function isVisible(\n element: HTMLElement,\n win: Window,\n doc: Document,\n): boolean {\n if (!isRendered(element, win)) return false;\n\n const rect = element.getBoundingClientRect();\n const viewportWidth = doc.documentElement.clientWidth || win.innerWidth;\n const viewportHeight = doc.documentElement.clientHeight || win.innerHeight;\n\n // Clip the element against the viewport. Probing the centre of this visible\n // band, rather than the centre of the element, is what removes the need for a\n // separate large-element branch: an element taller than the viewport has its\n // own centre off screen, which the previous implementation read as hidden.\n const left = Math.max(rect.left, 0);\n const top = Math.max(rect.top, 0);\n const right = Math.min(rect.right, viewportWidth);\n const bottom = Math.min(rect.bottom, viewportHeight);\n if (right <= left || bottom <= top) return false;\n\n const pointX = (left + right) / 2;\n const pointY = (top + bottom) / 2;\n\n const hit = deepElementFromPoint(doc, pointX, pointY);\n if (!hit) return false;\n if (hit === element) return true;\n if (composedAncestors(hit, win).includes(element)) return true;\n // Clause 3 is deliberately shadowHostsAbove (shadow-host hops only), not a\n // general ancestor walk. A plain light-DOM ancestor returned by\n // elementFromPoint (target has pointer-events:none, a transparent center, or\n // is covered via stacking) must NOT count as visible; restricting to shadow\n // hosts preserves light-DOM occlusion. Do not merge this with clause 2.\n if (shadowHostsAbove(element, win).includes(hit)) return true;\n return false;\n}\n","import type { SendDataValue, SendHeaders, SendResponse } from '@walkeros/core';\nimport {\n getHeaders,\n transformData,\n tryCatch,\n tryCatchAsync,\n} from '@walkeros/core';\n\nexport type SendWebTransport = 'fetch' | 'beacon' | 'xhr';\n\nexport interface SendWebOptions {\n headers?: SendHeaders;\n transport?: SendWebTransport;\n method?: string;\n}\n\nexport interface SendWebOptionsFetch extends SendWebOptions {\n credentials?: 'omit' | 'same-origin' | 'include'; // Add credentials option\n noCors?: boolean; // Add noCors option for fetch transport\n timeout?: number; // Abort the request after this many ms (default 10000)\n}\n\nconst DEFAULT_FETCH_TIMEOUT = 10000;\n\ntype SendWebOptionsDynamic<T extends SendWebTransport> = T extends 'fetch'\n ? SendWebOptionsFetch\n : SendWebOptions;\n\nexport type SendWebReturn<T extends SendWebTransport> = T extends 'fetch'\n ? Promise<SendResponse>\n : SendResponse;\n\nexport function sendWeb<T extends SendWebTransport>(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsDynamic<T> & { transport?: T } = {\n transport: 'fetch' as T,\n },\n): SendWebReturn<T> {\n const transport = options.transport || 'fetch';\n\n switch (transport) {\n case 'beacon':\n return sendWebAsBeacon(url, data) as SendWebReturn<T>;\n case 'xhr':\n return sendWebAsXhr(url, data, options) as SendWebReturn<T>;\n case 'fetch':\n default:\n return sendWebAsFetch(url, data, options) as SendWebReturn<T>;\n }\n}\n\nexport async function sendWebAsFetch(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsFetch = {},\n): Promise<SendResponse> {\n const headers = getHeaders(options.headers);\n const body = transformData(data);\n const requested = options.timeout;\n const timeout =\n typeof requested === 'number' && Number.isFinite(requested) && requested > 0\n ? requested\n : DEFAULT_FETCH_TIMEOUT;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n return tryCatchAsync(\n async () => {\n try {\n const response = await fetch(url, {\n method: options.method || 'POST',\n headers,\n keepalive: true,\n credentials: options.credentials || 'same-origin',\n mode: options.noCors ? 'no-cors' : 'cors',\n body,\n signal: controller.signal,\n });\n\n const responseData = options.noCors ? '' : await response.text();\n\n return {\n ok: response.ok,\n data: responseData,\n error: response.ok ? undefined : response.statusText,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n },\n (error) => {\n clearTimeout(timeoutId);\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n\nexport function sendWebAsBeacon(\n url: string,\n data?: SendDataValue,\n): SendResponse {\n const body = transformData(data);\n const ok = navigator.sendBeacon(url, body);\n\n return {\n ok,\n error: ok ? undefined : 'Failed to send beacon',\n };\n}\n\nexport function sendWebAsXhr(\n url: string,\n data?: SendDataValue,\n options: SendWebOptions = {},\n): SendResponse {\n const headers = getHeaders(options.headers);\n const method = options.method || 'POST';\n const body = transformData(data);\n\n return tryCatch(\n () => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, false); // Synchronous request\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n xhr.send(body);\n\n const ok = xhr.status >= 200 && xhr.status < 300;\n\n const parsedData = tryCatch(JSON.parse, () => xhr.response)(xhr.response);\n\n return {\n ok,\n data: parsedData,\n error: ok ? undefined : `${xhr.status} ${xhr.statusText}`,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { StorageType } from '@walkeros/core';\nimport { castValue, Const } from '@walkeros/core';\n\nexport interface StorageValue {\n e: number; // Expiration timestamp\n v: string; // Value\n}\n\nexport interface StorageEnv {\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport function storageDelete(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n env?: StorageEnv,\n) {\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n storageWrite(key, '', 0, storage, undefined, env);\n break;\n case Const.Utils.Storage.Local:\n (env?.window ?? window).localStorage.removeItem(key);\n break;\n case Const.Utils.Storage.Session:\n (env?.window ?? window).sessionStorage.removeItem(key);\n break;\n }\n } catch (err) {\n // Storage may be disabled (SecurityError in private browsing, sandboxed\n // iframes, or restrictive browser settings). Silently ignore.\n }\n}\n\nexport function storageRead(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n env?: StorageEnv,\n): WalkerOS.PropertyType {\n // Helper function for local and session storage to support expiration\n function parseItem(string: string | null): StorageValue {\n try {\n return JSON.parse(string || '');\n } catch (err) {\n let e = 1,\n v = '';\n\n // Remove expiration date\n if (string) {\n e = 0;\n v = string;\n }\n\n return { e, v };\n }\n }\n let value, item;\n\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n value = decodeURIComponent(\n (env?.document ?? document).cookie\n .split('; ')\n .find((row) => row.startsWith(key + '='))\n ?.split('=')[1] || '',\n );\n break;\n case Const.Utils.Storage.Local:\n item = parseItem((env?.window ?? window).localStorage.getItem(key));\n break;\n case Const.Utils.Storage.Session:\n item = parseItem((env?.window ?? window).sessionStorage.getItem(key));\n break;\n }\n } catch (err) {\n // Storage may be disabled or inaccessible. Return empty string.\n return castValue('');\n }\n\n // Check if item is expired\n if (item) {\n value = item.v;\n\n if (item.e != 0 && item.e < Date.now()) {\n storageDelete(key, storage, env);\n value = ''; // Conceal the outdated value\n }\n }\n\n return castValue(value || '');\n}\n\nexport function storageWrite(\n key: string,\n value: WalkerOS.PropertyType,\n maxAgeInMinutes = 30,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n env?: StorageEnv,\n): WalkerOS.PropertyType {\n const e = Date.now() + 1000 * 60 * maxAgeInMinutes;\n const item: StorageValue = { e, v: String(value) };\n const stringifiedItem = JSON.stringify(item);\n\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie: {\n value = typeof value === 'object' ? JSON.stringify(value) : value;\n let cookie = `${key}=${encodeURIComponent(value)}; max-age=${\n maxAgeInMinutes * 60\n }; path=/; SameSite=Lax; secure`;\n\n if (domain) cookie += '; domain=' + domain;\n\n (env?.document ?? document).cookie = cookie;\n break;\n }\n case Const.Utils.Storage.Local:\n (env?.window ?? window).localStorage.setItem(key, stringifiedItem);\n break;\n case Const.Utils.Storage.Session:\n (env?.window ?? window).sessionStorage.setItem(key, stringifiedItem);\n break;\n }\n } catch (err) {\n // Storage may be disabled (SecurityError) or full (QuotaExceededError).\n // Return empty string to signal the write did not persist.\n return castValue('');\n }\n\n return storageRead(key, storage, env);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Destination as WalkerOSDestination } from '@walkeros/core';\n\nexport type TypesGeneric = WalkerOSDestination.TypesGeneric;\n\nexport interface Destination<T extends TypesGeneric = WalkerOSDestination.Types>\n extends WalkerOSDestination.Instance<T> {}\n\nexport type Init = WalkerOSDestination.Init;\n\nexport type Config<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.Config<T>;\n\nexport type PartialConfig<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.PartialConfig<T>;\n\nexport type InitFn<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.InitFn<T>;\n\nexport type PushFn<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.PushFn<T>;\n\nexport type PushEvent<Mapping = unknown> =\n WalkerOSDestination.PushEvent<Mapping>;\n\nexport type PushEvents<Mapping = unknown> =\n WalkerOSDestination.PushEvents<Mapping>;\n\n/**\n * Web-specific environment requirements interface\n *\n * Extends the core Env interface with web-specific\n * globals like window and document for browser destinations.\n */\nexport interface Env extends WalkerOSDestination.BaseEnv {\n /**\n * Properties to be added to the global `window` object\n *\n * Used by web destinations that expect browser-specific\n * global functions like analytics APIs.\n *\n * @example\n * ```typescript\n * window: {\n * gtag: () => {},\n * fbq: () => {},\n * dataLayer: []\n * }\n * ```\n */\n window?: Record<string, unknown>;\n\n /**\n * Properties to be added to the global `document` object\n *\n * Used by destinations that need DOM manipulation capabilities\n * for script loading or element creation.\n *\n * @example\n * ```typescript\n * document: {\n * createElement: () => ({ src: '', async: false }),\n * head: { appendChild: () => {} }\n * }\n * ```\n */\n document?: Record<string, unknown>;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Collector, WalkerOS, Source as CoreSource } from '@walkeros/core';\n\nexport type TypesGeneric = CoreSource.TypesGeneric;\n\nexport interface Source<T extends TypesGeneric = CoreSource.Types>\n extends CoreSource.Instance<T> {\n settings?: CoreSource.Settings<T>;\n mapping?: CoreSource.Mapping<T>;\n}\n\nexport type Init = Partial<Omit<Source, 'init'>> & Pick<Source, 'type'>;\n\nexport type Config<T extends TypesGeneric = CoreSource.Types> =\n CoreSource.Instance<T> & {\n settings: CoreSource.Settings<T>;\n mapping?: CoreSource.Mapping<T>;\n };\n\nexport type PartialConfig<T extends TypesGeneric = CoreSource.Types> = Partial<\n Config<T>\n>;\n\nexport type InitFn<T extends TypesGeneric = CoreSource.Types> = (\n collector: Collector.Instance,\n config: Config<T>,\n) => void | Promise<void>;\n","import type { Elb } from '@walkeros/core';\n\n// Simple re-exports from core\nexport type PushResult = Elb.PushResult;\nexport type Layer = Elb.Layer;\n","import type {\n Collector as CoreCollector,\n Elb,\n Hooks,\n WalkerOS,\n Destination as WalkerOSDestination,\n On,\n} from '@walkeros/core';\nimport type { Destination, Config as DestConfig } from './destination';\nimport type { Layer } from './elb';\nimport type { Events, Trigger } from './walker';\n\ndeclare global {\n interface Window {\n elbwalker: Collector;\n walkerjs: CoreCollector.Instance;\n elbLayer?: Layer;\n dataLayer: WalkerOS.Events | unknown | unknown[];\n elb: Elb.Fn<Promise<Elb.PushResult>>;\n }\n}\n\nexport interface Collector extends Omit<CoreCollector.Instance, 'config'> {\n config: Config & CoreCollector.Config;\n destinations: Destinations;\n push: Elb.Fn<Promise<Elb.PushResult>>;\n getAllEvents: (scope: Element, prefix: string) => Events;\n getEvents: (target: Element, trigger: Trigger, prefix: string) => Events;\n getGlobals: () => WalkerOS.Properties;\n _visibilityState?: {\n observer: IntersectionObserver | undefined;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean }\n >;\n };\n}\n\nexport interface State {\n config: Config;\n destinations: Destinations;\n}\n\nexport interface Config {\n dataLayer: boolean;\n dataLayerConfig: DestConfig;\n elbLayer: Layer;\n listeners: boolean;\n pageview: boolean;\n prefix: string;\n run: boolean;\n scope: Scope;\n elb?: string;\n name?: string;\n}\n\nexport interface InitConfig extends Partial<Config> {\n consent?: WalkerOS.Consent;\n custom?: WalkerOS.Properties;\n destinations?: WalkerOSDestination.InitDestinations;\n hooks?: Hooks.Functions;\n on?: On.OnConfig;\n user?: WalkerOS.User;\n}\n\nexport interface Destinations {\n [name: string]: Destination;\n}\n\nexport type Scope = Element | Document;\n","import type { WalkerOS } from '@walkeros/core';\n\nexport type Events = Event[];\n\nexport interface Event {\n entity: string;\n action: string;\n data?: WalkerOS.Properties;\n context?: WalkerOS.OrderedProperties;\n trigger?: Trigger;\n nested: WalkerOS.Entities;\n}\n\nexport type KeyVal = [string, string];\n\nexport type Attributes = Array<string>;\n\nexport type Trigger =\n | 'click'\n | 'custom'\n | 'hover'\n | 'load'\n | 'pulse'\n | 'scroll'\n | 'submit'\n | 'visible'\n | 'visibles'\n | 'wait'\n | string;\n\nexport interface Filter {\n [name: string]: boolean;\n}\n\nexport interface TriggersActionGroups {\n [trigger: string]: TriggerActions;\n}\n\nexport type TriggerActions = Array<TriggerAction>;\n\ninterface TriggerAction {\n trigger: string;\n triggerParams?: string;\n action: string;\n actionParams?: string;\n}\n\nexport type ScrollElements = Array<[HTMLElement, number]>;\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/attributes.ts","../src/browser.ts","../src/elb.ts","../src/environment.ts","../src/getHashWeb.ts","../src/isVisible.ts","../src/sendWeb.ts","../src/storage.ts","../src/types/destination.ts","../src/types/source.ts","../src/types/elb.ts","../src/types/collector.ts","../src/types/walker.ts"],"sourcesContent":["export * from './attributes';\nexport * from './browser';\nexport * from './elb';\nexport * from './environment';\nexport * from './getHashWeb';\nexport * from './isVisible';\nexport * from './sendWeb';\nexport * from './storage';\n\n// Export web-specific types\nexport * from './types';\n","import { trim } from '@walkeros/core';\n\n/**\n * Get attribute value from element\n * @param element - DOM element\n * @param name - Attribute name\n * @returns Trimmed attribute value or empty string\n */\nexport function getAttribute(element: Element, name: string): string {\n return (element.getAttribute(name) || '').trim();\n}\n\n/**\n * Split attribute string by separator (semicolon by default)\n * Handles quoted values containing the separator\n * @param str - String to split\n * @param separator - Separator character (default: ';')\n * @returns Array of attribute strings\n */\nexport function splitAttribute(str: string, separator = ';'): string[] {\n if (!str) return [];\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\n/**\n * Split key-value pair by first colon\n * @param str - String in format \"key:value\"\n * @returns Tuple of [key, value]\n */\nexport function splitKeyVal(str: string): [string, string] {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key || ''), trim(value || '')];\n}\n\n/**\n * Parse inline configuration string into object\n * Supports type conversion for boolean and numeric values\n * @param str - Configuration string (e.g., \"elb:track;run:false;port:3000\")\n * @returns Parsed configuration object\n */\nexport function parseInlineConfig(str: string): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n\n splitAttribute(str).forEach((pair) => {\n const [key, value] = splitKeyVal(pair);\n if (key) {\n // Type conversion\n if (value === 'true') {\n config[key] = true;\n } else if (value === 'false') {\n config[key] = false;\n } else if (value && /^\\d+$/.test(value)) {\n config[key] = parseInt(value, 10);\n } else if (value && /^\\d+\\.\\d+$/.test(value)) {\n config[key] = parseFloat(value);\n } else if (value) {\n config[key] = value;\n } else {\n // Key without value defaults to true\n config[key] = true;\n }\n }\n });\n\n return config;\n}\n","export function getLanguage(navigatorRef: Navigator): string | undefined {\n return navigatorRef.language;\n}\n\nexport function getTimezone(): string | undefined {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function getScreenSize(windowRef: Window): string {\n return `${windowRef.screen.width}x${windowRef.screen.height}`;\n}\n","import type { Elb } from '@walkeros/core';\n\nexport const elb: Elb.Fn<void> = function () {\n const w = window as unknown as Record<string, unknown[]>;\n (w.elbLayer = w.elbLayer || []).push(arguments);\n};\n","import type { Env } from './types/destination';\nimport type { Destination } from '@walkeros/core';\nimport { OBSERVE_ENV_KEY, isEnvObserve, parseCallPath } from '@walkeros/core';\n\n/**\n * Transparent recording Proxy over a resolved env root (`window`, `document`,\n * or an env override). `subPaths` are the tracked dot-path segments AFTER the\n * root, so a leaf is a length-1 remainder and a longer remainder is an\n * intermediate to recurse into.\n *\n * Only a get-trap: writes fall through to the real target so patterns like\n * gtm's `window[dataLayerName] = ...` mutate the actual global. `Reflect.get`\n * uses `t` (never the proxy) as receiver so native accessors keep their brand\n * checks (`window.document`, `window.location`). Wrappers and child proxies are\n * memoized per proxy so repeated reads return the same reference and untracked\n * globals are never bound.\n */\nfunction wrapRoot(\n target: object,\n subPaths: string[][],\n record: Destination.EnvObserve['record'],\n prefix: string,\n): object {\n const memo = new Map<string, unknown>();\n\n return new Proxy(target, {\n get(t, prop) {\n if (typeof prop !== 'string') return Reflect.get(t, prop, t);\n\n const cached = memo.get(prop);\n if (cached !== undefined) return cached;\n\n // Leaf: this prop is the final tracked segment — record its calls.\n if (subPaths.some((sp) => sp.length === 1 && sp[0] === prop)) {\n const original: unknown = Reflect.get(t, prop, t);\n if (typeof original !== 'function') return original;\n\n const fullPath = `${prefix}.${prop}`;\n const wrapper = (...args: unknown[]): unknown => {\n try {\n record(fullPath, args);\n } catch {\n // Telemetry must never suppress the real vendor call.\n }\n return original.apply(t, args);\n };\n memo.set(prop, wrapper);\n return wrapper;\n }\n\n // Intermediate: navigate deeper, keeping the same recorder.\n const interRests = subPaths\n .filter((sp) => sp.length > 1 && sp[0] === prop)\n .map((sp) => sp.slice(1));\n if (interRests.length > 0) {\n const child: unknown = Reflect.get(t, prop, t);\n if (child === null || typeof child !== 'object') return child;\n\n const childProxy = wrapRoot(\n child,\n interRests,\n record,\n `${prefix}.${prop}`,\n );\n memo.set(prop, childProxy);\n return childProxy;\n }\n\n return Reflect.get(t, prop, t);\n },\n });\n}\n\n/**\n * Helper function to get environment globals with fallbacks\n *\n * Returns window and document by default, with optional environment overrides.\n * Generic over the caller's `Env` so a destination that narrows `window`/\n * `document` (and augments the DOM globals via `declare global`) gets those\n * narrowed types back without casting at the call site.\n *\n * When the collector injects an observe recorder under `OBSERVE_ENV_KEY` (trace\n * level, live-web paths wrapEnv could not resolve), the resolved roots are\n * wrapped in a transparent recording Proxy and the key is stripped before the\n * env reaches the destination. Outside trace the key is absent, so the guard is\n * a single property read with no wrapping cost.\n *\n * @param env - Optional environment overrides\n * @returns Env with window/document defaults and any provided overrides\n */\nexport function getEnv<E extends Env = Env>(env?: E) {\n // The DOM globals (typed `Window`/`Document`) are merged with the caller's\n // narrowed `Env` overrides. This intersection is asserted once here, at the\n // single boundary where the loose `Record`-typed base meets the real DOM\n // globals, so no destination has to cast `window`/`document` per call.\n const merged: Record<string, unknown> = {\n window: typeof window !== 'undefined' ? window : globalThis.window,\n document: typeof document !== 'undefined' ? document : globalThis.document,\n ...env,\n };\n\n const observe = env && env[OBSERVE_ENV_KEY];\n if (isEnvObserve(observe)) {\n // Strip the recorder so it never reaches the destination (mirrors wrapEnv\n // stripping `simulation`).\n delete merged[OBSERVE_ENV_KEY];\n\n // Group tracked paths by root segment through the shared grammar so the\n // fallback wrapper and wrapEnv cannot drift.\n const subPathsByRoot = new Map<string, string[][]>();\n for (const raw of observe.paths) {\n const segments = parseCallPath(raw);\n const root = segments[0];\n // W5 filters malformed paths already; guard against an empty parse.\n if (root === undefined) continue;\n const group = subPathsByRoot.get(root) ?? [];\n group.push(segments.slice(1));\n subPathsByRoot.set(root, group);\n }\n\n // Wrap each present, navigable root; a missing or non-object root is left\n // as-is (its leaf stays unresolvable, matching wrapEnv).\n for (const [root, subPaths] of subPathsByRoot) {\n const target = merged[root];\n if (target !== null && typeof target === 'object') {\n merged[root] = wrapRoot(target, subPaths, observe.record, root);\n }\n }\n }\n\n return merged as Omit<E, 'window' | 'document'> & {\n window: Window & NonNullable<E['window']>;\n document: Document & NonNullable<E['document']>;\n };\n}\n","import { isDefined } from '@walkeros/core';\n\nasync function sha256(message: string): Promise<string | undefined> {\n const crypto: Crypto | undefined =\n isDefined(window) && window.crypto ? window.crypto : undefined;\n\n // Crypto API not available\n if (!crypto || !crypto.subtle || !TextEncoder) return;\n\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hashHex;\n}\n\nexport async function getHashWeb(\n str: string,\n length?: number,\n): Promise<string> {\n return ((await sha256(str)) || '').slice(0, length);\n}\n","/**\n * Resolve the topmost element at a point, descending into shadow trees.\n * `elementFromPoint` does not pierce shadow boundaries, so this re-probes each\n * open shadow root's own `elementFromPoint`. It descends through open roots and\n * stops at a closed host, whose `shadowRoot` is null.\n * @param root - Document or shadow root to probe from\n * @param x - Viewport x coordinate\n * @param y - Viewport y coordinate\n * @returns Deepest element at the point, or null when nothing is hit\n */\nexport function deepElementFromPoint(\n root: DocumentOrShadowRoot,\n x: number,\n y: number,\n): Element | null {\n let el = root.elementFromPoint(x, y);\n while (el && el.shadowRoot) {\n const inner = el.shadowRoot.elementFromPoint(x, y);\n if (!inner || inner === el) break;\n el = inner;\n }\n return el;\n}\n\n/**\n * Collect the composed ancestor chain of an element, walking `parentElement`\n * and hopping across shadow-host boundaries when a shadow root is reached.\n * Ancestry follows the flattened tree by DOM containment; it does not resolve\n * slot distribution (slotted light-DOM parents are not tracked).\n * @param node - Element to walk up from\n * @param win - Window owning the element, used for its realm's ShadowRoot\n * @returns Ancestors from nearest to furthest\n */\nexport function composedAncestors(node: Element, win: Window): Element[] {\n const chain: Element[] = [];\n let current: Element | null = node;\n while (current) {\n let parent: Element | null = current.parentElement;\n if (!parent) {\n const root = current.getRootNode();\n // `win.self` is load-bearing: the ShadowRoot constructor lives on\n // `Window & typeof globalThis` (the type of `win.self`), not the bare\n // `Window` parameter, so `win.ShadowRoot` would fail typecheck.\n if (root instanceof win.self.ShadowRoot) parent = root.host;\n }\n if (!parent) break;\n chain.push(parent);\n current = parent;\n }\n return chain;\n}\n\n/**\n * Collect the shadow hosts enclosing an element, crossing only shadow-host\n * boundaries. Unlike composedAncestors, plain light-DOM parents are skipped, so\n * the result contains hosts alone, ordered from innermost to outermost.\n * @param node - Element to walk up from\n * @param win - Window owning the element, used for its realm's ShadowRoot\n * @returns Enclosing shadow hosts, innermost first\n */\nexport function shadowHostsAbove(node: Element, win: Window): Element[] {\n const hosts: Element[] = [];\n let root = node.getRootNode();\n // `win.self` is load-bearing: the ShadowRoot constructor lives on\n // `Window & typeof globalThis` (the type of `win.self`), not the bare\n // `Window` parameter, so `win.ShadowRoot` would fail typecheck.\n while (root instanceof win.self.ShadowRoot) {\n hosts.push(root.host);\n root = root.host.getRootNode();\n }\n return hosts;\n}\n\n/**\n * True when the composed chain renders the element at all. `visibility`\n * inherits, so the element's own computed value is enough. `opacity` does NOT\n * inherit: a transparent ancestor leaves the element's own opacity at 1 while\n * hiding it, and elementFromPoint does not help because a transparent element\n * is still hit-testable. Walk the chain, crossing shadow-host boundaries.\n */\nfunction isRendered(element: HTMLElement, win: Window): boolean {\n const style = win.getComputedStyle(element);\n if (style.display === 'none') return false;\n if (style.visibility !== 'visible') return false;\n\n let current: Element | null = element;\n while (current) {\n const opacity = win.getComputedStyle(current).opacity;\n if (opacity && Number(opacity) < 0.1) return false;\n\n const parent: Element | null = current.parentElement;\n if (parent) {\n current = parent;\n continue;\n }\n const root = current.getRootNode();\n current = root instanceof win.self.ShadowRoot ? root.host : null;\n }\n\n return true;\n}\n\n/**\n * Whether the element is actually seen by the user: rendered, on screen, and\n * not painted over. Geometry (how much of it is showing) is decided by the\n * IntersectionObserver, which computes it during layout for free; this function\n * answers only the two questions the observer is blind to, so it runs once per\n * candidate impression rather than on every scroll frame.\n */\nexport function isVisible(\n element: HTMLElement,\n win: Window,\n doc: Document,\n): boolean {\n if (!isRendered(element, win)) return false;\n\n const rect = element.getBoundingClientRect();\n const viewportWidth = doc.documentElement.clientWidth || win.innerWidth;\n const viewportHeight = doc.documentElement.clientHeight || win.innerHeight;\n\n // Clip the element against the viewport. Probing the centre of this visible\n // band, rather than the centre of the element, is what removes the need for a\n // separate large-element branch: an element taller than the viewport has its\n // own centre off screen, which the previous implementation read as hidden.\n const left = Math.max(rect.left, 0);\n const top = Math.max(rect.top, 0);\n const right = Math.min(rect.right, viewportWidth);\n const bottom = Math.min(rect.bottom, viewportHeight);\n if (right <= left || bottom <= top) return false;\n\n const pointX = (left + right) / 2;\n const pointY = (top + bottom) / 2;\n\n const hit = deepElementFromPoint(doc, pointX, pointY);\n if (!hit) return false;\n if (hit === element) return true;\n if (composedAncestors(hit, win).includes(element)) return true;\n // Clause 3 is deliberately shadowHostsAbove (shadow-host hops only), not a\n // general ancestor walk. A plain light-DOM ancestor returned by\n // elementFromPoint (target has pointer-events:none, a transparent center, or\n // is covered via stacking) must NOT count as visible; restricting to shadow\n // hosts preserves light-DOM occlusion. Do not merge this with clause 2.\n if (shadowHostsAbove(element, win).includes(hit)) return true;\n return false;\n}\n","import type { SendDataValue, SendHeaders, SendResponse } from '@walkeros/core';\nimport {\n getHeaders,\n transformData,\n tryCatch,\n tryCatchAsync,\n} from '@walkeros/core';\n\nexport type SendWebTransport = 'fetch' | 'beacon' | 'xhr';\n\nexport interface SendWebOptions {\n headers?: SendHeaders;\n transport?: SendWebTransport;\n method?: string;\n}\n\nexport interface SendWebOptionsFetch extends SendWebOptions {\n credentials?: 'omit' | 'same-origin' | 'include'; // Add credentials option\n noCors?: boolean; // Add noCors option for fetch transport\n timeout?: number; // Abort the request after this many ms (default 10000)\n}\n\nconst DEFAULT_FETCH_TIMEOUT = 10000;\n\ntype SendWebOptionsDynamic<T extends SendWebTransport> = T extends 'fetch'\n ? SendWebOptionsFetch\n : SendWebOptions;\n\nexport type SendWebReturn<T extends SendWebTransport> = T extends 'fetch'\n ? Promise<SendResponse>\n : SendResponse;\n\nexport function sendWeb<T extends SendWebTransport>(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsDynamic<T> & { transport?: T } = {\n transport: 'fetch' as T,\n },\n): SendWebReturn<T> {\n const transport = options.transport || 'fetch';\n\n switch (transport) {\n case 'beacon':\n return sendWebAsBeacon(url, data) as SendWebReturn<T>;\n case 'xhr':\n return sendWebAsXhr(url, data, options) as SendWebReturn<T>;\n case 'fetch':\n default:\n return sendWebAsFetch(url, data, options) as SendWebReturn<T>;\n }\n}\n\nexport async function sendWebAsFetch(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsFetch = {},\n): Promise<SendResponse> {\n const headers = getHeaders(options.headers);\n const body = transformData(data);\n const requested = options.timeout;\n const timeout =\n typeof requested === 'number' && Number.isFinite(requested) && requested > 0\n ? requested\n : DEFAULT_FETCH_TIMEOUT;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n return tryCatchAsync(\n async () => {\n try {\n const response = await fetch(url, {\n method: options.method || 'POST',\n headers,\n keepalive: true,\n credentials: options.credentials || 'same-origin',\n mode: options.noCors ? 'no-cors' : 'cors',\n body,\n signal: controller.signal,\n });\n\n const responseData = options.noCors ? '' : await response.text();\n\n return {\n ok: response.ok,\n data: responseData,\n error: response.ok ? undefined : response.statusText,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n },\n (error) => {\n clearTimeout(timeoutId);\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n\nexport function sendWebAsBeacon(\n url: string,\n data?: SendDataValue,\n): SendResponse {\n const body = transformData(data);\n const ok = navigator.sendBeacon(url, body);\n\n return {\n ok,\n error: ok ? undefined : 'Failed to send beacon',\n };\n}\n\nexport function sendWebAsXhr(\n url: string,\n data?: SendDataValue,\n options: SendWebOptions = {},\n): SendResponse {\n const headers = getHeaders(options.headers);\n const method = options.method || 'POST';\n const body = transformData(data);\n\n return tryCatch(\n () => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, false); // Synchronous request\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n xhr.send(body);\n\n const ok = xhr.status >= 200 && xhr.status < 300;\n\n const parsedData = tryCatch(JSON.parse, () => xhr.response)(xhr.response);\n\n return {\n ok,\n data: parsedData,\n error: ok ? undefined : `${xhr.status} ${xhr.statusText}`,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { StorageType } from '@walkeros/core';\nimport { castValue, Const } from '@walkeros/core';\n\nexport interface StorageValue {\n e: number; // Expiration timestamp\n v: string; // Value\n}\n\nexport interface StorageEnv {\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport function storageDelete(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n env?: StorageEnv,\n) {\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n storageWrite(key, '', 0, storage, domain, env);\n break;\n case Const.Utils.Storage.Local:\n (env?.window ?? window).localStorage.removeItem(key);\n break;\n case Const.Utils.Storage.Session:\n (env?.window ?? window).sessionStorage.removeItem(key);\n break;\n }\n } catch (err) {\n // Storage may be disabled (SecurityError in private browsing, sandboxed\n // iframes, or restrictive browser settings). Silently ignore.\n }\n}\n\nexport function storageRead(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n env?: StorageEnv,\n): WalkerOS.PropertyType {\n // Helper function for local and session storage to support expiration\n function parseItem(string: string | null): StorageValue {\n try {\n return JSON.parse(string || '');\n } catch (err) {\n let e = 1,\n v = '';\n\n // Remove expiration date\n if (string) {\n e = 0;\n v = string;\n }\n\n return { e, v };\n }\n }\n let value, item;\n\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n value = decodeURIComponent(\n (env?.document ?? document).cookie\n .split('; ')\n .find((row) => row.startsWith(key + '='))\n ?.split('=')[1] || '',\n );\n break;\n case Const.Utils.Storage.Local:\n item = parseItem((env?.window ?? window).localStorage.getItem(key));\n break;\n case Const.Utils.Storage.Session:\n item = parseItem((env?.window ?? window).sessionStorage.getItem(key));\n break;\n }\n } catch (err) {\n // Storage may be disabled or inaccessible. Return empty string.\n return castValue('');\n }\n\n // Check if item is expired\n if (item) {\n value = item.v;\n\n if (item.e != 0 && item.e < Date.now()) {\n storageDelete(key, storage, undefined, env);\n value = ''; // Conceal the outdated value\n }\n }\n\n return castValue(value || '');\n}\n\nexport function storageWrite(\n key: string,\n value: WalkerOS.PropertyType,\n maxAgeInMinutes = 30,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n env?: StorageEnv,\n): WalkerOS.PropertyType {\n const e = Date.now() + 1000 * 60 * maxAgeInMinutes;\n const item: StorageValue = { e, v: String(value) };\n const stringifiedItem = JSON.stringify(item);\n\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie: {\n value = typeof value === 'object' ? JSON.stringify(value) : value;\n let cookie = `${key}=${encodeURIComponent(value)}; max-age=${\n maxAgeInMinutes * 60\n }; path=/; SameSite=Lax; secure`;\n\n if (domain) cookie += '; domain=' + domain;\n\n (env?.document ?? document).cookie = cookie;\n break;\n }\n case Const.Utils.Storage.Local:\n (env?.window ?? window).localStorage.setItem(key, stringifiedItem);\n break;\n case Const.Utils.Storage.Session:\n (env?.window ?? window).sessionStorage.setItem(key, stringifiedItem);\n break;\n }\n } catch (err) {\n // Storage may be disabled (SecurityError) or full (QuotaExceededError).\n // Return empty string to signal the write did not persist.\n return castValue('');\n }\n\n return storageRead(key, storage, env);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Destination as WalkerOSDestination } from '@walkeros/core';\n\nexport type TypesGeneric = WalkerOSDestination.TypesGeneric;\n\nexport interface Destination<T extends TypesGeneric = WalkerOSDestination.Types>\n extends WalkerOSDestination.Instance<T> {}\n\nexport type Init = WalkerOSDestination.Init;\n\nexport type Config<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.Config<T>;\n\nexport type PartialConfig<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.PartialConfig<T>;\n\nexport type InitFn<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.InitFn<T>;\n\nexport type PushFn<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.PushFn<T>;\n\nexport type PushEvent<Mapping = unknown> =\n WalkerOSDestination.PushEvent<Mapping>;\n\nexport type PushEvents<Mapping = unknown> =\n WalkerOSDestination.PushEvents<Mapping>;\n\n/**\n * Web-specific environment requirements interface\n *\n * Extends the core Env interface with web-specific\n * globals like window and document for browser destinations.\n */\nexport interface Env extends WalkerOSDestination.BaseEnv {\n /**\n * Properties to be added to the global `window` object\n *\n * Used by web destinations that expect browser-specific\n * global functions like analytics APIs.\n *\n * @example\n * ```typescript\n * window: {\n * gtag: () => {},\n * fbq: () => {},\n * dataLayer: []\n * }\n * ```\n */\n window?: Record<string, unknown>;\n\n /**\n * Properties to be added to the global `document` object\n *\n * Used by destinations that need DOM manipulation capabilities\n * for script loading or element creation.\n *\n * @example\n * ```typescript\n * document: {\n * createElement: () => ({ src: '', async: false }),\n * head: { appendChild: () => {} }\n * }\n * ```\n */\n document?: Record<string, unknown>;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Collector, WalkerOS, Source as CoreSource } from '@walkeros/core';\n\nexport type TypesGeneric = CoreSource.TypesGeneric;\n\nexport interface Source<T extends TypesGeneric = CoreSource.Types>\n extends CoreSource.Instance<T> {\n settings?: CoreSource.Settings<T>;\n mapping?: CoreSource.Mapping<T>;\n}\n\nexport type Init = Partial<Omit<Source, 'init'>> & Pick<Source, 'type'>;\n\nexport type Config<T extends TypesGeneric = CoreSource.Types> =\n CoreSource.Instance<T> & {\n settings: CoreSource.Settings<T>;\n mapping?: CoreSource.Mapping<T>;\n };\n\nexport type PartialConfig<T extends TypesGeneric = CoreSource.Types> = Partial<\n Config<T>\n>;\n\nexport type InitFn<T extends TypesGeneric = CoreSource.Types> = (\n collector: Collector.Instance,\n config: Config<T>,\n) => void | Promise<void>;\n","import type { Elb } from '@walkeros/core';\n\n// Simple re-exports from core\nexport type PushResult = Elb.PushResult;\nexport type Layer = Elb.Layer;\n","import type {\n Collector as CoreCollector,\n Elb,\n Hooks,\n WalkerOS,\n Destination as WalkerOSDestination,\n On,\n} from '@walkeros/core';\nimport type { Destination, Config as DestConfig } from './destination';\nimport type { Layer } from './elb';\nimport type { Events, Trigger } from './walker';\n\ndeclare global {\n interface Window {\n elbwalker: Collector;\n walkerjs: CoreCollector.Instance;\n elbLayer?: Layer;\n dataLayer: WalkerOS.Events | unknown | unknown[];\n elb: Elb.Fn<Promise<Elb.PushResult>>;\n }\n}\n\nexport interface Collector extends Omit<CoreCollector.Instance, 'config'> {\n config: Config & CoreCollector.Config;\n destinations: Destinations;\n push: Elb.Fn<Promise<Elb.PushResult>>;\n getAllEvents: (scope: Element, prefix: string) => Events;\n getEvents: (target: Element, trigger: Trigger, prefix: string) => Events;\n getGlobals: () => WalkerOS.Properties;\n _visibilityState?: {\n observer: IntersectionObserver | undefined;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean }\n >;\n };\n}\n\nexport interface State {\n config: Config;\n destinations: Destinations;\n}\n\nexport interface Config {\n dataLayer: boolean;\n dataLayerConfig: DestConfig;\n elbLayer: Layer;\n listeners: boolean;\n pageview: boolean;\n prefix: string;\n run: boolean;\n scope: Scope;\n elb?: string;\n name?: string;\n}\n\nexport interface InitConfig extends Partial<Config> {\n consent?: WalkerOS.Consent;\n custom?: WalkerOS.Properties;\n destinations?: WalkerOSDestination.InitDestinations;\n hooks?: Hooks.Functions;\n on?: On.OnConfig;\n user?: WalkerOS.User;\n}\n\nexport interface Destinations {\n [name: string]: Destination;\n}\n\nexport type Scope = Element | Document;\n","import type { WalkerOS } from '@walkeros/core';\n\nexport type Events = Event[];\n\nexport interface Event {\n entity: string;\n action: string;\n data?: WalkerOS.Properties;\n context?: WalkerOS.OrderedProperties;\n trigger?: Trigger;\n nested: WalkerOS.Entities;\n}\n\nexport type KeyVal = [string, string];\n\nexport type Attributes = Array<string>;\n\nexport type Trigger =\n | 'click'\n | 'custom'\n | 'hover'\n | 'load'\n | 'pulse'\n | 'scroll'\n | 'submit'\n | 'visible'\n | 'visibles'\n | 'wait'\n | string;\n\nexport interface Filter {\n [name: string]: boolean;\n}\n\nexport interface TriggersActionGroups {\n [trigger: string]: TriggerActions;\n}\n\nexport type TriggerActions = Array<TriggerAction>;\n\ninterface TriggerAction {\n trigger: string;\n triggerParams?: string;\n action: string;\n actionParams?: string;\n}\n\nexport type ScrollElements = Array<[HTMLElement, number]>;\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{trim as t}from"@walkeros/core";function e(t,e){return(t.getAttribute(e)||"").trim()}function o(t,e=";"){if(!t)return[];const o=new RegExp(`(?:[^${e}']+|'[^']*')+`,"ig");return t.match(o)||[]}function n(e){const[o,n]=e.split(/:(.+)/,2);return[t(o||""),t(n||"")]}function r(t){const e={};return o(t).forEach(t=>{const[o,r]=n(t);o&&("true"===r?e[o]=!0:"false"===r?e[o]=!1:r&&/^\d+$/.test(r)?e[o]=parseInt(r,10):r&&/^\d+\.\d+$/.test(r)?e[o]=parseFloat(r):e[o]=r||!0)}),e}function s(t){return t.language}function i(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function c(t){return`${t.screen.width}x${t.screen.height}`}var a=function(){const t=window;(t.elbLayer=t.elbLayer||[]).push(arguments)};import{OBSERVE_ENV_KEY as u,isEnvObserve as l,parseCallPath as d}from"@walkeros/core";function f(t,e,o,n){const r=new Map;return new Proxy(t,{get(t,s){if("string"!=typeof s)return Reflect.get(t,s,t);const i=r.get(s);if(void 0!==i)return i;if(e.some(t=>1===t.length&&t[0]===s)){const e=Reflect.get(t,s,t);if("function"!=typeof e)return e;const i=`${n}.${s}`,c=(...n)=>{try{o(i,n)}catch{}return e.apply(t,n)};return r.set(s,c),c}const c=e.filter(t=>t.length>1&&t[0]===s).map(t=>t.slice(1));if(c.length>0){const e=Reflect.get(t,s,t);if(null===e||"object"!=typeof e)return e;const i=f(e,c,o,`${n}.${s}`);return r.set(s,i),i}return Reflect.get(t,s,t)}})}function m(t){const e={window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document,...t},o=t&&t[u];if(l(o)){delete e[u];const t=new Map;for(const e of o.paths){const o=d(e),n=o[0];if(void 0===n)continue;const r=t.get(n)??[];r.push(o.slice(1)),t.set(n,r)}for(const[n,r]of t){const t=e[n];null!==t&&"object"==typeof t&&(e[n]=f(t,r,o.record,n))}}return e}import{isDefined as w}from"@walkeros/core";async function g(t,e){return(await async function(t){const e=w(window)&&window.crypto?window.crypto:void 0;if(!e||!e.subtle||!TextEncoder)return;const o=(new TextEncoder).encode(t),n=await e.subtle.digest("SHA-256",o);return Array.from(new Uint8Array(n)).map(t=>t.toString(16).padStart(2,"0")).join("")}(t)||"").slice(0,e)}function h(t,e,o){let n=t.elementFromPoint(e,o);for(;n&&n.shadowRoot;){const t=n.shadowRoot.elementFromPoint(e,o);if(!t||t===n)break;n=t}return n}function p(t,e){const o=[];let n=t;for(;n;){let t=n.parentElement;if(!t){const o=n.getRootNode();o instanceof e.self.ShadowRoot&&(t=o.host)}if(!t)break;o.push(t),n=t}return o}function S(t,e){const o=[];let n=t.getRootNode();for(;n instanceof e.self.ShadowRoot;)o.push(n.host),n=n.host.getRootNode();return o}function y(t,e,o){if(!function(t,e){const o=e.getComputedStyle(t);if("none"===o.display)return!1;if("visible"!==o.visibility)return!1;let n=t;for(;n;){const t=e.getComputedStyle(n).opacity;if(t&&Number(t)<.1)return!1;const o=n.parentElement;if(o){n=o;continue}const r=n.getRootNode();n=r instanceof e.self.ShadowRoot?r.host:null}return!0}(t,e))return!1;const n=t.getBoundingClientRect(),r=o.documentElement.clientWidth||e.innerWidth,s=o.documentElement.clientHeight||e.innerHeight,i=Math.max(n.left,0),c=Math.max(n.top,0),a=Math.min(n.right,r),u=Math.min(n.bottom,s);if(a<=i||u<=c)return!1;const l=h(o,(i+a)/2,(c+u)/2);return!!l&&(l===t||(!!p(l,e).includes(t)||!!S(t,e).includes(l)))}import{getHeaders as b,transformData as k,tryCatch as v,tryCatchAsync as R}from"@walkeros/core";function U(t,e,o={transport:"fetch"}){switch(o.transport||"fetch"){case"beacon":return $(t,e);case"xhr":return C(t,e,o);default:return x(t,e,o)}}async function x(t,e,o={}){const n=b(o.headers),r=k(e),s=o.timeout,i="number"==typeof s&&Number.isFinite(s)&&s>0?s:1e4,c=new AbortController,a=setTimeout(()=>c.abort(),i);return R(async()=>{try{const e=await fetch(t,{method:o.method||"POST",headers:n,keepalive:!0,credentials:o.credentials||"same-origin",mode:o.noCors?"no-cors":"cors",body:r,signal:c.signal}),s=o.noCors?"":await e.text();return{ok:e.ok,data:s,error:e.ok?void 0:e.statusText}}finally{clearTimeout(a)}},t=>(clearTimeout(a),{ok:!1,error:t.message}))()}function $(t,e){const o=k(e),n=navigator.sendBeacon(t,o);return{ok:n,error:n?void 0:"Failed to send beacon"}}function C(t,e,o={}){const n=b(o.headers),r=o.method||"POST",s=k(e);return v(()=>{const e=new XMLHttpRequest;e.open(r,t,!1);for(const t in n)e.setRequestHeader(t,n[t]);e.send(s);const o=e.status>=200&&e.status<300;return{ok:o,data:v(JSON.parse,()=>e.response)(e.response),error:o?void 0:`${e.status} ${e.statusText}`}},t=>({ok:!1,error:t.message}))()}import{castValue as T,Const as I}from"@walkeros/core";function N(t,e=I.Utils.Storage.Session,o){try{switch(e){case I.Utils.Storage.Cookie:L(t,"",0,e,
|
|
1
|
+
import{trim as t}from"@walkeros/core";function e(t,e){return(t.getAttribute(e)||"").trim()}function o(t,e=";"){if(!t)return[];const o=new RegExp(`(?:[^${e}']+|'[^']*')+`,"ig");return t.match(o)||[]}function n(e){const[o,n]=e.split(/:(.+)/,2);return[t(o||""),t(n||"")]}function r(t){const e={};return o(t).forEach(t=>{const[o,r]=n(t);o&&("true"===r?e[o]=!0:"false"===r?e[o]=!1:r&&/^\d+$/.test(r)?e[o]=parseInt(r,10):r&&/^\d+\.\d+$/.test(r)?e[o]=parseFloat(r):e[o]=r||!0)}),e}function s(t){return t.language}function i(){return Intl.DateTimeFormat().resolvedOptions().timeZone}function c(t){return`${t.screen.width}x${t.screen.height}`}var a=function(){const t=window;(t.elbLayer=t.elbLayer||[]).push(arguments)};import{OBSERVE_ENV_KEY as u,isEnvObserve as l,parseCallPath as d}from"@walkeros/core";function f(t,e,o,n){const r=new Map;return new Proxy(t,{get(t,s){if("string"!=typeof s)return Reflect.get(t,s,t);const i=r.get(s);if(void 0!==i)return i;if(e.some(t=>1===t.length&&t[0]===s)){const e=Reflect.get(t,s,t);if("function"!=typeof e)return e;const i=`${n}.${s}`,c=(...n)=>{try{o(i,n)}catch{}return e.apply(t,n)};return r.set(s,c),c}const c=e.filter(t=>t.length>1&&t[0]===s).map(t=>t.slice(1));if(c.length>0){const e=Reflect.get(t,s,t);if(null===e||"object"!=typeof e)return e;const i=f(e,c,o,`${n}.${s}`);return r.set(s,i),i}return Reflect.get(t,s,t)}})}function m(t){const e={window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document,...t},o=t&&t[u];if(l(o)){delete e[u];const t=new Map;for(const e of o.paths){const o=d(e),n=o[0];if(void 0===n)continue;const r=t.get(n)??[];r.push(o.slice(1)),t.set(n,r)}for(const[n,r]of t){const t=e[n];null!==t&&"object"==typeof t&&(e[n]=f(t,r,o.record,n))}}return e}import{isDefined as w}from"@walkeros/core";async function g(t,e){return(await async function(t){const e=w(window)&&window.crypto?window.crypto:void 0;if(!e||!e.subtle||!TextEncoder)return;const o=(new TextEncoder).encode(t),n=await e.subtle.digest("SHA-256",o);return Array.from(new Uint8Array(n)).map(t=>t.toString(16).padStart(2,"0")).join("")}(t)||"").slice(0,e)}function h(t,e,o){let n=t.elementFromPoint(e,o);for(;n&&n.shadowRoot;){const t=n.shadowRoot.elementFromPoint(e,o);if(!t||t===n)break;n=t}return n}function p(t,e){const o=[];let n=t;for(;n;){let t=n.parentElement;if(!t){const o=n.getRootNode();o instanceof e.self.ShadowRoot&&(t=o.host)}if(!t)break;o.push(t),n=t}return o}function S(t,e){const o=[];let n=t.getRootNode();for(;n instanceof e.self.ShadowRoot;)o.push(n.host),n=n.host.getRootNode();return o}function y(t,e,o){if(!function(t,e){const o=e.getComputedStyle(t);if("none"===o.display)return!1;if("visible"!==o.visibility)return!1;let n=t;for(;n;){const t=e.getComputedStyle(n).opacity;if(t&&Number(t)<.1)return!1;const o=n.parentElement;if(o){n=o;continue}const r=n.getRootNode();n=r instanceof e.self.ShadowRoot?r.host:null}return!0}(t,e))return!1;const n=t.getBoundingClientRect(),r=o.documentElement.clientWidth||e.innerWidth,s=o.documentElement.clientHeight||e.innerHeight,i=Math.max(n.left,0),c=Math.max(n.top,0),a=Math.min(n.right,r),u=Math.min(n.bottom,s);if(a<=i||u<=c)return!1;const l=h(o,(i+a)/2,(c+u)/2);return!!l&&(l===t||(!!p(l,e).includes(t)||!!S(t,e).includes(l)))}import{getHeaders as b,transformData as k,tryCatch as v,tryCatchAsync as R}from"@walkeros/core";function U(t,e,o={transport:"fetch"}){switch(o.transport||"fetch"){case"beacon":return $(t,e);case"xhr":return C(t,e,o);default:return x(t,e,o)}}async function x(t,e,o={}){const n=b(o.headers),r=k(e),s=o.timeout,i="number"==typeof s&&Number.isFinite(s)&&s>0?s:1e4,c=new AbortController,a=setTimeout(()=>c.abort(),i);return R(async()=>{try{const e=await fetch(t,{method:o.method||"POST",headers:n,keepalive:!0,credentials:o.credentials||"same-origin",mode:o.noCors?"no-cors":"cors",body:r,signal:c.signal}),s=o.noCors?"":await e.text();return{ok:e.ok,data:s,error:e.ok?void 0:e.statusText}}finally{clearTimeout(a)}},t=>(clearTimeout(a),{ok:!1,error:t.message}))()}function $(t,e){const o=k(e),n=navigator.sendBeacon(t,o);return{ok:n,error:n?void 0:"Failed to send beacon"}}function C(t,e,o={}){const n=b(o.headers),r=o.method||"POST",s=k(e);return v(()=>{const e=new XMLHttpRequest;e.open(r,t,!1);for(const t in n)e.setRequestHeader(t,n[t]);e.send(s);const o=e.status>=200&&e.status<300;return{ok:o,data:v(JSON.parse,()=>e.response)(e.response),error:o?void 0:`${e.status} ${e.statusText}`}},t=>({ok:!1,error:t.message}))()}import{castValue as T,Const as I}from"@walkeros/core";function N(t,e=I.Utils.Storage.Session,o,n){try{switch(e){case I.Utils.Storage.Cookie:L(t,"",0,e,o,n);break;case I.Utils.Storage.Local:(n?.window??window).localStorage.removeItem(t);break;case I.Utils.Storage.Session:(n?.window??window).sessionStorage.removeItem(t)}}catch(t){}}function E(t,e=I.Utils.Storage.Session,o){function n(t){try{return JSON.parse(t||"")}catch(e){let o=1,n="";return t&&(o=0,n=t),{e:o,v:n}}}let r,s;try{switch(e){case I.Utils.Storage.Cookie:r=decodeURIComponent((o?.document??document).cookie.split("; ").find(e=>e.startsWith(t+"="))?.split("=")[1]||"");break;case I.Utils.Storage.Local:s=n((o?.window??window).localStorage.getItem(t));break;case I.Utils.Storage.Session:s=n((o?.window??window).sessionStorage.getItem(t))}}catch(t){return T("")}return s&&(r=s.v,0!=s.e&&s.e<Date.now()&&(N(t,e,void 0,o),r="")),T(r||"")}function L(t,e,o=30,n=I.Utils.Storage.Session,r,s){const i={e:Date.now()+6e4*o,v:String(e)},c=JSON.stringify(i);try{switch(n){case I.Utils.Storage.Cookie:{e="object"==typeof e?JSON.stringify(e):e;let n=`${t}=${encodeURIComponent(e)}; max-age=${60*o}; path=/; SameSite=Lax; secure`;r&&(n+="; domain="+r),(s?.document??document).cookie=n;break}case I.Utils.Storage.Local:(s?.window??window).localStorage.setItem(t,c);break;case I.Utils.Storage.Session:(s?.window??window).sessionStorage.setItem(t,c)}}catch(t){return T("")}return E(t,n,s)}var M={},O={},W={},F={},A={};export{M as DestinationWeb,W as Elb,O as SourceWeb,A as Walker,F as WebCollector,p as composedAncestors,h as deepElementFromPoint,a as elb,e as getAttribute,m as getEnv,g as getHashWeb,s as getLanguage,c as getScreenSize,i as getTimezone,y as isVisible,r as parseInlineConfig,U as sendWeb,$ as sendWebAsBeacon,x as sendWebAsFetch,C as sendWebAsXhr,S as shadowHostsAbove,o as splitAttribute,n as splitKeyVal,N as storageDelete,E as storageRead,L as storageWrite};//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/attributes.ts","../src/browser.ts","../src/elb.ts","../src/environment.ts","../src/getHashWeb.ts","../src/isVisible.ts","../src/sendWeb.ts","../src/storage.ts","../src/types/destination.ts","../src/types/source.ts","../src/types/elb.ts","../src/types/collector.ts","../src/types/walker.ts"],"sourcesContent":["import { trim } from '@walkeros/core';\n\n/**\n * Get attribute value from element\n * @param element - DOM element\n * @param name - Attribute name\n * @returns Trimmed attribute value or empty string\n */\nexport function getAttribute(element: Element, name: string): string {\n return (element.getAttribute(name) || '').trim();\n}\n\n/**\n * Split attribute string by separator (semicolon by default)\n * Handles quoted values containing the separator\n * @param str - String to split\n * @param separator - Separator character (default: ';')\n * @returns Array of attribute strings\n */\nexport function splitAttribute(str: string, separator = ';'): string[] {\n if (!str) return [];\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\n/**\n * Split key-value pair by first colon\n * @param str - String in format \"key:value\"\n * @returns Tuple of [key, value]\n */\nexport function splitKeyVal(str: string): [string, string] {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key || ''), trim(value || '')];\n}\n\n/**\n * Parse inline configuration string into object\n * Supports type conversion for boolean and numeric values\n * @param str - Configuration string (e.g., \"elb:track;run:false;port:3000\")\n * @returns Parsed configuration object\n */\nexport function parseInlineConfig(str: string): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n\n splitAttribute(str).forEach((pair) => {\n const [key, value] = splitKeyVal(pair);\n if (key) {\n // Type conversion\n if (value === 'true') {\n config[key] = true;\n } else if (value === 'false') {\n config[key] = false;\n } else if (value && /^\\d+$/.test(value)) {\n config[key] = parseInt(value, 10);\n } else if (value && /^\\d+\\.\\d+$/.test(value)) {\n config[key] = parseFloat(value);\n } else if (value) {\n config[key] = value;\n } else {\n // Key without value defaults to true\n config[key] = true;\n }\n }\n });\n\n return config;\n}\n","export function getLanguage(navigatorRef: Navigator): string | undefined {\n return navigatorRef.language;\n}\n\nexport function getTimezone(): string | undefined {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function getScreenSize(windowRef: Window): string {\n return `${windowRef.screen.width}x${windowRef.screen.height}`;\n}\n","import type { Elb } from '@walkeros/core';\n\nexport const elb: Elb.Fn<void> = function () {\n const w = window as unknown as Record<string, unknown[]>;\n (w.elbLayer = w.elbLayer || []).push(arguments);\n};\n","import type { Env } from './types/destination';\nimport type { Destination } from '@walkeros/core';\nimport { OBSERVE_ENV_KEY, isEnvObserve, parseCallPath } from '@walkeros/core';\n\n/**\n * Transparent recording Proxy over a resolved env root (`window`, `document`,\n * or an env override). `subPaths` are the tracked dot-path segments AFTER the\n * root, so a leaf is a length-1 remainder and a longer remainder is an\n * intermediate to recurse into.\n *\n * Only a get-trap: writes fall through to the real target so patterns like\n * gtm's `window[dataLayerName] = ...` mutate the actual global. `Reflect.get`\n * uses `t` (never the proxy) as receiver so native accessors keep their brand\n * checks (`window.document`, `window.location`). Wrappers and child proxies are\n * memoized per proxy so repeated reads return the same reference and untracked\n * globals are never bound.\n */\nfunction wrapRoot(\n target: object,\n subPaths: string[][],\n record: Destination.EnvObserve['record'],\n prefix: string,\n): object {\n const memo = new Map<string, unknown>();\n\n return new Proxy(target, {\n get(t, prop) {\n if (typeof prop !== 'string') return Reflect.get(t, prop, t);\n\n const cached = memo.get(prop);\n if (cached !== undefined) return cached;\n\n // Leaf: this prop is the final tracked segment — record its calls.\n if (subPaths.some((sp) => sp.length === 1 && sp[0] === prop)) {\n const original: unknown = Reflect.get(t, prop, t);\n if (typeof original !== 'function') return original;\n\n const fullPath = `${prefix}.${prop}`;\n const wrapper = (...args: unknown[]): unknown => {\n try {\n record(fullPath, args);\n } catch {\n // Telemetry must never suppress the real vendor call.\n }\n return original.apply(t, args);\n };\n memo.set(prop, wrapper);\n return wrapper;\n }\n\n // Intermediate: navigate deeper, keeping the same recorder.\n const interRests = subPaths\n .filter((sp) => sp.length > 1 && sp[0] === prop)\n .map((sp) => sp.slice(1));\n if (interRests.length > 0) {\n const child: unknown = Reflect.get(t, prop, t);\n if (child === null || typeof child !== 'object') return child;\n\n const childProxy = wrapRoot(\n child,\n interRests,\n record,\n `${prefix}.${prop}`,\n );\n memo.set(prop, childProxy);\n return childProxy;\n }\n\n return Reflect.get(t, prop, t);\n },\n });\n}\n\n/**\n * Helper function to get environment globals with fallbacks\n *\n * Returns window and document by default, with optional environment overrides.\n * Generic over the caller's `Env` so a destination that narrows `window`/\n * `document` (and augments the DOM globals via `declare global`) gets those\n * narrowed types back without casting at the call site.\n *\n * When the collector injects an observe recorder under `OBSERVE_ENV_KEY` (trace\n * level, live-web paths wrapEnv could not resolve), the resolved roots are\n * wrapped in a transparent recording Proxy and the key is stripped before the\n * env reaches the destination. Outside trace the key is absent, so the guard is\n * a single property read with no wrapping cost.\n *\n * @param env - Optional environment overrides\n * @returns Env with window/document defaults and any provided overrides\n */\nexport function getEnv<E extends Env = Env>(env?: E) {\n // The DOM globals (typed `Window`/`Document`) are merged with the caller's\n // narrowed `Env` overrides. This intersection is asserted once here, at the\n // single boundary where the loose `Record`-typed base meets the real DOM\n // globals, so no destination has to cast `window`/`document` per call.\n const merged: Record<string, unknown> = {\n window: typeof window !== 'undefined' ? window : globalThis.window,\n document: typeof document !== 'undefined' ? document : globalThis.document,\n ...env,\n };\n\n const observe = env && env[OBSERVE_ENV_KEY];\n if (isEnvObserve(observe)) {\n // Strip the recorder so it never reaches the destination (mirrors wrapEnv\n // stripping `simulation`).\n delete merged[OBSERVE_ENV_KEY];\n\n // Group tracked paths by root segment through the shared grammar so the\n // fallback wrapper and wrapEnv cannot drift.\n const subPathsByRoot = new Map<string, string[][]>();\n for (const raw of observe.paths) {\n const segments = parseCallPath(raw);\n const root = segments[0];\n // W5 filters malformed paths already; guard against an empty parse.\n if (root === undefined) continue;\n const group = subPathsByRoot.get(root) ?? [];\n group.push(segments.slice(1));\n subPathsByRoot.set(root, group);\n }\n\n // Wrap each present, navigable root; a missing or non-object root is left\n // as-is (its leaf stays unresolvable, matching wrapEnv).\n for (const [root, subPaths] of subPathsByRoot) {\n const target = merged[root];\n if (target !== null && typeof target === 'object') {\n merged[root] = wrapRoot(target, subPaths, observe.record, root);\n }\n }\n }\n\n return merged as Omit<E, 'window' | 'document'> & {\n window: Window & NonNullable<E['window']>;\n document: Document & NonNullable<E['document']>;\n };\n}\n","import { isDefined } from '@walkeros/core';\n\nasync function sha256(message: string): Promise<string | undefined> {\n const crypto: Crypto | undefined =\n isDefined(window) && window.crypto ? window.crypto : undefined;\n\n // Crypto API not available\n if (!crypto || !crypto.subtle || !TextEncoder) return;\n\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hashHex;\n}\n\nexport async function getHashWeb(\n str: string,\n length?: number,\n): Promise<string> {\n return ((await sha256(str)) || '').slice(0, length);\n}\n","/**\n * Resolve the topmost element at a point, descending into shadow trees.\n * `elementFromPoint` does not pierce shadow boundaries, so this re-probes each\n * open shadow root's own `elementFromPoint`. It descends through open roots and\n * stops at a closed host, whose `shadowRoot` is null.\n * @param root - Document or shadow root to probe from\n * @param x - Viewport x coordinate\n * @param y - Viewport y coordinate\n * @returns Deepest element at the point, or null when nothing is hit\n */\nexport function deepElementFromPoint(\n root: DocumentOrShadowRoot,\n x: number,\n y: number,\n): Element | null {\n let el = root.elementFromPoint(x, y);\n while (el && el.shadowRoot) {\n const inner = el.shadowRoot.elementFromPoint(x, y);\n if (!inner || inner === el) break;\n el = inner;\n }\n return el;\n}\n\n/**\n * Collect the composed ancestor chain of an element, walking `parentElement`\n * and hopping across shadow-host boundaries when a shadow root is reached.\n * Ancestry follows the flattened tree by DOM containment; it does not resolve\n * slot distribution (slotted light-DOM parents are not tracked).\n * @param node - Element to walk up from\n * @param win - Window owning the element, used for its realm's ShadowRoot\n * @returns Ancestors from nearest to furthest\n */\nexport function composedAncestors(node: Element, win: Window): Element[] {\n const chain: Element[] = [];\n let current: Element | null = node;\n while (current) {\n let parent: Element | null = current.parentElement;\n if (!parent) {\n const root = current.getRootNode();\n // `win.self` is load-bearing: the ShadowRoot constructor lives on\n // `Window & typeof globalThis` (the type of `win.self`), not the bare\n // `Window` parameter, so `win.ShadowRoot` would fail typecheck.\n if (root instanceof win.self.ShadowRoot) parent = root.host;\n }\n if (!parent) break;\n chain.push(parent);\n current = parent;\n }\n return chain;\n}\n\n/**\n * Collect the shadow hosts enclosing an element, crossing only shadow-host\n * boundaries. Unlike composedAncestors, plain light-DOM parents are skipped, so\n * the result contains hosts alone, ordered from innermost to outermost.\n * @param node - Element to walk up from\n * @param win - Window owning the element, used for its realm's ShadowRoot\n * @returns Enclosing shadow hosts, innermost first\n */\nexport function shadowHostsAbove(node: Element, win: Window): Element[] {\n const hosts: Element[] = [];\n let root = node.getRootNode();\n // `win.self` is load-bearing: the ShadowRoot constructor lives on\n // `Window & typeof globalThis` (the type of `win.self`), not the bare\n // `Window` parameter, so `win.ShadowRoot` would fail typecheck.\n while (root instanceof win.self.ShadowRoot) {\n hosts.push(root.host);\n root = root.host.getRootNode();\n }\n return hosts;\n}\n\n/**\n * True when the composed chain renders the element at all. `visibility`\n * inherits, so the element's own computed value is enough. `opacity` does NOT\n * inherit: a transparent ancestor leaves the element's own opacity at 1 while\n * hiding it, and elementFromPoint does not help because a transparent element\n * is still hit-testable. Walk the chain, crossing shadow-host boundaries.\n */\nfunction isRendered(element: HTMLElement, win: Window): boolean {\n const style = win.getComputedStyle(element);\n if (style.display === 'none') return false;\n if (style.visibility !== 'visible') return false;\n\n let current: Element | null = element;\n while (current) {\n const opacity = win.getComputedStyle(current).opacity;\n if (opacity && Number(opacity) < 0.1) return false;\n\n const parent: Element | null = current.parentElement;\n if (parent) {\n current = parent;\n continue;\n }\n const root = current.getRootNode();\n current = root instanceof win.self.ShadowRoot ? root.host : null;\n }\n\n return true;\n}\n\n/**\n * Whether the element is actually seen by the user: rendered, on screen, and\n * not painted over. Geometry (how much of it is showing) is decided by the\n * IntersectionObserver, which computes it during layout for free; this function\n * answers only the two questions the observer is blind to, so it runs once per\n * candidate impression rather than on every scroll frame.\n */\nexport function isVisible(\n element: HTMLElement,\n win: Window,\n doc: Document,\n): boolean {\n if (!isRendered(element, win)) return false;\n\n const rect = element.getBoundingClientRect();\n const viewportWidth = doc.documentElement.clientWidth || win.innerWidth;\n const viewportHeight = doc.documentElement.clientHeight || win.innerHeight;\n\n // Clip the element against the viewport. Probing the centre of this visible\n // band, rather than the centre of the element, is what removes the need for a\n // separate large-element branch: an element taller than the viewport has its\n // own centre off screen, which the previous implementation read as hidden.\n const left = Math.max(rect.left, 0);\n const top = Math.max(rect.top, 0);\n const right = Math.min(rect.right, viewportWidth);\n const bottom = Math.min(rect.bottom, viewportHeight);\n if (right <= left || bottom <= top) return false;\n\n const pointX = (left + right) / 2;\n const pointY = (top + bottom) / 2;\n\n const hit = deepElementFromPoint(doc, pointX, pointY);\n if (!hit) return false;\n if (hit === element) return true;\n if (composedAncestors(hit, win).includes(element)) return true;\n // Clause 3 is deliberately shadowHostsAbove (shadow-host hops only), not a\n // general ancestor walk. A plain light-DOM ancestor returned by\n // elementFromPoint (target has pointer-events:none, a transparent center, or\n // is covered via stacking) must NOT count as visible; restricting to shadow\n // hosts preserves light-DOM occlusion. Do not merge this with clause 2.\n if (shadowHostsAbove(element, win).includes(hit)) return true;\n return false;\n}\n","import type { SendDataValue, SendHeaders, SendResponse } from '@walkeros/core';\nimport {\n getHeaders,\n transformData,\n tryCatch,\n tryCatchAsync,\n} from '@walkeros/core';\n\nexport type SendWebTransport = 'fetch' | 'beacon' | 'xhr';\n\nexport interface SendWebOptions {\n headers?: SendHeaders;\n transport?: SendWebTransport;\n method?: string;\n}\n\nexport interface SendWebOptionsFetch extends SendWebOptions {\n credentials?: 'omit' | 'same-origin' | 'include'; // Add credentials option\n noCors?: boolean; // Add noCors option for fetch transport\n timeout?: number; // Abort the request after this many ms (default 10000)\n}\n\nconst DEFAULT_FETCH_TIMEOUT = 10000;\n\ntype SendWebOptionsDynamic<T extends SendWebTransport> = T extends 'fetch'\n ? SendWebOptionsFetch\n : SendWebOptions;\n\nexport type SendWebReturn<T extends SendWebTransport> = T extends 'fetch'\n ? Promise<SendResponse>\n : SendResponse;\n\nexport function sendWeb<T extends SendWebTransport>(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsDynamic<T> & { transport?: T } = {\n transport: 'fetch' as T,\n },\n): SendWebReturn<T> {\n const transport = options.transport || 'fetch';\n\n switch (transport) {\n case 'beacon':\n return sendWebAsBeacon(url, data) as SendWebReturn<T>;\n case 'xhr':\n return sendWebAsXhr(url, data, options) as SendWebReturn<T>;\n case 'fetch':\n default:\n return sendWebAsFetch(url, data, options) as SendWebReturn<T>;\n }\n}\n\nexport async function sendWebAsFetch(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsFetch = {},\n): Promise<SendResponse> {\n const headers = getHeaders(options.headers);\n const body = transformData(data);\n const requested = options.timeout;\n const timeout =\n typeof requested === 'number' && Number.isFinite(requested) && requested > 0\n ? requested\n : DEFAULT_FETCH_TIMEOUT;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n return tryCatchAsync(\n async () => {\n try {\n const response = await fetch(url, {\n method: options.method || 'POST',\n headers,\n keepalive: true,\n credentials: options.credentials || 'same-origin',\n mode: options.noCors ? 'no-cors' : 'cors',\n body,\n signal: controller.signal,\n });\n\n const responseData = options.noCors ? '' : await response.text();\n\n return {\n ok: response.ok,\n data: responseData,\n error: response.ok ? undefined : response.statusText,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n },\n (error) => {\n clearTimeout(timeoutId);\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n\nexport function sendWebAsBeacon(\n url: string,\n data?: SendDataValue,\n): SendResponse {\n const body = transformData(data);\n const ok = navigator.sendBeacon(url, body);\n\n return {\n ok,\n error: ok ? undefined : 'Failed to send beacon',\n };\n}\n\nexport function sendWebAsXhr(\n url: string,\n data?: SendDataValue,\n options: SendWebOptions = {},\n): SendResponse {\n const headers = getHeaders(options.headers);\n const method = options.method || 'POST';\n const body = transformData(data);\n\n return tryCatch(\n () => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, false); // Synchronous request\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n xhr.send(body);\n\n const ok = xhr.status >= 200 && xhr.status < 300;\n\n const parsedData = tryCatch(JSON.parse, () => xhr.response)(xhr.response);\n\n return {\n ok,\n data: parsedData,\n error: ok ? undefined : `${xhr.status} ${xhr.statusText}`,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { StorageType } from '@walkeros/core';\nimport { castValue, Const } from '@walkeros/core';\n\nexport interface StorageValue {\n e: number; // Expiration timestamp\n v: string; // Value\n}\n\nexport interface StorageEnv {\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport function storageDelete(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n env?: StorageEnv,\n) {\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n storageWrite(key, '', 0, storage, undefined, env);\n break;\n case Const.Utils.Storage.Local:\n (env?.window ?? window).localStorage.removeItem(key);\n break;\n case Const.Utils.Storage.Session:\n (env?.window ?? window).sessionStorage.removeItem(key);\n break;\n }\n } catch (err) {\n // Storage may be disabled (SecurityError in private browsing, sandboxed\n // iframes, or restrictive browser settings). Silently ignore.\n }\n}\n\nexport function storageRead(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n env?: StorageEnv,\n): WalkerOS.PropertyType {\n // Helper function for local and session storage to support expiration\n function parseItem(string: string | null): StorageValue {\n try {\n return JSON.parse(string || '');\n } catch (err) {\n let e = 1,\n v = '';\n\n // Remove expiration date\n if (string) {\n e = 0;\n v = string;\n }\n\n return { e, v };\n }\n }\n let value, item;\n\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n value = decodeURIComponent(\n (env?.document ?? document).cookie\n .split('; ')\n .find((row) => row.startsWith(key + '='))\n ?.split('=')[1] || '',\n );\n break;\n case Const.Utils.Storage.Local:\n item = parseItem((env?.window ?? window).localStorage.getItem(key));\n break;\n case Const.Utils.Storage.Session:\n item = parseItem((env?.window ?? window).sessionStorage.getItem(key));\n break;\n }\n } catch (err) {\n // Storage may be disabled or inaccessible. Return empty string.\n return castValue('');\n }\n\n // Check if item is expired\n if (item) {\n value = item.v;\n\n if (item.e != 0 && item.e < Date.now()) {\n storageDelete(key, storage, env);\n value = ''; // Conceal the outdated value\n }\n }\n\n return castValue(value || '');\n}\n\nexport function storageWrite(\n key: string,\n value: WalkerOS.PropertyType,\n maxAgeInMinutes = 30,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n env?: StorageEnv,\n): WalkerOS.PropertyType {\n const e = Date.now() + 1000 * 60 * maxAgeInMinutes;\n const item: StorageValue = { e, v: String(value) };\n const stringifiedItem = JSON.stringify(item);\n\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie: {\n value = typeof value === 'object' ? JSON.stringify(value) : value;\n let cookie = `${key}=${encodeURIComponent(value)}; max-age=${\n maxAgeInMinutes * 60\n }; path=/; SameSite=Lax; secure`;\n\n if (domain) cookie += '; domain=' + domain;\n\n (env?.document ?? document).cookie = cookie;\n break;\n }\n case Const.Utils.Storage.Local:\n (env?.window ?? window).localStorage.setItem(key, stringifiedItem);\n break;\n case Const.Utils.Storage.Session:\n (env?.window ?? window).sessionStorage.setItem(key, stringifiedItem);\n break;\n }\n } catch (err) {\n // Storage may be disabled (SecurityError) or full (QuotaExceededError).\n // Return empty string to signal the write did not persist.\n return castValue('');\n }\n\n return storageRead(key, storage, env);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Destination as WalkerOSDestination } from '@walkeros/core';\n\nexport type TypesGeneric = WalkerOSDestination.TypesGeneric;\n\nexport interface Destination<T extends TypesGeneric = WalkerOSDestination.Types>\n extends WalkerOSDestination.Instance<T> {}\n\nexport type Init = WalkerOSDestination.Init;\n\nexport type Config<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.Config<T>;\n\nexport type PartialConfig<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.PartialConfig<T>;\n\nexport type InitFn<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.InitFn<T>;\n\nexport type PushFn<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.PushFn<T>;\n\nexport type PushEvent<Mapping = unknown> =\n WalkerOSDestination.PushEvent<Mapping>;\n\nexport type PushEvents<Mapping = unknown> =\n WalkerOSDestination.PushEvents<Mapping>;\n\n/**\n * Web-specific environment requirements interface\n *\n * Extends the core Env interface with web-specific\n * globals like window and document for browser destinations.\n */\nexport interface Env extends WalkerOSDestination.BaseEnv {\n /**\n * Properties to be added to the global `window` object\n *\n * Used by web destinations that expect browser-specific\n * global functions like analytics APIs.\n *\n * @example\n * ```typescript\n * window: {\n * gtag: () => {},\n * fbq: () => {},\n * dataLayer: []\n * }\n * ```\n */\n window?: Record<string, unknown>;\n\n /**\n * Properties to be added to the global `document` object\n *\n * Used by destinations that need DOM manipulation capabilities\n * for script loading or element creation.\n *\n * @example\n * ```typescript\n * document: {\n * createElement: () => ({ src: '', async: false }),\n * head: { appendChild: () => {} }\n * }\n * ```\n */\n document?: Record<string, unknown>;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Collector, WalkerOS, Source as CoreSource } from '@walkeros/core';\n\nexport type TypesGeneric = CoreSource.TypesGeneric;\n\nexport interface Source<T extends TypesGeneric = CoreSource.Types>\n extends CoreSource.Instance<T> {\n settings?: CoreSource.Settings<T>;\n mapping?: CoreSource.Mapping<T>;\n}\n\nexport type Init = Partial<Omit<Source, 'init'>> & Pick<Source, 'type'>;\n\nexport type Config<T extends TypesGeneric = CoreSource.Types> =\n CoreSource.Instance<T> & {\n settings: CoreSource.Settings<T>;\n mapping?: CoreSource.Mapping<T>;\n };\n\nexport type PartialConfig<T extends TypesGeneric = CoreSource.Types> = Partial<\n Config<T>\n>;\n\nexport type InitFn<T extends TypesGeneric = CoreSource.Types> = (\n collector: Collector.Instance,\n config: Config<T>,\n) => void | Promise<void>;\n","import type { Elb } from '@walkeros/core';\n\n// Simple re-exports from core\nexport type PushResult = Elb.PushResult;\nexport type Layer = Elb.Layer;\n","import type {\n Collector as CoreCollector,\n Elb,\n Hooks,\n WalkerOS,\n Destination as WalkerOSDestination,\n On,\n} from '@walkeros/core';\nimport type { Destination, Config as DestConfig } from './destination';\nimport type { Layer } from './elb';\nimport type { Events, Trigger } from './walker';\n\ndeclare global {\n interface Window {\n elbwalker: Collector;\n walkerjs: CoreCollector.Instance;\n elbLayer?: Layer;\n dataLayer: WalkerOS.Events | unknown | unknown[];\n elb: Elb.Fn<Promise<Elb.PushResult>>;\n }\n}\n\nexport interface Collector extends Omit<CoreCollector.Instance, 'config'> {\n config: Config & CoreCollector.Config;\n destinations: Destinations;\n push: Elb.Fn<Promise<Elb.PushResult>>;\n getAllEvents: (scope: Element, prefix: string) => Events;\n getEvents: (target: Element, trigger: Trigger, prefix: string) => Events;\n getGlobals: () => WalkerOS.Properties;\n _visibilityState?: {\n observer: IntersectionObserver | undefined;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean }\n >;\n };\n}\n\nexport interface State {\n config: Config;\n destinations: Destinations;\n}\n\nexport interface Config {\n dataLayer: boolean;\n dataLayerConfig: DestConfig;\n elbLayer: Layer;\n listeners: boolean;\n pageview: boolean;\n prefix: string;\n run: boolean;\n scope: Scope;\n elb?: string;\n name?: string;\n}\n\nexport interface InitConfig extends Partial<Config> {\n consent?: WalkerOS.Consent;\n custom?: WalkerOS.Properties;\n destinations?: WalkerOSDestination.InitDestinations;\n hooks?: Hooks.Functions;\n on?: On.OnConfig;\n user?: WalkerOS.User;\n}\n\nexport interface Destinations {\n [name: string]: Destination;\n}\n\nexport type Scope = Element | Document;\n","import type { WalkerOS } from '@walkeros/core';\n\nexport type Events = Event[];\n\nexport interface Event {\n entity: string;\n action: string;\n data?: WalkerOS.Properties;\n context?: WalkerOS.OrderedProperties;\n trigger?: Trigger;\n nested: WalkerOS.Entities;\n}\n\nexport type KeyVal = [string, string];\n\nexport type Attributes = Array<string>;\n\nexport type Trigger =\n | 'click'\n | 'custom'\n | 'hover'\n | 'load'\n | 'pulse'\n | 'scroll'\n | 'submit'\n | 'visible'\n | 'visibles'\n | 'wait'\n | string;\n\nexport interface Filter {\n [name: string]: boolean;\n}\n\nexport interface TriggersActionGroups {\n [trigger: string]: TriggerActions;\n}\n\nexport type TriggerActions = Array<TriggerAction>;\n\ninterface TriggerAction {\n trigger: string;\n triggerParams?: string;\n action: string;\n actionParams?: string;\n}\n\nexport type ScrollElements = Array<[HTMLElement, number]>;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/attributes.ts","../src/browser.ts","../src/elb.ts","../src/environment.ts","../src/getHashWeb.ts","../src/isVisible.ts","../src/sendWeb.ts","../src/storage.ts","../src/types/destination.ts","../src/types/source.ts","../src/types/elb.ts","../src/types/collector.ts","../src/types/walker.ts"],"sourcesContent":["import { trim } from '@walkeros/core';\n\n/**\n * Get attribute value from element\n * @param element - DOM element\n * @param name - Attribute name\n * @returns Trimmed attribute value or empty string\n */\nexport function getAttribute(element: Element, name: string): string {\n return (element.getAttribute(name) || '').trim();\n}\n\n/**\n * Split attribute string by separator (semicolon by default)\n * Handles quoted values containing the separator\n * @param str - String to split\n * @param separator - Separator character (default: ';')\n * @returns Array of attribute strings\n */\nexport function splitAttribute(str: string, separator = ';'): string[] {\n if (!str) return [];\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\n/**\n * Split key-value pair by first colon\n * @param str - String in format \"key:value\"\n * @returns Tuple of [key, value]\n */\nexport function splitKeyVal(str: string): [string, string] {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key || ''), trim(value || '')];\n}\n\n/**\n * Parse inline configuration string into object\n * Supports type conversion for boolean and numeric values\n * @param str - Configuration string (e.g., \"elb:track;run:false;port:3000\")\n * @returns Parsed configuration object\n */\nexport function parseInlineConfig(str: string): Record<string, unknown> {\n const config: Record<string, unknown> = {};\n\n splitAttribute(str).forEach((pair) => {\n const [key, value] = splitKeyVal(pair);\n if (key) {\n // Type conversion\n if (value === 'true') {\n config[key] = true;\n } else if (value === 'false') {\n config[key] = false;\n } else if (value && /^\\d+$/.test(value)) {\n config[key] = parseInt(value, 10);\n } else if (value && /^\\d+\\.\\d+$/.test(value)) {\n config[key] = parseFloat(value);\n } else if (value) {\n config[key] = value;\n } else {\n // Key without value defaults to true\n config[key] = true;\n }\n }\n });\n\n return config;\n}\n","export function getLanguage(navigatorRef: Navigator): string | undefined {\n return navigatorRef.language;\n}\n\nexport function getTimezone(): string | undefined {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function getScreenSize(windowRef: Window): string {\n return `${windowRef.screen.width}x${windowRef.screen.height}`;\n}\n","import type { Elb } from '@walkeros/core';\n\nexport const elb: Elb.Fn<void> = function () {\n const w = window as unknown as Record<string, unknown[]>;\n (w.elbLayer = w.elbLayer || []).push(arguments);\n};\n","import type { Env } from './types/destination';\nimport type { Destination } from '@walkeros/core';\nimport { OBSERVE_ENV_KEY, isEnvObserve, parseCallPath } from '@walkeros/core';\n\n/**\n * Transparent recording Proxy over a resolved env root (`window`, `document`,\n * or an env override). `subPaths` are the tracked dot-path segments AFTER the\n * root, so a leaf is a length-1 remainder and a longer remainder is an\n * intermediate to recurse into.\n *\n * Only a get-trap: writes fall through to the real target so patterns like\n * gtm's `window[dataLayerName] = ...` mutate the actual global. `Reflect.get`\n * uses `t` (never the proxy) as receiver so native accessors keep their brand\n * checks (`window.document`, `window.location`). Wrappers and child proxies are\n * memoized per proxy so repeated reads return the same reference and untracked\n * globals are never bound.\n */\nfunction wrapRoot(\n target: object,\n subPaths: string[][],\n record: Destination.EnvObserve['record'],\n prefix: string,\n): object {\n const memo = new Map<string, unknown>();\n\n return new Proxy(target, {\n get(t, prop) {\n if (typeof prop !== 'string') return Reflect.get(t, prop, t);\n\n const cached = memo.get(prop);\n if (cached !== undefined) return cached;\n\n // Leaf: this prop is the final tracked segment — record its calls.\n if (subPaths.some((sp) => sp.length === 1 && sp[0] === prop)) {\n const original: unknown = Reflect.get(t, prop, t);\n if (typeof original !== 'function') return original;\n\n const fullPath = `${prefix}.${prop}`;\n const wrapper = (...args: unknown[]): unknown => {\n try {\n record(fullPath, args);\n } catch {\n // Telemetry must never suppress the real vendor call.\n }\n return original.apply(t, args);\n };\n memo.set(prop, wrapper);\n return wrapper;\n }\n\n // Intermediate: navigate deeper, keeping the same recorder.\n const interRests = subPaths\n .filter((sp) => sp.length > 1 && sp[0] === prop)\n .map((sp) => sp.slice(1));\n if (interRests.length > 0) {\n const child: unknown = Reflect.get(t, prop, t);\n if (child === null || typeof child !== 'object') return child;\n\n const childProxy = wrapRoot(\n child,\n interRests,\n record,\n `${prefix}.${prop}`,\n );\n memo.set(prop, childProxy);\n return childProxy;\n }\n\n return Reflect.get(t, prop, t);\n },\n });\n}\n\n/**\n * Helper function to get environment globals with fallbacks\n *\n * Returns window and document by default, with optional environment overrides.\n * Generic over the caller's `Env` so a destination that narrows `window`/\n * `document` (and augments the DOM globals via `declare global`) gets those\n * narrowed types back without casting at the call site.\n *\n * When the collector injects an observe recorder under `OBSERVE_ENV_KEY` (trace\n * level, live-web paths wrapEnv could not resolve), the resolved roots are\n * wrapped in a transparent recording Proxy and the key is stripped before the\n * env reaches the destination. Outside trace the key is absent, so the guard is\n * a single property read with no wrapping cost.\n *\n * @param env - Optional environment overrides\n * @returns Env with window/document defaults and any provided overrides\n */\nexport function getEnv<E extends Env = Env>(env?: E) {\n // The DOM globals (typed `Window`/`Document`) are merged with the caller's\n // narrowed `Env` overrides. This intersection is asserted once here, at the\n // single boundary where the loose `Record`-typed base meets the real DOM\n // globals, so no destination has to cast `window`/`document` per call.\n const merged: Record<string, unknown> = {\n window: typeof window !== 'undefined' ? window : globalThis.window,\n document: typeof document !== 'undefined' ? document : globalThis.document,\n ...env,\n };\n\n const observe = env && env[OBSERVE_ENV_KEY];\n if (isEnvObserve(observe)) {\n // Strip the recorder so it never reaches the destination (mirrors wrapEnv\n // stripping `simulation`).\n delete merged[OBSERVE_ENV_KEY];\n\n // Group tracked paths by root segment through the shared grammar so the\n // fallback wrapper and wrapEnv cannot drift.\n const subPathsByRoot = new Map<string, string[][]>();\n for (const raw of observe.paths) {\n const segments = parseCallPath(raw);\n const root = segments[0];\n // W5 filters malformed paths already; guard against an empty parse.\n if (root === undefined) continue;\n const group = subPathsByRoot.get(root) ?? [];\n group.push(segments.slice(1));\n subPathsByRoot.set(root, group);\n }\n\n // Wrap each present, navigable root; a missing or non-object root is left\n // as-is (its leaf stays unresolvable, matching wrapEnv).\n for (const [root, subPaths] of subPathsByRoot) {\n const target = merged[root];\n if (target !== null && typeof target === 'object') {\n merged[root] = wrapRoot(target, subPaths, observe.record, root);\n }\n }\n }\n\n return merged as Omit<E, 'window' | 'document'> & {\n window: Window & NonNullable<E['window']>;\n document: Document & NonNullable<E['document']>;\n };\n}\n","import { isDefined } from '@walkeros/core';\n\nasync function sha256(message: string): Promise<string | undefined> {\n const crypto: Crypto | undefined =\n isDefined(window) && window.crypto ? window.crypto : undefined;\n\n // Crypto API not available\n if (!crypto || !crypto.subtle || !TextEncoder) return;\n\n const msgBuffer = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n return hashHex;\n}\n\nexport async function getHashWeb(\n str: string,\n length?: number,\n): Promise<string> {\n return ((await sha256(str)) || '').slice(0, length);\n}\n","/**\n * Resolve the topmost element at a point, descending into shadow trees.\n * `elementFromPoint` does not pierce shadow boundaries, so this re-probes each\n * open shadow root's own `elementFromPoint`. It descends through open roots and\n * stops at a closed host, whose `shadowRoot` is null.\n * @param root - Document or shadow root to probe from\n * @param x - Viewport x coordinate\n * @param y - Viewport y coordinate\n * @returns Deepest element at the point, or null when nothing is hit\n */\nexport function deepElementFromPoint(\n root: DocumentOrShadowRoot,\n x: number,\n y: number,\n): Element | null {\n let el = root.elementFromPoint(x, y);\n while (el && el.shadowRoot) {\n const inner = el.shadowRoot.elementFromPoint(x, y);\n if (!inner || inner === el) break;\n el = inner;\n }\n return el;\n}\n\n/**\n * Collect the composed ancestor chain of an element, walking `parentElement`\n * and hopping across shadow-host boundaries when a shadow root is reached.\n * Ancestry follows the flattened tree by DOM containment; it does not resolve\n * slot distribution (slotted light-DOM parents are not tracked).\n * @param node - Element to walk up from\n * @param win - Window owning the element, used for its realm's ShadowRoot\n * @returns Ancestors from nearest to furthest\n */\nexport function composedAncestors(node: Element, win: Window): Element[] {\n const chain: Element[] = [];\n let current: Element | null = node;\n while (current) {\n let parent: Element | null = current.parentElement;\n if (!parent) {\n const root = current.getRootNode();\n // `win.self` is load-bearing: the ShadowRoot constructor lives on\n // `Window & typeof globalThis` (the type of `win.self`), not the bare\n // `Window` parameter, so `win.ShadowRoot` would fail typecheck.\n if (root instanceof win.self.ShadowRoot) parent = root.host;\n }\n if (!parent) break;\n chain.push(parent);\n current = parent;\n }\n return chain;\n}\n\n/**\n * Collect the shadow hosts enclosing an element, crossing only shadow-host\n * boundaries. Unlike composedAncestors, plain light-DOM parents are skipped, so\n * the result contains hosts alone, ordered from innermost to outermost.\n * @param node - Element to walk up from\n * @param win - Window owning the element, used for its realm's ShadowRoot\n * @returns Enclosing shadow hosts, innermost first\n */\nexport function shadowHostsAbove(node: Element, win: Window): Element[] {\n const hosts: Element[] = [];\n let root = node.getRootNode();\n // `win.self` is load-bearing: the ShadowRoot constructor lives on\n // `Window & typeof globalThis` (the type of `win.self`), not the bare\n // `Window` parameter, so `win.ShadowRoot` would fail typecheck.\n while (root instanceof win.self.ShadowRoot) {\n hosts.push(root.host);\n root = root.host.getRootNode();\n }\n return hosts;\n}\n\n/**\n * True when the composed chain renders the element at all. `visibility`\n * inherits, so the element's own computed value is enough. `opacity` does NOT\n * inherit: a transparent ancestor leaves the element's own opacity at 1 while\n * hiding it, and elementFromPoint does not help because a transparent element\n * is still hit-testable. Walk the chain, crossing shadow-host boundaries.\n */\nfunction isRendered(element: HTMLElement, win: Window): boolean {\n const style = win.getComputedStyle(element);\n if (style.display === 'none') return false;\n if (style.visibility !== 'visible') return false;\n\n let current: Element | null = element;\n while (current) {\n const opacity = win.getComputedStyle(current).opacity;\n if (opacity && Number(opacity) < 0.1) return false;\n\n const parent: Element | null = current.parentElement;\n if (parent) {\n current = parent;\n continue;\n }\n const root = current.getRootNode();\n current = root instanceof win.self.ShadowRoot ? root.host : null;\n }\n\n return true;\n}\n\n/**\n * Whether the element is actually seen by the user: rendered, on screen, and\n * not painted over. Geometry (how much of it is showing) is decided by the\n * IntersectionObserver, which computes it during layout for free; this function\n * answers only the two questions the observer is blind to, so it runs once per\n * candidate impression rather than on every scroll frame.\n */\nexport function isVisible(\n element: HTMLElement,\n win: Window,\n doc: Document,\n): boolean {\n if (!isRendered(element, win)) return false;\n\n const rect = element.getBoundingClientRect();\n const viewportWidth = doc.documentElement.clientWidth || win.innerWidth;\n const viewportHeight = doc.documentElement.clientHeight || win.innerHeight;\n\n // Clip the element against the viewport. Probing the centre of this visible\n // band, rather than the centre of the element, is what removes the need for a\n // separate large-element branch: an element taller than the viewport has its\n // own centre off screen, which the previous implementation read as hidden.\n const left = Math.max(rect.left, 0);\n const top = Math.max(rect.top, 0);\n const right = Math.min(rect.right, viewportWidth);\n const bottom = Math.min(rect.bottom, viewportHeight);\n if (right <= left || bottom <= top) return false;\n\n const pointX = (left + right) / 2;\n const pointY = (top + bottom) / 2;\n\n const hit = deepElementFromPoint(doc, pointX, pointY);\n if (!hit) return false;\n if (hit === element) return true;\n if (composedAncestors(hit, win).includes(element)) return true;\n // Clause 3 is deliberately shadowHostsAbove (shadow-host hops only), not a\n // general ancestor walk. A plain light-DOM ancestor returned by\n // elementFromPoint (target has pointer-events:none, a transparent center, or\n // is covered via stacking) must NOT count as visible; restricting to shadow\n // hosts preserves light-DOM occlusion. Do not merge this with clause 2.\n if (shadowHostsAbove(element, win).includes(hit)) return true;\n return false;\n}\n","import type { SendDataValue, SendHeaders, SendResponse } from '@walkeros/core';\nimport {\n getHeaders,\n transformData,\n tryCatch,\n tryCatchAsync,\n} from '@walkeros/core';\n\nexport type SendWebTransport = 'fetch' | 'beacon' | 'xhr';\n\nexport interface SendWebOptions {\n headers?: SendHeaders;\n transport?: SendWebTransport;\n method?: string;\n}\n\nexport interface SendWebOptionsFetch extends SendWebOptions {\n credentials?: 'omit' | 'same-origin' | 'include'; // Add credentials option\n noCors?: boolean; // Add noCors option for fetch transport\n timeout?: number; // Abort the request after this many ms (default 10000)\n}\n\nconst DEFAULT_FETCH_TIMEOUT = 10000;\n\ntype SendWebOptionsDynamic<T extends SendWebTransport> = T extends 'fetch'\n ? SendWebOptionsFetch\n : SendWebOptions;\n\nexport type SendWebReturn<T extends SendWebTransport> = T extends 'fetch'\n ? Promise<SendResponse>\n : SendResponse;\n\nexport function sendWeb<T extends SendWebTransport>(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsDynamic<T> & { transport?: T } = {\n transport: 'fetch' as T,\n },\n): SendWebReturn<T> {\n const transport = options.transport || 'fetch';\n\n switch (transport) {\n case 'beacon':\n return sendWebAsBeacon(url, data) as SendWebReturn<T>;\n case 'xhr':\n return sendWebAsXhr(url, data, options) as SendWebReturn<T>;\n case 'fetch':\n default:\n return sendWebAsFetch(url, data, options) as SendWebReturn<T>;\n }\n}\n\nexport async function sendWebAsFetch(\n url: string,\n data?: SendDataValue,\n options: SendWebOptionsFetch = {},\n): Promise<SendResponse> {\n const headers = getHeaders(options.headers);\n const body = transformData(data);\n const requested = options.timeout;\n const timeout =\n typeof requested === 'number' && Number.isFinite(requested) && requested > 0\n ? requested\n : DEFAULT_FETCH_TIMEOUT;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n return tryCatchAsync(\n async () => {\n try {\n const response = await fetch(url, {\n method: options.method || 'POST',\n headers,\n keepalive: true,\n credentials: options.credentials || 'same-origin',\n mode: options.noCors ? 'no-cors' : 'cors',\n body,\n signal: controller.signal,\n });\n\n const responseData = options.noCors ? '' : await response.text();\n\n return {\n ok: response.ok,\n data: responseData,\n error: response.ok ? undefined : response.statusText,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n },\n (error) => {\n clearTimeout(timeoutId);\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n\nexport function sendWebAsBeacon(\n url: string,\n data?: SendDataValue,\n): SendResponse {\n const body = transformData(data);\n const ok = navigator.sendBeacon(url, body);\n\n return {\n ok,\n error: ok ? undefined : 'Failed to send beacon',\n };\n}\n\nexport function sendWebAsXhr(\n url: string,\n data?: SendDataValue,\n options: SendWebOptions = {},\n): SendResponse {\n const headers = getHeaders(options.headers);\n const method = options.method || 'POST';\n const body = transformData(data);\n\n return tryCatch(\n () => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url, false); // Synchronous request\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n xhr.send(body);\n\n const ok = xhr.status >= 200 && xhr.status < 300;\n\n const parsedData = tryCatch(JSON.parse, () => xhr.response)(xhr.response);\n\n return {\n ok,\n data: parsedData,\n error: ok ? undefined : `${xhr.status} ${xhr.statusText}`,\n };\n },\n (error) => {\n return {\n ok: false,\n error: (error as Error).message,\n };\n },\n )();\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { StorageType } from '@walkeros/core';\nimport { castValue, Const } from '@walkeros/core';\n\nexport interface StorageValue {\n e: number; // Expiration timestamp\n v: string; // Value\n}\n\nexport interface StorageEnv {\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport function storageDelete(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n env?: StorageEnv,\n) {\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n storageWrite(key, '', 0, storage, domain, env);\n break;\n case Const.Utils.Storage.Local:\n (env?.window ?? window).localStorage.removeItem(key);\n break;\n case Const.Utils.Storage.Session:\n (env?.window ?? window).sessionStorage.removeItem(key);\n break;\n }\n } catch (err) {\n // Storage may be disabled (SecurityError in private browsing, sandboxed\n // iframes, or restrictive browser settings). Silently ignore.\n }\n}\n\nexport function storageRead(\n key: string,\n storage: StorageType = Const.Utils.Storage.Session,\n env?: StorageEnv,\n): WalkerOS.PropertyType {\n // Helper function for local and session storage to support expiration\n function parseItem(string: string | null): StorageValue {\n try {\n return JSON.parse(string || '');\n } catch (err) {\n let e = 1,\n v = '';\n\n // Remove expiration date\n if (string) {\n e = 0;\n v = string;\n }\n\n return { e, v };\n }\n }\n let value, item;\n\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie:\n value = decodeURIComponent(\n (env?.document ?? document).cookie\n .split('; ')\n .find((row) => row.startsWith(key + '='))\n ?.split('=')[1] || '',\n );\n break;\n case Const.Utils.Storage.Local:\n item = parseItem((env?.window ?? window).localStorage.getItem(key));\n break;\n case Const.Utils.Storage.Session:\n item = parseItem((env?.window ?? window).sessionStorage.getItem(key));\n break;\n }\n } catch (err) {\n // Storage may be disabled or inaccessible. Return empty string.\n return castValue('');\n }\n\n // Check if item is expired\n if (item) {\n value = item.v;\n\n if (item.e != 0 && item.e < Date.now()) {\n storageDelete(key, storage, undefined, env);\n value = ''; // Conceal the outdated value\n }\n }\n\n return castValue(value || '');\n}\n\nexport function storageWrite(\n key: string,\n value: WalkerOS.PropertyType,\n maxAgeInMinutes = 30,\n storage: StorageType = Const.Utils.Storage.Session,\n domain?: string,\n env?: StorageEnv,\n): WalkerOS.PropertyType {\n const e = Date.now() + 1000 * 60 * maxAgeInMinutes;\n const item: StorageValue = { e, v: String(value) };\n const stringifiedItem = JSON.stringify(item);\n\n try {\n switch (storage) {\n case Const.Utils.Storage.Cookie: {\n value = typeof value === 'object' ? JSON.stringify(value) : value;\n let cookie = `${key}=${encodeURIComponent(value)}; max-age=${\n maxAgeInMinutes * 60\n }; path=/; SameSite=Lax; secure`;\n\n if (domain) cookie += '; domain=' + domain;\n\n (env?.document ?? document).cookie = cookie;\n break;\n }\n case Const.Utils.Storage.Local:\n (env?.window ?? window).localStorage.setItem(key, stringifiedItem);\n break;\n case Const.Utils.Storage.Session:\n (env?.window ?? window).sessionStorage.setItem(key, stringifiedItem);\n break;\n }\n } catch (err) {\n // Storage may be disabled (SecurityError) or full (QuotaExceededError).\n // Return empty string to signal the write did not persist.\n return castValue('');\n }\n\n return storageRead(key, storage, env);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Destination as WalkerOSDestination } from '@walkeros/core';\n\nexport type TypesGeneric = WalkerOSDestination.TypesGeneric;\n\nexport interface Destination<T extends TypesGeneric = WalkerOSDestination.Types>\n extends WalkerOSDestination.Instance<T> {}\n\nexport type Init = WalkerOSDestination.Init;\n\nexport type Config<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.Config<T>;\n\nexport type PartialConfig<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.PartialConfig<T>;\n\nexport type InitFn<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.InitFn<T>;\n\nexport type PushFn<T extends TypesGeneric = WalkerOSDestination.Types> =\n WalkerOSDestination.PushFn<T>;\n\nexport type PushEvent<Mapping = unknown> =\n WalkerOSDestination.PushEvent<Mapping>;\n\nexport type PushEvents<Mapping = unknown> =\n WalkerOSDestination.PushEvents<Mapping>;\n\n/**\n * Web-specific environment requirements interface\n *\n * Extends the core Env interface with web-specific\n * globals like window and document for browser destinations.\n */\nexport interface Env extends WalkerOSDestination.BaseEnv {\n /**\n * Properties to be added to the global `window` object\n *\n * Used by web destinations that expect browser-specific\n * global functions like analytics APIs.\n *\n * @example\n * ```typescript\n * window: {\n * gtag: () => {},\n * fbq: () => {},\n * dataLayer: []\n * }\n * ```\n */\n window?: Record<string, unknown>;\n\n /**\n * Properties to be added to the global `document` object\n *\n * Used by destinations that need DOM manipulation capabilities\n * for script loading or element creation.\n *\n * @example\n * ```typescript\n * document: {\n * createElement: () => ({ src: '', async: false }),\n * head: { appendChild: () => {} }\n * }\n * ```\n */\n document?: Record<string, unknown>;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Collector, WalkerOS, Source as CoreSource } from '@walkeros/core';\n\nexport type TypesGeneric = CoreSource.TypesGeneric;\n\nexport interface Source<T extends TypesGeneric = CoreSource.Types>\n extends CoreSource.Instance<T> {\n settings?: CoreSource.Settings<T>;\n mapping?: CoreSource.Mapping<T>;\n}\n\nexport type Init = Partial<Omit<Source, 'init'>> & Pick<Source, 'type'>;\n\nexport type Config<T extends TypesGeneric = CoreSource.Types> =\n CoreSource.Instance<T> & {\n settings: CoreSource.Settings<T>;\n mapping?: CoreSource.Mapping<T>;\n };\n\nexport type PartialConfig<T extends TypesGeneric = CoreSource.Types> = Partial<\n Config<T>\n>;\n\nexport type InitFn<T extends TypesGeneric = CoreSource.Types> = (\n collector: Collector.Instance,\n config: Config<T>,\n) => void | Promise<void>;\n","import type { Elb } from '@walkeros/core';\n\n// Simple re-exports from core\nexport type PushResult = Elb.PushResult;\nexport type Layer = Elb.Layer;\n","import type {\n Collector as CoreCollector,\n Elb,\n Hooks,\n WalkerOS,\n Destination as WalkerOSDestination,\n On,\n} from '@walkeros/core';\nimport type { Destination, Config as DestConfig } from './destination';\nimport type { Layer } from './elb';\nimport type { Events, Trigger } from './walker';\n\ndeclare global {\n interface Window {\n elbwalker: Collector;\n walkerjs: CoreCollector.Instance;\n elbLayer?: Layer;\n dataLayer: WalkerOS.Events | unknown | unknown[];\n elb: Elb.Fn<Promise<Elb.PushResult>>;\n }\n}\n\nexport interface Collector extends Omit<CoreCollector.Instance, 'config'> {\n config: Config & CoreCollector.Config;\n destinations: Destinations;\n push: Elb.Fn<Promise<Elb.PushResult>>;\n getAllEvents: (scope: Element, prefix: string) => Events;\n getEvents: (target: Element, trigger: Trigger, prefix: string) => Events;\n getGlobals: () => WalkerOS.Properties;\n _visibilityState?: {\n observer: IntersectionObserver | undefined;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean }\n >;\n };\n}\n\nexport interface State {\n config: Config;\n destinations: Destinations;\n}\n\nexport interface Config {\n dataLayer: boolean;\n dataLayerConfig: DestConfig;\n elbLayer: Layer;\n listeners: boolean;\n pageview: boolean;\n prefix: string;\n run: boolean;\n scope: Scope;\n elb?: string;\n name?: string;\n}\n\nexport interface InitConfig extends Partial<Config> {\n consent?: WalkerOS.Consent;\n custom?: WalkerOS.Properties;\n destinations?: WalkerOSDestination.InitDestinations;\n hooks?: Hooks.Functions;\n on?: On.OnConfig;\n user?: WalkerOS.User;\n}\n\nexport interface Destinations {\n [name: string]: Destination;\n}\n\nexport type Scope = Element | Document;\n","import type { WalkerOS } from '@walkeros/core';\n\nexport type Events = Event[];\n\nexport interface Event {\n entity: string;\n action: string;\n data?: WalkerOS.Properties;\n context?: WalkerOS.OrderedProperties;\n trigger?: Trigger;\n nested: WalkerOS.Entities;\n}\n\nexport type KeyVal = [string, string];\n\nexport type Attributes = Array<string>;\n\nexport type Trigger =\n | 'click'\n | 'custom'\n | 'hover'\n | 'load'\n | 'pulse'\n | 'scroll'\n | 'submit'\n | 'visible'\n | 'visibles'\n | 'wait'\n | string;\n\nexport interface Filter {\n [name: string]: boolean;\n}\n\nexport interface TriggersActionGroups {\n [trigger: string]: TriggerActions;\n}\n\nexport type TriggerActions = Array<TriggerAction>;\n\ninterface TriggerAction {\n trigger: string;\n triggerParams?: string;\n action: string;\n actionParams?: string;\n}\n\nexport type ScrollElements = Array<[HTMLElement, number]>;\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/web-core",
|
|
3
3
|
"description": "Web-specific utilities for walkerOS",
|
|
4
|
-
"version": "4.3.
|
|
4
|
+
"version": "4.3.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"update": "npx npm-check-updates -u && npm update"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@walkeros/core": "4.3.
|
|
30
|
+
"@walkeros/core": "4.3.1"
|
|
31
31
|
},
|
|
32
32
|
"repository": {
|
|
33
33
|
"url": "git+https://github.com/elbwalker/walkerOS.git",
|
|
@@ -51,6 +51,6 @@
|
|
|
51
51
|
}
|
|
52
52
|
],
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@walkeros/core": "4.3.
|
|
54
|
+
"@walkeros/core": "4.3.1"
|
|
55
55
|
}
|
|
56
56
|
}
|