@walkeros/web-source-browser 0.6.0 → 0.6.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/trigger.ts","../src/walker.ts","../src/triggerVisible.ts","../src/translation.ts","../src/elbLayer.ts","../src/session.ts","../src/config.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/env.ts","../src/tagger.ts"],"sourcesContent":["import type { Source, WalkerOS, On } from '@walkeros/core';\nimport type { Scope, Types, Env } from './types';\nimport type {\n BrowserPushData,\n BrowserPushOptions,\n BrowserPushContext,\n BrowserPush,\n} from './types/elb';\nimport { isString } from '@walkeros/core';\nimport { initTriggers, processLoadTriggers, ready } from './trigger';\nimport { destroyVisibilityTracking } from './triggerVisible';\nimport { initElbLayer } from './elbLayer';\nimport { translateToCoreCollector } from './translation';\nimport { sessionStart } from './session';\nimport { getPageViewData } from './walker';\nimport { getConfig } from './config';\n\nexport * as SourceBrowser from './types';\n\n// Export examples\nexport * as examples from './examples';\n\n// Export walker utility functions\nexport {\n getAllEvents,\n getEvents,\n getGlobals,\n getElbAttributeName,\n getElbValues,\n} from './walker';\n\n// Export tagger functionality\nexport { createTagger } from './tagger';\nexport type { TaggerConfig, TaggerInstance } from './tagger';\n\n/**\n * Browser source implementation using environment injection.\n *\n * This source captures DOM events, manages sessions, handles pageviews,\n * and processes the elbLayer for browser environments.\n */\nexport const sourceBrowser: Source.Init<Types> = async (\n config: Partial<Source.Config<Types>>,\n env: Env,\n) => {\n const { elb, command, window, document } = env;\n\n const userSettings = config?.settings || {};\n const actualWindow =\n window ||\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n const actualDocument =\n document ||\n (typeof globalThis.document !== 'undefined'\n ? globalThis.document\n : undefined);\n\n const settings: Source.Settings<Types> = getConfig(\n userSettings,\n actualDocument as Document | undefined,\n );\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n const translationContext = {\n elb,\n settings,\n };\n\n // Initialize features if environment is available\n // Skip all DOM-related functionality when not in browser environment\n\n if (actualWindow && actualDocument) {\n // Initialize ELB Layer for async command handling\n if (settings.elbLayer !== false && elb) {\n initElbLayer(elb, {\n name: isString(settings.elbLayer) ? settings.elbLayer : 'elbLayer',\n prefix: settings.prefix,\n window: actualWindow as Window,\n });\n }\n\n // Initialize session if enabled\n if (settings.session && elb) {\n const sessionConfig =\n typeof settings.session === 'boolean' ? {} : settings.session;\n sessionStart(elb, sessionConfig, command);\n }\n\n // Setup global triggers (click, submit) when DOM is ready\n await ready(initTriggers, translationContext, settings);\n\n // Setup load triggers and pageview on each run\n const handleRun = () => {\n processLoadTriggers(translationContext, settings);\n\n // Send pageview if enabled\n if (settings.pageview) {\n const [data, context] = getPageViewData(\n settings.prefix || 'data-elb',\n settings.scope as Scope,\n );\n translateToCoreCollector(\n translationContext,\n 'page view',\n data,\n 'load',\n context,\n );\n }\n };\n\n // Trigger initial run if this is a new session/page load\n handleRun();\n\n // Set up automatic window.elb assignment if configured\n if (isString(settings.elb) && settings.elb) {\n (actualWindow as unknown as Record<string, unknown>)[settings.elb] = (\n ...args: unknown[]\n ) => {\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n translationContext,\n event,\n data as BrowserPushData | undefined,\n options as BrowserPushOptions | undefined,\n context as BrowserPushContext | undefined,\n nested as WalkerOS.Entities,\n custom as WalkerOS.Properties,\n );\n };\n }\n }\n\n // Handle events pushed from collector (consent, session, ready, run)\n const handleEvent = async (event: On.Types, context?: unknown) => {\n switch (event) {\n case 'consent':\n // React to consent changes - sources can implement specific consent handling\n // For browser source, we might want to re-evaluate session settings\n if (settings.session && context && elb) {\n const sessionConfig =\n typeof settings.session === 'boolean' ? {} : settings.session;\n sessionStart(elb, sessionConfig, command);\n }\n break;\n\n case 'session':\n // React to session events if needed\n // Browser source typically handles session creation, not reaction\n break;\n\n case 'ready':\n // React to collector ready state\n // Browser source initialization already handles this\n break;\n\n case 'run':\n // React to collector run events - re-process load triggers\n if (actualDocument && actualWindow) {\n processLoadTriggers(translationContext, settings);\n\n // Send pageview if enabled\n if (settings.pageview) {\n const [data, contextData] = getPageViewData(\n settings.prefix || 'data-elb',\n settings.scope as Scope,\n );\n translateToCoreCollector(\n translationContext,\n 'page view',\n data,\n 'load',\n contextData,\n );\n }\n }\n break;\n\n default:\n break;\n }\n };\n\n const push: BrowserPush = ((...args: Parameters<BrowserPush>) => {\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n translationContext,\n event,\n data,\n options,\n context,\n nested,\n custom,\n );\n }) satisfies BrowserPush;\n\n // Return stateless source instance with event handler and push method\n return {\n type: 'browser',\n config: fullConfig,\n push,\n destroy: async () => {\n // Cleanup visibility tracking and other resources\n if (actualDocument) {\n destroyVisibilityTracking(\n settings.scope || (actualDocument as Document),\n );\n }\n },\n on: handleEvent,\n };\n};\n\nexport default sourceBrowser;\n","import type { WalkerOS, Collector } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope, Settings, Context } from './types';\nimport { throttle, tryCatch } from '@walkeros/core';\nimport { Const, onApply } from '@walkeros/collector';\nimport { elb as elbOrg, getAttribute } from '@walkeros/web-core';\nimport {\n getElbAttributeName,\n getEvents,\n getPageViewData,\n getTriggerActions,\n} from './walker';\nimport {\n initVisibilityTracking,\n triggerVisible,\n destroyVisibilityTracking,\n} from './triggerVisible';\nimport { translateToCoreCollector } from './translation';\n\nlet scrollElements: Walker.ScrollElements = [];\nlet scrollListener: EventListenerOrEventListenerObject | undefined;\n\n// Reset function for testing\nexport function resetScrollListener() {\n scrollListener = undefined;\n scrollElements = [];\n}\n\nexport const createElb: (customLayer?: unknown) => unknown = (customLayer?) => {\n return (\n customLayer\n ? function () {\n (customLayer as unknown[]).push(arguments);\n }\n : elbOrg\n ) as unknown;\n};\n\nexport const Triggers: { [key: string]: Walker.Trigger } = {\n Click: 'click',\n Custom: 'custom',\n Hover: 'hover',\n Load: 'load',\n Pulse: 'pulse',\n Scroll: 'scroll',\n Submit: 'submit',\n Impression: 'impression',\n Visible: 'visible',\n Wait: 'wait',\n} as const;\n\nexport async function ready(\n fn: (context: Context, settings: Settings) => void,\n context: Context,\n settings: Settings,\n): Promise<void> {\n const readyFn = () => {\n fn(context, settings);\n };\n\n if (document.readyState !== 'loading') {\n readyFn();\n } else {\n document.addEventListener('DOMContentLoaded', readyFn);\n }\n}\n\n// Called once during source initialization to setup global listeners\nexport function initTriggers(context: Context, settings: Settings) {\n if (!settings.scope) return; // Skip if no scope available\n const requiredSettings = settings as Required<Settings>;\n initGlobalTrigger(context, requiredSettings);\n}\n\n// Called on each walker run to process load triggers\nexport function processLoadTriggers(context: Context, settings: Settings) {\n if (!settings.scope) return; // Skip if no scope available\n const requiredSettings = settings as Required<Settings>;\n initScopeTrigger(context, requiredSettings);\n}\n\nexport function initGlobalTrigger(context: Context, settings: Settings): void {\n const scope = settings.scope;\n\n if (!scope) return;\n\n scope.addEventListener(\n 'click',\n tryCatch(function (this: Scope, ev: unknown) {\n triggerClick.call(this, context, ev as MouseEvent);\n }) as EventListener,\n );\n scope.addEventListener(\n 'submit',\n tryCatch(function (this: Scope, ev: unknown) {\n triggerSubmit.call(this, context, ev as SubmitEvent);\n }) as EventListener,\n );\n}\n\nexport function initScopeTrigger(context: Context, settings: Settings) {\n const elem = settings.scope;\n\n // Reset all scroll events @TODO check if it's right here\n scrollElements = [];\n\n // Clean up any existing visibility tracking to prevent observer accumulation\n const scope = elem || document;\n destroyVisibilityTracking(scope);\n // Initialize visibility tracking for this scope\n initVisibilityTracking(scope, 1000);\n\n // default data-elbaction\n const selectorAction = getElbAttributeName(\n settings.prefix,\n Const.Commands.Action,\n false,\n );\n if (scope !== document) {\n // Handle the elements action(s), too\n handleActionElem(context, scope as HTMLElement, selectorAction, settings);\n }\n\n // Handle all children action(s)\n const elements = scope.querySelectorAll<HTMLElement>(`[${selectorAction}]`);\n\n elements.forEach((elem) => {\n handleActionElem(context, elem, selectorAction, settings);\n });\n\n if (scrollElements.length) scroll(context, scope, settings);\n}\n\nexport async function handleTrigger(\n context: Context,\n element: Element,\n trigger: string,\n // @TODO add triggerParams to filter for specific trigger\n): Promise<unknown[]> {\n const events = getEvents(element, trigger, context.settings.prefix);\n return Promise.all(\n events.map((event: Walker.Event) =>\n translateToCoreCollector(context, {\n name: `${event.entity} ${event.action}`,\n ...event,\n trigger,\n }),\n ),\n );\n}\n\nfunction handleActionElem(\n context: Context,\n elem: HTMLElement,\n selectorAction: string,\n settings: Settings,\n) {\n const actionAttr = getAttribute(elem, selectorAction);\n\n if (!actionAttr) return;\n\n // TriggersActionGroups ([trigger: string]: TriggerActions)\n Object.values(getTriggerActions(actionAttr)).forEach((triggerActions) =>\n // TriggerActions (Array<TriggerAction>)\n triggerActions.forEach((triggerAction: Walker.TriggerActions[0]) => {\n // TriggerAction ({ trigger, triggerParams, action, actionParams })\n switch (triggerAction.trigger) {\n case Triggers.Hover:\n triggerHover(context, elem);\n break;\n case Triggers.Load:\n triggerLoad(context, elem);\n break;\n case Triggers.Pulse:\n triggerPulse(context, elem, triggerAction.triggerParams);\n break;\n case Triggers.Scroll:\n triggerScroll(elem, triggerAction.triggerParams);\n break;\n case Triggers.Impression:\n triggerVisible(context, elem);\n break;\n case Triggers.Visible:\n triggerVisible(context, elem, { multiple: true });\n break;\n case Triggers.Wait:\n triggerWait(context, elem, triggerAction.triggerParams);\n break;\n }\n }),\n );\n}\n\nfunction triggerClick(context: Context, ev: MouseEvent) {\n handleTrigger(context, ev.target as Element, Triggers.Click);\n}\n\nfunction triggerHover(context: Context, elem: HTMLElement) {\n elem.addEventListener(\n 'mouseenter',\n tryCatch(function (this: Document, ev: MouseEvent) {\n if (ev.target instanceof Element)\n handleTrigger(context, ev.target, Triggers.Hover);\n }),\n );\n}\n\nfunction triggerLoad(context: Context, elem: HTMLElement) {\n handleTrigger(context, elem, Triggers.Load);\n}\n\nfunction triggerPulse(\n context: Context,\n elem: HTMLElement,\n triggerParams: string = '',\n) {\n setInterval(\n () => {\n // Only trigger when tab is active\n if (!document.hidden) handleTrigger(context, elem, Triggers.Pulse);\n },\n parseInt(triggerParams || '') || 15000,\n );\n}\n\nfunction triggerScroll(elem: HTMLElement, triggerParams: string = '') {\n // Scroll depth in percent, default 50%\n const depth = parseInt(triggerParams || '') || 50;\n\n // Ignore invalid parameters\n if (depth < 0 || depth > 100) return;\n\n scrollElements.push([elem, depth]);\n}\n\nfunction triggerSubmit(context: Context, ev: SubmitEvent) {\n if (ev.target) {\n handleTrigger(context, ev.target as Element, Triggers.Submit);\n }\n}\n\nfunction triggerWait(\n context: Context,\n elem: HTMLElement,\n triggerParams: string = '',\n) {\n setTimeout(\n () => handleTrigger(context, elem, Triggers.Wait),\n parseInt(triggerParams || '') || 15000,\n );\n}\n\nfunction scroll(context: Context, scope: Scope, settings: Settings) {\n const scrolling = (\n scrollElements: Walker.ScrollElements,\n context: Context,\n ) => {\n return scrollElements.filter(([element, depth]: [Element, number]) => {\n // Distance from top to the bottom of the visible screen\n const windowBottom = window.scrollY + window.innerHeight;\n // Distance from top to the elements relevant content\n const elemTop = (element as HTMLElement).offsetTop;\n\n // Skip calculations if not in viewport yet\n if (windowBottom < elemTop) return true;\n\n // Height of the elements box as 100 percent base\n const elemHeight = element.clientHeight;\n // Distance from top to the elements bottom\n const elemBottom = elemTop + elemHeight;\n // Height of the non-visible pixels below visible screen\n const hidden = elemBottom - windowBottom;\n // Visible percentage of the element\n const scrollDepth = (1 - hidden / (elemHeight || 1)) * 100;\n\n // Check if the elements visibility skipped the required border\n if (scrollDepth >= depth) {\n // Enough scrolling, it's time\n handleTrigger(context, element, Triggers.Scroll);\n\n // Remove the element from scrollEvents\n return false;\n }\n\n // Keep observing the element\n return true;\n });\n };\n\n // Don't add unnecessary scroll listeners\n if (!scrollListener) {\n scrollListener = throttle(function () {\n scrollElements = scrolling.call(scope, scrollElements, context);\n });\n\n scope.addEventListener('scroll', scrollListener);\n }\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope } from './types';\nimport { assign, castValue, isArray, trim } from '@walkeros/core';\nimport { Const } from '@walkeros/collector';\nimport { getAttribute } from '@walkeros/web-core';\n\nexport function getElbAttributeName(\n prefix: string,\n name?: string,\n isProperty = true,\n): string {\n // separate dynamic properties from walker Const.Commands\n const separator = isProperty ? '-' : '';\n name = name != undefined ? separator + name : '';\n return prefix + name;\n}\n\nexport function getElbValues(\n prefix: string,\n element: Element,\n name: string,\n isProperty = true,\n): WalkerOS.Properties {\n const attributeValue =\n getAttribute(element, getElbAttributeName(prefix, name, isProperty)) || '';\n\n const elbValues = splitAttribute(attributeValue).reduce((values, str) => {\n let [key, val]: Walker.KeyVal = splitKeyVal(str);\n\n if (!key) return values;\n\n // Handle keys without value\n if (!val) {\n // Manually remove the : from key on empty values\n if (key.endsWith(':')) key = key.slice(0, -1);\n val = '';\n }\n\n // Dynamic values\n if (val.startsWith('#')) {\n val = val.slice(1); // Remove # symbol\n try {\n // Read property value from element\n let dynamicValue = (element as Element)[val as keyof Element];\n if (!dynamicValue && val === 'selected') {\n // Try to read selected value with chance of error\n dynamicValue = (element as HTMLSelectElement).options[\n (element as HTMLSelectElement).selectedIndex\n ].text;\n }\n\n val = String(dynamicValue);\n } catch (error) {\n val = '';\n }\n }\n\n if (key.endsWith('[]')) {\n key = key.slice(0, -2); // Remove [] symbol\n if (!isArray(values[key])) values[key] = [];\n (values[key] as WalkerOS.PropertyType[]).push(castValue(val));\n } else {\n values[key] = castValue(val);\n }\n\n return values;\n }, {} as WalkerOS.Properties);\n\n return elbValues;\n}\n\nexport function getAllEvents(\n scope?: Scope,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\n const actualScope = scope || document.body;\n if (!actualScope) return [];\n let events: Walker.Events = [];\n const action = Const.Commands.Action;\n const actionSelector = `[${getElbAttributeName(prefix, action, false)}]`;\n\n const processElementEvents = (elem: Element) => {\n Object.keys(getElbValues(prefix, elem, action, false)).forEach(\n (trigger) => {\n events = events.concat(getEvents(elem, trigger, prefix));\n },\n );\n };\n\n // Check if the scope element itself has action attributes\n if (\n actualScope !== document &&\n (actualScope as Element).matches?.(actionSelector)\n ) {\n processElementEvents(actualScope as Element);\n }\n\n queryAll(actualScope, actionSelector, processElementEvents);\n\n return events;\n}\n\nexport function getEvents(\n target: Element,\n trigger: string,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\n const events: Walker.Events = [];\n\n // Check for actions and get entity collection strategy\n const { actions, nearestOnly } = resolveAttributes(prefix, target, trigger);\n\n // Stop if there's no valid action combo\n if (!actions.length) return events;\n\n actions.forEach((triggerAction) => {\n const filter = splitAttribute(triggerAction.actionParams || '', ',').reduce(\n (filter, param) => {\n filter[trim(param)] = true;\n return filter;\n },\n {} as Walker.Filter,\n );\n\n // Get entities - using nearestOnly flag to determine collection strategy\n const entities = getEntities(prefix, target, filter, nearestOnly);\n\n // Use page as default entity if no one was set\n if (!entities.length) {\n const entity = 'page';\n // Only use explicit page properties and ignore generic properties\n const entitySelector = `[${getElbAttributeName(prefix, entity)}]`;\n\n // Get matching properties from the element and its parents\n const [data, context] = getThisAndParentProperties(\n target,\n entitySelector,\n prefix,\n entity,\n );\n\n entities.push({\n entity, // page\n data, // Consider only upper data\n nested: [], // Skip nested in this faked page case\n context,\n });\n }\n\n // Return a list of full events\n entities.forEach((entity) => {\n events.push({\n entity: entity.entity,\n action: triggerAction.action,\n data: entity.data,\n trigger,\n context: entity.context,\n nested: entity.nested,\n });\n });\n });\n\n return events;\n}\n\nexport function getGlobals(\n prefix: string = Const.Commands.Prefix,\n scope: Scope = document,\n): WalkerOS.Properties {\n const globalsName = getElbAttributeName(\n prefix,\n Const.Commands.Globals,\n false,\n );\n const globalSelector = `[${globalsName}]`;\n let values = {};\n\n queryAll(scope, globalSelector, (element) => {\n values = assign(\n values,\n getElbValues(prefix, element, Const.Commands.Globals, false),\n );\n });\n\n return values;\n}\n\nexport function getPageViewData(\n prefix: string,\n scope: Scope,\n): [WalkerOS.Properties, WalkerOS.OrderedProperties] {\n // static page view\n const loc = window.location;\n const page = 'page';\n const scopeElement = scope === document ? document.body : (scope as Element);\n const [data, context] = getThisAndParentProperties(\n scopeElement,\n `[${getElbAttributeName(prefix, page)}]`,\n prefix,\n page,\n );\n data.domain = loc.hostname;\n data.title = document.title;\n data.referrer = document.referrer;\n\n if (loc.search) data.search = loc.search;\n if (loc.hash) data.hash = loc.hash;\n\n // @TODO get all nested entities\n return [data, context];\n}\n\nexport function getTriggerActions(str: string): Walker.TriggersActionGroups {\n const values: Walker.TriggersActionGroups = {};\n\n const attributes = splitAttribute(str);\n\n attributes.forEach((str) => {\n const [triggerAttr, actionAttr] = splitKeyVal(str);\n const [trigger, triggerParams] = parseAttribute(triggerAttr);\n\n if (!trigger) return;\n\n let [action, actionParams] = parseAttribute(actionAttr || '');\n\n // Shortcut if trigger and action are the same (click:click)\n action = action || trigger;\n\n if (!values[trigger]) values[trigger] = [];\n\n values[trigger].push({ trigger, triggerParams, action, actionParams });\n });\n\n return values;\n}\n\nexport function getEntities(\n prefix: string,\n target: Element,\n filter?: Walker.Filter,\n nearestOnly = false,\n): WalkerOS.Entities {\n const entities: WalkerOS.Entities = [];\n let element = target as Node['parentElement'];\n\n // Unset empty filter object\n filter = Object.keys(filter || {}).length !== 0 ? filter : undefined;\n\n while (element) {\n const entity = getEntity(prefix, element, target, filter);\n if (entity) {\n entities.push(entity);\n if (nearestOnly) break; // Stop after first entity for data-elbaction\n }\n\n element = getParent(prefix, element);\n }\n\n return entities;\n}\n\nfunction getEntity(\n prefix: string,\n element: Element,\n origin?: Element,\n filter?: Walker.Filter,\n): WalkerOS.Entity | null {\n const entity = getAttribute(element, getElbAttributeName(prefix));\n\n // It's not a (valid) entity element or should be filtered\n if (!entity || (filter && !filter[entity])) return null;\n\n const scopeElems = [element]; // All related elements\n const dataSelector = `[${getElbAttributeName(\n prefix,\n entity,\n )}],[${getElbAttributeName(prefix, '')}]`; // [data-elb-entity,data-elb-]\n const linkName = getElbAttributeName(prefix, Const.Commands.Link, false); // data-elblink\n\n let data: WalkerOS.Properties = {};\n const nested: WalkerOS.Entities = [];\n const [parentData, context] = getThisAndParentProperties(\n origin || element,\n dataSelector,\n prefix,\n entity,\n );\n\n // Add linked elements (data-elblink)\n queryAll(element, `[${linkName}]`, (link) => {\n const [linkId, linkState]: Walker.KeyVal = splitKeyVal(\n getAttribute(link, linkName),\n );\n\n // Get all linked child elements if link is a parent\n // Note: This searches the entire document - for scoped operation, we would need\n // to pass scope context down to this function or redesign the linking mechanism\n if (linkState === 'parent')\n queryAll(document.body, `[${linkName}=\"${linkId}:child\"]`, (wormhole) => {\n scopeElems.push(wormhole);\n\n // A linked child can also be an entity\n const nestedEntity = getEntity(prefix, wormhole);\n if (nestedEntity) nested.push(nestedEntity);\n });\n });\n\n // Get all property elements including linked elements\n const propertyElems: Array<Element> = [];\n scopeElems.forEach((elem) => {\n // Also check for property on same level\n if (elem.matches(dataSelector)) propertyElems.push(elem);\n\n queryAll(elem, dataSelector, (elem) => propertyElems.push(elem));\n });\n\n // Get properties\n let genericData: WalkerOS.Properties = {};\n propertyElems.forEach((child) => {\n // Eventually override closer properties\n genericData = assign(genericData, getElbValues(prefix, child, ''));\n data = assign(data, getElbValues(prefix, child, entity));\n });\n\n // Merge properties with the hierarchy generic > data > parent\n data = assign(assign(genericData, data), parentData);\n\n // Get nested entities\n scopeElems.forEach((elem) => {\n queryAll(\n elem,\n `[${getElbAttributeName(prefix)}]`,\n (nestedEntityElement) => {\n const nestedEntity = getEntity(prefix, nestedEntityElement);\n if (nestedEntity) nested.push(nestedEntity);\n },\n );\n });\n\n return { entity, data, context, nested };\n}\n\nfunction getParent(prefix: string, elem: HTMLElement): HTMLElement | null {\n const linkName = getElbAttributeName(prefix, Const.Commands.Link, false); // data-elblink\n\n // Link\n if (elem.matches(`[${linkName}]`)) {\n const [linkId, linkState]: Walker.KeyVal = splitKeyVal(\n getAttribute(elem, linkName),\n );\n if (linkState === 'child') {\n // If current element is a child-link jump to the parent\n // Note: This searches the entire document - for scoped operation, we would need\n // to pass scope context down to this function or redesign the linking mechanism\n return document.querySelector(`[${linkName}=\"${linkId}:parent\"]`);\n }\n }\n\n // Shadow DOM traversal\n if (\n !elem.parentElement &&\n elem.getRootNode &&\n elem.getRootNode() instanceof ShadowRoot\n ) {\n return (elem.getRootNode() as ShadowRoot).host as HTMLElement;\n }\n\n return elem.parentElement;\n}\n\nfunction getThisAndParentProperties(\n element: Element,\n entitySelector: string,\n prefix: string,\n type: string,\n): [data: WalkerOS.Properties, context: WalkerOS.OrderedProperties] {\n let data: WalkerOS.Properties = {};\n const context: WalkerOS.OrderedProperties = {};\n let parent = element as Node['parentElement'];\n const contextSelector = `[${getElbAttributeName(\n prefix,\n Const.Commands.Context,\n false,\n )}]`;\n\n // Get all bubbling-up properties with decreasing priority\n let contextI = 0; // Context counter\n while (parent) {\n // Properties\n if (parent.matches(entitySelector)) {\n // Get higher properties first\n data = assign(getElbValues(prefix, parent, ''), data); // Generic\n data = assign(getElbValues(prefix, parent, type), data); // Explicit\n }\n\n // Context\n if (parent.matches(contextSelector)) {\n Object.entries(\n getElbValues(prefix, parent, Const.Commands.Context, false),\n ).forEach(([key, val]) => {\n // Don't override context with same but higher key\n if (val && !context[key]) context[key] = [val, contextI];\n });\n\n // Increase context counter with each parent level\n ++contextI;\n }\n\n parent = getParent(prefix, parent);\n }\n\n return [data, context];\n}\n\nfunction queryAll(\n scope: Document | Element,\n selector: string,\n fn: (element: Element) => void,\n): void {\n const elements = scope.querySelectorAll(selector);\n elements.forEach(fn);\n}\n\nfunction resolveAttributes(\n prefix: string,\n target: Element,\n trigger: string,\n): { actions: Walker.TriggerActions; nearestOnly: boolean } {\n let element = target as Node['parentElement'];\n\n while (element) {\n // Check for data-elbactions first (takes precedence)\n const multiAttribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Actions, false),\n );\n\n if (multiAttribute) {\n const triggerActions = getTriggerActions(multiAttribute);\n if (triggerActions[trigger]) {\n return { actions: triggerActions[trigger], nearestOnly: false };\n }\n }\n\n // Check for data-elbaction (nearest entity only)\n const singleAttribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Action, false),\n );\n\n if (singleAttribute) {\n const triggerActions = getTriggerActions(singleAttribute);\n // Action found on element or is not a click trigger\n if (triggerActions[trigger] || trigger !== 'click') {\n return { actions: triggerActions[trigger] || [], nearestOnly: true };\n }\n }\n\n element = getParent(prefix, element);\n }\n\n return { actions: [], nearestOnly: false };\n}\n\nfunction splitAttribute(str: string, separator = ';'): Walker.Attributes {\n const values: Walker.Attributes = [];\n\n if (!str) return values;\n\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\nfunction splitKeyVal(str: string): Walker.KeyVal {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key), trim(value)];\n}\n\nfunction parseAttribute(str: string): Walker.KeyVal {\n // action(a, b, c)\n const [key, value] = str.split('(', 2);\n const param = value ? value.slice(0, -1) : ''; // Remove the )\n // key = 'action'\n // param = 'a, b, c'\n return [key, param];\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Settings, Context } from './types';\nimport { tryCatch } from '@walkeros/core';\nimport { isVisible } from '@walkeros/web-core';\nimport { handleTrigger, Triggers } from './trigger';\n\n// Cache for element size calculations to reduce DOM queries\nconst elementSizeCache = new WeakMap<\n HTMLElement,\n { isLarge: boolean; lastChecked: number }\n>();\n\n// Cache for basic visibility checks to reduce expensive isVisible() calls\nconst visibilityCache = new WeakMap<\n HTMLElement,\n { isVisible: boolean; lastChecked: number }\n>();\n\n// Module-level visibility state management (stateless source architecture)\ninterface VisibilityState {\n observer?: IntersectionObserver;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean; context: Context; trigger: string }\n >;\n}\n\n// Module-level visibility state keyed by document/scope\nconst visibilityStates = new WeakMap<Document | Element, VisibilityState>();\n\n/**\n * Cached visibility check to reduce expensive isVisible() calls\n */\nfunction isElementVisible(element: HTMLElement): boolean {\n const now = Date.now();\n let cached = visibilityCache.get(element);\n\n // Cache visibility result for 500ms to balance accuracy with performance\n if (!cached || now - cached.lastChecked > 500) {\n cached = {\n isVisible: isVisible(element),\n lastChecked: now,\n };\n visibilityCache.set(element, cached);\n }\n\n return cached.isVisible;\n}\n\n/**\n * Element cleanup (unobserve + timer + cache cleanup)\n */\nexport function unobserveElement(\n scope: Document | Element,\n element: HTMLElement,\n): void {\n const state = visibilityStates.get(scope);\n if (!state) return;\n\n if (state.observer) {\n state.observer.unobserve(element);\n }\n\n // Clear timer\n const timer = state.timers.get(element);\n if (timer) {\n clearTimeout(timer);\n state.timers.delete(element);\n }\n\n // Clean up caches to prevent memory leaks\n elementSizeCache.delete(element);\n visibilityCache.delete(element);\n}\n\n/**\n * Creates an IntersectionObserver for the given scope\n */\nfunction createObserver(\n scope: Document | Element,\n): IntersectionObserver | undefined {\n if (!window.IntersectionObserver) return undefined;\n\n return tryCatch(\n () =>\n new window.IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n handleIntersection(scope, entry);\n });\n },\n {\n rootMargin: '0px',\n threshold: [0, 0.5],\n },\n ),\n () => undefined,\n )();\n}\n\n/**\n * Handles intersection changes for observed elements\n */\nfunction handleIntersection(\n scope: Document | Element,\n entry: IntersectionObserverEntry,\n): void {\n const target = entry.target as HTMLElement;\n const state = visibilityStates.get(scope);\n\n if (!state) return;\n\n const existingTimer = state.timers.get(target);\n\n if (entry.intersectionRatio > 0) {\n // Optimize: Cache element size calculations to avoid repeated DOM queries\n const now = Date.now();\n let cached = elementSizeCache.get(target);\n\n // Cache element size for 1 second to reduce DOM queries\n if (!cached || now - cached.lastChecked > 1000) {\n cached = {\n isLarge: target.offsetHeight > window.innerHeight,\n lastChecked: now,\n };\n elementSizeCache.set(target, cached);\n }\n\n const meetsThreshold = entry.intersectionRatio >= 0.5;\n\n // Optimized visibility strategy:\n // - Standard elements: intersection ratio ≥ 0.5 is sufficient (fast)\n // - Large elements: need additional overlay/occlusion check (slower but necessary)\n const shouldTrigger =\n meetsThreshold || (cached.isLarge && isElementVisible(target));\n\n if (shouldTrigger) {\n // Get element configuration\n const elementConfig = state.elementConfigs?.get(target);\n\n // For multiple triggers, only proceed if this is a re-entry (was not visible, now visible)\n if (elementConfig?.multiple && elementConfig.blocked) return; // Don't trigger again\n\n // Only create timer if none exists\n if (!existingTimer) {\n const timer = window.setTimeout(async () => {\n // Final visibility check before triggering (cached for performance)\n if (isElementVisible(target)) {\n // Get element configuration to access context\n const elementConfig = state.elementConfigs?.get(target);\n if (elementConfig?.context) {\n await handleTrigger(\n elementConfig.context,\n target as Element,\n elementConfig.trigger,\n );\n }\n\n // Get fresh element config reference for state update\n const currentConfig = state.elementConfigs?.get(target);\n\n // For multiple triggers, mark as visible after firing\n if (currentConfig?.multiple) {\n currentConfig.blocked = true;\n } else {\n // Clean up and unobserve only if not a multiple trigger\n unobserveElement(scope, target);\n }\n }\n }, state.duration);\n\n state.timers.set(target, timer);\n }\n return;\n }\n }\n\n // Element isn't sufficiently in viewport - clear existing timer\n if (existingTimer) {\n clearTimeout(existingTimer);\n state.timers.delete(target);\n }\n\n // For multiple triggers, mark as not visible for re-entry detection\n const elementConfig = state.elementConfigs?.get(target);\n if (elementConfig?.multiple) {\n elementConfig.blocked = false;\n }\n}\n\n/**\n * Initializes visibility tracking for a scope (document/element)\n */\nexport function initVisibilityTracking(\n scope: Document | Element,\n duration = 1000,\n): void {\n if (visibilityStates.has(scope)) return; // Already initialized\n\n visibilityStates.set(scope, {\n observer: createObserver(scope),\n timers: new WeakMap(),\n duration,\n });\n}\n\n/**\n * Main trigger function for visible elements\n */\nexport function triggerVisible(\n context: Context,\n element: HTMLElement,\n config: { multiple?: boolean } = { multiple: false },\n): void {\n // Use scope from settings, fallback to document\n const scope = context.settings.scope || document;\n const state = visibilityStates.get(scope);\n\n if (state?.observer && element) {\n // Store element config for later use in intersection handling\n if (!state.elementConfigs) {\n state.elementConfigs = new WeakMap();\n }\n state.elementConfigs.set(element, {\n multiple: config.multiple ?? false,\n blocked: false,\n context,\n trigger: config.multiple ? 'visible' : 'impression',\n });\n state.observer.observe(element);\n }\n}\n\n/**\n * Destroys visibility tracking for a scope, cleaning up all resources\n */\nexport function destroyVisibilityTracking(scope?: Document | Element): void {\n if (!scope) return; // No scope provided, nothing to clean up\n\n const state = visibilityStates.get(scope);\n if (!state) return;\n\n if (state.observer) {\n state.observer.disconnect();\n }\n\n visibilityStates.delete(scope);\n}\n","import type { WalkerOS, Elb, Collector } from '@walkeros/core';\nimport { isString, isObject, isElementOrDocument } from '@walkeros/core';\nimport type {\n BrowserPushData,\n BrowserPushOptions,\n BrowserPushContext,\n} from './types/elb';\nimport type { Context } from './types';\nimport { getEntities, getGlobals } from './walker';\n\n/**\n * Translation layer that converts flexible browser source inputs\n * to the strict core collector format\n */\nexport function translateToCoreCollector(\n context: Context,\n eventOrCommand: unknown,\n data?: BrowserPushData,\n options?: BrowserPushOptions,\n pushContext?: BrowserPushContext,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n): Promise<Elb.PushResult> {\n const { elb, settings } = context;\n\n // Handle walker commands - pass through directly to elb (it will route to command)\n if (isString(eventOrCommand) && eventOrCommand.startsWith('walker ')) {\n return elb(eventOrCommand, data as WalkerOS.Properties);\n }\n\n // Handle event objects - add source and globals if missing\n if (isObject(eventOrCommand)) {\n const event = eventOrCommand;\n if (!event.source) event.source = getBrowserSource();\n\n // Add globals if not already present\n if (!event.globals) {\n event.globals = getGlobals(settings.prefix, settings.scope || document);\n }\n\n return elb(event);\n }\n\n // Extract entity name from event string\n const [entity] = String(\n isObject(eventOrCommand) ? eventOrCommand.name : eventOrCommand,\n ).split(' ');\n\n // Get data and context either from elements or parameters\n let eventData = isObject(data) ? (data as WalkerOS.Properties) : {};\n let eventContext: WalkerOS.OrderedProperties = {};\n\n let elemParameter: undefined | Element;\n let dataIsElem = false;\n\n // Check if data parameter is an element\n if (isElementOrDocument(data)) {\n elemParameter = data as Element;\n dataIsElem = true;\n }\n\n // Check if contextData parameter is an element\n if (isElementOrDocument(pushContext)) {\n elemParameter = pushContext as Element;\n } else if (isObject(pushContext) && Object.keys(pushContext).length) {\n eventContext = pushContext as WalkerOS.OrderedProperties;\n }\n\n // Extract data from element if provided\n if (elemParameter) {\n const entityObj = getEntities(\n settings.prefix || 'data-elb',\n elemParameter,\n ).find((obj) => obj.entity === entity);\n if (entityObj) {\n if (dataIsElem) eventData = entityObj.data;\n eventContext = entityObj.context;\n }\n }\n\n // Special handling for page events\n if (entity === 'page') {\n eventData.id = eventData.id || window.location.pathname;\n }\n\n // Collect globals from the DOM scope\n const eventGlobals = getGlobals(settings.prefix, settings.scope);\n\n // Build unified event from various elb usage patterns\n const event: WalkerOS.DeepPartialEvent = {\n name: String(eventOrCommand || ''),\n data: eventData,\n context: eventContext,\n globals: eventGlobals,\n nested,\n custom,\n trigger: isString(options) ? options : '',\n source: getBrowserSource(),\n };\n\n return elb(event);\n}\n\n/**\n * Create source information for browser events\n */\nfunction getBrowserSource(): WalkerOS.Source {\n return {\n type: 'browser',\n id: window.location.href,\n previous_id: document.referrer,\n };\n}\n","import type { WalkerOS, Collector, Elb } from '@walkeros/core';\nimport type { ELBLayer, ELBLayerConfig, Settings } from './types';\nimport { tryCatch, isString, isObject } from '@walkeros/core';\nimport { translateToCoreCollector } from './translation';\n\n/**\n * Initialize elbLayer for async command handling\n * This creates window.elbLayer array and processes any existing commands\n */\nexport function initElbLayer(\n elb: Elb.Fn,\n config: ELBLayerConfig & { prefix?: string; window?: Window } = {},\n): void {\n const layerName = config.name || 'elbLayer';\n const windowObj = config.window || window;\n\n if (!windowObj) {\n return; // Skip if no window available\n }\n\n // Ensure elbLayer exists on window\n const windowWithLayer = windowObj as typeof windowObj &\n Record<string, unknown>;\n if (!windowWithLayer[layerName]) {\n windowWithLayer[layerName] = [];\n }\n\n const elbLayer = windowWithLayer[layerName] as ELBLayer;\n\n // Override the push method to process items immediately\n elbLayer.push = function (...args: Array<Elb.Layer | IArguments>) {\n // Handle arguments object\n if (isArguments(args[0])) {\n const argsArray = [...Array.from(args[0])];\n const i = Array.prototype.push.apply(this, [argsArray]);\n // Process the arguments as a single command\n pushCommand(elb, config.prefix, argsArray);\n return i;\n }\n\n const i = Array.prototype.push.apply(this, args);\n\n // Process each pushed item immediately\n args.forEach((item) => {\n pushCommand(elb, config.prefix, item);\n });\n\n return i;\n };\n\n // Process any existing commands that were pushed before initialization\n if (Array.isArray(elbLayer) && elbLayer.length > 0) {\n processElbLayer(elb, config.prefix, elbLayer);\n }\n}\n\n/**\n * Process commands from ELB Layer array\n * Commands are processed in order with walker commands getting priority\n */\nfunction processElbLayer(\n elb: Elb.Fn,\n prefix: string = 'data-elb',\n elbLayer: ELBLayer,\n): void {\n // Process in two phases: walker commands first, then events\n processPredefined(elb, prefix, elbLayer, true); // Commands only\n processPredefined(elb, prefix, elbLayer, false); // Events only\n\n // Clear the array after processing\n elbLayer.length = 0;\n}\n\n/**\n * Process predefined commands with execution order handling\n */\nfunction processPredefined(\n elb: Elb.Fn,\n prefix: string,\n elbLayer: ELBLayer,\n commandsOnly: boolean,\n): void {\n const walkerCommand = 'walker '; // Space on purpose\n const events: unknown[] = [];\n let isFirstRunEvent = true;\n\n elbLayer.forEach((pushedItem) => {\n // Handle arguments object or arrays\n const item = isArguments(pushedItem)\n ? [...Array.from(pushedItem)]\n : isArrayLike(pushedItem)\n ? Array.from(pushedItem as ArrayLike<unknown>)\n : [pushedItem];\n\n // Skip malformed commands\n if (Array.isArray(item) && item.length === 0) {\n return; // Empty array\n }\n\n if (Array.isArray(item) && item.length === 1 && !item[0]) {\n return; // Array with falsy first element\n }\n\n const firstParam = item[0];\n const isCommand =\n !isObject(firstParam) &&\n isString(firstParam) &&\n firstParam.startsWith(walkerCommand);\n\n if (!isObject(firstParam)) {\n const args = Array.from(item);\n if (!isString(args[0]) || args[0].trim() === '') return; // Invalid or empty string\n\n // FIXED: Don't skip the first walker run - this was causing no events on first load\n // The original logic was meant to prevent duplicate execution but was too aggressive\n const runCommand = 'walker run';\n if (isFirstRunEvent && args[0] === runCommand) {\n isFirstRunEvent = false; // Mark that we've seen the first run\n // Continue processing instead of returning\n }\n } else {\n // For objects, skip if empty\n if (\n typeof firstParam === 'object' &&\n Object.keys(firstParam).length === 0\n ) {\n return;\n }\n }\n\n // Handle commands and events separately\n if (\n (commandsOnly && isCommand) || // Only commands\n (!commandsOnly && !isCommand) // Only events\n )\n events.push(item);\n });\n\n events.forEach((item) => {\n // Use the elb push function directly to match legacy behavior\n pushCommand(elb, prefix, item);\n });\n}\n\n/**\n * Push command directly using elb or translation based on type\n */\nfunction pushCommand(\n elb: Elb.Fn,\n prefix: string = 'data-elb',\n item: unknown,\n): void {\n tryCatch(\n () => {\n if (Array.isArray(item)) {\n const [action, ...rest] = item;\n\n // Skip empty or invalid actions\n if (!action || (isString(action) && action.trim() === '')) {\n return;\n }\n\n // Walker commands go directly to collector\n if (isString(action) && action.startsWith('walker ')) {\n elb(action, rest[0]);\n return;\n }\n\n translateToCoreCollector(\n {\n elb,\n settings: {\n prefix,\n scope: document,\n pageview: false,\n session: false,\n elb: '',\n elbLayer: false,\n },\n },\n action,\n ...rest,\n );\n } else if (item && typeof item === 'object') {\n // Skip empty objects\n if (Object.keys(item).length === 0) {\n return;\n }\n // Object events go directly to elb\n elb(item as WalkerOS.DeepPartialEvent);\n }\n },\n () => {\n // Silent error handling - failed commands are ignored\n },\n )();\n}\n\n/**\n * Check if value is arguments object\n */\nfunction isArguments(value: unknown): value is IArguments {\n return (\n value != null &&\n typeof value === 'object' &&\n Object.prototype.toString.call(value) === '[object Arguments]'\n );\n}\n\n/**\n * Check if value is array-like (has length property)\n */\nfunction isArrayLike(value: unknown): boolean {\n return (\n value != null &&\n typeof value === 'object' &&\n 'length' in value &&\n typeof (value as unknown[]).length === 'number'\n );\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport {\n sessionStart as sessionStartOrg,\n SessionConfig,\n} from '@walkeros/web-core';\n\nexport function createSessionStart(elb: Elb.Fn, command?: Collector.CommandFn) {\n return function (\n options: { config?: SessionConfig; data?: Collector.SessionData } = {},\n ): void | Collector.SessionData {\n const { config = {} } = options;\n return sessionStart(\n elb,\n {\n ...config,\n pulse: config.pulse !== undefined ? config.pulse : true,\n },\n command,\n );\n };\n}\n\nexport function sessionStart(\n elb: Elb.Fn,\n config: SessionConfig = {},\n command?: Collector.CommandFn,\n): void | Collector.SessionData {\n // Create minimal collector interface for sessionStart that needs elb and group tracking\n const collectorInterface: Partial<Collector.Instance> = {\n push: elb,\n group: undefined, // Session tracking doesn't need group initially\n command, // Include command for session to call walker command\n };\n\n return sessionStartOrg({\n ...config,\n collector: collectorInterface as Collector.Instance,\n });\n}\n","import type { InitSettings, Settings } from './types';\n\n/**\n * Get browser source configuration with defaults\n * @param initSettings - Initial settings to override defaults\n * @param envDocument - Document from environment (optional)\n * @returns Complete settings object with all defaults applied\n */\nexport function getConfig(\n initSettings: InitSettings = {},\n envDocument?: Document,\n): Settings {\n return {\n prefix: 'data-elb',\n pageview: true,\n session: true,\n elb: 'elb',\n elbLayer: 'elbLayer',\n scope: envDocument || undefined,\n ...initSettings,\n };\n}\n","import type { Source, Elb, Collector } from '@walkeros/core';\nimport type { SessionConfig, SessionCallback } from '@walkeros/web-core';\nimport type { SettingsSchema } from '../schemas';\nimport { z } from '@walkeros/core/dev';\n\n// Export browser-specific elb types\nexport * from './elb';\nimport type { BrowserPush } from './elb';\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// InitSettings: what users provide (all optional)\n// Override specific fields with non-serializable types\nexport interface InitSettings\n extends Partial<Omit<BaseSettings, 'scope' | 'session' | 'elbLayer'>> {\n scope?: Element | Document;\n session?: boolean | SessionConfig;\n elbLayer?: boolean | string | Elb.Layer;\n}\n\n// Settings: resolved configuration\n// Override specific fields with non-serializable types\nexport interface Settings\n extends Omit<BaseSettings, 'scope' | 'session' | 'elbLayer'> {\n scope?: Element | Document;\n session: boolean | SessionConfig;\n elbLayer: boolean | string | Elb.Layer;\n}\n\nexport interface Mapping {}\n\nexport type Push = BrowserPush;\n\nexport interface Env extends Source.BaseEnv {\n elb: Elb.Fn;\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport interface Context {\n elb: Elb.Fn;\n settings: Settings;\n}\n\n// Re-export session types from web-core to avoid duplication\nexport type { SessionConfig, SessionCallback };\n\n// ELB Layer types for async command handling\nexport type ELBLayer = Array<Elb.Layer | IArguments>;\nexport interface ELBLayerConfig {\n name?: string; // Property name for window.elbLayer (default: 'elbLayer')\n}\n\n// Scope type for DOM operations\nexport type Scope = Document | Element;\n","export * as env from './env';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for browser source\n *\n * These environments provide standardized mock structures for testing\n * browser event capture without requiring an actual DOM environment.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopLogger: Logger.Instance = {\n error: noop,\n info: noop,\n debug: noop,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n scope: () => noopLogger,\n};\n\n/**\n * Mock window object with common browser APIs\n */\nconst createMockWindow = () => ({\n addEventListener: noop,\n removeEventListener: noop,\n location: {\n href: 'https://example.com/page',\n pathname: '/page',\n search: '?query=test',\n hash: '#section',\n host: 'example.com',\n hostname: 'example.com',\n origin: 'https://example.com',\n protocol: 'https:',\n },\n document: {},\n navigator: {\n language: 'en-US',\n userAgent: 'Mozilla/5.0 (Test)',\n },\n screen: {\n width: 1920,\n height: 1080,\n },\n innerWidth: 1920,\n innerHeight: 1080,\n pageXOffset: 0,\n pageYOffset: 0,\n scrollX: 0,\n scrollY: 0,\n});\n\n/**\n * Mock document object with DOM methods\n */\nconst createMockDocument = () => ({\n addEventListener: noop,\n removeEventListener: noop,\n querySelector: noop,\n querySelectorAll: () => [],\n getElementById: noop,\n getElementsByClassName: () => [],\n getElementsByTagName: () => [],\n createElement: () => ({\n setAttribute: noop,\n getAttribute: noop,\n addEventListener: noop,\n removeEventListener: noop,\n }),\n body: {\n appendChild: noop,\n removeChild: noop,\n },\n documentElement: {\n scrollTop: 0,\n scrollLeft: 0,\n },\n readyState: 'complete',\n title: 'Test Page',\n referrer: '',\n cookie: '',\n});\n\n/**\n * Standard mock environment for testing browser source\n *\n * Use this for testing event capture, DOM interactions, and pageview tracking\n * without requiring a real browser environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n get window() {\n return createMockWindow() as unknown as typeof window;\n },\n get document() {\n return createMockDocument() as unknown as typeof document;\n },\n logger: noopLogger,\n};\n","import type { WalkerOS } from '@walkeros/core';\nimport { isString, isDefined } from '@walkeros/core';\n\nexport interface TaggerConfig {\n prefix?: string;\n}\n\nexport interface TaggerInstance {\n entity: (name: string) => TaggerInstance;\n data: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((data: WalkerOS.Properties) => TaggerInstance);\n action: ((trigger: string, action?: string) => TaggerInstance) &\n ((actions: Record<string, string>) => TaggerInstance);\n actions: ((trigger: string, action?: string) => TaggerInstance) &\n ((actions: Record<string, string>) => TaggerInstance);\n context: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((context: WalkerOS.Properties) => TaggerInstance);\n globals: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((globals: WalkerOS.Properties) => TaggerInstance);\n link: ((id: string, type: string) => TaggerInstance) &\n ((links: Record<string, string>) => TaggerInstance);\n get: () => Record<string, string>;\n}\n\n/**\n * Creates a new tagger instance for generating walkerOS data attributes.\n *\n * @param config The configuration for the tagger.\n * @returns A new tagger instance.\n */\nexport function createTagger(\n config: TaggerConfig = {},\n): (entity?: string) => TaggerInstance {\n const prefix = config.prefix || 'data-elb';\n\n return function (entity?: string): TaggerInstance {\n // Internal state\n let currentEntity: string | undefined = undefined; // Only set via .entity() method\n let namingEntity: string | undefined = entity; // Used for data attribute naming\n const dataProperties: Record<string, WalkerOS.Properties> = {};\n const actionProperties: Record<string, string> = {};\n const actionsProperties: Record<string, string> = {};\n const contextProperties: WalkerOS.Properties = {};\n const globalProperties: WalkerOS.Properties = {};\n const linkProperties: Record<string, string> = {};\n\n // Helper function to escape special characters\n function escapeValue(value: WalkerOS.Property | undefined): string {\n if (!isDefined(value) || value === null) return 'undefined';\n\n let str = String(value);\n\n // Escape backslashes first, then other characters\n str = str.replace(/\\\\/g, '\\\\\\\\');\n str = str.replace(/;/g, '\\\\;');\n str = str.replace(/:/g, '\\\\:');\n str = str.replace(/'/g, \"\\\\'\");\n\n return str;\n }\n\n // Helper function to serialize key-value pairs\n function serializeKeyValue(obj: WalkerOS.Properties): string {\n return Object.entries(obj)\n .map(([key, value]) => `${key}:${escapeValue(value)}`)\n .join(';');\n }\n\n const instance: TaggerInstance = {\n entity(name: string): TaggerInstance {\n currentEntity = name;\n namingEntity = name; // Always update naming scope when entity is set\n return instance;\n },\n\n data(\n keyOrData: string | WalkerOS.Properties,\n value?: WalkerOS.Property,\n ): TaggerInstance {\n const entityKey = namingEntity ?? '';\n\n if (!dataProperties[entityKey]) {\n dataProperties[entityKey] = {};\n }\n\n if (isString(keyOrData)) {\n dataProperties[entityKey][keyOrData] = value;\n } else {\n Object.assign(dataProperties[entityKey], keyOrData);\n }\n\n return instance;\n },\n\n action(\n triggerOrActions: string | Record<string, string>,\n actionValue?: string,\n ): TaggerInstance {\n if (isString(triggerOrActions)) {\n if (isDefined(actionValue)) {\n // Two parameters: trigger and action\n actionProperties[triggerOrActions] = actionValue;\n } else {\n // Single parameter: could be \"trigger:action\" or just \"trigger\"\n if (triggerOrActions.includes(':')) {\n const [trigger, action] = triggerOrActions.split(':', 2);\n actionProperties[trigger] = action;\n } else {\n actionProperties[triggerOrActions] = triggerOrActions;\n }\n }\n } else {\n Object.assign(actionProperties, triggerOrActions);\n }\n\n return instance;\n },\n\n actions(\n triggerOrActions: string | Record<string, string>,\n actionValue?: string,\n ): TaggerInstance {\n if (isString(triggerOrActions)) {\n if (isDefined(actionValue)) {\n // Two parameters: trigger and action\n actionsProperties[triggerOrActions] = actionValue;\n } else {\n // Single parameter: could be \"trigger:action\" or just \"trigger\"\n if (triggerOrActions.includes(':')) {\n const [trigger, action] = triggerOrActions.split(':', 2);\n actionsProperties[trigger] = action;\n } else {\n actionsProperties[triggerOrActions] = triggerOrActions;\n }\n }\n } else {\n Object.assign(actionsProperties, triggerOrActions);\n }\n\n return instance;\n },\n\n context(\n keyOrContext: string | WalkerOS.Properties,\n value?: WalkerOS.Property,\n ): TaggerInstance {\n if (isString(keyOrContext)) {\n contextProperties[keyOrContext] = value;\n } else {\n Object.assign(contextProperties, keyOrContext);\n }\n\n return instance;\n },\n\n globals(\n keyOrGlobals: string | WalkerOS.Properties,\n value?: WalkerOS.Property,\n ): TaggerInstance {\n if (isString(keyOrGlobals)) {\n globalProperties[keyOrGlobals] = value;\n } else {\n Object.assign(globalProperties, keyOrGlobals);\n }\n\n return instance;\n },\n\n link(\n idOrLinks: string | Record<string, string>,\n type?: string,\n ): TaggerInstance {\n if (isString(idOrLinks)) {\n linkProperties[idOrLinks] = type!;\n } else {\n Object.assign(linkProperties, idOrLinks);\n }\n\n return instance;\n },\n\n get(): Record<string, string> {\n const attributes: Record<string, string> = {};\n\n // Add entity attribute if set\n if (currentEntity) {\n attributes[prefix] = currentEntity;\n }\n\n // Add data attributes\n Object.entries(dataProperties).forEach(([entityKey, props]) => {\n if (Object.keys(props).length > 0) {\n const attrName = entityKey\n ? `${prefix}-${entityKey}`\n : `${prefix}-`;\n attributes[attrName] = serializeKeyValue(props);\n }\n });\n\n // Add action attributes\n if (Object.keys(actionProperties).length > 0) {\n attributes[`${prefix}action`] = serializeKeyValue(actionProperties);\n }\n\n // Add actions attributes (for all entities)\n if (Object.keys(actionsProperties).length > 0) {\n attributes[`${prefix}actions`] = serializeKeyValue(actionsProperties);\n }\n\n // Add context attributes\n if (Object.keys(contextProperties).length > 0) {\n attributes[`${prefix}context`] = serializeKeyValue(contextProperties);\n }\n\n // Add global attributes\n if (Object.keys(globalProperties).length > 0) {\n attributes[`${prefix}globals`] = serializeKeyValue(globalProperties);\n }\n\n // Add link attributes\n if (Object.keys(linkProperties).length > 0) {\n attributes[`${prefix}link`] = serializeKeyValue(linkProperties);\n }\n\n return attributes;\n },\n };\n\n return instance;\n };\n}\n"],"mappings":"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","names":["import_collector","import_web_core","filter","str","elem","import_web_core","elementConfig","_a","_b","event","Triggers","elem","scrollElements","context","i","import_web_core","sessionStartOrg","window","document","push"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/trigger.ts","../src/walker.ts","../src/triggerVisible.ts","../src/translation.ts","../src/elbLayer.ts","../src/session.ts","../src/config.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/env.ts","../src/tagger.ts"],"sourcesContent":["import type { Source, WalkerOS, On } from '@walkeros/core';\nimport type { Scope, Types, Env } from './types';\nimport type {\n BrowserPushData,\n BrowserPushOptions,\n BrowserPushContext,\n BrowserPush,\n} from './types/elb';\nimport { isString } from '@walkeros/core';\nimport { initTriggers, processLoadTriggers, ready } from './trigger';\nimport { destroyVisibilityTracking } from './triggerVisible';\nimport { initElbLayer } from './elbLayer';\nimport { translateToCoreCollector } from './translation';\nimport { sessionStart } from './session';\nimport { getPageViewData } from './walker';\nimport { getConfig } from './config';\n\nexport * as SourceBrowser from './types';\n\n// Export examples\nexport * as examples from './examples';\n\n// Export walker utility functions\nexport {\n getAllEvents,\n getEvents,\n getGlobals,\n getElbAttributeName,\n getElbValues,\n} from './walker';\n\n// Export tagger functionality\nexport { createTagger } from './tagger';\nexport type { TaggerConfig, TaggerInstance } from './tagger';\n\n/**\n * Browser source implementation using environment injection.\n *\n * This source captures DOM events, manages sessions, handles pageviews,\n * and processes the elbLayer for browser environments.\n */\nexport const sourceBrowser: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, command, window, document } = env;\n\n const userSettings = config?.settings || {};\n const actualWindow =\n window ||\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n const actualDocument =\n document ||\n (typeof globalThis.document !== 'undefined'\n ? globalThis.document\n : undefined);\n\n const settings: Source.Settings<Types> = getConfig(\n userSettings,\n actualDocument as Document | undefined,\n );\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n const translationContext = {\n elb,\n settings,\n };\n\n // Initialize features if environment is available\n // Skip all DOM-related functionality when not in browser environment\n\n if (actualWindow && actualDocument) {\n // Initialize ELB Layer for async command handling\n if (settings.elbLayer !== false && elb) {\n initElbLayer(elb, {\n name: isString(settings.elbLayer) ? settings.elbLayer : 'elbLayer',\n prefix: settings.prefix,\n window: actualWindow as Window,\n });\n }\n\n // Initialize session if enabled\n if (settings.session && elb) {\n const sessionConfig =\n typeof settings.session === 'boolean' ? {} : settings.session;\n sessionStart(elb, sessionConfig, command);\n }\n\n // Setup global triggers (click, submit) when DOM is ready\n await ready(initTriggers, translationContext, settings);\n\n // Setup load triggers and pageview on each run\n const handleRun = () => {\n processLoadTriggers(translationContext, settings);\n\n // Send pageview if enabled\n if (settings.pageview) {\n const [data, context] = getPageViewData(\n settings.prefix || 'data-elb',\n settings.scope as Scope,\n );\n translateToCoreCollector(\n translationContext,\n 'page view',\n data,\n 'load',\n context,\n );\n }\n };\n\n // Trigger initial run if this is a new session/page load\n handleRun();\n\n // Set up automatic window.elb assignment if configured\n if (isString(settings.elb) && settings.elb) {\n (actualWindow as unknown as Record<string, unknown>)[settings.elb] = (\n ...args: unknown[]\n ) => {\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n translationContext,\n event,\n data as BrowserPushData | undefined,\n options as BrowserPushOptions | undefined,\n context as BrowserPushContext | undefined,\n nested as WalkerOS.Entities,\n custom as WalkerOS.Properties,\n );\n };\n }\n }\n\n // Handle events pushed from collector (consent, session, ready, run)\n const handleEvent = async (event: On.Types, context?: unknown) => {\n switch (event) {\n case 'consent':\n // React to consent changes - sources can implement specific consent handling\n // For browser source, we might want to re-evaluate session settings\n if (settings.session && context && elb) {\n const sessionConfig =\n typeof settings.session === 'boolean' ? {} : settings.session;\n sessionStart(elb, sessionConfig, command);\n }\n break;\n\n case 'session':\n // React to session events if needed\n // Browser source typically handles session creation, not reaction\n break;\n\n case 'ready':\n // React to collector ready state\n // Browser source initialization already handles this\n break;\n\n case 'run':\n // React to collector run events - re-process load triggers\n if (actualDocument && actualWindow) {\n processLoadTriggers(translationContext, settings);\n\n // Send pageview if enabled\n if (settings.pageview) {\n const [data, contextData] = getPageViewData(\n settings.prefix || 'data-elb',\n settings.scope as Scope,\n );\n translateToCoreCollector(\n translationContext,\n 'page view',\n data,\n 'load',\n contextData,\n );\n }\n }\n break;\n\n default:\n break;\n }\n };\n\n const push: BrowserPush = ((...args: Parameters<BrowserPush>) => {\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n translationContext,\n event,\n data,\n options,\n context,\n nested,\n custom,\n );\n }) satisfies BrowserPush;\n\n // Return stateless source instance with event handler and push method\n return {\n type: 'browser',\n config: fullConfig,\n push,\n destroy: async () => {\n // Cleanup visibility tracking and other resources\n if (actualDocument) {\n destroyVisibilityTracking(\n settings.scope || (actualDocument as Document),\n );\n }\n },\n on: handleEvent,\n };\n};\n\nexport default sourceBrowser;\n","import type { WalkerOS, Collector } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope, Settings, Context } from './types';\nimport { throttle, tryCatch } from '@walkeros/core';\nimport { Const, onApply } from '@walkeros/collector';\nimport { elb as elbOrg, getAttribute } from '@walkeros/web-core';\nimport {\n getElbAttributeName,\n getEvents,\n getPageViewData,\n getTriggerActions,\n} from './walker';\nimport {\n initVisibilityTracking,\n triggerVisible,\n destroyVisibilityTracking,\n} from './triggerVisible';\nimport { translateToCoreCollector } from './translation';\n\nlet scrollElements: Walker.ScrollElements = [];\nlet scrollListener: EventListenerOrEventListenerObject | undefined;\n\n// Reset function for testing\nexport function resetScrollListener() {\n scrollListener = undefined;\n scrollElements = [];\n}\n\nexport const createElb: (customLayer?: unknown) => unknown = (customLayer?) => {\n return (\n customLayer\n ? function () {\n (customLayer as unknown[]).push(arguments);\n }\n : elbOrg\n ) as unknown;\n};\n\nexport const Triggers: { [key: string]: Walker.Trigger } = {\n Click: 'click',\n Custom: 'custom',\n Hover: 'hover',\n Load: 'load',\n Pulse: 'pulse',\n Scroll: 'scroll',\n Submit: 'submit',\n Impression: 'impression',\n Visible: 'visible',\n Wait: 'wait',\n} as const;\n\nexport async function ready(\n fn: (context: Context, settings: Settings) => void,\n context: Context,\n settings: Settings,\n): Promise<void> {\n const readyFn = () => {\n fn(context, settings);\n };\n\n if (document.readyState !== 'loading') {\n readyFn();\n } else {\n document.addEventListener('DOMContentLoaded', readyFn);\n }\n}\n\n// Called once during source initialization to setup global listeners\nexport function initTriggers(context: Context, settings: Settings) {\n if (!settings.scope) return; // Skip if no scope available\n const requiredSettings = settings as Required<Settings>;\n initGlobalTrigger(context, requiredSettings);\n}\n\n// Called on each walker run to process load triggers\nexport function processLoadTriggers(context: Context, settings: Settings) {\n if (!settings.scope) return; // Skip if no scope available\n const requiredSettings = settings as Required<Settings>;\n initScopeTrigger(context, requiredSettings);\n}\n\nexport function initGlobalTrigger(context: Context, settings: Settings): void {\n const scope = settings.scope;\n\n if (!scope) return;\n\n scope.addEventListener(\n 'click',\n tryCatch(function (this: Scope, ev: unknown) {\n triggerClick.call(this, context, ev as MouseEvent);\n }) as EventListener,\n );\n scope.addEventListener(\n 'submit',\n tryCatch(function (this: Scope, ev: unknown) {\n triggerSubmit.call(this, context, ev as SubmitEvent);\n }) as EventListener,\n );\n}\n\nexport function initScopeTrigger(context: Context, settings: Settings) {\n const elem = settings.scope;\n\n // Reset all scroll events @TODO check if it's right here\n scrollElements = [];\n\n // Clean up any existing visibility tracking to prevent observer accumulation\n const scope = elem || document;\n destroyVisibilityTracking(scope);\n // Initialize visibility tracking for this scope\n initVisibilityTracking(scope, 1000);\n\n // default data-elbaction\n const selectorAction = getElbAttributeName(\n settings.prefix,\n Const.Commands.Action,\n false,\n );\n if (scope !== document) {\n // Handle the elements action(s), too\n handleActionElem(context, scope as HTMLElement, selectorAction, settings);\n }\n\n // Handle all children action(s)\n const elements = scope.querySelectorAll<HTMLElement>(`[${selectorAction}]`);\n\n elements.forEach((elem) => {\n handleActionElem(context, elem, selectorAction, settings);\n });\n\n if (scrollElements.length) scroll(context, scope, settings);\n}\n\nexport async function handleTrigger(\n context: Context,\n element: Element,\n trigger: string,\n // @TODO add triggerParams to filter for specific trigger\n): Promise<unknown[]> {\n const events = getEvents(element, trigger, context.settings.prefix);\n return Promise.all(\n events.map((event: Walker.Event) =>\n translateToCoreCollector(context, {\n name: `${event.entity} ${event.action}`,\n ...event,\n trigger,\n }),\n ),\n );\n}\n\nfunction handleActionElem(\n context: Context,\n elem: HTMLElement,\n selectorAction: string,\n settings: Settings,\n) {\n const actionAttr = getAttribute(elem, selectorAction);\n\n if (!actionAttr) return;\n\n // TriggersActionGroups ([trigger: string]: TriggerActions)\n Object.values(getTriggerActions(actionAttr)).forEach((triggerActions) =>\n // TriggerActions (Array<TriggerAction>)\n triggerActions.forEach((triggerAction: Walker.TriggerActions[0]) => {\n // TriggerAction ({ trigger, triggerParams, action, actionParams })\n switch (triggerAction.trigger) {\n case Triggers.Hover:\n triggerHover(context, elem);\n break;\n case Triggers.Load:\n triggerLoad(context, elem);\n break;\n case Triggers.Pulse:\n triggerPulse(context, elem, triggerAction.triggerParams);\n break;\n case Triggers.Scroll:\n triggerScroll(elem, triggerAction.triggerParams);\n break;\n case Triggers.Impression:\n triggerVisible(context, elem);\n break;\n case Triggers.Visible:\n triggerVisible(context, elem, { multiple: true });\n break;\n case Triggers.Wait:\n triggerWait(context, elem, triggerAction.triggerParams);\n break;\n }\n }),\n );\n}\n\nfunction triggerClick(context: Context, ev: MouseEvent) {\n handleTrigger(context, ev.target as Element, Triggers.Click);\n}\n\nfunction triggerHover(context: Context, elem: HTMLElement) {\n elem.addEventListener(\n 'mouseenter',\n tryCatch(function (this: Document, ev: MouseEvent) {\n if (ev.target instanceof Element)\n handleTrigger(context, ev.target, Triggers.Hover);\n }),\n );\n}\n\nfunction triggerLoad(context: Context, elem: HTMLElement) {\n handleTrigger(context, elem, Triggers.Load);\n}\n\nfunction triggerPulse(\n context: Context,\n elem: HTMLElement,\n triggerParams: string = '',\n) {\n setInterval(\n () => {\n // Only trigger when tab is active\n if (!document.hidden) handleTrigger(context, elem, Triggers.Pulse);\n },\n parseInt(triggerParams || '') || 15000,\n );\n}\n\nfunction triggerScroll(elem: HTMLElement, triggerParams: string = '') {\n // Scroll depth in percent, default 50%\n const depth = parseInt(triggerParams || '') || 50;\n\n // Ignore invalid parameters\n if (depth < 0 || depth > 100) return;\n\n scrollElements.push([elem, depth]);\n}\n\nfunction triggerSubmit(context: Context, ev: SubmitEvent) {\n if (ev.target) {\n handleTrigger(context, ev.target as Element, Triggers.Submit);\n }\n}\n\nfunction triggerWait(\n context: Context,\n elem: HTMLElement,\n triggerParams: string = '',\n) {\n setTimeout(\n () => handleTrigger(context, elem, Triggers.Wait),\n parseInt(triggerParams || '') || 15000,\n );\n}\n\nfunction scroll(context: Context, scope: Scope, settings: Settings) {\n const scrolling = (\n scrollElements: Walker.ScrollElements,\n context: Context,\n ) => {\n return scrollElements.filter(([element, depth]: [Element, number]) => {\n // Distance from top to the bottom of the visible screen\n const windowBottom = window.scrollY + window.innerHeight;\n // Distance from top to the elements relevant content\n const elemTop = (element as HTMLElement).offsetTop;\n\n // Skip calculations if not in viewport yet\n if (windowBottom < elemTop) return true;\n\n // Height of the elements box as 100 percent base\n const elemHeight = element.clientHeight;\n // Distance from top to the elements bottom\n const elemBottom = elemTop + elemHeight;\n // Height of the non-visible pixels below visible screen\n const hidden = elemBottom - windowBottom;\n // Visible percentage of the element\n const scrollDepth = (1 - hidden / (elemHeight || 1)) * 100;\n\n // Check if the elements visibility skipped the required border\n if (scrollDepth >= depth) {\n // Enough scrolling, it's time\n handleTrigger(context, element, Triggers.Scroll);\n\n // Remove the element from scrollEvents\n return false;\n }\n\n // Keep observing the element\n return true;\n });\n };\n\n // Don't add unnecessary scroll listeners\n if (!scrollListener) {\n scrollListener = throttle(function () {\n scrollElements = scrolling.call(scope, scrollElements, context);\n });\n\n scope.addEventListener('scroll', scrollListener);\n }\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope } from './types';\nimport { assign, castValue, isArray, trim } from '@walkeros/core';\nimport { Const } from '@walkeros/collector';\nimport { getAttribute } from '@walkeros/web-core';\n\nexport function getElbAttributeName(\n prefix: string,\n name?: string,\n isProperty = true,\n): string {\n // separate dynamic properties from walker Const.Commands\n const separator = isProperty ? '-' : '';\n name = name != undefined ? separator + name : '';\n return prefix + name;\n}\n\nexport function getElbValues(\n prefix: string,\n element: Element,\n name: string,\n isProperty = true,\n): WalkerOS.Properties {\n const attributeValue =\n getAttribute(element, getElbAttributeName(prefix, name, isProperty)) || '';\n\n const elbValues = splitAttribute(attributeValue).reduce((values, str) => {\n let [key, val]: Walker.KeyVal = splitKeyVal(str);\n\n if (!key) return values;\n\n // Handle keys without value\n if (!val) {\n // Manually remove the : from key on empty values\n if (key.endsWith(':')) key = key.slice(0, -1);\n val = '';\n }\n\n // Dynamic values\n if (val.startsWith('#')) {\n val = val.slice(1); // Remove # symbol\n try {\n // Read property value from element\n let dynamicValue = (element as Element)[val as keyof Element];\n if (!dynamicValue && val === 'selected') {\n // Try to read selected value with chance of error\n dynamicValue = (element as HTMLSelectElement).options[\n (element as HTMLSelectElement).selectedIndex\n ].text;\n }\n\n val = String(dynamicValue);\n } catch (error) {\n val = '';\n }\n }\n\n if (key.endsWith('[]')) {\n key = key.slice(0, -2); // Remove [] symbol\n if (!isArray(values[key])) values[key] = [];\n (values[key] as WalkerOS.PropertyType[]).push(castValue(val));\n } else {\n values[key] = castValue(val);\n }\n\n return values;\n }, {} as WalkerOS.Properties);\n\n return elbValues;\n}\n\nexport function getAllEvents(\n scope?: Scope,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\n const actualScope = scope || document.body;\n if (!actualScope) return [];\n let events: Walker.Events = [];\n const action = Const.Commands.Action;\n const actionSelector = `[${getElbAttributeName(prefix, action, false)}]`;\n\n const processElementEvents = (elem: Element) => {\n Object.keys(getElbValues(prefix, elem, action, false)).forEach(\n (trigger) => {\n events = events.concat(getEvents(elem, trigger, prefix));\n },\n );\n };\n\n // Check if the scope element itself has action attributes\n if (\n actualScope !== document &&\n (actualScope as Element).matches?.(actionSelector)\n ) {\n processElementEvents(actualScope as Element);\n }\n\n queryAll(actualScope, actionSelector, processElementEvents);\n\n return events;\n}\n\nexport function getEvents(\n target: Element,\n trigger: string,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\n const events: Walker.Events = [];\n\n // Check for actions and get entity collection strategy\n const { actions, nearestOnly } = resolveAttributes(prefix, target, trigger);\n\n // Stop if there's no valid action combo\n if (!actions.length) return events;\n\n actions.forEach((triggerAction) => {\n const filter = splitAttribute(triggerAction.actionParams || '', ',').reduce(\n (filter, param) => {\n filter[trim(param)] = true;\n return filter;\n },\n {} as Walker.Filter,\n );\n\n // Get entities - using nearestOnly flag to determine collection strategy\n const entities = getEntities(prefix, target, filter, nearestOnly);\n\n // Use page as default entity if no one was set\n if (!entities.length) {\n const entity = 'page';\n // Only use explicit page properties and ignore generic properties\n const entitySelector = `[${getElbAttributeName(prefix, entity)}]`;\n\n // Get matching properties from the element and its parents\n const [data, context] = getThisAndParentProperties(\n target,\n entitySelector,\n prefix,\n entity,\n );\n\n entities.push({\n entity, // page\n data, // Consider only upper data\n nested: [], // Skip nested in this faked page case\n context,\n });\n }\n\n // Return a list of full events\n entities.forEach((entity) => {\n events.push({\n entity: entity.entity,\n action: triggerAction.action,\n data: entity.data,\n trigger,\n context: entity.context,\n nested: entity.nested,\n });\n });\n });\n\n return events;\n}\n\nexport function getGlobals(\n prefix: string = Const.Commands.Prefix,\n scope: Scope = document,\n): WalkerOS.Properties {\n const globalsName = getElbAttributeName(\n prefix,\n Const.Commands.Globals,\n false,\n );\n const globalSelector = `[${globalsName}]`;\n let values = {};\n\n queryAll(scope, globalSelector, (element) => {\n values = assign(\n values,\n getElbValues(prefix, element, Const.Commands.Globals, false),\n );\n });\n\n return values;\n}\n\nexport function getPageViewData(\n prefix: string,\n scope: Scope,\n): [WalkerOS.Properties, WalkerOS.OrderedProperties] {\n // static page view\n const loc = window.location;\n const page = 'page';\n const scopeElement = scope === document ? document.body : (scope as Element);\n const [data, context] = getThisAndParentProperties(\n scopeElement,\n `[${getElbAttributeName(prefix, page)}]`,\n prefix,\n page,\n );\n data.domain = loc.hostname;\n data.title = document.title;\n data.referrer = document.referrer;\n\n if (loc.search) data.search = loc.search;\n if (loc.hash) data.hash = loc.hash;\n\n // @TODO get all nested entities\n return [data, context];\n}\n\nexport function getTriggerActions(str: string): Walker.TriggersActionGroups {\n const values: Walker.TriggersActionGroups = {};\n\n const attributes = splitAttribute(str);\n\n attributes.forEach((str) => {\n const [triggerAttr, actionAttr] = splitKeyVal(str);\n const [trigger, triggerParams] = parseAttribute(triggerAttr);\n\n if (!trigger) return;\n\n let [action, actionParams] = parseAttribute(actionAttr || '');\n\n // Shortcut if trigger and action are the same (click:click)\n action = action || trigger;\n\n if (!values[trigger]) values[trigger] = [];\n\n values[trigger].push({ trigger, triggerParams, action, actionParams });\n });\n\n return values;\n}\n\nexport function getEntities(\n prefix: string,\n target: Element,\n filter?: Walker.Filter,\n nearestOnly = false,\n): WalkerOS.Entities {\n const entities: WalkerOS.Entities = [];\n let element = target as Node['parentElement'];\n\n // Unset empty filter object\n filter = Object.keys(filter || {}).length !== 0 ? filter : undefined;\n\n while (element) {\n const entity = getEntity(prefix, element, target, filter);\n if (entity) {\n entities.push(entity);\n if (nearestOnly) break; // Stop after first entity for data-elbaction\n }\n\n element = getParent(prefix, element);\n }\n\n return entities;\n}\n\nfunction getEntity(\n prefix: string,\n element: Element,\n origin?: Element,\n filter?: Walker.Filter,\n): WalkerOS.Entity | null {\n const entity = getAttribute(element, getElbAttributeName(prefix));\n\n // It's not a (valid) entity element or should be filtered\n if (!entity || (filter && !filter[entity])) return null;\n\n const scopeElems = [element]; // All related elements\n const dataSelector = `[${getElbAttributeName(\n prefix,\n entity,\n )}],[${getElbAttributeName(prefix, '')}]`; // [data-elb-entity,data-elb-]\n const linkName = getElbAttributeName(prefix, Const.Commands.Link, false); // data-elblink\n\n let data: WalkerOS.Properties = {};\n const nested: WalkerOS.Entities = [];\n const [parentData, context] = getThisAndParentProperties(\n origin || element,\n dataSelector,\n prefix,\n entity,\n );\n\n // Add linked elements (data-elblink)\n queryAll(element, `[${linkName}]`, (link) => {\n const [linkId, linkState]: Walker.KeyVal = splitKeyVal(\n getAttribute(link, linkName),\n );\n\n // Get all linked child elements if link is a parent\n // Note: This searches the entire document - for scoped operation, we would need\n // to pass scope context down to this function or redesign the linking mechanism\n if (linkState === 'parent')\n queryAll(document.body, `[${linkName}=\"${linkId}:child\"]`, (wormhole) => {\n scopeElems.push(wormhole);\n\n // A linked child can also be an entity\n const nestedEntity = getEntity(prefix, wormhole);\n if (nestedEntity) nested.push(nestedEntity);\n });\n });\n\n // Get all property elements including linked elements\n const propertyElems: Array<Element> = [];\n scopeElems.forEach((elem) => {\n // Also check for property on same level\n if (elem.matches(dataSelector)) propertyElems.push(elem);\n\n queryAll(elem, dataSelector, (elem) => propertyElems.push(elem));\n });\n\n // Get properties\n let genericData: WalkerOS.Properties = {};\n propertyElems.forEach((child) => {\n // Eventually override closer properties\n genericData = assign(genericData, getElbValues(prefix, child, ''));\n data = assign(data, getElbValues(prefix, child, entity));\n });\n\n // Merge properties with the hierarchy generic > data > parent\n data = assign(assign(genericData, data), parentData);\n\n // Get nested entities\n scopeElems.forEach((elem) => {\n queryAll(\n elem,\n `[${getElbAttributeName(prefix)}]`,\n (nestedEntityElement) => {\n const nestedEntity = getEntity(prefix, nestedEntityElement);\n if (nestedEntity) nested.push(nestedEntity);\n },\n );\n });\n\n return { entity, data, context, nested };\n}\n\nfunction getParent(prefix: string, elem: HTMLElement): HTMLElement | null {\n const linkName = getElbAttributeName(prefix, Const.Commands.Link, false); // data-elblink\n\n // Link\n if (elem.matches(`[${linkName}]`)) {\n const [linkId, linkState]: Walker.KeyVal = splitKeyVal(\n getAttribute(elem, linkName),\n );\n if (linkState === 'child') {\n // If current element is a child-link jump to the parent\n // Note: This searches the entire document - for scoped operation, we would need\n // to pass scope context down to this function or redesign the linking mechanism\n return document.querySelector(`[${linkName}=\"${linkId}:parent\"]`);\n }\n }\n\n // Shadow DOM traversal\n if (\n !elem.parentElement &&\n elem.getRootNode &&\n elem.getRootNode() instanceof ShadowRoot\n ) {\n return (elem.getRootNode() as ShadowRoot).host as HTMLElement;\n }\n\n return elem.parentElement;\n}\n\nfunction getThisAndParentProperties(\n element: Element,\n entitySelector: string,\n prefix: string,\n type: string,\n): [data: WalkerOS.Properties, context: WalkerOS.OrderedProperties] {\n let data: WalkerOS.Properties = {};\n const context: WalkerOS.OrderedProperties = {};\n let parent = element as Node['parentElement'];\n const contextSelector = `[${getElbAttributeName(\n prefix,\n Const.Commands.Context,\n false,\n )}]`;\n\n // Get all bubbling-up properties with decreasing priority\n let contextI = 0; // Context counter\n while (parent) {\n // Properties\n if (parent.matches(entitySelector)) {\n // Get higher properties first\n data = assign(getElbValues(prefix, parent, ''), data); // Generic\n data = assign(getElbValues(prefix, parent, type), data); // Explicit\n }\n\n // Context\n if (parent.matches(contextSelector)) {\n Object.entries(\n getElbValues(prefix, parent, Const.Commands.Context, false),\n ).forEach(([key, val]) => {\n // Don't override context with same but higher key\n if (val && !context[key]) context[key] = [val, contextI];\n });\n\n // Increase context counter with each parent level\n ++contextI;\n }\n\n parent = getParent(prefix, parent);\n }\n\n return [data, context];\n}\n\nfunction queryAll(\n scope: Document | Element,\n selector: string,\n fn: (element: Element) => void,\n): void {\n const elements = scope.querySelectorAll(selector);\n elements.forEach(fn);\n}\n\nfunction resolveAttributes(\n prefix: string,\n target: Element,\n trigger: string,\n): { actions: Walker.TriggerActions; nearestOnly: boolean } {\n let element = target as Node['parentElement'];\n\n while (element) {\n // Check for data-elbactions first (takes precedence)\n const multiAttribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Actions, false),\n );\n\n if (multiAttribute) {\n const triggerActions = getTriggerActions(multiAttribute);\n if (triggerActions[trigger]) {\n return { actions: triggerActions[trigger], nearestOnly: false };\n }\n }\n\n // Check for data-elbaction (nearest entity only)\n const singleAttribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Action, false),\n );\n\n if (singleAttribute) {\n const triggerActions = getTriggerActions(singleAttribute);\n // Action found on element or is not a click trigger\n if (triggerActions[trigger] || trigger !== 'click') {\n return { actions: triggerActions[trigger] || [], nearestOnly: true };\n }\n }\n\n element = getParent(prefix, element);\n }\n\n return { actions: [], nearestOnly: false };\n}\n\nfunction splitAttribute(str: string, separator = ';'): Walker.Attributes {\n const values: Walker.Attributes = [];\n\n if (!str) return values;\n\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\nfunction splitKeyVal(str: string): Walker.KeyVal {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key), trim(value)];\n}\n\nfunction parseAttribute(str: string): Walker.KeyVal {\n // action(a, b, c)\n const [key, value] = str.split('(', 2);\n const param = value ? value.slice(0, -1) : ''; // Remove the )\n // key = 'action'\n // param = 'a, b, c'\n return [key, param];\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Settings, Context } from './types';\nimport { tryCatch } from '@walkeros/core';\nimport { isVisible } from '@walkeros/web-core';\nimport { handleTrigger, Triggers } from './trigger';\n\n// Cache for element size calculations to reduce DOM queries\nconst elementSizeCache = new WeakMap<\n HTMLElement,\n { isLarge: boolean; lastChecked: number }\n>();\n\n// Cache for basic visibility checks to reduce expensive isVisible() calls\nconst visibilityCache = new WeakMap<\n HTMLElement,\n { isVisible: boolean; lastChecked: number }\n>();\n\n// Module-level visibility state management (stateless source architecture)\ninterface VisibilityState {\n observer?: IntersectionObserver;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean; context: Context; trigger: string }\n >;\n}\n\n// Module-level visibility state keyed by document/scope\nconst visibilityStates = new WeakMap<Document | Element, VisibilityState>();\n\n/**\n * Cached visibility check to reduce expensive isVisible() calls\n */\nfunction isElementVisible(element: HTMLElement): boolean {\n const now = Date.now();\n let cached = visibilityCache.get(element);\n\n // Cache visibility result for 500ms to balance accuracy with performance\n if (!cached || now - cached.lastChecked > 500) {\n cached = {\n isVisible: isVisible(element),\n lastChecked: now,\n };\n visibilityCache.set(element, cached);\n }\n\n return cached.isVisible;\n}\n\n/**\n * Element cleanup (unobserve + timer + cache cleanup)\n */\nexport function unobserveElement(\n scope: Document | Element,\n element: HTMLElement,\n): void {\n const state = visibilityStates.get(scope);\n if (!state) return;\n\n if (state.observer) {\n state.observer.unobserve(element);\n }\n\n // Clear timer\n const timer = state.timers.get(element);\n if (timer) {\n clearTimeout(timer);\n state.timers.delete(element);\n }\n\n // Clean up caches to prevent memory leaks\n elementSizeCache.delete(element);\n visibilityCache.delete(element);\n}\n\n/**\n * Creates an IntersectionObserver for the given scope\n */\nfunction createObserver(\n scope: Document | Element,\n): IntersectionObserver | undefined {\n if (!window.IntersectionObserver) return undefined;\n\n return tryCatch(\n () =>\n new window.IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n handleIntersection(scope, entry);\n });\n },\n {\n rootMargin: '0px',\n threshold: [0, 0.5],\n },\n ),\n () => undefined,\n )();\n}\n\n/**\n * Handles intersection changes for observed elements\n */\nfunction handleIntersection(\n scope: Document | Element,\n entry: IntersectionObserverEntry,\n): void {\n const target = entry.target as HTMLElement;\n const state = visibilityStates.get(scope);\n\n if (!state) return;\n\n const existingTimer = state.timers.get(target);\n\n if (entry.intersectionRatio > 0) {\n // Optimize: Cache element size calculations to avoid repeated DOM queries\n const now = Date.now();\n let cached = elementSizeCache.get(target);\n\n // Cache element size for 1 second to reduce DOM queries\n if (!cached || now - cached.lastChecked > 1000) {\n cached = {\n isLarge: target.offsetHeight > window.innerHeight,\n lastChecked: now,\n };\n elementSizeCache.set(target, cached);\n }\n\n const meetsThreshold = entry.intersectionRatio >= 0.5;\n\n // Optimized visibility strategy:\n // - Standard elements: intersection ratio ≥ 0.5 is sufficient (fast)\n // - Large elements: need additional overlay/occlusion check (slower but necessary)\n const shouldTrigger =\n meetsThreshold || (cached.isLarge && isElementVisible(target));\n\n if (shouldTrigger) {\n // Get element configuration\n const elementConfig = state.elementConfigs?.get(target);\n\n // For multiple triggers, only proceed if this is a re-entry (was not visible, now visible)\n if (elementConfig?.multiple && elementConfig.blocked) return; // Don't trigger again\n\n // Only create timer if none exists\n if (!existingTimer) {\n const timer = window.setTimeout(async () => {\n // Final visibility check before triggering (cached for performance)\n if (isElementVisible(target)) {\n // Get element configuration to access context\n const elementConfig = state.elementConfigs?.get(target);\n if (elementConfig?.context) {\n await handleTrigger(\n elementConfig.context,\n target as Element,\n elementConfig.trigger,\n );\n }\n\n // Get fresh element config reference for state update\n const currentConfig = state.elementConfigs?.get(target);\n\n // For multiple triggers, mark as visible after firing\n if (currentConfig?.multiple) {\n currentConfig.blocked = true;\n } else {\n // Clean up and unobserve only if not a multiple trigger\n unobserveElement(scope, target);\n }\n }\n }, state.duration);\n\n state.timers.set(target, timer);\n }\n return;\n }\n }\n\n // Element isn't sufficiently in viewport - clear existing timer\n if (existingTimer) {\n clearTimeout(existingTimer);\n state.timers.delete(target);\n }\n\n // For multiple triggers, mark as not visible for re-entry detection\n const elementConfig = state.elementConfigs?.get(target);\n if (elementConfig?.multiple) {\n elementConfig.blocked = false;\n }\n}\n\n/**\n * Initializes visibility tracking for a scope (document/element)\n */\nexport function initVisibilityTracking(\n scope: Document | Element,\n duration = 1000,\n): void {\n if (visibilityStates.has(scope)) return; // Already initialized\n\n visibilityStates.set(scope, {\n observer: createObserver(scope),\n timers: new WeakMap(),\n duration,\n });\n}\n\n/**\n * Main trigger function for visible elements\n */\nexport function triggerVisible(\n context: Context,\n element: HTMLElement,\n config: { multiple?: boolean } = { multiple: false },\n): void {\n // Use scope from settings, fallback to document\n const scope = context.settings.scope || document;\n const state = visibilityStates.get(scope);\n\n if (state?.observer && element) {\n // Store element config for later use in intersection handling\n if (!state.elementConfigs) {\n state.elementConfigs = new WeakMap();\n }\n state.elementConfigs.set(element, {\n multiple: config.multiple ?? false,\n blocked: false,\n context,\n trigger: config.multiple ? 'visible' : 'impression',\n });\n state.observer.observe(element);\n }\n}\n\n/**\n * Destroys visibility tracking for a scope, cleaning up all resources\n */\nexport function destroyVisibilityTracking(scope?: Document | Element): void {\n if (!scope) return; // No scope provided, nothing to clean up\n\n const state = visibilityStates.get(scope);\n if (!state) return;\n\n if (state.observer) {\n state.observer.disconnect();\n }\n\n visibilityStates.delete(scope);\n}\n","import type { WalkerOS, Elb, Collector } from '@walkeros/core';\nimport { isString, isObject, isElementOrDocument } from '@walkeros/core';\nimport type {\n BrowserPushData,\n BrowserPushOptions,\n BrowserPushContext,\n} from './types/elb';\nimport type { Context } from './types';\nimport { getEntities, getGlobals } from './walker';\n\n/**\n * Translation layer that converts flexible browser source inputs\n * to the strict core collector format\n */\nexport function translateToCoreCollector(\n context: Context,\n eventOrCommand: unknown,\n data?: BrowserPushData,\n options?: BrowserPushOptions,\n pushContext?: BrowserPushContext,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n): Promise<Elb.PushResult> {\n const { elb, settings } = context;\n\n // Handle walker commands - pass through directly to elb (it will route to command)\n if (isString(eventOrCommand) && eventOrCommand.startsWith('walker ')) {\n return elb(eventOrCommand, data as WalkerOS.Properties);\n }\n\n // Handle event objects - add source and globals if missing\n if (isObject(eventOrCommand)) {\n const event = eventOrCommand;\n if (!event.source) event.source = getBrowserSource();\n\n // Add globals if not already present\n if (!event.globals) {\n event.globals = getGlobals(settings.prefix, settings.scope || document);\n }\n\n return elb(event);\n }\n\n // Extract entity name from event string\n const [entity] = String(\n isObject(eventOrCommand) ? eventOrCommand.name : eventOrCommand,\n ).split(' ');\n\n // Get data and context either from elements or parameters\n let eventData = isObject(data) ? (data as WalkerOS.Properties) : {};\n let eventContext: WalkerOS.OrderedProperties = {};\n\n let elemParameter: undefined | Element;\n let dataIsElem = false;\n\n // Check if data parameter is an element\n if (isElementOrDocument(data)) {\n elemParameter = data as Element;\n dataIsElem = true;\n }\n\n // Check if contextData parameter is an element\n if (isElementOrDocument(pushContext)) {\n elemParameter = pushContext as Element;\n } else if (isObject(pushContext) && Object.keys(pushContext).length) {\n eventContext = pushContext as WalkerOS.OrderedProperties;\n }\n\n // Extract data from element if provided\n if (elemParameter) {\n const entityObj = getEntities(\n settings.prefix || 'data-elb',\n elemParameter,\n ).find((obj) => obj.entity === entity);\n if (entityObj) {\n if (dataIsElem) eventData = entityObj.data;\n eventContext = entityObj.context;\n }\n }\n\n // Special handling for page events\n if (entity === 'page') {\n eventData.id = eventData.id || window.location.pathname;\n }\n\n // Collect globals from the DOM scope\n const eventGlobals = getGlobals(settings.prefix, settings.scope);\n\n // Build unified event from various elb usage patterns\n const event: WalkerOS.DeepPartialEvent = {\n name: String(eventOrCommand || ''),\n data: eventData,\n context: eventContext,\n globals: eventGlobals,\n nested,\n custom,\n trigger: isString(options) ? options : '',\n source: getBrowserSource(),\n };\n\n return elb(event);\n}\n\n/**\n * Create source information for browser events\n */\nfunction getBrowserSource(): WalkerOS.Source {\n return {\n type: 'browser',\n id: window.location.href,\n previous_id: document.referrer,\n };\n}\n","import type { WalkerOS, Collector, Elb } from '@walkeros/core';\nimport type { ELBLayer, ELBLayerConfig, Settings } from './types';\nimport { tryCatch, isString, isObject } from '@walkeros/core';\nimport { translateToCoreCollector } from './translation';\n\n/**\n * Initialize elbLayer for async command handling\n * This creates window.elbLayer array and processes any existing commands\n */\nexport function initElbLayer(\n elb: Elb.Fn,\n config: ELBLayerConfig & { prefix?: string; window?: Window } = {},\n): void {\n const layerName = config.name || 'elbLayer';\n const windowObj = config.window || window;\n\n if (!windowObj) {\n return; // Skip if no window available\n }\n\n // Ensure elbLayer exists on window\n const windowWithLayer = windowObj as typeof windowObj &\n Record<string, unknown>;\n if (!windowWithLayer[layerName]) {\n windowWithLayer[layerName] = [];\n }\n\n const elbLayer = windowWithLayer[layerName] as ELBLayer;\n\n // Override the push method to process items immediately\n elbLayer.push = function (...args: Array<Elb.Layer | IArguments>) {\n // Handle arguments object\n if (isArguments(args[0])) {\n const argsArray = [...Array.from(args[0])];\n const i = Array.prototype.push.apply(this, [argsArray]);\n // Process the arguments as a single command\n pushCommand(elb, config.prefix, argsArray);\n return i;\n }\n\n const i = Array.prototype.push.apply(this, args);\n\n // Process each pushed item immediately\n args.forEach((item) => {\n pushCommand(elb, config.prefix, item);\n });\n\n return i;\n };\n\n // Process any existing commands that were pushed before initialization\n if (Array.isArray(elbLayer) && elbLayer.length > 0) {\n processElbLayer(elb, config.prefix, elbLayer);\n }\n}\n\n/**\n * Process commands from ELB Layer array\n * Commands are processed in order with walker commands getting priority\n */\nfunction processElbLayer(\n elb: Elb.Fn,\n prefix: string = 'data-elb',\n elbLayer: ELBLayer,\n): void {\n // Process in two phases: walker commands first, then events\n processPredefined(elb, prefix, elbLayer, true); // Commands only\n processPredefined(elb, prefix, elbLayer, false); // Events only\n\n // Clear the array after processing\n elbLayer.length = 0;\n}\n\n/**\n * Process predefined commands with execution order handling\n */\nfunction processPredefined(\n elb: Elb.Fn,\n prefix: string,\n elbLayer: ELBLayer,\n commandsOnly: boolean,\n): void {\n const walkerCommand = 'walker '; // Space on purpose\n const events: unknown[] = [];\n let isFirstRunEvent = true;\n\n elbLayer.forEach((pushedItem) => {\n // Handle arguments object or arrays\n const item = isArguments(pushedItem)\n ? [...Array.from(pushedItem)]\n : isArrayLike(pushedItem)\n ? Array.from(pushedItem as ArrayLike<unknown>)\n : [pushedItem];\n\n // Skip malformed commands\n if (Array.isArray(item) && item.length === 0) {\n return; // Empty array\n }\n\n if (Array.isArray(item) && item.length === 1 && !item[0]) {\n return; // Array with falsy first element\n }\n\n const firstParam = item[0];\n const isCommand =\n !isObject(firstParam) &&\n isString(firstParam) &&\n firstParam.startsWith(walkerCommand);\n\n if (!isObject(firstParam)) {\n const args = Array.from(item);\n if (!isString(args[0]) || args[0].trim() === '') return; // Invalid or empty string\n\n // FIXED: Don't skip the first walker run - this was causing no events on first load\n // The original logic was meant to prevent duplicate execution but was too aggressive\n const runCommand = 'walker run';\n if (isFirstRunEvent && args[0] === runCommand) {\n isFirstRunEvent = false; // Mark that we've seen the first run\n // Continue processing instead of returning\n }\n } else {\n // For objects, skip if empty\n if (\n typeof firstParam === 'object' &&\n Object.keys(firstParam).length === 0\n ) {\n return;\n }\n }\n\n // Handle commands and events separately\n if (\n (commandsOnly && isCommand) || // Only commands\n (!commandsOnly && !isCommand) // Only events\n )\n events.push(item);\n });\n\n events.forEach((item) => {\n // Use the elb push function directly to match legacy behavior\n pushCommand(elb, prefix, item);\n });\n}\n\n/**\n * Push command directly using elb or translation based on type\n */\nfunction pushCommand(\n elb: Elb.Fn,\n prefix: string = 'data-elb',\n item: unknown,\n): void {\n tryCatch(\n () => {\n if (Array.isArray(item)) {\n const [action, ...rest] = item;\n\n // Skip empty or invalid actions\n if (!action || (isString(action) && action.trim() === '')) {\n return;\n }\n\n // Walker commands go directly to collector\n if (isString(action) && action.startsWith('walker ')) {\n elb(action, rest[0]);\n return;\n }\n\n translateToCoreCollector(\n {\n elb,\n settings: {\n prefix,\n scope: document,\n pageview: false,\n session: false,\n elb: '',\n elbLayer: false,\n },\n },\n action,\n ...rest,\n );\n } else if (item && typeof item === 'object') {\n // Skip empty objects\n if (Object.keys(item).length === 0) {\n return;\n }\n // Object events go directly to elb\n elb(item as WalkerOS.DeepPartialEvent);\n }\n },\n () => {\n // Silent error handling - failed commands are ignored\n },\n )();\n}\n\n/**\n * Check if value is arguments object\n */\nfunction isArguments(value: unknown): value is IArguments {\n return (\n value != null &&\n typeof value === 'object' &&\n Object.prototype.toString.call(value) === '[object Arguments]'\n );\n}\n\n/**\n * Check if value is array-like (has length property)\n */\nfunction isArrayLike(value: unknown): boolean {\n return (\n value != null &&\n typeof value === 'object' &&\n 'length' in value &&\n typeof (value as unknown[]).length === 'number'\n );\n}\n","import type { Collector, Elb } from '@walkeros/core';\nimport {\n sessionStart as sessionStartOrg,\n SessionConfig,\n} from '@walkeros/web-core';\n\nexport function createSessionStart(elb: Elb.Fn, command?: Collector.CommandFn) {\n return function (\n options: { config?: SessionConfig; data?: Collector.SessionData } = {},\n ): void | Collector.SessionData {\n const { config = {} } = options;\n return sessionStart(\n elb,\n {\n ...config,\n pulse: config.pulse !== undefined ? config.pulse : true,\n },\n command,\n );\n };\n}\n\nexport function sessionStart(\n elb: Elb.Fn,\n config: SessionConfig = {},\n command?: Collector.CommandFn,\n): void | Collector.SessionData {\n // Create minimal collector interface for sessionStart that needs elb and group tracking\n const collectorInterface: Partial<Collector.Instance> = {\n push: elb,\n group: undefined, // Session tracking doesn't need group initially\n command, // Include command for session to call walker command\n };\n\n return sessionStartOrg({\n ...config,\n collector: collectorInterface as Collector.Instance,\n });\n}\n","import type { InitSettings, Settings } from './types';\n\n/**\n * Get browser source configuration with defaults\n * @param initSettings - Initial settings to override defaults\n * @param envDocument - Document from environment (optional)\n * @returns Complete settings object with all defaults applied\n */\nexport function getConfig(\n initSettings: InitSettings = {},\n envDocument?: Document,\n): Settings {\n return {\n prefix: 'data-elb',\n pageview: true,\n session: true,\n elb: 'elb',\n elbLayer: 'elbLayer',\n scope: envDocument || undefined,\n ...initSettings,\n };\n}\n","import type { Source, Elb, Collector } from '@walkeros/core';\nimport type { SessionConfig, SessionCallback } from '@walkeros/web-core';\nimport type { SettingsSchema } from '../schemas';\nimport { z } from '@walkeros/core/dev';\n\n// Export browser-specific elb types\nexport * from './elb';\nimport type { BrowserPush } from './elb';\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// InitSettings: what users provide (all optional)\n// Override specific fields with non-serializable types\nexport interface InitSettings\n extends Partial<Omit<BaseSettings, 'scope' | 'session' | 'elbLayer'>> {\n scope?: Element | Document;\n session?: boolean | SessionConfig;\n elbLayer?: boolean | string | Elb.Layer;\n}\n\n// Settings: resolved configuration\n// Override specific fields with non-serializable types\nexport interface Settings\n extends Omit<BaseSettings, 'scope' | 'session' | 'elbLayer'> {\n scope?: Element | Document;\n session: boolean | SessionConfig;\n elbLayer: boolean | string | Elb.Layer;\n}\n\nexport interface Mapping {}\n\nexport type Push = BrowserPush;\n\nexport interface Env extends Source.BaseEnv {\n elb: Elb.Fn;\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport interface Context {\n elb: Elb.Fn;\n settings: Settings;\n}\n\n// Re-export session types from web-core to avoid duplication\nexport type { SessionConfig, SessionCallback };\n\n// ELB Layer types for async command handling\nexport type ELBLayer = Array<Elb.Layer | IArguments>;\nexport interface ELBLayerConfig {\n name?: string; // Property name for window.elbLayer (default: 'elbLayer')\n}\n\n// Scope type for DOM operations\nexport type Scope = Document | Element;\n","export * as env from './env';\n","import type { Env } from '../types';\nimport type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for browser source\n *\n * These environments provide standardized mock structures for testing\n * browser event capture without requiring an actual DOM environment.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopLogger: Logger.Instance = {\n error: noop,\n info: noop,\n debug: noop,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n scope: () => noopLogger,\n};\n\n/**\n * Mock window object with common browser APIs\n */\nconst createMockWindow = () => ({\n addEventListener: noop,\n removeEventListener: noop,\n location: {\n href: 'https://example.com/page',\n pathname: '/page',\n search: '?query=test',\n hash: '#section',\n host: 'example.com',\n hostname: 'example.com',\n origin: 'https://example.com',\n protocol: 'https:',\n },\n document: {},\n navigator: {\n language: 'en-US',\n userAgent: 'Mozilla/5.0 (Test)',\n },\n screen: {\n width: 1920,\n height: 1080,\n },\n innerWidth: 1920,\n innerHeight: 1080,\n pageXOffset: 0,\n pageYOffset: 0,\n scrollX: 0,\n scrollY: 0,\n});\n\n/**\n * Mock document object with DOM methods\n */\nconst createMockDocument = () => ({\n addEventListener: noop,\n removeEventListener: noop,\n querySelector: noop,\n querySelectorAll: () => [],\n getElementById: noop,\n getElementsByClassName: () => [],\n getElementsByTagName: () => [],\n createElement: () => ({\n setAttribute: noop,\n getAttribute: noop,\n addEventListener: noop,\n removeEventListener: noop,\n }),\n body: {\n appendChild: noop,\n removeChild: noop,\n },\n documentElement: {\n scrollTop: 0,\n scrollLeft: 0,\n },\n readyState: 'complete',\n title: 'Test Page',\n referrer: '',\n cookie: '',\n});\n\n/**\n * Standard mock environment for testing browser source\n *\n * Use this for testing event capture, DOM interactions, and pageview tracking\n * without requiring a real browser environment.\n */\nexport const push: Env = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n get window() {\n return createMockWindow() as unknown as typeof window;\n },\n get document() {\n return createMockDocument() as unknown as typeof document;\n },\n logger: noopLogger,\n};\n","import type { WalkerOS } from '@walkeros/core';\nimport { isString, isDefined } from '@walkeros/core';\n\nexport interface TaggerConfig {\n prefix?: string;\n}\n\nexport interface TaggerInstance {\n entity: (name: string) => TaggerInstance;\n data: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((data: WalkerOS.Properties) => TaggerInstance);\n action: ((trigger: string, action?: string) => TaggerInstance) &\n ((actions: Record<string, string>) => TaggerInstance);\n actions: ((trigger: string, action?: string) => TaggerInstance) &\n ((actions: Record<string, string>) => TaggerInstance);\n context: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((context: WalkerOS.Properties) => TaggerInstance);\n globals: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((globals: WalkerOS.Properties) => TaggerInstance);\n link: ((id: string, type: string) => TaggerInstance) &\n ((links: Record<string, string>) => TaggerInstance);\n get: () => Record<string, string>;\n}\n\n/**\n * Creates a new tagger instance for generating walkerOS data attributes.\n *\n * @param config The configuration for the tagger.\n * @returns A new tagger instance.\n */\nexport function createTagger(\n config: TaggerConfig = {},\n): (entity?: string) => TaggerInstance {\n const prefix = config.prefix || 'data-elb';\n\n return function (entity?: string): TaggerInstance {\n // Internal state\n let currentEntity: string | undefined = undefined; // Only set via .entity() method\n let namingEntity: string | undefined = entity; // Used for data attribute naming\n const dataProperties: Record<string, WalkerOS.Properties> = {};\n const actionProperties: Record<string, string> = {};\n const actionsProperties: Record<string, string> = {};\n const contextProperties: WalkerOS.Properties = {};\n const globalProperties: WalkerOS.Properties = {};\n const linkProperties: Record<string, string> = {};\n\n // Helper function to escape special characters\n function escapeValue(value: WalkerOS.Property | undefined): string {\n if (!isDefined(value) || value === null) return 'undefined';\n\n let str = String(value);\n\n // Escape backslashes first, then other characters\n str = str.replace(/\\\\/g, '\\\\\\\\');\n str = str.replace(/;/g, '\\\\;');\n str = str.replace(/:/g, '\\\\:');\n str = str.replace(/'/g, \"\\\\'\");\n\n return str;\n }\n\n // Helper function to serialize key-value pairs\n function serializeKeyValue(obj: WalkerOS.Properties): string {\n return Object.entries(obj)\n .map(([key, value]) => `${key}:${escapeValue(value)}`)\n .join(';');\n }\n\n const instance: TaggerInstance = {\n entity(name: string): TaggerInstance {\n currentEntity = name;\n namingEntity = name; // Always update naming scope when entity is set\n return instance;\n },\n\n data(\n keyOrData: string | WalkerOS.Properties,\n value?: WalkerOS.Property,\n ): TaggerInstance {\n const entityKey = namingEntity ?? '';\n\n if (!dataProperties[entityKey]) {\n dataProperties[entityKey] = {};\n }\n\n if (isString(keyOrData)) {\n dataProperties[entityKey][keyOrData] = value;\n } else {\n Object.assign(dataProperties[entityKey], keyOrData);\n }\n\n return instance;\n },\n\n action(\n triggerOrActions: string | Record<string, string>,\n actionValue?: string,\n ): TaggerInstance {\n if (isString(triggerOrActions)) {\n if (isDefined(actionValue)) {\n // Two parameters: trigger and action\n actionProperties[triggerOrActions] = actionValue;\n } else {\n // Single parameter: could be \"trigger:action\" or just \"trigger\"\n if (triggerOrActions.includes(':')) {\n const [trigger, action] = triggerOrActions.split(':', 2);\n actionProperties[trigger] = action;\n } else {\n actionProperties[triggerOrActions] = triggerOrActions;\n }\n }\n } else {\n Object.assign(actionProperties, triggerOrActions);\n }\n\n return instance;\n },\n\n actions(\n triggerOrActions: string | Record<string, string>,\n actionValue?: string,\n ): TaggerInstance {\n if (isString(triggerOrActions)) {\n if (isDefined(actionValue)) {\n // Two parameters: trigger and action\n actionsProperties[triggerOrActions] = actionValue;\n } else {\n // Single parameter: could be \"trigger:action\" or just \"trigger\"\n if (triggerOrActions.includes(':')) {\n const [trigger, action] = triggerOrActions.split(':', 2);\n actionsProperties[trigger] = action;\n } else {\n actionsProperties[triggerOrActions] = triggerOrActions;\n }\n }\n } else {\n Object.assign(actionsProperties, triggerOrActions);\n }\n\n return instance;\n },\n\n context(\n keyOrContext: string | WalkerOS.Properties,\n value?: WalkerOS.Property,\n ): TaggerInstance {\n if (isString(keyOrContext)) {\n contextProperties[keyOrContext] = value;\n } else {\n Object.assign(contextProperties, keyOrContext);\n }\n\n return instance;\n },\n\n globals(\n keyOrGlobals: string | WalkerOS.Properties,\n value?: WalkerOS.Property,\n ): TaggerInstance {\n if (isString(keyOrGlobals)) {\n globalProperties[keyOrGlobals] = value;\n } else {\n Object.assign(globalProperties, keyOrGlobals);\n }\n\n return instance;\n },\n\n link(\n idOrLinks: string | Record<string, string>,\n type?: string,\n ): TaggerInstance {\n if (isString(idOrLinks)) {\n linkProperties[idOrLinks] = type!;\n } else {\n Object.assign(linkProperties, idOrLinks);\n }\n\n return instance;\n },\n\n get(): Record<string, string> {\n const attributes: Record<string, string> = {};\n\n // Add entity attribute if set\n if (currentEntity) {\n attributes[prefix] = currentEntity;\n }\n\n // Add data attributes\n Object.entries(dataProperties).forEach(([entityKey, props]) => {\n if (Object.keys(props).length > 0) {\n const attrName = entityKey\n ? `${prefix}-${entityKey}`\n : `${prefix}-`;\n attributes[attrName] = serializeKeyValue(props);\n }\n });\n\n // Add action attributes\n if (Object.keys(actionProperties).length > 0) {\n attributes[`${prefix}action`] = serializeKeyValue(actionProperties);\n }\n\n // Add actions attributes (for all entities)\n if (Object.keys(actionsProperties).length > 0) {\n attributes[`${prefix}actions`] = serializeKeyValue(actionsProperties);\n }\n\n // Add context attributes\n if (Object.keys(contextProperties).length > 0) {\n attributes[`${prefix}context`] = serializeKeyValue(contextProperties);\n }\n\n // Add global attributes\n if (Object.keys(globalProperties).length > 0) {\n attributes[`${prefix}globals`] = serializeKeyValue(globalProperties);\n }\n\n // Add link attributes\n if (Object.keys(linkProperties).length > 0) {\n attributes[`${prefix}link`] = serializeKeyValue(linkProperties);\n }\n\n return attributes;\n },\n };\n\n return instance;\n };\n}\n"],"mappings":"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","names":["import_collector","import_web_core","filter","str","elem","import_web_core","elementConfig","_a","_b","event","Triggers","elem","scrollElements","context","i","import_web_core","sessionStartOrg","window","document","context","push"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})},n=Object.defineProperty;((e,t)=>{for(var r in t)n(e,r,{get:t[r],enumerable:!0})})({},{Level:()=>o});var r,o=((r=o||{})[r.ERROR=0]="ERROR",r[r.INFO=1]="INFO",r[r.DEBUG=2]="DEBUG",r),s={merge:!0,shallow:!0,extend:!0};function i(e,t={},n={}){n={...s,...n};const r=Object.entries(t).reduce((t,[r,o])=>{const s=e[r];return n.merge&&Array.isArray(s)&&Array.isArray(o)?t[r]=o.reduce((e,t)=>e.includes(t)?e:[...e,t],[...s]):(n.extend||r in e)&&(t[r]=o),t},{});return n.shallow?{...e,...r}:(Object.assign(e,r),e)}function c(e){return Array.isArray(e)}function a(e){return void 0!==e}function l(e){return e===document||e instanceof Element}function u(e){return"object"==typeof e&&null!==e&&!c(e)&&"[object Object]"===Object.prototype.toString.call(e)}function f(e){return"string"==typeof e}function d(e){if("true"===e)return!0;if("false"===e)return!1;const t=Number(e);return e==t&&""!==e?t:String(e)}function m(e,t,n){return function(...r){try{return e(...r)}catch(e){if(!t)return;return t(e)}finally{null==n||n()}}}function g(e){return e?e.trim().replace(/^'|'$/g,"").trim():""}import{Const as p}from"@walkeros/collector";import{elb as h,getAttribute as b}from"@walkeros/web-core";import{Const as y}from"@walkeros/collector";import{getAttribute as v}from"@walkeros/web-core";function w(e,t,n=!0){return e+(t=null!=t?(n?"-":"")+t:"")}function k(e,t,n,r=!0){return T(v(t,w(e,n,r))||"").reduce((e,n)=>{let[r,o]=R(n);if(!r)return e;if(o||(r.endsWith(":")&&(r=r.slice(0,-1)),o=""),o.startsWith("#")){o=o.slice(1);try{let e=t[o];e||"selected"!==o||(e=t.options[t.selectedIndex].text),o=String(e)}catch(e){o=""}}return r.endsWith("[]")?(r=r.slice(0,-2),c(e[r])||(e[r]=[]),e[r].push(d(o))):e[r]=d(o),e},{})}function x(e,t=y.Commands.Prefix){var n;const r=e||document.body;if(!r)return[];let o=[];const s=y.Commands.Action,i=`[${w(t,s,!1)}]`,c=e=>{Object.keys(k(t,e,s,!1)).forEach(n=>{o=o.concat(E(e,n,t))})};return r!==document&&(null==(n=r.matches)?void 0:n.call(r,i))&&c(r),P(r,i,c),o}function E(e,t,n=y.Commands.Prefix){const r=[],{actions:o,nearestOnly:s}=function(e,t,n){let r=t;for(;r;){const t=v(r,w(e,y.Commands.Actions,!1));if(t){const e=A(t);if(e[n])return{actions:e[n],nearestOnly:!1}}const o=v(r,w(e,y.Commands.Action,!1));if(o){const e=A(o);if(e[n]||"click"!==n)return{actions:e[n]||[],nearestOnly:!0}}r=L(e,r)}return{actions:[],nearestOnly:!1}}(n,e,t);return o.length?(o.forEach(o=>{const i=T(o.actionParams||"",",").reduce((e,t)=>(e[g(t)]=!0,e),{}),c=C(n,e,i,s);if(!c.length){const t="page",r=`[${w(n,t)}]`,[o,s]=S(e,r,n,t);c.push({entity:t,data:o,nested:[],context:s})}c.forEach(e=>{r.push({entity:e.entity,action:o.action,data:e.data,trigger:t,context:e.context,nested:e.nested})})}),r):r}function O(e=y.Commands.Prefix,t=document){const n=w(e,y.Commands.Globals,!1);let r={};return P(t,`[${n}]`,t=>{r=i(r,k(e,t,y.Commands.Globals,!1))}),r}function j(e,t){const n=window.location,r="page",o=t===document?document.body:t,[s,i]=S(o,`[${w(e,r)}]`,e,r);return s.domain=n.hostname,s.title=document.title,s.referrer=document.referrer,n.search&&(s.search=n.search),n.hash&&(s.hash=n.hash),[s,i]}function A(e){const t={};return T(e).forEach(e=>{const[n,r]=R(e),[o,s]=W(n);if(!o)return;let[i,c]=W(r||"");i=i||o,t[o]||(t[o]=[]),t[o].push({trigger:o,triggerParams:s,action:i,actionParams:c})}),t}function C(e,t,n,r=!1){const o=[];let s=t;for(n=0!==Object.keys(n||{}).length?n:void 0;s;){const i=$(e,s,t,n);if(i&&(o.push(i),r))break;s=L(e,s)}return o}function $(e,t,n,r){const o=v(t,w(e));if(!o||r&&!r[o])return null;const s=[t],c=`[${w(e,o)}],[${w(e,"")}]`,a=w(e,y.Commands.Link,!1);let l={};const u=[],[f,d]=S(n||t,c,e,o);P(t,`[${a}]`,t=>{const[n,r]=R(v(t,a));"parent"===r&&P(document.body,`[${a}="${n}:child"]`,t=>{s.push(t);const n=$(e,t);n&&u.push(n)})});const m=[];s.forEach(e=>{e.matches(c)&&m.push(e),P(e,c,e=>m.push(e))});let g={};return m.forEach(t=>{g=i(g,k(e,t,"")),l=i(l,k(e,t,o))}),l=i(i(g,l),f),s.forEach(t=>{P(t,`[${w(e)}]`,t=>{const n=$(e,t);n&&u.push(n)})}),{entity:o,data:l,context:d,nested:u}}function L(e,t){const n=w(e,y.Commands.Link,!1);if(t.matches(`[${n}]`)){const[e,r]=R(v(t,n));if("child"===r)return document.querySelector(`[${n}="${e}:parent"]`)}return!t.parentElement&&t.getRootNode&&t.getRootNode()instanceof ShadowRoot?t.getRootNode().host:t.parentElement}function S(e,t,n,r){let o={};const s={};let c=e;const a=`[${w(n,y.Commands.Context,!1)}]`;let l=0;for(;c;)c.matches(t)&&(o=i(k(n,c,""),o),o=i(k(n,c,r),o)),c.matches(a)&&(Object.entries(k(n,c,y.Commands.Context,!1)).forEach(([e,t])=>{t&&!s[e]&&(s[e]=[t,l])}),++l),c=L(n,c);return[o,s]}function P(e,t,n){e.querySelectorAll(t).forEach(n)}function T(e,t=";"){if(!e)return[];const n=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(n)||[]}function R(e){const[t,n]=e.split(/:(.+)/,2);return[g(t),g(n)]}function W(e){const[t,n]=e.split("(",2);return[t,n?n.slice(0,-1):""]}import{isVisible as I}from"@walkeros/web-core";var M=new WeakMap,N=new WeakMap,q=new WeakMap;function B(e){const t=Date.now();let n=N.get(e);return(!n||t-n.lastChecked>500)&&(n={isVisible:I(e),lastChecked:t},N.set(e,n)),n.isVisible}function D(e){if(window.IntersectionObserver)return m(()=>new window.IntersectionObserver(t=>{t.forEach(t=>{!function(e,t){var n,r;const o=t.target,s=q.get(e);if(!s)return;const i=s.timers.get(o);if(t.intersectionRatio>0){const r=Date.now();let c=M.get(o);(!c||r-c.lastChecked>1e3)&&(c={isLarge:o.offsetHeight>window.innerHeight,lastChecked:r},M.set(o,c));if(t.intersectionRatio>=.5||c.isLarge&&B(o)){const t=null==(n=s.elementConfigs)?void 0:n.get(o);if((null==t?void 0:t.multiple)&&t.blocked)return;if(!i){const t=window.setTimeout(async()=>{var t,n;if(B(o)){const r=null==(t=s.elementConfigs)?void 0:t.get(o);(null==r?void 0:r.context)&&await oe(r.context,o,r.trigger);const i=null==(n=s.elementConfigs)?void 0:n.get(o);(null==i?void 0:i.multiple)?i.blocked=!0:function(e,t){const n=q.get(e);if(!n)return;n.observer&&n.observer.unobserve(t);const r=n.timers.get(t);r&&(clearTimeout(r),n.timers.delete(t)),M.delete(t),N.delete(t)}(e,o)}},s.duration);s.timers.set(o,t)}return}}i&&(clearTimeout(i),s.timers.delete(o));const c=null==(r=s.elementConfigs)?void 0:r.get(o);(null==c?void 0:c.multiple)&&(c.blocked=!1)}(e,t)})},{rootMargin:"0px",threshold:[0,.5]}),()=>{})()}function H(e,t,n={multiple:!1}){var r;const o=e.settings.scope||document,s=q.get(o);(null==s?void 0:s.observer)&&t&&(s.elementConfigs||(s.elementConfigs=new WeakMap),s.elementConfigs.set(t,{multiple:null!=(r=n.multiple)&&r,blocked:!1,context:e,trigger:n.multiple?"visible":"impression"}),s.observer.observe(t))}function G(e){if(!e)return;const t=q.get(e);t&&(t.observer&&t.observer.disconnect(),q.delete(e))}function U(e,t,n,r,o,s,i){const{elb:c,settings:a}=e;if(f(t)&&t.startsWith("walker "))return c(t,n);if(u(t)){const e=t;return e.source||(e.source=Y()),e.globals||(e.globals=O(a.prefix,a.scope||document)),c(e)}const[d]=String(u(t)?t.name:t).split(" ");let m,g=u(n)?n:{},p={},h=!1;if(l(n)&&(m=n,h=!0),l(o)?m=o:u(o)&&Object.keys(o).length&&(p=o),m){const e=C(a.prefix||"data-elb",m).find(e=>e.entity===d);e&&(h&&(g=e.data),p=e.context)}"page"===d&&(g.id=g.id||window.location.pathname);const b=O(a.prefix,a.scope);return c({name:String(t||""),data:g,context:p,globals:b,nested:s,custom:i,trigger:f(r)?r:"",source:Y()})}function Y(){return{type:"browser",id:window.location.href,previous_id:document.referrer}}var F,V=[],X="click",z="hover",_="load",J="pulse",K="scroll",Q="submit",Z="impression",ee="visible",te="wait";function ne(e,t){if(!t.scope)return;!function(e,t){const n=t.scope;if(!n)return;n.addEventListener("click",m(function(t){ie.call(this,e,t)})),n.addEventListener("submit",m(function(t){ce.call(this,e,t)}))}(e,t)}function re(e,t){if(!t.scope)return;!function(e,t){const n=t.scope;V=[];const r=n||document;G(r),function(e,t=1e3){q.has(e)||q.set(e,{observer:D(e),timers:new WeakMap,duration:t})}(r,1e3);const o=w(t.prefix,p.Commands.Action,!1);r!==document&&se(e,r,o,t);r.querySelectorAll(`[${o}]`).forEach(n=>{se(e,n,o,t)}),V.length&&function(e,t){const n=(e,t)=>e.filter(([e,n])=>{const r=window.scrollY+window.innerHeight,o=e.offsetTop;if(r<o)return!0;const s=e.clientHeight;return!(100*(1-(o+s-r)/(s||1))>=n)||(oe(t,e,K),!1)});F||(F=function(e,t=1e3){let n=null;return function(...r){if(null===n)return n=setTimeout(()=>{n=null},t),e(...r)}}(function(){V=n.call(t,V,e)}),t.addEventListener("scroll",F))}(e,r)}(e,t)}async function oe(e,t,n){const r=E(t,n,e.settings.prefix);return Promise.all(r.map(t=>U(e,{name:`${t.entity} ${t.action}`,...t,trigger:n})))}function se(e,t,n,r){const o=b(t,n);o&&Object.values(A(o)).forEach(n=>n.forEach(n=>{switch(n.trigger){case z:!function(e,t){t.addEventListener("mouseenter",m(function(t){t.target instanceof Element&&oe(e,t.target,z)}))}(e,t);break;case _:!function(e,t){oe(e,t,_)}(e,t);break;case J:!function(e,t,n=""){setInterval(()=>{document.hidden||oe(e,t,J)},parseInt(n||"")||15e3)}(e,t,n.triggerParams);break;case K:!function(e,t=""){const n=parseInt(t||"")||50;if(n<0||n>100)return;V.push([e,n])}(t,n.triggerParams);break;case Z:H(e,t);break;case ee:H(e,t,{multiple:!0});break;case te:!function(e,t,n=""){setTimeout(()=>oe(e,t,te),parseInt(n||"")||15e3)}(e,t,n.triggerParams)}}))}function ie(e,t){oe(e,t.target,X)}function ce(e,t){t.target&&oe(e,t.target,Q)}function ae(e,t={}){const n=t.name||"elbLayer",r=t.window||window;if(!r)return;const o=r;o[n]||(o[n]=[]);const s=o[n];s.push=function(...n){if(fe(n[0])){const r=[...Array.from(n[0])],o=Array.prototype.push.apply(this,[r]);return ue(e,t.prefix,r),o}const r=Array.prototype.push.apply(this,n);return n.forEach(n=>{ue(e,t.prefix,n)}),r},Array.isArray(s)&&s.length>0&&function(e,t="data-elb",n){le(e,t,n,!0),le(e,t,n,!1),n.length=0}(e,t.prefix,s)}function le(e,t,n,r){const o=[];let s=!0;n.forEach(e=>{const t=fe(e)?[...Array.from(e)]:null!=(n=e)&&"object"==typeof n&&"length"in n&&"number"==typeof n.length?Array.from(e):[e];var n;if(Array.isArray(t)&&0===t.length)return;if(Array.isArray(t)&&1===t.length&&!t[0])return;const i=t[0],c=!u(i)&&f(i)&&i.startsWith("walker ");if(u(i)){if("object"==typeof i&&0===Object.keys(i).length)return}else{const e=Array.from(t);if(!f(e[0])||""===e[0].trim())return;const n="walker run";s&&e[0]===n&&(s=!1)}(r&&c||!r&&!c)&&o.push(t)}),o.forEach(n=>{ue(e,t,n)})}function ue(e,t="data-elb",n){m(()=>{if(Array.isArray(n)){const[r,...o]=n;if(!r||f(r)&&""===r.trim())return;if(f(r)&&r.startsWith("walker "))return void e(r,o[0]);U({elb:e,settings:{prefix:t,scope:document,pageview:!1,session:!1,elb:"",elbLayer:!1}},r,...o)}else if(n&&"object"==typeof n){if(0===Object.keys(n).length)return;e(n)}},()=>{})()}function fe(e){return null!=e&&"object"==typeof e&&"[object Arguments]"===Object.prototype.toString.call(e)}import{sessionStart as de}from"@walkeros/web-core";function me(e,t={},n){return de({...t,collector:{push:e,group:void 0,command:n}})}var ge={},pe={};t(pe,{env:()=>he});var he={};t(he,{push:()=>we});var be=()=>{},ye=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),ve={error:be,info:be,debug:be,throw:e=>{throw"string"==typeof e?new Error(e):e},scope:()=>ve},we={get push(){return ye()},get command(){return ye()},get elb(){return ye()},get window(){return{addEventListener:be,removeEventListener:be,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:be,removeEventListener:be,querySelector:be,querySelectorAll:()=>[],getElementById:be,getElementsByClassName:()=>[],getElementsByTagName:()=>[],createElement:()=>({setAttribute:be,getAttribute:be,addEventListener:be,removeEventListener:be}),body:{appendChild:be,removeChild:be},documentElement:{scrollTop:0,scrollLeft:0},readyState:"complete",title:"Test Page",referrer:"",cookie:""}},logger:ve};function ke(e={}){const t=e.prefix||"data-elb";return function(e){let n,r=e;const o={},s={},i={},c={},l={},u={};function d(e){return Object.entries(e).map(([e,t])=>`${e}:${function(e){if(!a(e)||null===e)return"undefined";let t=String(e);return t=t.replace(/\\/g,"\\\\"),t=t.replace(/;/g,"\\;"),t=t.replace(/:/g,"\\:"),t=t.replace(/'/g,"\\'"),t}(t)}`).join(";")}const m={entity:e=>(n=e,r=e,m),data(e,t){const n=null!=r?r:"";return o[n]||(o[n]={}),f(e)?o[n][e]=t:Object.assign(o[n],e),m},action(e,t){if(f(e))if(a(t))s[e]=t;else if(e.includes(":")){const[t,n]=e.split(":",2);s[t]=n}else s[e]=e;else Object.assign(s,e);return m},actions(e,t){if(f(e))if(a(t))i[e]=t;else if(e.includes(":")){const[t,n]=e.split(":",2);i[t]=n}else i[e]=e;else Object.assign(i,e);return m},context:(e,t)=>(f(e)?c[e]=t:Object.assign(c,e),m),globals:(e,t)=>(f(e)?l[e]=t:Object.assign(l,e),m),link:(e,t)=>(f(e)?u[e]=t:Object.assign(u,e),m),get(){const e={};return n&&(e[t]=n),Object.entries(o).forEach(([n,r])=>{if(Object.keys(r).length>0){e[n?`${t}-${n}`:`${t}-`]=d(r)}}),Object.keys(s).length>0&&(e[`${t}action`]=d(s)),Object.keys(i).length>0&&(e[`${t}actions`]=d(i)),Object.keys(c).length>0&&(e[`${t}context`]=d(c)),Object.keys(l).length>0&&(e[`${t}globals`]=d(l)),Object.keys(u).length>0&&(e[`${t}link`]=d(u)),e}};return m}}var xe=async(e,t)=>{const{elb:n,command:r,window:o,document:s}=t,i=(null==e?void 0:e.settings)||{},c=o||(void 0!==globalThis.window?globalThis.window:void 0),a=s||(void 0!==globalThis.document?globalThis.document:void 0),l=function(e={},t){return{prefix:"data-elb",pageview:!0,session:!0,elb:"elb",elbLayer:"elbLayer",scope:t||void 0,...e}}(i,a),u={settings:l},d={elb:n,settings:l};if(c&&a){if(!1!==l.elbLayer&&n&&ae(n,{name:f(l.elbLayer)?l.elbLayer:"elbLayer",prefix:l.prefix,window:c}),l.session&&n){const e="boolean"==typeof l.session?{}:l.session;me(n,e,r)}await async function(e,t,n){const r=()=>{e(t,n)};"loading"!==document.readyState?r():document.addEventListener("DOMContentLoaded",r)}(ne,d,l);(()=>{if(re(d,l),l.pageview){const[e,t]=j(l.prefix||"data-elb",l.scope);U(d,"page view",e,"load",t)}})(),f(l.elb)&&l.elb&&(c[l.elb]=(...e)=>{const[t,n,r,o,s,i]=e;return U(d,t,n,r,o,s,i)})}return{type:"browser",config:u,push:(...e)=>{const[t,n,r,o,s,i]=e;return U(d,t,n,r,o,s,i)},destroy:async()=>{a&&G(l.scope||a)},on:async(e,t)=>{switch(e){case"consent":if(l.session&&t&&n){const e="boolean"==typeof l.session?{}:l.session;me(n,e,r)}break;case"session":case"ready":default:break;case"run":if(a&&c&&(re(d,l),l.pageview)){const[e,t]=j(l.prefix||"data-elb",l.scope);U(d,"page view",e,"load",t)}}}}},Ee=xe;export{ge as SourceBrowser,ke as createTagger,Ee as default,pe as examples,x as getAllEvents,w as getElbAttributeName,k as getElbValues,E as getEvents,O as getGlobals,xe as sourceBrowser};//# sourceMappingURL=index.mjs.map
1
+ var e=Object.defineProperty,t=(t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})},n=Object.defineProperty;((e,t)=>{for(var r in t)n(e,r,{get:t[r],enumerable:!0})})({},{Level:()=>o});var r,o=((r=o||{})[r.ERROR=0]="ERROR",r[r.INFO=1]="INFO",r[r.DEBUG=2]="DEBUG",r),s={merge:!0,shallow:!0,extend:!0};function i(e,t={},n={}){n={...s,...n};const r=Object.entries(t).reduce((t,[r,o])=>{const s=e[r];return n.merge&&Array.isArray(s)&&Array.isArray(o)?t[r]=o.reduce((e,t)=>e.includes(t)?e:[...e,t],[...s]):(n.extend||r in e)&&(t[r]=o),t},{});return n.shallow?{...e,...r}:(Object.assign(e,r),e)}function c(e){return Array.isArray(e)}function a(e){return void 0!==e}function l(e){return e===document||e instanceof Element}function u(e){return"object"==typeof e&&null!==e&&!c(e)&&"[object Object]"===Object.prototype.toString.call(e)}function f(e){return"string"==typeof e}function d(e){if("true"===e)return!0;if("false"===e)return!1;const t=Number(e);return e==t&&""!==e?t:String(e)}function m(e,t,n){return function(...r){try{return e(...r)}catch(e){if(!t)return;return t(e)}finally{null==n||n()}}}function g(e){return e?e.trim().replace(/^'|'$/g,"").trim():""}import{Const as p}from"@walkeros/collector";import{elb as h,getAttribute as b}from"@walkeros/web-core";import{Const as y}from"@walkeros/collector";import{getAttribute as v}from"@walkeros/web-core";function w(e,t,n=!0){return e+(t=null!=t?(n?"-":"")+t:"")}function k(e,t,n,r=!0){return T(v(t,w(e,n,r))||"").reduce((e,n)=>{let[r,o]=R(n);if(!r)return e;if(o||(r.endsWith(":")&&(r=r.slice(0,-1)),o=""),o.startsWith("#")){o=o.slice(1);try{let e=t[o];e||"selected"!==o||(e=t.options[t.selectedIndex].text),o=String(e)}catch(e){o=""}}return r.endsWith("[]")?(r=r.slice(0,-2),c(e[r])||(e[r]=[]),e[r].push(d(o))):e[r]=d(o),e},{})}function x(e,t=y.Commands.Prefix){var n;const r=e||document.body;if(!r)return[];let o=[];const s=y.Commands.Action,i=`[${w(t,s,!1)}]`,c=e=>{Object.keys(k(t,e,s,!1)).forEach(n=>{o=o.concat(E(e,n,t))})};return r!==document&&(null==(n=r.matches)?void 0:n.call(r,i))&&c(r),P(r,i,c),o}function E(e,t,n=y.Commands.Prefix){const r=[],{actions:o,nearestOnly:s}=function(e,t,n){let r=t;for(;r;){const t=v(r,w(e,y.Commands.Actions,!1));if(t){const e=A(t);if(e[n])return{actions:e[n],nearestOnly:!1}}const o=v(r,w(e,y.Commands.Action,!1));if(o){const e=A(o);if(e[n]||"click"!==n)return{actions:e[n]||[],nearestOnly:!0}}r=L(e,r)}return{actions:[],nearestOnly:!1}}(n,e,t);return o.length?(o.forEach(o=>{const i=T(o.actionParams||"",",").reduce((e,t)=>(e[g(t)]=!0,e),{}),c=C(n,e,i,s);if(!c.length){const t="page",r=`[${w(n,t)}]`,[o,s]=S(e,r,n,t);c.push({entity:t,data:o,nested:[],context:s})}c.forEach(e=>{r.push({entity:e.entity,action:o.action,data:e.data,trigger:t,context:e.context,nested:e.nested})})}),r):r}function O(e=y.Commands.Prefix,t=document){const n=w(e,y.Commands.Globals,!1);let r={};return P(t,`[${n}]`,t=>{r=i(r,k(e,t,y.Commands.Globals,!1))}),r}function j(e,t){const n=window.location,r="page",o=t===document?document.body:t,[s,i]=S(o,`[${w(e,r)}]`,e,r);return s.domain=n.hostname,s.title=document.title,s.referrer=document.referrer,n.search&&(s.search=n.search),n.hash&&(s.hash=n.hash),[s,i]}function A(e){const t={};return T(e).forEach(e=>{const[n,r]=R(e),[o,s]=W(n);if(!o)return;let[i,c]=W(r||"");i=i||o,t[o]||(t[o]=[]),t[o].push({trigger:o,triggerParams:s,action:i,actionParams:c})}),t}function C(e,t,n,r=!1){const o=[];let s=t;for(n=0!==Object.keys(n||{}).length?n:void 0;s;){const i=$(e,s,t,n);if(i&&(o.push(i),r))break;s=L(e,s)}return o}function $(e,t,n,r){const o=v(t,w(e));if(!o||r&&!r[o])return null;const s=[t],c=`[${w(e,o)}],[${w(e,"")}]`,a=w(e,y.Commands.Link,!1);let l={};const u=[],[f,d]=S(n||t,c,e,o);P(t,`[${a}]`,t=>{const[n,r]=R(v(t,a));"parent"===r&&P(document.body,`[${a}="${n}:child"]`,t=>{s.push(t);const n=$(e,t);n&&u.push(n)})});const m=[];s.forEach(e=>{e.matches(c)&&m.push(e),P(e,c,e=>m.push(e))});let g={};return m.forEach(t=>{g=i(g,k(e,t,"")),l=i(l,k(e,t,o))}),l=i(i(g,l),f),s.forEach(t=>{P(t,`[${w(e)}]`,t=>{const n=$(e,t);n&&u.push(n)})}),{entity:o,data:l,context:d,nested:u}}function L(e,t){const n=w(e,y.Commands.Link,!1);if(t.matches(`[${n}]`)){const[e,r]=R(v(t,n));if("child"===r)return document.querySelector(`[${n}="${e}:parent"]`)}return!t.parentElement&&t.getRootNode&&t.getRootNode()instanceof ShadowRoot?t.getRootNode().host:t.parentElement}function S(e,t,n,r){let o={};const s={};let c=e;const a=`[${w(n,y.Commands.Context,!1)}]`;let l=0;for(;c;)c.matches(t)&&(o=i(k(n,c,""),o),o=i(k(n,c,r),o)),c.matches(a)&&(Object.entries(k(n,c,y.Commands.Context,!1)).forEach(([e,t])=>{t&&!s[e]&&(s[e]=[t,l])}),++l),c=L(n,c);return[o,s]}function P(e,t,n){e.querySelectorAll(t).forEach(n)}function T(e,t=";"){if(!e)return[];const n=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(n)||[]}function R(e){const[t,n]=e.split(/:(.+)/,2);return[g(t),g(n)]}function W(e){const[t,n]=e.split("(",2);return[t,n?n.slice(0,-1):""]}import{isVisible as I}from"@walkeros/web-core";var M=new WeakMap,N=new WeakMap,q=new WeakMap;function B(e){const t=Date.now();let n=N.get(e);return(!n||t-n.lastChecked>500)&&(n={isVisible:I(e),lastChecked:t},N.set(e,n)),n.isVisible}function D(e){if(window.IntersectionObserver)return m(()=>new window.IntersectionObserver(t=>{t.forEach(t=>{!function(e,t){var n,r;const o=t.target,s=q.get(e);if(!s)return;const i=s.timers.get(o);if(t.intersectionRatio>0){const r=Date.now();let c=M.get(o);(!c||r-c.lastChecked>1e3)&&(c={isLarge:o.offsetHeight>window.innerHeight,lastChecked:r},M.set(o,c));if(t.intersectionRatio>=.5||c.isLarge&&B(o)){const t=null==(n=s.elementConfigs)?void 0:n.get(o);if((null==t?void 0:t.multiple)&&t.blocked)return;if(!i){const t=window.setTimeout(async()=>{var t,n;if(B(o)){const r=null==(t=s.elementConfigs)?void 0:t.get(o);(null==r?void 0:r.context)&&await oe(r.context,o,r.trigger);const i=null==(n=s.elementConfigs)?void 0:n.get(o);(null==i?void 0:i.multiple)?i.blocked=!0:function(e,t){const n=q.get(e);if(!n)return;n.observer&&n.observer.unobserve(t);const r=n.timers.get(t);r&&(clearTimeout(r),n.timers.delete(t)),M.delete(t),N.delete(t)}(e,o)}},s.duration);s.timers.set(o,t)}return}}i&&(clearTimeout(i),s.timers.delete(o));const c=null==(r=s.elementConfigs)?void 0:r.get(o);(null==c?void 0:c.multiple)&&(c.blocked=!1)}(e,t)})},{rootMargin:"0px",threshold:[0,.5]}),()=>{})()}function H(e,t,n={multiple:!1}){var r;const o=e.settings.scope||document,s=q.get(o);(null==s?void 0:s.observer)&&t&&(s.elementConfigs||(s.elementConfigs=new WeakMap),s.elementConfigs.set(t,{multiple:null!=(r=n.multiple)&&r,blocked:!1,context:e,trigger:n.multiple?"visible":"impression"}),s.observer.observe(t))}function G(e){if(!e)return;const t=q.get(e);t&&(t.observer&&t.observer.disconnect(),q.delete(e))}function U(e,t,n,r,o,s,i){const{elb:c,settings:a}=e;if(f(t)&&t.startsWith("walker "))return c(t,n);if(u(t)){const e=t;return e.source||(e.source=Y()),e.globals||(e.globals=O(a.prefix,a.scope||document)),c(e)}const[d]=String(u(t)?t.name:t).split(" ");let m,g=u(n)?n:{},p={},h=!1;if(l(n)&&(m=n,h=!0),l(o)?m=o:u(o)&&Object.keys(o).length&&(p=o),m){const e=C(a.prefix||"data-elb",m).find(e=>e.entity===d);e&&(h&&(g=e.data),p=e.context)}"page"===d&&(g.id=g.id||window.location.pathname);const b=O(a.prefix,a.scope);return c({name:String(t||""),data:g,context:p,globals:b,nested:s,custom:i,trigger:f(r)?r:"",source:Y()})}function Y(){return{type:"browser",id:window.location.href,previous_id:document.referrer}}var F,V=[],X="click",z="hover",_="load",J="pulse",K="scroll",Q="submit",Z="impression",ee="visible",te="wait";function ne(e,t){if(!t.scope)return;!function(e,t){const n=t.scope;if(!n)return;n.addEventListener("click",m(function(t){ie.call(this,e,t)})),n.addEventListener("submit",m(function(t){ce.call(this,e,t)}))}(e,t)}function re(e,t){if(!t.scope)return;!function(e,t){const n=t.scope;V=[];const r=n||document;G(r),function(e,t=1e3){q.has(e)||q.set(e,{observer:D(e),timers:new WeakMap,duration:t})}(r,1e3);const o=w(t.prefix,p.Commands.Action,!1);r!==document&&se(e,r,o,t);r.querySelectorAll(`[${o}]`).forEach(n=>{se(e,n,o,t)}),V.length&&function(e,t){const n=(e,t)=>e.filter(([e,n])=>{const r=window.scrollY+window.innerHeight,o=e.offsetTop;if(r<o)return!0;const s=e.clientHeight;return!(100*(1-(o+s-r)/(s||1))>=n)||(oe(t,e,K),!1)});F||(F=function(e,t=1e3){let n=null;return function(...r){if(null===n)return n=setTimeout(()=>{n=null},t),e(...r)}}(function(){V=n.call(t,V,e)}),t.addEventListener("scroll",F))}(e,r)}(e,t)}async function oe(e,t,n){const r=E(t,n,e.settings.prefix);return Promise.all(r.map(t=>U(e,{name:`${t.entity} ${t.action}`,...t,trigger:n})))}function se(e,t,n,r){const o=b(t,n);o&&Object.values(A(o)).forEach(n=>n.forEach(n=>{switch(n.trigger){case z:!function(e,t){t.addEventListener("mouseenter",m(function(t){t.target instanceof Element&&oe(e,t.target,z)}))}(e,t);break;case _:!function(e,t){oe(e,t,_)}(e,t);break;case J:!function(e,t,n=""){setInterval(()=>{document.hidden||oe(e,t,J)},parseInt(n||"")||15e3)}(e,t,n.triggerParams);break;case K:!function(e,t=""){const n=parseInt(t||"")||50;if(n<0||n>100)return;V.push([e,n])}(t,n.triggerParams);break;case Z:H(e,t);break;case ee:H(e,t,{multiple:!0});break;case te:!function(e,t,n=""){setTimeout(()=>oe(e,t,te),parseInt(n||"")||15e3)}(e,t,n.triggerParams)}}))}function ie(e,t){oe(e,t.target,X)}function ce(e,t){t.target&&oe(e,t.target,Q)}function ae(e,t={}){const n=t.name||"elbLayer",r=t.window||window;if(!r)return;const o=r;o[n]||(o[n]=[]);const s=o[n];s.push=function(...n){if(fe(n[0])){const r=[...Array.from(n[0])],o=Array.prototype.push.apply(this,[r]);return ue(e,t.prefix,r),o}const r=Array.prototype.push.apply(this,n);return n.forEach(n=>{ue(e,t.prefix,n)}),r},Array.isArray(s)&&s.length>0&&function(e,t="data-elb",n){le(e,t,n,!0),le(e,t,n,!1),n.length=0}(e,t.prefix,s)}function le(e,t,n,r){const o=[];let s=!0;n.forEach(e=>{const t=fe(e)?[...Array.from(e)]:null!=(n=e)&&"object"==typeof n&&"length"in n&&"number"==typeof n.length?Array.from(e):[e];var n;if(Array.isArray(t)&&0===t.length)return;if(Array.isArray(t)&&1===t.length&&!t[0])return;const i=t[0],c=!u(i)&&f(i)&&i.startsWith("walker ");if(u(i)){if("object"==typeof i&&0===Object.keys(i).length)return}else{const e=Array.from(t);if(!f(e[0])||""===e[0].trim())return;const n="walker run";s&&e[0]===n&&(s=!1)}(r&&c||!r&&!c)&&o.push(t)}),o.forEach(n=>{ue(e,t,n)})}function ue(e,t="data-elb",n){m(()=>{if(Array.isArray(n)){const[r,...o]=n;if(!r||f(r)&&""===r.trim())return;if(f(r)&&r.startsWith("walker "))return void e(r,o[0]);U({elb:e,settings:{prefix:t,scope:document,pageview:!1,session:!1,elb:"",elbLayer:!1}},r,...o)}else if(n&&"object"==typeof n){if(0===Object.keys(n).length)return;e(n)}},()=>{})()}function fe(e){return null!=e&&"object"==typeof e&&"[object Arguments]"===Object.prototype.toString.call(e)}import{sessionStart as de}from"@walkeros/web-core";function me(e,t={},n){return de({...t,collector:{push:e,group:void 0,command:n}})}var ge={},pe={};t(pe,{env:()=>he});var he={};t(he,{push:()=>we});var be=()=>{},ye=()=>()=>Promise.resolve({ok:!0}),ve={error:be,info:be,debug:be,throw:e=>{throw"string"==typeof e?new Error(e):e},scope:()=>ve},we={get push(){return ye()},get command(){return ye()},get elb(){return ye()},get window(){return{addEventListener:be,removeEventListener:be,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:be,removeEventListener:be,querySelector:be,querySelectorAll:()=>[],getElementById:be,getElementsByClassName:()=>[],getElementsByTagName:()=>[],createElement:()=>({setAttribute:be,getAttribute:be,addEventListener:be,removeEventListener:be}),body:{appendChild:be,removeChild:be},documentElement:{scrollTop:0,scrollLeft:0},readyState:"complete",title:"Test Page",referrer:"",cookie:""}},logger:ve};function ke(e={}){const t=e.prefix||"data-elb";return function(e){let n,r=e;const o={},s={},i={},c={},l={},u={};function d(e){return Object.entries(e).map(([e,t])=>`${e}:${function(e){if(!a(e)||null===e)return"undefined";let t=String(e);return t=t.replace(/\\/g,"\\\\"),t=t.replace(/;/g,"\\;"),t=t.replace(/:/g,"\\:"),t=t.replace(/'/g,"\\'"),t}(t)}`).join(";")}const m={entity:e=>(n=e,r=e,m),data(e,t){const n=null!=r?r:"";return o[n]||(o[n]={}),f(e)?o[n][e]=t:Object.assign(o[n],e),m},action(e,t){if(f(e))if(a(t))s[e]=t;else if(e.includes(":")){const[t,n]=e.split(":",2);s[t]=n}else s[e]=e;else Object.assign(s,e);return m},actions(e,t){if(f(e))if(a(t))i[e]=t;else if(e.includes(":")){const[t,n]=e.split(":",2);i[t]=n}else i[e]=e;else Object.assign(i,e);return m},context:(e,t)=>(f(e)?c[e]=t:Object.assign(c,e),m),globals:(e,t)=>(f(e)?l[e]=t:Object.assign(l,e),m),link:(e,t)=>(f(e)?u[e]=t:Object.assign(u,e),m),get(){const e={};return n&&(e[t]=n),Object.entries(o).forEach(([n,r])=>{if(Object.keys(r).length>0){e[n?`${t}-${n}`:`${t}-`]=d(r)}}),Object.keys(s).length>0&&(e[`${t}action`]=d(s)),Object.keys(i).length>0&&(e[`${t}actions`]=d(i)),Object.keys(c).length>0&&(e[`${t}context`]=d(c)),Object.keys(l).length>0&&(e[`${t}globals`]=d(l)),Object.keys(u).length>0&&(e[`${t}link`]=d(u)),e}};return m}}var xe=async e=>{const{config:t,env:n}=e,{elb:r,command:o,window:s,document:i}=n,c=(null==t?void 0:t.settings)||{},a=s||(void 0!==globalThis.window?globalThis.window:void 0),l=i||(void 0!==globalThis.document?globalThis.document:void 0),u=function(e={},t){return{prefix:"data-elb",pageview:!0,session:!0,elb:"elb",elbLayer:"elbLayer",scope:t||void 0,...e}}(c,l),d={settings:u},m={elb:r,settings:u};if(a&&l){if(!1!==u.elbLayer&&r&&ae(r,{name:f(u.elbLayer)?u.elbLayer:"elbLayer",prefix:u.prefix,window:a}),u.session&&r){const e="boolean"==typeof u.session?{}:u.session;me(r,e,o)}await async function(e,t,n){const r=()=>{e(t,n)};"loading"!==document.readyState?r():document.addEventListener("DOMContentLoaded",r)}(ne,m,u);(()=>{if(re(m,u),u.pageview){const[e,t]=j(u.prefix||"data-elb",u.scope);U(m,"page view",e,"load",t)}})(),f(u.elb)&&u.elb&&(a[u.elb]=(...e)=>{const[t,n,r,o,s,i]=e;return U(m,t,n,r,o,s,i)})}return{type:"browser",config:d,push:(...e)=>{const[t,n,r,o,s,i]=e;return U(m,t,n,r,o,s,i)},destroy:async()=>{l&&G(u.scope||l)},on:async(e,t)=>{switch(e){case"consent":if(u.session&&t&&r){const e="boolean"==typeof u.session?{}:u.session;me(r,e,o)}break;case"session":case"ready":default:break;case"run":if(l&&a&&(re(m,u),u.pageview)){const[e,t]=j(u.prefix||"data-elb",u.scope);U(m,"page view",e,"load",t)}}}}},Ee=xe;export{ge as SourceBrowser,ke as createTagger,Ee as default,pe as examples,x as getAllEvents,w as getElbAttributeName,k as getElbValues,E as getEvents,O as getGlobals,xe as sourceBrowser};//# sourceMappingURL=index.mjs.map