@walkeros/web-source-browser 4.3.0-next-1783517345197 → 4.3.0-next-1784055686454

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 CHANGED
@@ -1,13 +1,25 @@
1
1
  # @walkeros/web-source-browser
2
2
 
3
- ## 4.3.0-next-1783517345197
3
+ ## 4.3.0-next-1784055686454
4
4
 
5
5
  ### Minor Changes
6
6
 
7
+ - 7527c41: Click and submit triggers now fire in the capture phase, reading
8
+ tagged elements at click time. This fixes lost tagging in single-page apps
9
+ where a click re-renders and unmounts the tagged element (events previously
10
+ fell back to `page` with no data), and means `stopPropagation` no longer
11
+ suppresses a tagged click. Set `capture: false` on the source to restore the
12
+ previous bubble-phase behavior.
7
13
  - 9506e3e: The browser source now supports a `data-elbobserve` attribute. Mark a
8
14
  container with it and any tagged content a SPA injects into that container is
9
15
  auto-registered for tracking, and cleaned up when removed, without calling
10
16
  `walker init` after each injection. Works in light DOM and open shadow roots.
17
+ - ebd193f: The browser source now supports a `data-elbuser` attribute to set
18
+ persistent user identity from the DOM. Tag any element with
19
+ `data-elbuser="id:u123;loggedin:true"` and the source applies it as collector
20
+ user state right before the page view, so the page view and every event after
21
+ it carry the user. Multiple elements merge, and an absent attribute leaves any
22
+ existing user untouched.
11
23
  - e01036e: The elbLayer is append-only with guaranteed ordering: walker commands
12
24
  apply immediately, events process in push order once the source starts, and
13
25
  entries stay inspectable in the array. `walker init` now works from every
@@ -19,6 +31,13 @@
19
31
  Visibility still accounts for occlusion across open shadow roots, so a
20
32
  genuinely covered element does not trigger. Closed shadow subtrees can be
21
33
  tracked by passing the closed root reference to walker init.
34
+ - d28a8ea: The `impression` and `visible` triggers now count an element as seen
35
+ when at least half of it, or half of the viewport, whichever is smaller, is on
36
+ screen along each axis for one continuous second in a foreground tab. Elements
37
+ larger than the viewport now fire, where previously they could not, and
38
+ elements are detected reliably when a framework injects them before rendering.
39
+ Expect an increase in impression volume, particularly on small viewports and
40
+ on pages with tall sections.
22
41
 
23
42
  ### Patch Changes
24
43
 
@@ -34,10 +53,13 @@
34
53
  - Updated dependencies [e01036e]
35
54
  - Updated dependencies [e01036e]
36
55
  - Updated dependencies [98801c9]
56
+ - Updated dependencies [f8408fd]
37
57
  - Updated dependencies [9506e3e]
38
- - @walkeros/web-core@4.3.0-next-1783517345197
39
- - @walkeros/collector@4.3.0-next-1783517345197
40
- - @walkeros/core@4.3.0-next-1783517345197
58
+ - Updated dependencies [d28a8ea]
59
+ - Updated dependencies [ebd193f]
60
+ - @walkeros/web-core@4.3.0-next-1784055686454
61
+ - @walkeros/collector@4.3.0-next-1784055686454
62
+ - @walkeros/core@4.3.0-next-1784055686454
41
63
 
42
64
  ## 4.2.1
43
65
 
package/dist/dev.d.mts CHANGED
@@ -25,6 +25,7 @@ declare const SettingsSchema: z.ZodObject<{
25
25
  prefix: z.ZodDefault<z.ZodString>;
26
26
  scope: z.ZodOptional<z.ZodString>;
27
27
  pageview: z.ZodDefault<z.ZodBoolean>;
28
+ capture: z.ZodDefault<z.ZodBoolean>;
28
29
  elb: z.ZodDefault<z.ZodString>;
29
30
  name: z.ZodOptional<z.ZodString>;
30
31
  elbLayer: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString, z.ZodAny]>>;
package/dist/dev.d.ts CHANGED
@@ -25,6 +25,7 @@ declare const SettingsSchema: z.ZodObject<{
25
25
  prefix: z.ZodDefault<z.ZodString>;
26
26
  scope: z.ZodOptional<z.ZodString>;
27
27
  pageview: z.ZodDefault<z.ZodBoolean>;
28
+ capture: z.ZodDefault<z.ZodBoolean>;
28
29
  elb: z.ZodDefault<z.ZodString>;
29
30
  name: z.ZodOptional<z.ZodString>;
30
31
  elbLayer: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString, z.ZodAny]>>;
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,a=(e,r)=>{for(var o in r)t(e,o,{get:r[o],enumerable:!0})},i={};a(i,{examples:()=>v,schemas:()=>s}),module.exports=(e=i,((e,a,i,s)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of o(a))n.call(e,c)||c===i||t(e,c,{get:()=>a[c],enumerable:!(s=r(a,c))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};a(s,{DataAttributePrefix:()=>d,JavaScriptVarName:()=>p,ScopeSelector:()=>m,SettingsSchema:()=>f,TaggerSchema:()=>g,settings:()=>h,tagger:()=>w});var c=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=require("@walkeros/core/dev"),d=u.z.string().min(1).regex(/^[a-z][a-z0-9-]*$/,"Must be lowercase kebab-case").describe("Prefix for data attributes on DOM elements"),p=u.z.string().min(1).regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,"Must be a valid JavaScript identifier").describe("JavaScript variable name"),m=u.z.string().describe('DOM scope for event tracking (CSS selector or "document")').optional(),b=l.z.union([l.z.boolean(),l.z.string(),l.z.any().describe("Elb.Layer array for async command queuing")]),f=l.z.object({prefix:d.default("data-elb").describe("Prefix for data attributes (default: data-elb)"),scope:m.describe("DOM scope for event tracking (default: document)"),pageview:l.z.boolean().default(!0).describe("Enable automatic pageview tracking"),elb:p.default("elb").describe("Name for global elb function"),name:l.z.string().describe("Custom name for source instance").optional(),elbLayer:b.default("elbLayer").describe("Enable elbLayer for async command queuing (boolean, string, or Elb.Layer)")}),g=require("@walkeros/core/dev").z.object({prefix:d.default("data-elb").describe("Custom prefix for generated data attributes")}),h=(0,c.zodToSchema)(f),w=(0,c.zodToSchema)(g),v={};a(v,{createTrigger:()=>oe,env:()=>y,step:()=>C,trigger:()=>ne});var y={};a(y,{push:()=>S});var k=()=>{},x=()=>()=>Promise.resolve({ok:!0}),E={error:k,warn:k,info:k,debug:k,throw:e=>{throw"string"==typeof e?new Error(e):e},json:k,scope:()=>E},S={get push(){return x()},get command(){return x()},get elb(){return x()},get window(){return{addEventListener:k,removeEventListener:k,location:{href:"https://example.com/page",pathname:"/page",search:"?query=test",hash:"#section",host:"example.com",hostname:"example.com",origin:"https://example.com",protocol:"https:"},document:{},navigator:{language:"en-US",userAgent:"Mozilla/5.0 (Test)"},screen:{width:1920,height:1080},innerWidth:1920,innerHeight:1080,pageXOffset:0,pageYOffset:0,scrollX:0,scrollY:0}},get document(){return{addEventListener:k,removeEventListener:k,querySelector:k,querySelectorAll:()=>[],getElementById:k,getElementsByClassName:()=>[],getElementsByTagName:()=>[],createElement:()=>({setAttribute:k,getAttribute:k,addEventListener:k,removeEventListener:k}),body:{appendChild:k,removeChild:k},documentElement:{scrollTop:0,scrollLeft:0},readyState:"complete",title:"Test Page",referrer:"",cookie:""}},logger:E},C={};a(C,{clickEvent:()=>O,contextAndGlobals:()=>P,dataAttributeTypes:()=>$,impressionEvent:()=>j,nestedEntities:()=>z,pageView:()=>A,submitEvent:()=>q});var A={title:"Page view",description:"A page load trigger captures the current URL, title, and referrer as a walker page view event.",trigger:{type:"load",options:{url:"https://example.com/docs",title:"Documentation",referrer:"https://example.com/"}},in:"",out:[["elb",{name:"page view",data:{domain:"example.com",title:"Documentation",referrer:"https://example.com/",id:"/docs"},context:{},globals:{},nested:void 0,custom:void 0,trigger:"load",source:{type:"browser",platform:"web",url:"https://example.com/docs",referrer:"https://example.com/"}}]]},O={title:"Click event",description:"A button click with walker data attributes is captured as an entity action event with the mapped label data.",trigger:{type:"click",options:"button"},in:'<button data-elb="cta" data-elb-cta="label:Sign Up" data-elbaction="click:click">Sign Up</button>',out:[["elb",{name:"cta click",entity:"cta",action:"click",data:{label:"Sign Up"},context:{},globals:{},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"click"}]]},q={title:"Submit event",description:"A form submit with walker data attributes produces a signup complete event carrying the selected plan.",trigger:{type:"submit",options:"form"},in:'<form data-elb="signup" data-elb-signup="plan:premium" data-elbaction="submit:complete"></form>',out:[["elb",{name:"signup complete",entity:"signup",action:"complete",data:{plan:"premium"},context:{},globals:{},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"submit"}]]},j={title:"Impression event",description:"An intersection observer impression on a div with walker attributes emits a banner view event.",trigger:{type:"impression",options:"div"},in:'<div data-elb="banner" data-elb-banner="type:promotional;position:sidebar" data-elbaction="impression:view"></div>',out:[["elb",{name:"banner view",entity:"banner",action:"view",data:{type:"promotional",position:"sidebar"},context:{},globals:{},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"impression"}]]},z={title:"Nested entities",description:"A page load produces a page view plus a product view whose nested size entity is captured on the product event.",trigger:{type:"load"},in:'<div data-elb="product" data-elb-product="id:SKU-42;name:Sneakers" data-elbaction="load:view"><div data-elb="size" data-elb-size="selected:large;inStock:true"></div></div>',out:[["elb",{name:"page view",data:{domain:"example.com",title:"",referrer:"",id:"/"},context:{},globals:{},nested:void 0,custom:void 0,trigger:"load",source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""}}],["elb",{name:"product view",entity:"product",action:"view",data:{id:"SKU-42",name:"Sneakers"},context:{},globals:{},nested:[{entity:"size",data:{selected:"large",inStock:!0},context:{},nested:[]}],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"load"}]]},$={title:"Data attribute types",description:"Walker data attributes parse scalar, boolean, and array values into typed fields on the emitted event.",trigger:{type:"click",options:"div"},in:'<div data-elb="product" data-elb-product="price:99.99;available:true;colors[]:red;colors[]:blue" data-elbaction="click:select"></div>',out:[["elb",{name:"product select",entity:"product",action:"select",data:{price:99.99,available:!0,colors:["red","blue"]},context:{},globals:{},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"click"}]]},P={title:"Context and globals",description:"Walker context and globals attributes attach ambient metadata to events emitted by the browser source.",trigger:{type:"click",options:'[data-elb="cta"]'},in:'<div data-elbcontext="test:engagement_flow" data-elbglobals="language:en;plan:premium"><div data-elb="cta" data-elb-cta="label:Try Now" data-elbaction="click:signup">Try Now</div></div>',out:[["elb",{name:"cta signup",entity:"cta",action:"signup",data:{label:"Try Now"},context:{test:["engagement_flow",0]},globals:{language:"en",plan:"premium"},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"click"}]]},T=require("@walkeros/collector"),D=(require("@walkeros/core"),require("@walkeros/collector"),require("@walkeros/web-core"),require("@walkeros/core")),L=require("@walkeros/collector"),R=require("@walkeros/web-core");function N(e,t,r=!0){return e+(t=null!=t?(r?"-":"")+t:"")}function M(e,t,r,o=!0){return K((0,R.getAttribute)(t,N(e,r,o))||"").reduce((e,r)=>{let[o,n]=X(r);if(!o)return e;if(n||(o.endsWith(":")&&(o=o.slice(0,-1)),n=""),n.startsWith("#")){n=n.slice(1);try{let e=t[n];e||"selected"!==n||(e=t.options[t.selectedIndex].text),n=String(e)}catch(e){n=""}}return o.endsWith("[]")?(o=o.slice(0,-2),(0,D.isArray)(e[o])||(e[o]=[]),e[o].push((0,D.castValue)(n))):e[o]=(0,D.castValue)(n),e},{})}function U(e,t,r=L.Const.Commands.Prefix){const o=[],{actions:n,nearestOnly:a}=function(e,t,r){let o=t;for(;o;){const t=(0,R.getAttribute)(o,N(e,L.Const.Commands.Actions,!1));if(t){const e=W(t);if(e[r])return{actions:e[r],nearestOnly:!1}}const n=(0,R.getAttribute)(o,N(e,L.Const.Commands.Action,!1));if(n){const e=W(n);if(e[r]||"click"!==r)return{actions:e[r]||[],nearestOnly:!0}}o=B(e,o)}return{actions:[],nearestOnly:!1}}(r,e,t);return n.length?(n.forEach(n=>{const i=K(n.actionParams||"",",").reduce((e,t)=>(e[(0,D.trim)(t)]=!0,e),{}),s=_(r,e,i,a);if(!s.length){const t="page",o=`[${N(r,t)}]`,[n,a]=G(e,o,r,t);s.push({entity:t,data:n,nested:[],context:a})}s.forEach(e=>{var r;o.push({entity:e.entity,action:n.action,data:e.data,trigger:t,context:e.context,nested:null!=(r=e.nested)?r:[]})})}),o):o}function V(e=L.Const.Commands.Prefix,t){if(!t)return{};const r=N(e,L.Const.Commands.Globals,!1);let o={};return J(t,`[${r}]`,t=>{o=(0,D.assign)(o,M(e,t,L.Const.Commands.Globals,!1))}),o}function W(e){const t={};return K(e).forEach(e=>{const[r,o]=X(e),[n,a]=Y(r);if(!n)return;let[i,s]=Y(o||"");i=i||n,t[n]||(t[n]=[]),t[n].push({trigger:n,triggerParams:a,action:i,actionParams:s})}),t}function _(e,t,r,o=!1){const n=[];let a=t;for(r=0!==Object.keys(r||{}).length?r:void 0;a;){const i=I(e,a,t,r);if(i&&(n.push(i),o))break;a=B(e,a)}return n}function I(e,t,r,o){const n=(0,R.getAttribute)(t,N(e));if(!n||o&&!o[n])return null;const a=[t],i=`[${N(e,n)}],[${N(e,"")}]`,s=N(e,L.Const.Commands.Link,!1);let c={};const l=[],[u,d]=G(r||t,i,e,n,!0);H(t,`[${s}]`,r=>{const[o,n]=X((0,R.getAttribute)(r,s));"parent"===n&&H(t.ownerDocument.body,`[${s}="${o}:child"]`,t=>{a.push(t);const r=I(e,t);r&&l.push(r)})});const p=[];a.forEach(e=>{e.matches(i)&&p.push(e),H(e,i,e=>p.push(e))});let m={};return p.forEach(t=>{m=(0,D.assign)(m,M(e,t,"")),c=(0,D.assign)(c,M(e,t,n))}),c=(0,D.assign)((0,D.assign)(m,c),u),a.forEach(t=>{H(t,`[${N(e)}]`,t=>{const r=I(e,t);r&&l.push(r)})}),{entity:n,data:c,context:d,nested:l}}function B(e,t){const r=N(e,L.Const.Commands.Link,!1);if(t.matches(`[${r}]`)){const[e,o]=X((0,R.getAttribute)(t,r));if("child"===o){const o=t.ownerDocument;let n=null;return J(o,`[${r}="${e}:parent"]`,e=>{n||(n=e)}),n}}const o=t.ownerDocument.defaultView;return!t.parentElement&&t.getRootNode&&t.getRootNode()instanceof o.ShadowRoot?t.getRootNode().host:t.parentElement}function G(e,t,r,o,n=!1){let a={};const i={};let s=e;const c=`[${N(r,L.Const.Commands.Context,!1)}]`,l=L.Const.Commands.Scoped,u=`[${N(r,l,!1)}]`;let d=0;for(;s;)n&&l&&s.matches(u)&&(a=(0,D.assign)(M(r,s,l,!1),a)),s.matches(t)&&(a=(0,D.assign)(M(r,s,""),a),a=(0,D.assign)(M(r,s,o),a)),s.matches(c)&&(Object.entries(M(r,s,L.Const.Commands.Context,!1)).forEach(([e,t])=>{t&&!i[e]&&(i[e]=[t,d])}),++d),s=B(r,s);return[a,i]}function J(e,t,r){e.querySelectorAll(t).forEach(r)}function H(e,t,r){e.querySelectorAll(t).forEach(r);e instanceof(e.ownerDocument||e).defaultView.Element&&e.shadowRoot&&H(e.shadowRoot,t,r),e.querySelectorAll("*").forEach(e=>{e.shadowRoot&&H(e.shadowRoot,t,r)})}function K(e,t=";"){if(!e)return[];const r=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(r)||[]}function X(e){const[t,r]=e.split(/:(.+)/,2);return[(0,D.trim)(t),(0,D.trim)(r)]}function Y(e){const[t,r]=e.split("(",2);return[t,r?r.slice(0,-1):""]}require("@walkeros/core"),require("@walkeros/web-core");var Z=require("@walkeros/core"),F=require("@walkeros/collector");function Q(e,t,r,o,n,a,i){const{elb:s,settings:c}=e;if((0,Z.isString)(t)&&t.startsWith("walker ")){if("walker init"===t&&e.initScope){const t=function(e,t){if(te(e))return[e];if(Array.isArray(e)){const t=[];for(const r of e)te(r)&&t.push(r);return t}if(void 0===e){const e=t.scope;if(te(e))return[e];if(void 0!==globalThis.document)return[globalThis.document]}return[]}(r,c);for(const r of t)e.initScope({...e,settings:{...c,scope:r}});return Promise.resolve((0,F.createPushResult)({ok:!0}))}return s(t,r)}if((0,Z.isObject)(t)){const e=t;if(!e.source&&c.scope){const t=c.scope.ownerDocument||c.scope,r=t.defaultView;e.source=ee(r,t)}return!e.globals&&c.scope&&(e.globals=re(c.scope)?V(c.prefix,c.scope):{}),s(e)}const[l]=String((0,Z.isObject)(t)?t.name:t).split(" ");let u,d=(0,Z.isObject)(r)?r:{},p={},m=!1;if((0,Z.isElementOrDocument)(r)&&(u=r,m=!0),(0,Z.isElementOrDocument)(n)?u=n:(0,Z.isObject)(n)&&Object.keys(n).length&&(p=n),u){const e=_(c.prefix||"data-elb",u).find(e=>e.entity===l);e&&(m&&(d=e.data),e.context&&(p=e.context))}const b=c.scope?c.scope.ownerDocument||c.scope:void 0,f=null==b?void 0:b.defaultView;"page"===l&&f&&(d.id=d.id||f.location.pathname);const g=c.scope&&re(c.scope)?V(c.prefix,c.scope):{};return s({name:String(t||""),data:d,context:p,globals:g,nested:a,custom:i,trigger:(0,Z.isString)(o)?o:"",source:f&&b?ee(f,b):void 0})}function ee(e,t){return{type:"browser",platform:"web",url:e.location.href,referrer:t.referrer}}function te(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof Element&&e instanceof Element)return!0;if("undefined"!=typeof Document&&e instanceof Document)return!0;if("undefined"!=typeof ShadowRoot&&e instanceof ShadowRoot)return!0;if("nodeType"in e){const t=e.nodeType;return 1===t||9===t||11===t}return!1}function re(e){return 11!==e.nodeType}var oe=async(e,t)=>{const r=(null==t?void 0:t.sourceId)||"browser";let o;const n=document,a=window;return{get flow(){return o},trigger:(t,i)=>async s=>{var c;if("load"===t||!t){const e="object"==typeof i&&null!==i?i:{};if(e.url){const t=new URL(e.url);a.history.replaceState({},"",t.pathname)}e.title&&(n.title=e.title),e.referrer&&Object.defineProperty(n,"referrer",{value:e.referrer,configurable:!0})}if(s&&(n.body.innerHTML=s),!o){const t=await(0,T.startFlow)({...e,run:null==(c=e.run)||c});o={collector:t.collector,elb:t.elb}}if(!t||"load"===t)return;const l="string"==typeof i?i:void 0,u=l?n.querySelector(l):null;if(!u)return void console.warn(`Trigger: element not found for selector "${l}"`);const d=o.collector.sources[r];if(!d)return void console.warn(`Trigger: source "${r}" not found in collector`);const p={elb:o.elb,settings:d.config.settings};await async function(e,t,r){const o=U(t,r,e.settings.prefix);return Promise.all(o.map(t=>Q(e,{name:`${t.entity} ${t.action}`,...t,trigger:r})))}(p,u,t)}}},ne=(e,t)=>{if(!e||"object"!=typeof e)return;const r=e,o=t.document,n=t.window,a=()=>{var e,t;if(!r.attributes)return;const n=(null==(t=null==(e=r.element)?void 0:e.match(/^(\w+)/))?void 0:t[1])||"div",a=o.createElement(n);for(const[e,t]of Object.entries(r.attributes))a.setAttribute(e,t);if(r.children)for(const e of r.children){const t=o.createElement("div");for(const[r,o]of Object.entries(e))t.setAttribute(r,o);a.appendChild(t)}return o.body.appendChild(a),a};if(!r.trigger||"load"===r.trigger){if(r.url){const e=new URL(r.url);n.history.replaceState({},"",e.pathname)}return r.title&&(o.title=r.title),r.referrer&&Object.defineProperty(o,"referrer",{value:r.referrer}),void a()}return()=>{const e=a();if(e)switch(r.trigger){case"click":e.dispatchEvent(new MouseEvent("click",{bubbles:!0}));break;case"submit":e.dispatchEvent(new Event("submit",{bubbles:!0}));break;case"hover":e.dispatchEvent(new MouseEvent("mouseenter",{bubbles:!0}));break;case"scroll":n.dispatchEvent(new Event("scroll"))}}};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,a=(e,r)=>{for(var o in r)t(e,o,{get:r[o],enumerable:!0})},i={};a(i,{examples:()=>w,schemas:()=>s}),module.exports=(e=i,((e,a,i,s)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of o(a))n.call(e,c)||c===i||t(e,c,{get:()=>a[c],enumerable:!(s=r(a,c))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};a(s,{DataAttributePrefix:()=>d,JavaScriptVarName:()=>p,ScopeSelector:()=>m,SettingsSchema:()=>f,TaggerSchema:()=>g,settings:()=>h,tagger:()=>v});var c=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=require("@walkeros/core/dev"),d=u.z.string().min(1).regex(/^[a-z][a-z0-9-]*$/,"Must be lowercase kebab-case").describe("Prefix for data attributes on DOM elements"),p=u.z.string().min(1).regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,"Must be a valid JavaScript identifier").describe("JavaScript variable name"),m=u.z.string().describe('DOM scope for event tracking (CSS selector or "document")').optional(),b=l.z.union([l.z.boolean(),l.z.string(),l.z.any().describe("Elb.Layer array for async command queuing")]),f=l.z.object({prefix:d.default("data-elb").describe("Prefix for data attributes (default: data-elb)"),scope:m.describe("DOM scope for event tracking (default: document)"),pageview:l.z.boolean().default(!0).describe("Enable automatic pageview tracking"),capture:l.z.boolean().default(!0).describe("Read click/submit triggers in the capture phase so tagged elements are resolved at click time before app handlers run (set false for the previous bubble-phase behavior)"),elb:p.default("elb").describe("Name for global elb function"),name:l.z.string().describe("Custom name for source instance").optional(),elbLayer:b.default("elbLayer").describe("Enable elbLayer for async command queuing (boolean, string, or Elb.Layer)")}),g=require("@walkeros/core/dev").z.object({prefix:d.default("data-elb").describe("Custom prefix for generated data attributes")}),h=(0,c.zodToSchema)(f),v=(0,c.zodToSchema)(g),w={};a(w,{createTrigger:()=>oe,env:()=>y,step:()=>C,trigger:()=>ne});var y={};a(y,{push:()=>S});var k=()=>{},x=()=>()=>Promise.resolve({ok:!0}),E={error:k,warn:k,info:k,debug:k,throw:e=>{throw"string"==typeof e?new Error(e):e},json:k,scope:()=>E},S={get push(){return x()},get command(){return x()},get elb(){return x()},get window(){return{addEventListener:k,removeEventListener:k,location:{href:"https://example.com/page",pathname:"/page",search:"?query=test",hash:"#section",host:"example.com",hostname:"example.com",origin:"https://example.com",protocol:"https:"},document:{},navigator:{language:"en-US",userAgent:"Mozilla/5.0 (Test)"},screen:{width:1920,height:1080},innerWidth:1920,innerHeight:1080,pageXOffset:0,pageYOffset:0,scrollX:0,scrollY:0}},get document(){return{addEventListener:k,removeEventListener:k,querySelector:k,querySelectorAll:()=>[],getElementById:k,getElementsByClassName:()=>[],getElementsByTagName:()=>[],createElement:()=>({setAttribute:k,getAttribute:k,addEventListener:k,removeEventListener:k}),body:{appendChild:k,removeChild:k},documentElement:{scrollTop:0,scrollLeft:0},readyState:"complete",title:"Test Page",referrer:"",cookie:""}},logger:E},C={};a(C,{clickEvent:()=>O,contextAndGlobals:()=>P,dataAttributeTypes:()=>$,impressionEvent:()=>z,nestedEntities:()=>j,pageView:()=>A,submitEvent:()=>q});var A={title:"Page view",description:"A page load trigger captures the current URL, title, and referrer as a walker page view event.",trigger:{type:"load",options:{url:"https://example.com/docs",title:"Documentation",referrer:"https://example.com/"}},in:"",out:[["elb",{name:"page view",data:{domain:"example.com",title:"Documentation",referrer:"https://example.com/",id:"/docs"},context:{},globals:{},nested:void 0,custom:void 0,trigger:"load",source:{type:"browser",platform:"web",url:"https://example.com/docs",referrer:"https://example.com/"}}]]},O={title:"Click event",description:"A button click with walker data attributes is captured as an entity action event with the mapped label data.",trigger:{type:"click",options:"button"},in:'<button data-elb="cta" data-elb-cta="label:Sign Up" data-elbaction="click:click">Sign Up</button>',out:[["elb",{name:"cta click",entity:"cta",action:"click",data:{label:"Sign Up"},context:{},globals:{},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"click"}]]},q={title:"Submit event",description:"A form submit with walker data attributes produces a signup complete event carrying the selected plan.",trigger:{type:"submit",options:"form"},in:'<form data-elb="signup" data-elb-signup="plan:premium" data-elbaction="submit:complete"></form>',out:[["elb",{name:"signup complete",entity:"signup",action:"complete",data:{plan:"premium"},context:{},globals:{},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"submit"}]]},z={title:"Impression event",description:"An intersection observer impression on a div with walker attributes emits a banner view event.",trigger:{type:"impression",options:"div"},in:'<div data-elb="banner" data-elb-banner="type:promotional;position:sidebar" data-elbaction="impression:view"></div>',out:[["elb",{name:"banner view",entity:"banner",action:"view",data:{type:"promotional",position:"sidebar"},context:{},globals:{},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"impression"}]]},j={title:"Nested entities",description:"A page load produces a page view plus a product view whose nested size entity is captured on the product event.",trigger:{type:"load"},in:'<div data-elb="product" data-elb-product="id:SKU-42;name:Sneakers" data-elbaction="load:view"><div data-elb="size" data-elb-size="selected:large;inStock:true"></div></div>',out:[["elb",{name:"page view",data:{domain:"example.com",title:"",referrer:"",id:"/"},context:{},globals:{},nested:void 0,custom:void 0,trigger:"load",source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""}}],["elb",{name:"product view",entity:"product",action:"view",data:{id:"SKU-42",name:"Sneakers"},context:{},globals:{},nested:[{entity:"size",data:{selected:"large",inStock:!0},context:{},nested:[]}],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"load"}]]},$={title:"Data attribute types",description:"Walker data attributes parse scalar, boolean, and array values into typed fields on the emitted event.",trigger:{type:"click",options:"div"},in:'<div data-elb="product" data-elb-product="price:99.99;available:true;colors[]:red;colors[]:blue" data-elbaction="click:select"></div>',out:[["elb",{name:"product select",entity:"product",action:"select",data:{price:99.99,available:!0,colors:["red","blue"]},context:{},globals:{},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"click"}]]},P={title:"Context and globals",description:"Walker context and globals attributes attach ambient metadata to events emitted by the browser source.",trigger:{type:"click",options:'[data-elb="cta"]'},in:'<div data-elbcontext="test:engagement_flow" data-elbglobals="language:en;plan:premium"><div data-elb="cta" data-elb-cta="label:Try Now" data-elbaction="click:signup">Try Now</div></div>',out:[["elb",{name:"cta signup",entity:"cta",action:"signup",data:{label:"Try Now"},context:{test:["engagement_flow",0]},globals:{language:"en",plan:"premium"},nested:[],source:{type:"browser",platform:"web",url:"https://example.com/",referrer:""},trigger:"click"}]]},T=require("@walkeros/collector"),D=(require("@walkeros/core"),require("@walkeros/collector"),require("@walkeros/web-core"),require("@walkeros/core")),L=require("@walkeros/collector"),R=require("@walkeros/web-core");function N(e,t,r=!0){return e+(t=null!=t?(r?"-":"")+t:"")}function M(e,t,r,o=!0){return K((0,R.getAttribute)(t,N(e,r,o))||"").reduce((e,r)=>{let[o,n]=X(r);if(!o)return e;if(n||(o.endsWith(":")&&(o=o.slice(0,-1)),n=""),n.startsWith("#")){n=n.slice(1);try{let e=t[n];e||"selected"!==n||(e=t.options[t.selectedIndex].text),n=String(e)}catch(e){n=""}}return o.endsWith("[]")?(o=o.slice(0,-2),(0,D.isArray)(e[o])||(e[o]=[]),e[o].push((0,D.castValue)(n))):e[o]=(0,D.castValue)(n),e},{})}function U(e,t,r=L.Const.Commands.Prefix){const o=[],{actions:n,nearestOnly:a}=function(e,t,r){let o=t;for(;o;){const t=(0,R.getAttribute)(o,N(e,L.Const.Commands.Actions,!1));if(t){const e=W(t);if(e[r])return{actions:e[r],nearestOnly:!1}}const n=(0,R.getAttribute)(o,N(e,L.Const.Commands.Action,!1));if(n){const e=W(n);if(e[r]||"click"!==r)return{actions:e[r]||[],nearestOnly:!0}}o=B(e,o)}return{actions:[],nearestOnly:!1}}(r,e,t);return n.length?(n.forEach(n=>{const i=K(n.actionParams||"",",").reduce((e,t)=>(e[(0,D.trim)(t)]=!0,e),{}),s=_(r,e,i,a);if(!s.length){const t="page",o=`[${N(r,t)}]`,[n,a]=G(e,o,r,t);s.push({entity:t,data:n,nested:[],context:a})}s.forEach(e=>{var r;o.push({entity:e.entity,action:n.action,data:e.data,trigger:t,context:e.context,nested:null!=(r=e.nested)?r:[]})})}),o):o}function V(e=L.Const.Commands.Prefix,t){if(!t)return{};const r=N(e,L.Const.Commands.Globals,!1);let o={};return J(t,`[${r}]`,t=>{o=(0,D.assign)(o,M(e,t,L.Const.Commands.Globals,!1))}),o}function W(e){const t={};return K(e).forEach(e=>{const[r,o]=X(e),[n,a]=Y(r);if(!n)return;let[i,s]=Y(o||"");i=i||n,t[n]||(t[n]=[]),t[n].push({trigger:n,triggerParams:a,action:i,actionParams:s})}),t}function _(e,t,r,o=!1){const n=[];let a=t;for(r=0!==Object.keys(r||{}).length?r:void 0;a;){const i=I(e,a,t,r);if(i&&(n.push(i),o))break;a=B(e,a)}return n}function I(e,t,r,o){const n=(0,R.getAttribute)(t,N(e));if(!n||o&&!o[n])return null;const a=[t],i=`[${N(e,n)}],[${N(e,"")}]`,s=N(e,L.Const.Commands.Link,!1);let c={};const l=[],[u,d]=G(r||t,i,e,n,!0);H(t,`[${s}]`,r=>{const[o,n]=X((0,R.getAttribute)(r,s));"parent"===n&&H(t.ownerDocument.body,`[${s}="${o}:child"]`,t=>{a.push(t);const r=I(e,t);r&&l.push(r)})});const p=[];a.forEach(e=>{e.matches(i)&&p.push(e),H(e,i,e=>p.push(e))});let m={};return p.forEach(t=>{m=(0,D.assign)(m,M(e,t,"")),c=(0,D.assign)(c,M(e,t,n))}),c=(0,D.assign)((0,D.assign)(m,c),u),a.forEach(t=>{H(t,`[${N(e)}]`,t=>{const r=I(e,t);r&&l.push(r)})}),{entity:n,data:c,context:d,nested:l}}function B(e,t){const r=N(e,L.Const.Commands.Link,!1);if(t.matches(`[${r}]`)){const[e,o]=X((0,R.getAttribute)(t,r));if("child"===o){const o=t.ownerDocument;let n=null;return J(o,`[${r}="${e}:parent"]`,e=>{n||(n=e)}),n}}const o=t.ownerDocument.defaultView;return!t.parentElement&&t.getRootNode&&t.getRootNode()instanceof o.ShadowRoot?t.getRootNode().host:t.parentElement}function G(e,t,r,o,n=!1){let a={};const i={};let s=e;const c=`[${N(r,L.Const.Commands.Context,!1)}]`,l=L.Const.Commands.Scoped,u=`[${N(r,l,!1)}]`;let d=0;for(;s;)n&&l&&s.matches(u)&&(a=(0,D.assign)(M(r,s,l,!1),a)),s.matches(t)&&(a=(0,D.assign)(M(r,s,""),a),a=(0,D.assign)(M(r,s,o),a)),s.matches(c)&&(Object.entries(M(r,s,L.Const.Commands.Context,!1)).forEach(([e,t])=>{t&&!i[e]&&(i[e]=[t,d])}),++d),s=B(r,s);return[a,i]}function J(e,t,r){e.querySelectorAll(t).forEach(r)}function H(e,t,r){e.querySelectorAll(t).forEach(r);e instanceof(e.ownerDocument||e).defaultView.Element&&e.shadowRoot&&H(e.shadowRoot,t,r),e.querySelectorAll("*").forEach(e=>{e.shadowRoot&&H(e.shadowRoot,t,r)})}function K(e,t=";"){if(!e)return[];const r=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(r)||[]}function X(e){const[t,r]=e.split(/:(.+)/,2);return[(0,D.trim)(t),(0,D.trim)(r)]}function Y(e){const[t,r]=e.split("(",2);return[t,r?r.slice(0,-1):""]}require("@walkeros/core"),require("@walkeros/web-core"),Array.from({length:101},(e,t)=>t/100);var Z=require("@walkeros/core"),F=require("@walkeros/collector");function Q(e,t,r,o,n,a,i){const{elb:s,settings:c}=e;if((0,Z.isString)(t)&&t.startsWith("walker ")){if("walker init"===t&&e.initScope){const t=function(e,t){if(te(e))return[e];if(Array.isArray(e)){const t=[];for(const r of e)te(r)&&t.push(r);return t}if(void 0===e){const e=t.scope;if(te(e))return[e];if(void 0!==globalThis.document)return[globalThis.document]}return[]}(r,c);for(const r of t)e.initScope({...e,settings:{...c,scope:r}});return Promise.resolve((0,F.createPushResult)({ok:!0}))}return s(t,r)}if((0,Z.isObject)(t)){const e=t;if(!e.source&&c.scope){const t=c.scope.ownerDocument||c.scope,r=t.defaultView;e.source=ee(r,t)}return!e.globals&&c.scope&&(e.globals=re(c.scope)?V(c.prefix,c.scope):{}),s(e)}const[l]=String((0,Z.isObject)(t)?t.name:t).split(" ");let u,d=(0,Z.isObject)(r)?r:{},p={},m=!1;if((0,Z.isElementOrDocument)(r)&&(u=r,m=!0),(0,Z.isElementOrDocument)(n)?u=n:(0,Z.isObject)(n)&&Object.keys(n).length&&(p=n),u){const e=_(c.prefix||"data-elb",u).find(e=>e.entity===l);e&&(m&&(d=e.data),e.context&&(p=e.context))}const b=c.scope?c.scope.ownerDocument||c.scope:void 0,f=null==b?void 0:b.defaultView;"page"===l&&f&&(d.id=d.id||f.location.pathname);const g=c.scope&&re(c.scope)?V(c.prefix,c.scope):{};return s({name:String(t||""),data:d,context:p,globals:g,nested:a,custom:i,trigger:(0,Z.isString)(o)?o:"",source:f&&b?ee(f,b):void 0})}function ee(e,t){return{type:"browser",platform:"web",url:e.location.href,referrer:t.referrer}}function te(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof Element&&e instanceof Element)return!0;if("undefined"!=typeof Document&&e instanceof Document)return!0;if("undefined"!=typeof ShadowRoot&&e instanceof ShadowRoot)return!0;if("nodeType"in e){const t=e.nodeType;return 1===t||9===t||11===t}return!1}function re(e){return 11!==e.nodeType}var oe=async(e,t)=>{const r=(null==t?void 0:t.sourceId)||"browser";let o;const n=document,a=window;return{get flow(){return o},trigger:(t,i)=>async s=>{var c;if("load"===t||!t){const e="object"==typeof i&&null!==i?i:{};if(e.url){const t=new URL(e.url);a.history.replaceState({},"",t.pathname)}e.title&&(n.title=e.title),e.referrer&&Object.defineProperty(n,"referrer",{value:e.referrer,configurable:!0})}if(s&&(n.body.innerHTML=s),!o){const t=await(0,T.startFlow)({...e,run:null==(c=e.run)||c});o={collector:t.collector,elb:t.elb}}if(!t||"load"===t)return;const l="string"==typeof i?i:void 0,u=l?n.querySelector(l):null;if(!u)return void console.warn(`Trigger: element not found for selector "${l}"`);const d=o.collector.sources[r];if(!d)return void console.warn(`Trigger: source "${r}" not found in collector`);const p={elb:o.elb,settings:d.config.settings};await async function(e,t,r){const o=U(t,r,e.settings.prefix);return Promise.all(o.map(t=>Q(e,{name:`${t.entity} ${t.action}`,...t,trigger:r})))}(p,u,t)}}},ne=(e,t)=>{if(!e||"object"!=typeof e)return;const r=e,o=t.document,n=t.window,a=()=>{var e,t;if(!r.attributes)return;const n=(null==(t=null==(e=r.element)?void 0:e.match(/^(\w+)/))?void 0:t[1])||"div",a=o.createElement(n);for(const[e,t]of Object.entries(r.attributes))a.setAttribute(e,t);if(r.children)for(const e of r.children){const t=o.createElement("div");for(const[r,o]of Object.entries(e))t.setAttribute(r,o);a.appendChild(t)}return o.body.appendChild(a),a};if(!r.trigger||"load"===r.trigger){if(r.url){const e=new URL(r.url);n.history.replaceState({},"",e.pathname)}return r.title&&(o.title=r.title),r.referrer&&Object.defineProperty(o,"referrer",{value:r.referrer}),void a()}return()=>{const e=a();if(e)switch(r.trigger){case"click":e.dispatchEvent(new MouseEvent("click",{bubbles:!0}));break;case"submit":e.dispatchEvent(new Event("submit",{bubbles:!0}));break;case"hover":e.dispatchEvent(new MouseEvent("mouseenter",{bubbles:!0}));break;case"scroll":n.dispatchEvent(new Event("scroll"))}}};//# sourceMappingURL=dev.js.map