@walkeros/web-source-browser 0.0.9 → 0.1.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/tagger.ts","../src/index.ts"],"sourcesContent":["import type { WalkerOS, Collector } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope, Settings } 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 Visible: 'visible',\n Visibles: 'visibles',\n Wait: 'wait',\n} as const;\n\nexport async function ready(\n fn: (collector: Collector.Instance, settings: any) => void,\n collector: Collector.Instance,\n settings: any,\n): Promise<void> {\n const readyFn = () => {\n fn(collector, settings);\n // Only call onApply if collector has the on property\n if (collector?.on) {\n try {\n onApply(collector, 'ready');\n } catch (error) {\n // Don't throw - this is not critical for functionality\n }\n }\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(\n collector: Collector.Instance,\n settings: Required<Settings>,\n) {\n const { scope, prefix } = settings;\n initGlobalTrigger(collector, scope as Scope, prefix);\n}\n\n// Called on each walker run to process load triggers\nexport function processLoadTriggers(\n collector: Collector.Instance,\n settings: Required<Settings>,\n) {\n const { prefix, scope } = settings;\n initScopeTrigger(collector, prefix, scope as Scope);\n}\n\nexport function initGlobalTrigger(\n collector: Collector.Instance,\n scope: Scope,\n prefix: string,\n): void {\n scope.addEventListener(\n 'click',\n tryCatch(function (this: Scope, ev: unknown) {\n triggerClick.call(this, collector, ev as MouseEvent, prefix);\n }) as EventListener,\n );\n scope.addEventListener(\n 'submit',\n tryCatch(function (this: Scope, ev: unknown) {\n triggerSubmit.call(this, collector, ev as SubmitEvent, prefix);\n }) as EventListener,\n );\n}\n\nexport function initScopeTrigger(\n collector: Collector.Instance,\n prefix: string,\n elem?: 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 destroyVisibilityTracking(collector);\n\n // Initialize visibility tracking for this collector\n initVisibilityTracking(collector, 1000);\n\n // default data-elbaction\n const selectorAction = getElbAttributeName(\n prefix,\n Const.Commands.Action,\n false,\n );\n\n const scope = elem || document;\n if (scope !== document) {\n // Handle the elements action(s), too\n handleActionElem(collector, scope as HTMLElement, selectorAction, prefix);\n }\n\n // Handle all children action(s)\n const elements = scope.querySelectorAll<HTMLElement>(`[${selectorAction}]`);\n\n elements.forEach((elem) => {\n handleActionElem(collector, elem, selectorAction, prefix);\n });\n\n if (scrollElements.length) scroll(collector, scope, prefix);\n}\n\nexport async function handleTrigger(\n collector: Collector.Instance,\n prefix: string,\n element: Element,\n trigger: string,\n // @TODO add triggerParams to filter for specific trigger\n): Promise<unknown[]> {\n const events = getEvents(element, trigger, prefix);\n return Promise.all(\n events.map((event: Walker.Event) =>\n translateToCoreCollector(collector, prefix, {\n event: `${event.entity} ${event.action}`,\n ...event,\n trigger,\n }),\n ),\n );\n}\n\nfunction handleActionElem(\n collector: Collector.Instance,\n elem: HTMLElement,\n selectorAction: string,\n prefix: string,\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(collector, elem, prefix);\n break;\n case Triggers.Load:\n triggerLoad(collector, elem, prefix);\n break;\n case Triggers.Pulse:\n triggerPulse(collector, elem, triggerAction.triggerParams, prefix);\n break;\n case Triggers.Scroll:\n triggerScroll(elem, triggerAction.triggerParams);\n break;\n case Triggers.Visible:\n triggerVisible(collector, elem, { prefix });\n break;\n case Triggers.Visibles:\n triggerVisible(collector, elem, { multiple: true, prefix });\n break;\n case Triggers.Wait:\n triggerWait(collector, elem, triggerAction.triggerParams, prefix);\n break;\n }\n }),\n );\n}\n\nfunction triggerClick(\n collector: Collector.Instance,\n ev: MouseEvent,\n prefix: string,\n) {\n handleTrigger(collector, prefix, ev.target as Element, Triggers.Click);\n}\n\nfunction triggerHover(\n collector: Collector.Instance,\n elem: HTMLElement,\n prefix: string,\n) {\n elem.addEventListener(\n 'mouseenter',\n tryCatch(function (this: Document, ev: MouseEvent) {\n if (ev.target instanceof Element)\n handleTrigger(collector, prefix, ev.target, Triggers.Hover);\n }),\n );\n}\n\nfunction triggerLoad(\n collector: Collector.Instance,\n elem: HTMLElement,\n prefix: string,\n) {\n handleTrigger(collector, prefix, elem, Triggers.Load);\n}\n\nfunction triggerPulse(\n collector: Collector.Instance,\n elem: HTMLElement,\n triggerParams: string = '',\n prefix: string,\n) {\n setInterval(\n () => {\n // Only trigger when tab is active\n if (!document.hidden)\n handleTrigger(collector, prefix, 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(\n collector: Collector.Instance,\n ev: SubmitEvent,\n prefix: string,\n) {\n if (ev.target) {\n handleTrigger(collector, prefix, ev.target as Element, Triggers.Submit);\n }\n}\n\nfunction triggerWait(\n collector: Collector.Instance,\n elem: HTMLElement,\n triggerParams: string = '',\n prefix: string,\n) {\n setTimeout(\n () => handleTrigger(collector, prefix, elem, Triggers.Wait),\n parseInt(triggerParams || '') || 15000,\n );\n}\n\nfunction scroll(collector: Collector.Instance, scope: Scope, prefix: string) {\n const scrolling = (\n scrollElements: Walker.ScrollElements,\n collector: Collector.Instance,\n prefix: string,\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(collector, prefix, 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, collector, prefix);\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 = document.body,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\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 (scope !== document && (scope as Element).matches(actionSelector)) {\n processElementEvents(scope as Element);\n }\n\n queryAll(scope, 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 an action (data-elbaction) attribute and resolve it\n const actions = resolveAttributes(prefix, target, trigger);\n\n // Stop if there's no valid action combo\n if (!actions) 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 the entities with their properties\n const entities = getEntities(prefix, target, filter);\n\n // Use page as default entity if no one was set\n if (!entities.length) {\n const type = 'page';\n // Only use explicit page properties and ignore generic properties\n const entitySelector = `[${getElbAttributeName(prefix, type)}]`;\n\n // Get matching properties from the element and its parents\n const [data, context] = getThisAndParentProperties(\n target,\n entitySelector,\n prefix,\n type,\n );\n\n entities.push({\n type, // 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 all full events\n entities.forEach((entity) => {\n events.push({\n entity: entity.type,\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): 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) entities.push(entity);\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 type = getAttribute(element, getElbAttributeName(prefix));\n\n // It's not a (valid) entity element or should be filtered\n if (!type || (filter && !filter[type])) return null;\n\n const scopeElems = [element]; // All related elements\n const dataSelector = `[${getElbAttributeName(\n prefix,\n type,\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 type,\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, type));\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 { type, 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): Walker.TriggerActions {\n let element = target as Node['parentElement'];\n\n while (element) {\n const attribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Action, false),\n );\n\n // Get action string related to trigger\n const triggerActions = getTriggerActions(attribute);\n\n // Action found on element or is not a click trigger\n // @TODO aggregate all click triggers, too\n if (triggerActions[trigger] || trigger !== 'click')\n return triggerActions[trigger];\n\n element = getParent(prefix, element);\n }\n\n return [];\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, Collector } from '@walkeros/core';\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// Visibility state interface for collector\ninterface VisibilityState {\n observer?: IntersectionObserver;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean; prefix: string }\n >;\n}\n\n// Extended collector interface with visibility state\ninterface CollectorWithVisibility extends Collector.Instance {\n _visibilityState?: VisibilityState;\n}\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 collector: Collector.Instance,\n element: HTMLElement,\n): void {\n const state = (collector as CollectorWithVisibility)._visibilityState;\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 collector\n */\nfunction createObserver(\n collector: Collector.Instance,\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(collector, 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 collector: Collector.Instance,\n entry: IntersectionObserverEntry,\n): void {\n const target = entry.target as HTMLElement;\n const state = (collector as CollectorWithVisibility)._visibilityState;\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 prefix\n const elementConfig = state.elementConfigs?.get(target);\n const prefix = elementConfig?.prefix || 'data-elb';\n\n await handleTrigger(\n collector,\n prefix,\n target as Element,\n Triggers.Visible,\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(collector, 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 collector\n */\nexport function initVisibilityTracking(\n collector: Collector.Instance,\n duration = 1000,\n): void {\n if ((collector as CollectorWithVisibility)._visibilityState) return; // Already initialized\n\n (collector as CollectorWithVisibility)._visibilityState = {\n observer: createObserver(collector),\n timers: new WeakMap(),\n duration,\n } as VisibilityState;\n}\n\n/**\n * Main trigger function for visible elements\n */\nexport function triggerVisible(\n collector: Collector.Instance,\n element: HTMLElement,\n config: { multiple?: boolean; prefix?: string } = { multiple: false },\n): void {\n const state = (collector as CollectorWithVisibility)._visibilityState;\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 prefix: config.prefix || 'data-elb',\n });\n state.observer.observe(element);\n }\n}\n\n/**\n * Destroys visibility tracking for a collector, cleaning up all resources\n */\nexport function destroyVisibilityTracking(collector: Collector.Instance): void {\n const state = (collector as CollectorWithVisibility)._visibilityState;\n if (!state) return;\n\n if (state.observer) {\n state.observer.disconnect();\n }\n\n delete (collector as CollectorWithVisibility)._visibilityState;\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 { getEntities } from './walker';\n\n// Initialize timing for performance measurements\nconst startTime = performance.now();\n\n/**\n * Translation layer that converts flexible browser source inputs\n * to the strict core collector format\n */\nexport function translateToCoreCollector(\n collector: Collector.Instance,\n prefix: string = 'data-elb',\n eventOrCommand: unknown,\n data?: BrowserPushData,\n options?: BrowserPushOptions,\n context?: BrowserPushContext,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n): Promise<Elb.PushResult> {\n // Handle walker commands - pass through directly to collector\n if (isString(eventOrCommand) && eventOrCommand.startsWith('walker ')) {\n const result = collector.push(eventOrCommand, data as WalkerOS.Properties);\n return result;\n }\n\n // Handle event objects - add source if missing\n if (isObject(eventOrCommand)) {\n const event = eventOrCommand;\n if (!event.source) event.source = getBrowserSource();\n return collector.push(event);\n }\n\n // Extract entity name from event string\n const [entity] = String(\n isObject(eventOrCommand) ? eventOrCommand.event : 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 context parameter is an element\n if (isElementOrDocument(context)) {\n elemParameter = context as Element;\n } else if (isObject(context) && Object.keys(context).length) {\n eventContext = context as WalkerOS.OrderedProperties;\n }\n\n // Extract data from element if provided\n if (elemParameter) {\n const entityObj = getEntities(prefix, elemParameter).find(\n (obj) => obj.type === entity,\n );\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 // Build unified event from various elb usage patterns\n const event: WalkerOS.DeepPartialEvent = {\n event: String(eventOrCommand || ''),\n data: eventData,\n context: eventContext,\n nested,\n custom,\n trigger: isString(options) ? options : '',\n timing: Math.round((performance.now() - startTime) / 10) / 100,\n source: getBrowserSource(),\n };\n\n return collector.push(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 } 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 collector: Collector.Instance,\n config: ELBLayerConfig & { prefix?: string } = {},\n): void {\n const layerName = config.name || 'elbLayer';\n\n // Ensure elbLayer exists on window\n if (!window[layerName]) {\n window[layerName] = [];\n }\n\n const elbLayer = window[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(collector, 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(collector, 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(collector, 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 collector: Collector.Instance,\n prefix: string = 'data-elb',\n elbLayer: ELBLayer,\n): void {\n // Process in two phases: walker commands first, then events\n processPredefined(collector, prefix, elbLayer, true); // Commands only\n processPredefined(collector, 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 collector: Collector.Instance,\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(collector, prefix, item);\n });\n}\n\n/**\n * Push command directly using collector or translation based on type\n */\nfunction pushCommand(\n collector: Collector.Instance,\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 collector.push(action, rest[0]);\n return;\n }\n\n // Regular events go through translation\n translateToCoreCollector(collector, prefix, action, ...rest);\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 collector\n collector.push(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 { WalkerOS, Collector } from '@walkeros/core';\nimport type { SessionCallback } from '@walkeros/web-core';\nimport { assign, useHooks } from '@walkeros/core';\nimport { onApply } from '@walkeros/collector';\nimport { sessionStart as sessionStartOrg } from '@walkeros/web-core';\n\nexport interface SessionStartOptions {\n config?: unknown;\n data?: Collector.SessionData;\n}\n\n// Enhanced session configuration interface\ninterface SessionConfigWithCallback {\n cb?: false | SessionCallback;\n [key: string]: unknown;\n}\n\nexport function createSessionStart(collector: Collector.Instance) {\n return function (\n options: SessionStartOptions = {},\n ): void | Collector.SessionData {\n const { config = {}, data, ...otherOptions } = options;\n return sessionStart(collector, {\n config: Object.assign({ pulse: true }, config),\n data: Object.assign({}, collector.session, {\n updated: Date.now(),\n }) as Collector.SessionData,\n ...otherOptions,\n });\n };\n}\n\nexport function sessionStart(\n collector: Collector.Instance,\n options: SessionStartOptions = {},\n): void | Collector.SessionData {\n const sessionConfig = options.config || {};\n const sessionData = assign(\n collector.config.sessionStatic || {},\n options.data || {},\n );\n\n // A wrapper for the callback\n const cb: SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n ) => {\n let result: void | undefined | Collector.SessionData;\n const configWithCb = sessionConfig as SessionConfigWithCallback;\n if (configWithCb.cb !== false && configWithCb.cb)\n // Run either the default callback or the provided one\n result = configWithCb.cb(\n session,\n collector,\n defaultCb as SessionCallback,\n );\n else if (configWithCb.cb !== false)\n // Run default callback\n result = (defaultCb as SessionCallback)(\n session,\n collector,\n defaultCb as SessionCallback,\n );\n\n // Assign the session (only if collector is available)\n if (collector) {\n collector.session = session;\n\n // Run on session events\n onApply(collector, 'session');\n }\n\n return result;\n };\n\n const session = useHooks(\n sessionStartOrg,\n 'SessionStart',\n collector.hooks,\n )({\n ...sessionConfig, // Session detection configuration\n cb, // Custom wrapper callback\n data: sessionData, // Static default session data\n collector,\n });\n\n return session;\n}\n","import type { Settings } from './types';\n\n/**\n * Get browser source configuration with defaults\n * @param settings - Partial settings to override defaults\n * @returns Complete settings object with all defaults applied\n */\nexport function getConfig(\n settings: Partial<Settings> = {},\n): Required<Settings> {\n return {\n prefix: 'data-elb',\n pageview: true,\n session: true,\n elb: 'elb',\n elbLayer: 'elbLayer',\n scope: document,\n ...settings,\n };\n}\n","import type { Source } from '@walkeros/core';\nimport type { Elb, SessionConfig, SessionCallback } from '@walkeros/web-core';\n\n// Export browser-specific elb types\nexport * from './elb';\n\n// Browser source configuration extending core source config\nexport interface BrowserSourceConfig extends Source.Config {\n type: 'browser';\n settings: Settings;\n}\n\nexport interface Settings extends Record<string, unknown> {\n prefix?: string;\n scope?: Element | Document;\n pageview?: boolean;\n session?: boolean | SessionConfig;\n elb?: string;\n elbLayer?: boolean | string | Elb.Layer;\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\ndeclare global {\n interface Window {\n [key: string]: Elb.Layer | unknown;\n }\n}\n\n// Scope type for DOM operations\nexport type Scope = Document | Element;\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 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 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 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 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","import type { Collector, WalkerOS, Source, On } from '@walkeros/core';\nimport type { BrowserSourceConfig, Scope, Settings } 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, Triggers } 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// @TODO export examples\n\n// Export walker utility functions\nexport { getAllEvents, getEvents, getGlobals } from './walker';\n\n// Export tagger functionality\nexport { createTagger } from './tagger';\nexport type { TaggerConfig, TaggerInstance } from './tagger';\n\n// Browser source init function for createSource\nexport const sourceBrowser: Source.Init<\n BrowserSourceConfig,\n BrowserPush\n> = async (collector: Collector.Instance, config: BrowserSourceConfig) => {\n try {\n // Get full configuration with defaults\n const fullConfig: BrowserSourceConfig & { settings: Required<Settings> } = {\n ...config,\n settings: getConfig(config.settings),\n };\n\n // Create the source instance\n const source: Source.Instance<BrowserSourceConfig> = {\n type: 'browser',\n config: fullConfig,\n collector,\n destroy() {\n destroyVisibilityTracking(collector);\n // Additional cleanup could be added here\n },\n };\n\n // Initialize ELB Layer for async command handling\n if (fullConfig.settings.elbLayer !== false) {\n initElbLayer(collector, {\n name: isString(fullConfig.settings.elbLayer)\n ? fullConfig.settings.elbLayer\n : 'elbLayer',\n prefix: fullConfig.settings.prefix,\n });\n }\n\n // Initialize session if enabled\n if (fullConfig.settings.session) {\n const sessionConfig =\n typeof fullConfig.settings.session === 'boolean'\n ? {}\n : fullConfig.settings.session;\n sessionStart(collector, { config: sessionConfig });\n }\n\n // Setup one-time global triggers (click, submit) via ready state\n await ready(initTriggers, collector, fullConfig.settings);\n\n // Register on.run callback for load triggers AND pageview (runs on each walker run)\n const runCallback: On.RunFn = (collectorInstance) => {\n // Process load triggers and scope-based triggers on each run\n processLoadTriggers(collectorInstance, fullConfig.settings);\n\n // Send pageview if enabled\n if (fullConfig.settings.pageview) {\n const [data, context] = getPageViewData(\n fullConfig.settings.prefix || 'data-elb',\n fullConfig.settings.scope as Scope,\n );\n translateToCoreCollector(\n collectorInstance,\n 'page view',\n data,\n Triggers.Load,\n context,\n );\n }\n };\n\n await collector.push('walker on', 'run', runCallback);\n\n // Setup cleanup for visibility tracking on collector destroy\n const originalDestroy = (\n collector as Collector.Instance & { _destroy?: () => void }\n )._destroy;\n (collector as Collector.Instance & { _destroy?: () => void })._destroy =\n () => {\n source.destroy?.();\n if (originalDestroy) originalDestroy();\n };\n\n // Create browser-specific elb function with flexible arguments\n const elb: BrowserPush = ((...args: unknown[]) => {\n // Use the translation layer to convert flexible browser inputs to collector format\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n collector,\n fullConfig.settings.prefix,\n event,\n data as BrowserPushData,\n options as BrowserPushOptions,\n context as BrowserPushContext,\n nested as WalkerOS.Entities,\n custom as WalkerOS.Properties,\n );\n }) as BrowserPush;\n\n // Automatically assign elb function to window using settings.elb property\n if (isString(fullConfig.settings.elb))\n window[fullConfig.settings.elb] = elb;\n\n return { source, elb };\n } catch (error) {\n throw error; // Re-throw so tryCatchAsync can handle it\n }\n};\n\nexport default sourceBrowser;\n"],"mappings":"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","names":["Const","getAttribute","filter","str","elem","elementConfig","_a","_b","event","Const","elem","getAttribute","scrollElements","collector","prefix","i","onApply","session","collector","onApply"]}
1
+ {"version":3,"sources":["../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/tagger.ts","../src/index.ts"],"sourcesContent":["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: (collector: Collector.Instance, settings: Settings) => void,\n collector: Collector.Instance,\n settings: Settings,\n): Promise<void> {\n const readyFn = () => {\n fn(collector, settings);\n // Only call onApply if collector has the on property\n if (collector?.on) {\n try {\n onApply(collector, 'ready');\n } catch (error) {\n // Don't throw - this is not critical for functionality\n }\n }\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(\n collector: Collector.Instance,\n settings: Required<Settings>,\n) {\n initGlobalTrigger(collector, settings);\n}\n\n// Called on each walker run to process load triggers\nexport function processLoadTriggers(\n collector: Collector.Instance,\n settings: Required<Settings>,\n) {\n initScopeTrigger(collector, settings);\n}\n\nexport function initGlobalTrigger(\n collector: Collector.Instance,\n settings: Settings,\n): void {\n const scope = settings.scope;\n const context: Context = { collector, settings };\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(\n collector: Collector.Instance,\n settings: Settings,\n) {\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 destroyVisibilityTracking(collector);\n\n // Initialize visibility tracking for this collector\n initVisibilityTracking(collector, 1000);\n\n // default data-elbaction\n const selectorAction = getElbAttributeName(\n settings.prefix,\n Const.Commands.Action,\n false,\n );\n\n const scope = elem || document;\n if (scope !== document) {\n // Handle the elements action(s), too\n handleActionElem(collector, 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(collector, elem, selectorAction, settings);\n });\n\n if (scrollElements.length) scroll(collector, 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 collector: Collector.Instance,\n elem: HTMLElement,\n selectorAction: string,\n settings: Settings,\n) {\n const actionAttr = getAttribute(elem, selectorAction);\n\n if (!actionAttr) return;\n\n const context: Context = { collector, settings };\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(\n collector: Collector.Instance,\n scope: Scope,\n settings: Settings,\n) {\n const context: Context = { collector, settings };\n\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 = document.body,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\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 (scope !== document && (scope as Element).matches(actionSelector)) {\n processElementEvents(scope as Element);\n }\n\n queryAll(scope, 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, Collector } 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// Visibility state interface for collector\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// Extended collector interface with visibility state\ninterface CollectorWithVisibility extends Collector.Instance {\n _visibilityState?: VisibilityState;\n}\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 collector: Collector.Instance,\n element: HTMLElement,\n): void {\n const state = (collector as CollectorWithVisibility)._visibilityState;\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 collector\n */\nfunction createObserver(\n collector: Collector.Instance,\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(collector, 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 collector: Collector.Instance,\n entry: IntersectionObserverEntry,\n): void {\n const target = entry.target as HTMLElement;\n const state = (collector as CollectorWithVisibility)._visibilityState;\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(collector, 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 collector\n */\nexport function initVisibilityTracking(\n collector: Collector.Instance,\n duration = 1000,\n): void {\n if ((collector as CollectorWithVisibility)._visibilityState) return; // Already initialized\n\n (collector as CollectorWithVisibility)._visibilityState = {\n observer: createObserver(collector),\n timers: new WeakMap(),\n duration,\n } as VisibilityState;\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 const state = (context.collector as CollectorWithVisibility)._visibilityState;\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 collector, cleaning up all resources\n */\nexport function destroyVisibilityTracking(collector: Collector.Instance): void {\n const state = (collector as CollectorWithVisibility)._visibilityState;\n if (!state) return;\n\n if (state.observer) {\n state.observer.disconnect();\n }\n\n delete (collector as CollectorWithVisibility)._visibilityState;\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 } from './walker';\n\n// Initialize timing for performance measurements\nconst startTime = performance.now();\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 { collector, settings } = context;\n // Handle walker commands - pass through directly to collector\n if (isString(eventOrCommand) && eventOrCommand.startsWith('walker ')) {\n const result = collector.push(eventOrCommand, data as WalkerOS.Properties);\n return result;\n }\n\n // Handle event objects - add source if missing\n if (isObject(eventOrCommand)) {\n const event = eventOrCommand;\n if (!event.source) event.source = getBrowserSource();\n return collector.push(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 // Build unified event from various elb usage patterns\n const event: WalkerOS.DeepPartialEvent = {\n name: String(eventOrCommand || ''),\n data: eventData,\n context: eventContext,\n nested,\n custom,\n trigger: isString(options) ? options : '',\n timing: Math.round((performance.now() - startTime) / 10) / 100,\n source: getBrowserSource(),\n };\n\n return collector.push(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 collector: Collector.Instance,\n config: ELBLayerConfig & { prefix?: string } = {},\n): void {\n const layerName = config.name || 'elbLayer';\n\n // Ensure elbLayer exists on window\n if (!window[layerName]) {\n window[layerName] = [];\n }\n\n const elbLayer = window[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(collector, 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(collector, 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(collector, 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 collector: Collector.Instance,\n prefix: string = 'data-elb',\n elbLayer: ELBLayer,\n): void {\n // Process in two phases: walker commands first, then events\n processPredefined(collector, prefix, elbLayer, true); // Commands only\n processPredefined(collector, 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 collector: Collector.Instance,\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(collector, prefix, item);\n });\n}\n\n/**\n * Push command directly using collector or translation based on type\n */\nfunction pushCommand(\n collector: Collector.Instance,\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 collector.push(action, rest[0]);\n return;\n }\n\n // Regular events go through translation\n translateToCoreCollector(\n {\n collector,\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 collector\n collector.push(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 { WalkerOS, Collector } from '@walkeros/core';\nimport type { SessionCallback } from '@walkeros/web-core';\nimport { assign, useHooks } from '@walkeros/core';\nimport { onApply } from '@walkeros/collector';\nimport { sessionStart as sessionStartOrg } from '@walkeros/web-core';\n\nexport interface SessionStartOptions {\n config?: unknown;\n data?: Collector.SessionData;\n}\n\n// Enhanced session configuration interface\ninterface SessionConfigWithCallback {\n cb?: false | SessionCallback;\n [key: string]: unknown;\n}\n\nexport function createSessionStart(collector: Collector.Instance) {\n return function (\n options: SessionStartOptions = {},\n ): void | Collector.SessionData {\n const { config = {}, data, ...otherOptions } = options;\n return sessionStart(collector, {\n config: Object.assign({ pulse: true }, config),\n data: Object.assign({}, collector.session, {\n updated: Date.now(),\n }) as Collector.SessionData,\n ...otherOptions,\n });\n };\n}\n\nexport function sessionStart(\n collector: Collector.Instance,\n options: SessionStartOptions = {},\n): void | Collector.SessionData {\n const sessionConfig = options.config || {};\n const sessionData = assign(\n collector.config.sessionStatic || {},\n options.data || {},\n );\n\n // A wrapper for the callback\n const cb: SessionCallback = (\n session: Collector.SessionData,\n collector: Collector.Instance | undefined,\n defaultCb: SessionCallback,\n ) => {\n let result: void | undefined | Collector.SessionData;\n const configWithCb = sessionConfig as SessionConfigWithCallback;\n if (configWithCb.cb !== false && configWithCb.cb)\n // Run either the default callback or the provided one\n result = configWithCb.cb(\n session,\n collector,\n defaultCb as SessionCallback,\n );\n else if (configWithCb.cb !== false)\n // Run default callback\n result = (defaultCb as SessionCallback)(\n session,\n collector,\n defaultCb as SessionCallback,\n );\n\n // Assign the session (only if collector is available)\n if (collector) {\n collector.session = session;\n\n // Run on session events\n onApply(collector, 'session');\n }\n\n return result;\n };\n\n const session = useHooks(\n sessionStartOrg,\n 'SessionStart',\n collector.hooks,\n )({\n ...sessionConfig, // Session detection configuration\n cb, // Custom wrapper callback\n data: sessionData, // Static default session data\n collector,\n });\n\n return session;\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 * @returns Complete settings object with all defaults applied\n */\nexport function getConfig(initSettings: InitSettings = {}): Settings {\n return {\n prefix: 'data-elb',\n pageview: true,\n session: true,\n elb: 'elb',\n elbLayer: 'elbLayer',\n scope: document,\n ...initSettings,\n };\n}\n","import type { Source, Collector } from '@walkeros/core';\nimport type { Elb, SessionConfig, SessionCallback } from '@walkeros/web-core';\n\n// Export browser-specific elb types\nexport * from './elb';\n\n// Browser source configuration extending core source config\nexport interface BrowserSourceConfig extends Source.Config {\n type: 'browser';\n settings: InitSettings;\n}\n\n// InitSettings: what users provide (all optional)\nexport interface InitSettings extends Record<string, unknown> {\n prefix?: string;\n scope?: Element | Document;\n pageview?: boolean;\n session?: boolean | SessionConfig;\n elb?: string;\n elbLayer?: boolean | string | Elb.Layer;\n}\n\n// Settings: resolved configuration (required fields are actually required)\nexport interface Settings extends Record<string, unknown> {\n prefix: string; // Always required after resolution\n scope: Element | Document; // Always required after resolution\n pageview: boolean; // Always required after resolution (defaults to false)\n session: boolean | SessionConfig; // Always required after resolution (defaults to false)\n elb: string; // Always required after resolution (defaults to '')\n elbLayer: boolean | string | Elb.Layer; // Always required after resolution (defaults to false)\n}\n\n// Context for translation functions with collector and settings\nexport interface Context {\n collector: Collector.Instance;\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\ndeclare global {\n interface Window {\n [key: string]: Elb.Layer | unknown;\n }\n}\n\n// Scope type for DOM operations\nexport type Scope = Document | Element;\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","import type { Collector, WalkerOS, Source, On } from '@walkeros/core';\nimport type { BrowserSourceConfig, Scope, Settings } 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, Triggers } 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// @TODO export examples\n\n// Export walker utility functions\nexport { getAllEvents, getEvents, getGlobals } from './walker';\n\n// Export tagger functionality\nexport { createTagger } from './tagger';\nexport type { TaggerConfig, TaggerInstance } from './tagger';\n\n// Browser source init function for createSource\nexport const sourceBrowser: Source.Init<\n BrowserSourceConfig,\n BrowserPush\n> = async (collector: Collector.Instance, config: BrowserSourceConfig) => {\n try {\n // Get full configuration with defaults\n const fullConfig: BrowserSourceConfig & { settings: Settings } = {\n ...config,\n settings: getConfig(config.settings),\n };\n\n // Create the source instance\n const source: Source.Instance<BrowserSourceConfig> = {\n type: 'browser',\n config: fullConfig,\n collector,\n destroy() {\n destroyVisibilityTracking(collector);\n // Additional cleanup could be added here\n },\n };\n\n // Initialize ELB Layer for async command handling\n if (fullConfig.settings.elbLayer !== false) {\n initElbLayer(collector, {\n name: isString(fullConfig.settings.elbLayer)\n ? fullConfig.settings.elbLayer\n : 'elbLayer',\n prefix: fullConfig.settings.prefix,\n });\n }\n\n // Initialize session if enabled\n if (fullConfig.settings.session) {\n const sessionConfig =\n typeof fullConfig.settings.session === 'boolean'\n ? {}\n : fullConfig.settings.session;\n sessionStart(collector, { config: sessionConfig });\n }\n\n // Setup one-time global triggers (click, submit) via ready state\n await ready(initTriggers, collector, fullConfig.settings);\n\n // Register on.run callback for load triggers AND pageview (runs on each walker run)\n const runCallback: On.RunFn = (collectorInstance) => {\n // Process load triggers and scope-based triggers on each run\n processLoadTriggers(collectorInstance, fullConfig.settings);\n\n // Send pageview if enabled\n if (fullConfig.settings.pageview) {\n const [data, context] = getPageViewData(\n fullConfig.settings.prefix || 'data-elb',\n fullConfig.settings.scope as Scope,\n );\n translateToCoreCollector(\n { collector: collectorInstance, settings: fullConfig.settings },\n 'page view',\n data,\n Triggers.Load,\n context,\n );\n }\n };\n\n await collector.push('walker on', 'run', runCallback);\n\n // Setup cleanup for visibility tracking on collector destroy\n const originalDestroy = (\n collector as Collector.Instance & { _destroy?: () => void }\n )._destroy;\n (collector as Collector.Instance & { _destroy?: () => void })._destroy =\n () => {\n source.destroy?.();\n if (originalDestroy) originalDestroy();\n };\n\n // Create browser-specific elb function with flexible arguments\n const elb: BrowserPush = ((...args: unknown[]) => {\n // Use the translation layer to convert flexible browser inputs to collector format\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n { collector, settings: fullConfig.settings },\n event,\n data as BrowserPushData,\n options as BrowserPushOptions,\n context as BrowserPushContext,\n nested as WalkerOS.Entities,\n custom as WalkerOS.Properties,\n );\n }) as BrowserPush;\n\n // Automatically assign elb function to window using settings.elb property\n if (isString(fullConfig.settings.elb))\n window[fullConfig.settings.elb] = elb;\n\n return { source, elb };\n } catch (error) {\n throw error; // Re-throw so tryCatchAsync can handle it\n }\n};\n\nexport default sourceBrowser;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,SAAAA,QAAO,eAAe;AAC/B,SAAS,OAAO,QAAQ,gBAAAC,qBAAoB;;;ACD5C,SAAS,aAAa;AACtB,SAAS,oBAAoB;AAEtB,SAAS,oBACd,QACA,MACA,aAAa,MACL;AAER,QAAM,YAAY,aAAa,MAAM;AACrC,SAAO,QAAQ,SAAY,YAAY,OAAO;AAC9C,SAAO,SAAS;AAClB;AAEO,SAAS,aACd,QACA,SACA,MACA,aAAa,MACQ;AACrB,QAAM,iBACJ,aAAa,SAAS,oBAAoB,QAAQ,MAAM,UAAU,CAAC,KAAK;AAE1E,QAAM,YAAY,eAAe,cAAc,EAAE,OAAO,CAAC,QAAQ,QAAQ;AACvE,QAAI,CAAC,KAAK,GAAG,IAAmB,YAAY,GAAG;AAE/C,QAAI,CAAC,IAAK,QAAO;AAGjB,QAAI,CAAC,KAAK;AAER,UAAI,IAAI,SAAS,GAAG,EAAG,OAAM,IAAI,MAAM,GAAG,EAAE;AAC5C,YAAM;AAAA,IACR;AAGA,QAAI,IAAI,WAAW,GAAG,GAAG;AACvB,YAAM,IAAI,MAAM,CAAC;AACjB,UAAI;AAEF,YAAI,eAAgB,QAAoB,GAAoB;AAC5D,YAAI,CAAC,gBAAgB,QAAQ,YAAY;AAEvC,yBAAgB,QAA8B,QAC3C,QAA8B,aACjC,EAAE;AAAA,QACJ;AAEA,cAAM,OAAO,YAAY;AAAA,MAC3B,SAAS,OAAO;AACd,cAAM;AAAA,MACR;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,IAAI,GAAG;AACtB,YAAM,IAAI,MAAM,GAAG,EAAE;AACrB,UAAI,CAAC,EAAQ,OAAO,GAAG,CAAC,EAAG,QAAO,GAAG,IAAI,CAAC;AAC1C,MAAC,OAAO,GAAG,EAA8B,KAAK,EAAU,GAAG,CAAC;AAAA,IAC9D,OAAO;AACL,aAAO,GAAG,IAAI,EAAU,GAAG;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAwB;AAE5B,SAAO;AACT;AAEO,SAAS,aACd,QAAe,SAAS,MACxB,SAAiB,MAAM,SAAS,QACjB;AACf,MAAI,SAAwB,CAAC;AAC7B,QAAM,SAAS,MAAM,SAAS;AAC9B,QAAM,iBAAiB,IAAI,oBAAoB,QAAQ,QAAQ,KAAK,CAAC;AAErE,QAAM,uBAAuB,CAAC,SAAkB;AAC9C,WAAO,KAAK,aAAa,QAAQ,MAAM,QAAQ,KAAK,CAAC,EAAE;AAAA,MACrD,CAAC,YAAY;AACX,iBAAS,OAAO,OAAO,UAAU,MAAM,SAAS,MAAM,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,UAAU,YAAa,MAAkB,QAAQ,cAAc,GAAG;AACpE,yBAAqB,KAAgB;AAAA,EACvC;AAEA,WAAS,OAAO,gBAAgB,oBAAoB;AAEpD,SAAO;AACT;AAEO,SAAS,UACd,QACA,SACA,SAAiB,MAAM,SAAS,QACjB;AACf,QAAM,SAAwB,CAAC;AAG/B,QAAM,EAAE,SAAS,YAAY,IAAI,kBAAkB,QAAQ,QAAQ,OAAO;AAG1E,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,UAAQ,QAAQ,CAAC,kBAAkB;AACjC,UAAM,SAAS,eAAe,cAAc,gBAAgB,IAAI,GAAG,EAAE;AAAA,MACnE,CAACC,SAAQ,UAAU;AACjB,QAAAA,QAAO,GAAK,KAAK,CAAC,IAAI;AACtB,eAAOA;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAGA,UAAM,WAAW,YAAY,QAAQ,QAAQ,QAAQ,WAAW;AAGhE,QAAI,CAAC,SAAS,QAAQ;AACpB,YAAM,SAAS;AAEf,YAAM,iBAAiB,IAAI,oBAAoB,QAAQ,MAAM,CAAC;AAG9D,YAAM,CAAC,MAAM,OAAO,IAAI;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,eAAS,KAAK;AAAA,QACZ;AAAA;AAAA,QACA;AAAA;AAAA,QACA,QAAQ,CAAC;AAAA;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAGA,aAAS,QAAQ,CAAC,WAAW;AAC3B,aAAO,KAAK;AAAA,QACV,QAAQ,OAAO;AAAA,QACf,QAAQ,cAAc;AAAA,QACtB,MAAM,OAAO;AAAA,QACb;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AAEO,SAAS,WACd,SAAiB,MAAM,SAAS,QAChC,QAAe,UACM;AACrB,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,MAAM,SAAS;AAAA,IACf;AAAA,EACF;AACA,QAAM,iBAAiB,IAAI,WAAW;AACtC,MAAI,SAAS,CAAC;AAEd,WAAS,OAAO,gBAAgB,CAAC,YAAY;AAC3C,aAAS;AAAA,MACP;AAAA,MACA,aAAa,QAAQ,SAAS,MAAM,SAAS,SAAS,KAAK;AAAA,IAC7D;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,gBACd,QACA,OACmD;AAEnD,QAAM,MAAM,OAAO;AACnB,QAAM,OAAO;AACb,QAAM,eAAe,UAAU,WAAW,SAAS,OAAQ;AAC3D,QAAM,CAAC,MAAM,OAAO,IAAI;AAAA,IACtB;AAAA,IACA,IAAI,oBAAoB,QAAQ,IAAI,CAAC;AAAA,IACrC;AAAA,IACA;AAAA,EACF;AACA,OAAK,SAAS,IAAI;AAClB,OAAK,QAAQ,SAAS;AACtB,OAAK,WAAW,SAAS;AAEzB,MAAI,IAAI,OAAQ,MAAK,SAAS,IAAI;AAClC,MAAI,IAAI,KAAM,MAAK,OAAO,IAAI;AAG9B,SAAO,CAAC,MAAM,OAAO;AACvB;AAEO,SAAS,kBAAkB,KAA0C;AAC1E,QAAM,SAAsC,CAAC;AAE7C,QAAM,aAAa,eAAe,GAAG;AAErC,aAAW,QAAQ,CAACC,SAAQ;AAC1B,UAAM,CAAC,aAAa,UAAU,IAAI,YAAYA,IAAG;AACjD,UAAM,CAAC,SAAS,aAAa,IAAI,eAAe,WAAW;AAE3D,QAAI,CAAC,QAAS;AAEd,QAAI,CAAC,QAAQ,YAAY,IAAI,eAAe,cAAc,EAAE;AAG5D,aAAS,UAAU;AAEnB,QAAI,CAAC,OAAO,OAAO,EAAG,QAAO,OAAO,IAAI,CAAC;AAEzC,WAAO,OAAO,EAAE,KAAK,EAAE,SAAS,eAAe,QAAQ,aAAa,CAAC;AAAA,EACvE,CAAC;AAED,SAAO;AACT;AAEO,SAAS,YACd,QACA,QACA,QACA,cAAc,OACK;AACnB,QAAM,WAA8B,CAAC;AACrC,MAAI,UAAU;AAGd,WAAS,OAAO,KAAK,UAAU,CAAC,CAAC,EAAE,WAAW,IAAI,SAAS;AAE3D,SAAO,SAAS;AACd,UAAM,SAAS,UAAU,QAAQ,SAAS,QAAQ,MAAM;AACxD,QAAI,QAAQ;AACV,eAAS,KAAK,MAAM;AACpB,UAAI,YAAa;AAAA,IACnB;AAEA,cAAU,UAAU,QAAQ,OAAO;AAAA,EACrC;AAEA,SAAO;AACT;AAEA,SAAS,UACP,QACA,SACA,QACA,QACwB;AACxB,QAAM,SAAS,aAAa,SAAS,oBAAoB,MAAM,CAAC;AAGhE,MAAI,CAAC,UAAW,UAAU,CAAC,OAAO,MAAM,EAAI,QAAO;AAEnD,QAAM,aAAa,CAAC,OAAO;AAC3B,QAAM,eAAe,IAAI;AAAA,IACvB;AAAA,IACA;AAAA,EACF,CAAC,MAAM,oBAAoB,QAAQ,EAAE,CAAC;AACtC,QAAM,WAAW,oBAAoB,QAAQ,MAAM,SAAS,MAAM,KAAK;AAEvE,MAAI,OAA4B,CAAC;AACjC,QAAM,SAA4B,CAAC;AACnC,QAAM,CAAC,YAAY,OAAO,IAAI;AAAA,IAC5B,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,WAAS,SAAS,IAAI,QAAQ,KAAK,CAAC,SAAS;AAC3C,UAAM,CAAC,QAAQ,SAAS,IAAmB;AAAA,MACzC,aAAa,MAAM,QAAQ;AAAA,IAC7B;AAKA,QAAI,cAAc;AAChB,eAAS,SAAS,MAAM,IAAI,QAAQ,KAAK,MAAM,YAAY,CAAC,aAAa;AACvE,mBAAW,KAAK,QAAQ;AAGxB,cAAM,eAAe,UAAU,QAAQ,QAAQ;AAC/C,YAAI,aAAc,QAAO,KAAK,YAAY;AAAA,MAC5C,CAAC;AAAA,EACL,CAAC;AAGD,QAAM,gBAAgC,CAAC;AACvC,aAAW,QAAQ,CAAC,SAAS;AAE3B,QAAI,KAAK,QAAQ,YAAY,EAAG,eAAc,KAAK,IAAI;AAEvD,aAAS,MAAM,cAAc,CAACC,UAAS,cAAc,KAAKA,KAAI,CAAC;AAAA,EACjE,CAAC;AAGD,MAAI,cAAmC,CAAC;AACxC,gBAAc,QAAQ,CAAC,UAAU;AAE/B,kBAAc,EAAO,aAAa,aAAa,QAAQ,OAAO,EAAE,CAAC;AACjE,WAAO,EAAO,MAAM,aAAa,QAAQ,OAAO,MAAM,CAAC;AAAA,EACzD,CAAC;AAGD,SAAO,EAAO,EAAO,aAAa,IAAI,GAAG,UAAU;AAGnD,aAAW,QAAQ,CAAC,SAAS;AAC3B;AAAA,MACE;AAAA,MACA,IAAI,oBAAoB,MAAM,CAAC;AAAA,MAC/B,CAAC,wBAAwB;AACvB,cAAM,eAAe,UAAU,QAAQ,mBAAmB;AAC1D,YAAI,aAAc,QAAO,KAAK,YAAY;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,EAAE,QAAQ,MAAM,SAAS,OAAO;AACzC;AAEA,SAAS,UAAU,QAAgB,MAAuC;AACxE,QAAM,WAAW,oBAAoB,QAAQ,MAAM,SAAS,MAAM,KAAK;AAGvE,MAAI,KAAK,QAAQ,IAAI,QAAQ,GAAG,GAAG;AACjC,UAAM,CAAC,QAAQ,SAAS,IAAmB;AAAA,MACzC,aAAa,MAAM,QAAQ;AAAA,IAC7B;AACA,QAAI,cAAc,SAAS;AAIzB,aAAO,SAAS,cAAc,IAAI,QAAQ,KAAK,MAAM,WAAW;AAAA,IAClE;AAAA,EACF;AAGA,MACE,CAAC,KAAK,iBACN,KAAK,eACL,KAAK,YAAY,aAAa,YAC9B;AACA,WAAQ,KAAK,YAAY,EAAiB;AAAA,EAC5C;AAEA,SAAO,KAAK;AACd;AAEA,SAAS,2BACP,SACA,gBACA,QACA,MACkE;AAClE,MAAI,OAA4B,CAAC;AACjC,QAAM,UAAsC,CAAC;AAC7C,MAAI,SAAS;AACb,QAAM,kBAAkB,IAAI;AAAA,IAC1B;AAAA,IACA,MAAM,SAAS;AAAA,IACf;AAAA,EACF,CAAC;AAGD,MAAI,WAAW;AACf,SAAO,QAAQ;AAEb,QAAI,OAAO,QAAQ,cAAc,GAAG;AAElC,aAAO,EAAO,aAAa,QAAQ,QAAQ,EAAE,GAAG,IAAI;AACpD,aAAO,EAAO,aAAa,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,IACxD;AAGA,QAAI,OAAO,QAAQ,eAAe,GAAG;AACnC,aAAO;AAAA,QACL,aAAa,QAAQ,QAAQ,MAAM,SAAS,SAAS,KAAK;AAAA,MAC5D,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAExB,YAAI,OAAO,CAAC,QAAQ,GAAG,EAAG,SAAQ,GAAG,IAAI,CAAC,KAAK,QAAQ;AAAA,MACzD,CAAC;AAGD,QAAE;AAAA,IACJ;AAEA,aAAS,UAAU,QAAQ,MAAM;AAAA,EACnC;AAEA,SAAO,CAAC,MAAM,OAAO;AACvB;AAEA,SAAS,SACP,OACA,UACA,IACM;AACN,QAAM,WAAW,MAAM,iBAAiB,QAAQ;AAChD,WAAS,QAAQ,EAAE;AACrB;AAEA,SAAS,kBACP,QACA,QACA,SAC0D;AAC1D,MAAI,UAAU;AAEd,SAAO,SAAS;AAEd,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,oBAAoB,QAAQ,MAAM,SAAS,SAAS,KAAK;AAAA,IAC3D;AAEA,QAAI,gBAAgB;AAClB,YAAM,iBAAiB,kBAAkB,cAAc;AACvD,UAAI,eAAe,OAAO,GAAG;AAC3B,eAAO,EAAE,SAAS,eAAe,OAAO,GAAG,aAAa,MAAM;AAAA,MAChE;AAAA,IACF;AAGA,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,oBAAoB,QAAQ,MAAM,SAAS,QAAQ,KAAK;AAAA,IAC1D;AAEA,QAAI,iBAAiB;AACnB,YAAM,iBAAiB,kBAAkB,eAAe;AAExD,UAAI,eAAe,OAAO,KAAK,YAAY,SAAS;AAClD,eAAO,EAAE,SAAS,eAAe,OAAO,KAAK,CAAC,GAAG,aAAa,KAAK;AAAA,MACrE;AAAA,IACF;AAEA,cAAU,UAAU,QAAQ,OAAO;AAAA,EACrC;AAEA,SAAO,EAAE,SAAS,CAAC,GAAG,aAAa,MAAM;AAC3C;AAEA,SAAS,eAAe,KAAa,YAAY,KAAwB;AACvE,QAAM,SAA4B,CAAC;AAEnC,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,MAAM,IAAI,OAAO,QAAQ,SAAS,iBAAiB,IAAI;AAC7D,SAAO,IAAI,MAAM,GAAG,KAAK,CAAC;AAC5B;AAEA,SAAS,YAAY,KAA4B;AAC/C,QAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,SAAS,CAAC;AACzC,SAAO,CAAC,GAAK,GAAG,GAAG,GAAK,KAAK,CAAC;AAChC;AAEA,SAAS,eAAe,KAA4B;AAElD,QAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,CAAC;AACrC,QAAM,QAAQ,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI;AAG3C,SAAO,CAAC,KAAK,KAAK;AACpB;;;AC9dA,SAAS,iBAAiB;AAI1B,IAAM,mBAAmB,oBAAI,QAG3B;AAGF,IAAM,kBAAkB,oBAAI,QAG1B;AAqBF,SAAS,iBAAiB,SAA+B;AACvD,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,SAAS,gBAAgB,IAAI,OAAO;AAGxC,MAAI,CAAC,UAAU,MAAM,OAAO,cAAc,KAAK;AAC7C,aAAS;AAAA,MACP,WAAW,UAAU,OAAO;AAAA,MAC5B,aAAa;AAAA,IACf;AACA,oBAAgB,IAAI,SAAS,MAAM;AAAA,EACrC;AAEA,SAAO,OAAO;AAChB;AAKO,SAAS,iBACd,WACA,SACM;AACN,QAAM,QAAS,UAAsC;AACrD,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM,UAAU;AAClB,UAAM,SAAS,UAAU,OAAO;AAAA,EAClC;AAGA,QAAM,QAAQ,MAAM,OAAO,IAAI,OAAO;AACtC,MAAI,OAAO;AACT,iBAAa,KAAK;AAClB,UAAM,OAAO,OAAO,OAAO;AAAA,EAC7B;AAGA,mBAAiB,OAAO,OAAO;AAC/B,kBAAgB,OAAO,OAAO;AAChC;AAKA,SAAS,eACP,WACkC;AAClC,MAAI,CAAC,OAAO,qBAAsB,QAAO;AAEzC,SAAO;AAAA,IACL,MACE,IAAI,OAAO;AAAA,MACT,CAAC,YAAY;AACX,gBAAQ,QAAQ,CAAC,UAAU;AACzB,6BAAmB,WAAW,KAAK;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ,WAAW,CAAC,GAAG,GAAG;AAAA,MACpB;AAAA,IACF;AAAA,IACF,MAAM;AAAA,EACR,EAAE;AACJ;AAKA,SAAS,mBACP,WACA,OACM;AA9GR;AA+GE,QAAM,SAAS,MAAM;AACrB,QAAM,QAAS,UAAsC;AAErD,MAAI,CAAC,MAAO;AAEZ,QAAM,gBAAgB,MAAM,OAAO,IAAI,MAAM;AAE7C,MAAI,MAAM,oBAAoB,GAAG;AAE/B,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,SAAS,iBAAiB,IAAI,MAAM;AAGxC,QAAI,CAAC,UAAU,MAAM,OAAO,cAAc,KAAM;AAC9C,eAAS;AAAA,QACP,SAAS,OAAO,eAAe,OAAO;AAAA,QACtC,aAAa;AAAA,MACf;AACA,uBAAiB,IAAI,QAAQ,MAAM;AAAA,IACrC;AAEA,UAAM,iBAAiB,MAAM,qBAAqB;AAKlD,UAAM,gBACJ,kBAAmB,OAAO,WAAW,iBAAiB,MAAM;AAE9D,QAAI,eAAe;AAEjB,YAAMC,kBAAgB,WAAM,mBAAN,mBAAsB,IAAI;AAGhD,WAAIA,kBAAA,gBAAAA,eAAe,aAAYA,eAAc,QAAS;AAGtD,UAAI,CAAC,eAAe;AAClB,cAAM,QAAQ,OAAO,WAAW,YAAY;AArJpD,cAAAC,KAAAC;AAuJU,cAAI,iBAAiB,MAAM,GAAG;AAE5B,kBAAMF,kBAAgBC,MAAA,MAAM,mBAAN,gBAAAA,IAAsB,IAAI;AAChD,gBAAID,kBAAA,gBAAAA,eAAe,SAAS;AAC1B,oBAAM;AAAA,gBACJA,eAAc;AAAA,gBACd;AAAA,gBACAA,eAAc;AAAA,cAChB;AAAA,YACF;AAGA,kBAAM,iBAAgBE,MAAA,MAAM,mBAAN,gBAAAA,IAAsB,IAAI;AAGhD,gBAAI,+CAAe,UAAU;AAC3B,4BAAc,UAAU;AAAA,YAC1B,OAAO;AAEL,+BAAiB,WAAW,MAAM;AAAA,YACpC;AAAA,UACF;AAAA,QACF,GAAG,MAAM,QAAQ;AAEjB,cAAM,OAAO,IAAI,QAAQ,KAAK;AAAA,MAChC;AACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,eAAe;AACjB,iBAAa,aAAa;AAC1B,UAAM,OAAO,OAAO,MAAM;AAAA,EAC5B;AAGA,QAAM,iBAAgB,WAAM,mBAAN,mBAAsB,IAAI;AAChD,MAAI,+CAAe,UAAU;AAC3B,kBAAc,UAAU;AAAA,EAC1B;AACF;AAKO,SAAS,uBACd,WACA,WAAW,KACL;AACN,MAAK,UAAsC,iBAAkB;AAE7D,EAAC,UAAsC,mBAAmB;AAAA,IACxD,UAAU,eAAe,SAAS;AAAA,IAClC,QAAQ,oBAAI,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;AAKO,SAAS,eACd,SACA,SACA,SAAiC,EAAE,UAAU,MAAM,GAC7C;AAzNR;AA0NE,QAAM,QAAS,QAAQ,UAAsC;AAC7D,OAAI,+BAAO,aAAY,SAAS;AAE9B,QAAI,CAAC,MAAM,gBAAgB;AACzB,YAAM,iBAAiB,oBAAI,QAAQ;AAAA,IACrC;AACA,UAAM,eAAe,IAAI,SAAS;AAAA,MAChC,WAAU,YAAO,aAAP,YAAmB;AAAA,MAC7B,SAAS;AAAA,MACT;AAAA,MACA,SAAS,OAAO,WAAW,YAAY;AAAA,IACzC,CAAC;AACD,UAAM,SAAS,QAAQ,OAAO;AAAA,EAChC;AACF;AAKO,SAAS,0BAA0B,WAAqC;AAC7E,QAAM,QAAS,UAAsC;AACrD,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM,UAAU;AAClB,UAAM,SAAS,WAAW;AAAA,EAC5B;AAEA,SAAQ,UAAsC;AAChD;;;AC3OA,IAAM,YAAY,YAAY,IAAI;AAM3B,SAAS,yBACd,SACA,gBACA,MACA,SACA,aACA,QACA,QACyB;AACzB,QAAM,EAAE,WAAW,SAAS,IAAI;AAEhC,MAAI,EAAS,cAAc,KAAK,eAAe,WAAW,SAAS,GAAG;AACpE,UAAM,SAAS,UAAU,KAAK,gBAAgB,IAA2B;AACzE,WAAO;AAAA,EACT;AAGA,MAAI,EAAS,cAAc,GAAG;AAC5B,UAAMC,SAAQ;AACd,QAAI,CAACA,OAAM,OAAQ,CAAAA,OAAM,SAAS,iBAAiB;AACnD,WAAO,UAAU,KAAKA,MAAK;AAAA,EAC7B;AAGA,QAAM,CAAC,MAAM,IAAI;AAAA,IACf,EAAS,cAAc,IAAI,eAAe,OAAO;AAAA,EACnD,EAAE,MAAM,GAAG;AAGX,MAAI,YAAY,EAAS,IAAI,IAAK,OAA+B,CAAC;AAClE,MAAI,eAA2C,CAAC;AAEhD,MAAI;AACJ,MAAI,aAAa;AAGjB,MAAI,EAAoB,IAAI,GAAG;AAC7B,oBAAgB;AAChB,iBAAa;AAAA,EACf;AAGA,MAAI,EAAoB,WAAW,GAAG;AACpC,oBAAgB;AAAA,EAClB,WAAW,EAAS,WAAW,KAAK,OAAO,KAAK,WAAW,EAAE,QAAQ;AACnE,mBAAe;AAAA,EACjB;AAGA,MAAI,eAAe;AACjB,UAAM,YAAY;AAAA,MAChB,SAAS,UAAU;AAAA,MACnB;AAAA,IACF,EAAE,KAAK,CAAC,QAAQ,IAAI,WAAW,MAAM;AACrC,QAAI,WAAW;AACb,UAAI,WAAY,aAAY,UAAU;AACtC,qBAAe,UAAU;AAAA,IAC3B;AAAA,EACF;AAGA,MAAI,WAAW,QAAQ;AACrB,cAAU,KAAK,UAAU,MAAM,OAAO,SAAS;AAAA,EACjD;AAGA,QAAM,QAAmC;AAAA,IACvC,MAAM,OAAO,kBAAkB,EAAE;AAAA,IACjC,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,SAAS,EAAS,OAAO,IAAI,UAAU;AAAA,IACvC,QAAQ,KAAK,OAAO,YAAY,IAAI,IAAI,aAAa,EAAE,IAAI;AAAA,IAC3D,QAAQ,iBAAiB;AAAA,EAC3B;AAEA,SAAO,UAAU,KAAK,KAAK;AAC7B;AAKA,SAAS,mBAAoC;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI,OAAO,SAAS;AAAA,IACpB,aAAa,SAAS;AAAA,EACxB;AACF;;;AHvFA,IAAI,iBAAwC,CAAC;AAC7C,IAAI;AAkBG,IAAMC,YAA8C;AAAA,EACzD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AACR;AAEA,eAAsB,MACpB,IACA,WACA,UACe;AACf,QAAM,UAAU,MAAM;AACpB,OAAG,WAAW,QAAQ;AAEtB,QAAI,uCAAW,IAAI;AACjB,UAAI;AACF,gBAAQ,WAAW,OAAO;AAAA,MAC5B,SAAS,OAAO;AAAA,MAEhB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,eAAe,WAAW;AACrC,YAAQ;AAAA,EACV,OAAO;AACL,aAAS,iBAAiB,oBAAoB,OAAO;AAAA,EACvD;AACF;AAGO,SAAS,aACd,WACA,UACA;AACA,oBAAkB,WAAW,QAAQ;AACvC;AAGO,SAAS,oBACd,WACA,UACA;AACA,mBAAiB,WAAW,QAAQ;AACtC;AAEO,SAAS,kBACd,WACA,UACM;AACN,QAAM,QAAQ,SAAS;AACvB,QAAM,UAAmB,EAAE,WAAW,SAAS;AAC/C,QAAM;AAAA,IACJ;AAAA,IACA,EAAS,SAAuB,IAAa;AAC3C,mBAAa,KAAK,MAAM,SAAS,EAAgB;AAAA,IACnD,CAAC;AAAA,EACH;AACA,QAAM;AAAA,IACJ;AAAA,IACA,EAAS,SAAuB,IAAa;AAC3C,oBAAc,KAAK,MAAM,SAAS,EAAiB;AAAA,IACrD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,iBACd,WACA,UACA;AACA,QAAM,OAAO,SAAS;AAGtB,mBAAiB,CAAC;AAGlB,4BAA0B,SAAS;AAGnC,yBAAuB,WAAW,GAAI;AAGtC,QAAM,iBAAiB;AAAA,IACrB,SAAS;AAAA,IACTC,OAAM,SAAS;AAAA,IACf;AAAA,EACF;AAEA,QAAM,QAAQ,QAAQ;AACtB,MAAI,UAAU,UAAU;AAEtB,qBAAiB,WAAW,OAAsB,gBAAgB,QAAQ;AAAA,EAC5E;AAGA,QAAM,WAAW,MAAM,iBAA8B,IAAI,cAAc,GAAG;AAE1E,WAAS,QAAQ,CAACC,UAAS;AACzB,qBAAiB,WAAWA,OAAM,gBAAgB,QAAQ;AAAA,EAC5D,CAAC;AAED,MAAI,eAAe,OAAQ,QAAO,WAAW,OAAO,QAAQ;AAC9D;AAEA,eAAsB,cACpB,SACA,SACA,SAEoB;AACpB,QAAM,SAAS,UAAU,SAAS,SAAS,QAAQ,SAAS,MAAM;AAClE,SAAO,QAAQ;AAAA,IACb,OAAO;AAAA,MAAI,CAAC,UACV,yBAAyB,SAAS;AAAA,QAChC,MAAM,GAAG,MAAM,MAAM,IAAI,MAAM,MAAM;AAAA,QACrC,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,iBACP,WACA,MACA,gBACA,UACA;AACA,QAAM,aAAaC,cAAa,MAAM,cAAc;AAEpD,MAAI,CAAC,WAAY;AAEjB,QAAM,UAAmB,EAAE,WAAW,SAAS;AAG/C,SAAO,OAAO,kBAAkB,UAAU,CAAC,EAAE;AAAA,IAAQ,CAAC;AAAA;AAAA,MAEpD,eAAe,QAAQ,CAAC,kBAA4C;AAElE,gBAAQ,cAAc,SAAS;AAAA,UAC7B,KAAKH,UAAS;AACZ,yBAAa,SAAS,IAAI;AAC1B;AAAA,UACF,KAAKA,UAAS;AACZ,wBAAY,SAAS,IAAI;AACzB;AAAA,UACF,KAAKA,UAAS;AACZ,yBAAa,SAAS,MAAM,cAAc,aAAa;AACvD;AAAA,UACF,KAAKA,UAAS;AACZ,0BAAc,MAAM,cAAc,aAAa;AAC/C;AAAA,UACF,KAAKA,UAAS;AACZ,2BAAe,SAAS,IAAI;AAC5B;AAAA,UACF,KAAKA,UAAS;AACZ,2BAAe,SAAS,MAAM,EAAE,UAAU,KAAK,CAAC;AAChD;AAAA,UACF,KAAKA,UAAS;AACZ,wBAAY,SAAS,MAAM,cAAc,aAAa;AACtD;AAAA,QACJ;AAAA,MACF,CAAC;AAAA;AAAA,EACH;AACF;AAEA,SAAS,aAAa,SAAkB,IAAgB;AACtD,gBAAc,SAAS,GAAG,QAAmBA,UAAS,KAAK;AAC7D;AAEA,SAAS,aAAa,SAAkB,MAAmB;AACzD,OAAK;AAAA,IACH;AAAA,IACA,EAAS,SAA0B,IAAgB;AACjD,UAAI,GAAG,kBAAkB;AACvB,sBAAc,SAAS,GAAG,QAAQA,UAAS,KAAK;AAAA,IACpD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,YAAY,SAAkB,MAAmB;AACxD,gBAAc,SAAS,MAAMA,UAAS,IAAI;AAC5C;AAEA,SAAS,aACP,SACA,MACA,gBAAwB,IACxB;AACA;AAAA,IACE,MAAM;AAEJ,UAAI,CAAC,SAAS,OAAQ,eAAc,SAAS,MAAMA,UAAS,KAAK;AAAA,IACnE;AAAA,IACA,SAAS,iBAAiB,EAAE,KAAK;AAAA,EACnC;AACF;AAEA,SAAS,cAAc,MAAmB,gBAAwB,IAAI;AAEpE,QAAM,QAAQ,SAAS,iBAAiB,EAAE,KAAK;AAG/C,MAAI,QAAQ,KAAK,QAAQ,IAAK;AAE9B,iBAAe,KAAK,CAAC,MAAM,KAAK,CAAC;AACnC;AAEA,SAAS,cAAc,SAAkB,IAAiB;AACxD,MAAI,GAAG,QAAQ;AACb,kBAAc,SAAS,GAAG,QAAmBA,UAAS,MAAM;AAAA,EAC9D;AACF;AAEA,SAAS,YACP,SACA,MACA,gBAAwB,IACxB;AACA;AAAA,IACE,MAAM,cAAc,SAAS,MAAMA,UAAS,IAAI;AAAA,IAChD,SAAS,iBAAiB,EAAE,KAAK;AAAA,EACnC;AACF;AAEA,SAAS,OACP,WACA,OACA,UACA;AACA,QAAM,UAAmB,EAAE,WAAW,SAAS;AAE/C,QAAM,YAAY,CAChBI,iBACAC,aACG;AACH,WAAOD,gBAAe,OAAO,CAAC,CAAC,SAAS,KAAK,MAAyB;AAEpE,YAAM,eAAe,OAAO,UAAU,OAAO;AAE7C,YAAM,UAAW,QAAwB;AAGzC,UAAI,eAAe,QAAS,QAAO;AAGnC,YAAM,aAAa,QAAQ;AAE3B,YAAM,aAAa,UAAU;AAE7B,YAAM,SAAS,aAAa;AAE5B,YAAM,eAAe,IAAI,UAAU,cAAc,MAAM;AAGvD,UAAI,eAAe,OAAO;AAExB,sBAAcC,UAAS,SAASL,UAAS,MAAM;AAG/C,eAAO;AAAA,MACT;AAGA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,EAAS,WAAY;AACpC,uBAAiB,UAAU,KAAK,OAAO,gBAAgB,OAAO;AAAA,IAChE,CAAC;AAED,UAAM,iBAAiB,UAAU,cAAc;AAAA,EACjD;AACF;;;AIxTO,SAAS,aACd,WACA,SAA+C,CAAC,GAC1C;AACN,QAAM,YAAY,OAAO,QAAQ;AAGjC,MAAI,CAAC,OAAO,SAAS,GAAG;AACtB,WAAO,SAAS,IAAI,CAAC;AAAA,EACvB;AAEA,QAAM,WAAW,OAAO,SAAS;AAGjC,WAAS,OAAO,YAAa,MAAqC;AAEhE,QAAI,YAAY,KAAK,CAAC,CAAC,GAAG;AACxB,YAAM,YAAY,CAAC,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC;AACzC,YAAMM,KAAI,MAAM,UAAU,KAAK,MAAM,MAAM,CAAC,SAAS,CAAC;AAEtD,kBAAY,WAAW,OAAO,QAAQ,SAAS;AAC/C,aAAOA;AAAA,IACT;AAEA,UAAM,IAAI,MAAM,UAAU,KAAK,MAAM,MAAM,IAAI;AAG/C,SAAK,QAAQ,CAAC,SAAS;AACrB,kBAAY,WAAW,OAAO,QAAQ,IAAI;AAAA,IAC5C,CAAC;AAED,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,oBAAgB,WAAW,OAAO,QAAQ,QAAQ;AAAA,EACpD;AACF;AAMA,SAAS,gBACP,WACA,SAAiB,YACjB,UACM;AAEN,oBAAkB,WAAW,QAAQ,UAAU,IAAI;AACnD,oBAAkB,WAAW,QAAQ,UAAU,KAAK;AAGpD,WAAS,SAAS;AACpB;AAKA,SAAS,kBACP,WACA,QACA,UACA,cACM;AACN,QAAM,gBAAgB;AACtB,QAAM,SAAoB,CAAC;AAC3B,MAAI,kBAAkB;AAEtB,WAAS,QAAQ,CAAC,eAAe;AAE/B,UAAM,OAAO,YAAY,UAAU,IAC/B,CAAC,GAAG,MAAM,KAAK,UAAU,CAAC,IAC1B,YAAY,UAAU,IACpB,MAAM,KAAK,UAAgC,IAC3C,CAAC,UAAU;AAGjB,QAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAG;AAC5C;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,KAAK,CAAC,KAAK,CAAC,GAAG;AACxD;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,CAAC;AACzB,UAAM,YACJ,CAAC,EAAS,UAAU,KACpB,EAAS,UAAU,KACnB,WAAW,WAAW,aAAa;AAErC,QAAI,CAAC,EAAS,UAAU,GAAG;AACzB,YAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,UAAI,CAAC,EAAS,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,KAAK,MAAM,GAAI;AAIjD,YAAM,aAAa;AACnB,UAAI,mBAAmB,KAAK,CAAC,MAAM,YAAY;AAC7C,0BAAkB;AAAA,MAEpB;AAAA,IACF,OAAO;AAEL,UACE,OAAO,eAAe,YACtB,OAAO,KAAK,UAAU,EAAE,WAAW,GACnC;AACA;AAAA,MACF;AAAA,IACF;AAGA,QACG,gBAAgB;AAAA,IAChB,CAAC,gBAAgB,CAAC;AAEnB,aAAO,KAAK,IAAI;AAAA,EACpB,CAAC;AAED,SAAO,QAAQ,CAAC,SAAS;AAEvB,gBAAY,WAAW,QAAQ,IAAI;AAAA,EACrC,CAAC;AACH;AAKA,SAAS,YACP,WACA,SAAiB,YACjB,MACM;AACN;AAAA,IACE,MAAM;AACJ,UAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,cAAM,CAAC,QAAQ,GAAG,IAAI,IAAI;AAG1B,YAAI,CAAC,UAAW,EAAS,MAAM,KAAK,OAAO,KAAK,MAAM,IAAK;AACzD;AAAA,QACF;AAGA,YAAI,EAAS,MAAM,KAAK,OAAO,WAAW,SAAS,GAAG;AACpD,oBAAU,KAAK,QAAQ,KAAK,CAAC,CAAC;AAC9B;AAAA,QACF;AAGA;AAAA,UACE;AAAA,YACE;AAAA,YACA,UAAU;AAAA,cACR;AAAA,cACA,OAAO;AAAA,cACP,UAAU;AAAA,cACV,SAAS;AAAA,cACT,KAAK;AAAA,cACL,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA;AAAA,UACA,GAAG;AAAA,QACL;AAAA,MACF,WAAW,QAAQ,OAAO,SAAS,UAAU;AAE3C,YAAI,OAAO,KAAK,IAAI,EAAE,WAAW,GAAG;AAClC;AAAA,QACF;AAEA,kBAAU,KAAK,IAAiC;AAAA,MAClD;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IAEN;AAAA,EACF,EAAE;AACJ;AAKA,SAAS,YAAY,OAAqC;AACxD,SACE,SAAS,QACT,OAAO,UAAU,YACjB,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM;AAE9C;AAKA,SAAS,YAAY,OAAyB;AAC5C,SACE,SAAS,QACT,OAAO,UAAU,YACjB,YAAY,SACZ,OAAQ,MAAoB,WAAW;AAE3C;;;AClNA,SAAS,WAAAC,gBAAe;AACxB,SAAS,gBAAgB,uBAAuB;AA4BzC,SAAS,aACd,WACA,UAA+B,CAAC,GACF;AAC9B,QAAM,gBAAgB,QAAQ,UAAU,CAAC;AACzC,QAAM,cAAc;AAAA,IAClB,UAAU,OAAO,iBAAiB,CAAC;AAAA,IACnC,QAAQ,QAAQ,CAAC;AAAA,EACnB;AAGA,QAAM,KAAsB,CAC1BC,UACAC,YACA,cACG;AACH,QAAI;AACJ,UAAM,eAAe;AACrB,QAAI,aAAa,OAAO,SAAS,aAAa;AAE5C,eAAS,aAAa;AAAA,QACpBD;AAAA,QACAC;AAAA,QACA;AAAA,MACF;AAAA,aACO,aAAa,OAAO;AAE3B,eAAU;AAAA,QACRD;AAAA,QACAC;AAAA,QACA;AAAA,MACF;AAGF,QAAIA,YAAW;AACb,MAAAA,WAAU,UAAUD;AAGpB,MAAAE,SAAQD,YAAW,SAAS;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,EAAE;AAAA,IACA,GAAG;AAAA;AAAA,IACH;AAAA;AAAA,IACA,MAAM;AAAA;AAAA,IACN;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACjFO,SAAS,UAAU,eAA6B,CAAC,GAAa;AACnE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,IACP,GAAG;AAAA,EACL;AACF;;;ACjBA;;;AC8BO,SAAS,aACd,SAAuB,CAAC,GACa;AACrC,QAAM,SAAS,OAAO,UAAU;AAEhC,SAAO,SAAU,QAAiC;AAEhD,QAAI,gBAAoC;AACxC,QAAI,eAAmC;AACvC,UAAM,iBAAsD,CAAC;AAC7D,UAAM,mBAA2C,CAAC;AAClD,UAAM,oBAA4C,CAAC;AACnD,UAAM,oBAAyC,CAAC;AAChD,UAAM,mBAAwC,CAAC;AAC/C,UAAM,iBAAyC,CAAC;AAGhD,aAAS,YAAY,OAA8C;AACjE,UAAI,CAAC,EAAU,KAAK,KAAK,UAAU,KAAM,QAAO;AAEhD,UAAI,MAAM,OAAO,KAAK;AAGtB,YAAM,IAAI,QAAQ,OAAO,MAAM;AAC/B,YAAM,IAAI,QAAQ,MAAM,KAAK;AAC7B,YAAM,IAAI,QAAQ,MAAM,KAAK;AAC7B,YAAM,IAAI,QAAQ,MAAM,KAAK;AAE7B,aAAO;AAAA,IACT;AAGA,aAAS,kBAAkB,KAAkC;AAC3D,aAAO,OAAO,QAAQ,GAAG,EACtB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,YAAY,KAAK,CAAC,EAAE,EACpD,KAAK,GAAG;AAAA,IACb;AAEA,UAAM,WAA2B;AAAA,MAC/B,OAAO,MAA8B;AACnC,wBAAgB;AAChB,uBAAe;AACf,eAAO;AAAA,MACT;AAAA,MAEA,KACE,WACA,OACgB;AAChB,cAAM,YAAY,sCAAgB;AAElC,YAAI,CAAC,eAAe,SAAS,GAAG;AAC9B,yBAAe,SAAS,IAAI,CAAC;AAAA,QAC/B;AAEA,YAAI,EAAS,SAAS,GAAG;AACvB,yBAAe,SAAS,EAAE,SAAS,IAAI;AAAA,QACzC,OAAO;AACL,iBAAO,OAAO,eAAe,SAAS,GAAG,SAAS;AAAA,QACpD;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,OACE,kBACA,aACgB;AAChB,YAAI,EAAS,gBAAgB,GAAG;AAC9B,cAAI,EAAU,WAAW,GAAG;AAE1B,6BAAiB,gBAAgB,IAAI;AAAA,UACvC,OAAO;AAEL,gBAAI,iBAAiB,SAAS,GAAG,GAAG;AAClC,oBAAM,CAAC,SAAS,MAAM,IAAI,iBAAiB,MAAM,KAAK,CAAC;AACvD,+BAAiB,OAAO,IAAI;AAAA,YAC9B,OAAO;AACL,+BAAiB,gBAAgB,IAAI;AAAA,YACvC;AAAA,UACF;AAAA,QACF,OAAO;AACL,iBAAO,OAAO,kBAAkB,gBAAgB;AAAA,QAClD;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,QACE,kBACA,aACgB;AAChB,YAAI,EAAS,gBAAgB,GAAG;AAC9B,cAAI,EAAU,WAAW,GAAG;AAE1B,8BAAkB,gBAAgB,IAAI;AAAA,UACxC,OAAO;AAEL,gBAAI,iBAAiB,SAAS,GAAG,GAAG;AAClC,oBAAM,CAAC,SAAS,MAAM,IAAI,iBAAiB,MAAM,KAAK,CAAC;AACvD,gCAAkB,OAAO,IAAI;AAAA,YAC/B,OAAO;AACL,gCAAkB,gBAAgB,IAAI;AAAA,YACxC;AAAA,UACF;AAAA,QACF,OAAO;AACL,iBAAO,OAAO,mBAAmB,gBAAgB;AAAA,QACnD;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,QACE,cACA,OACgB;AAChB,YAAI,EAAS,YAAY,GAAG;AAC1B,4BAAkB,YAAY,IAAI;AAAA,QACpC,OAAO;AACL,iBAAO,OAAO,mBAAmB,YAAY;AAAA,QAC/C;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,QACE,cACA,OACgB;AAChB,YAAI,EAAS,YAAY,GAAG;AAC1B,2BAAiB,YAAY,IAAI;AAAA,QACnC,OAAO;AACL,iBAAO,OAAO,kBAAkB,YAAY;AAAA,QAC9C;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,KACE,WACA,MACgB;AAChB,YAAI,EAAS,SAAS,GAAG;AACvB,yBAAe,SAAS,IAAI;AAAA,QAC9B,OAAO;AACL,iBAAO,OAAO,gBAAgB,SAAS;AAAA,QACzC;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAA8B;AAC5B,cAAM,aAAqC,CAAC;AAG5C,YAAI,eAAe;AACjB,qBAAW,MAAM,IAAI;AAAA,QACvB;AAGA,eAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,WAAW,KAAK,MAAM;AAC7D,cAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,kBAAM,WAAW,YACb,GAAG,MAAM,IAAI,SAAS,KACtB,GAAG,MAAM;AACb,uBAAW,QAAQ,IAAI,kBAAkB,KAAK;AAAA,UAChD;AAAA,QACF,CAAC;AAGD,YAAI,OAAO,KAAK,gBAAgB,EAAE,SAAS,GAAG;AAC5C,qBAAW,GAAG,MAAM,QAAQ,IAAI,kBAAkB,gBAAgB;AAAA,QACpE;AAGA,YAAI,OAAO,KAAK,iBAAiB,EAAE,SAAS,GAAG;AAC7C,qBAAW,GAAG,MAAM,SAAS,IAAI,kBAAkB,iBAAiB;AAAA,QACtE;AAGA,YAAI,OAAO,KAAK,iBAAiB,EAAE,SAAS,GAAG;AAC7C,qBAAW,GAAG,MAAM,SAAS,IAAI,kBAAkB,iBAAiB;AAAA,QACtE;AAGA,YAAI,OAAO,KAAK,gBAAgB,EAAE,SAAS,GAAG;AAC5C,qBAAW,GAAG,MAAM,SAAS,IAAI,kBAAkB,gBAAgB;AAAA,QACrE;AAGA,YAAI,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC1C,qBAAW,GAAG,MAAM,MAAM,IAAI,kBAAkB,cAAc;AAAA,QAChE;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACzMO,IAAM,gBAGT,OAAO,WAA+B,WAAgC;AACxE,MAAI;AAEF,UAAM,aAA2D;AAAA,MAC/D,GAAG;AAAA,MACH,UAAU,UAAU,OAAO,QAAQ;AAAA,IACrC;AAGA,UAAM,SAA+C;AAAA,MACnD,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AACR,kCAA0B,SAAS;AAAA,MAErC;AAAA,IACF;AAGA,QAAI,WAAW,SAAS,aAAa,OAAO;AAC1C,mBAAa,WAAW;AAAA,QACtB,MAAM,EAAS,WAAW,SAAS,QAAQ,IACvC,WAAW,SAAS,WACpB;AAAA,QACJ,QAAQ,WAAW,SAAS;AAAA,MAC9B,CAAC;AAAA,IACH;AAGA,QAAI,WAAW,SAAS,SAAS;AAC/B,YAAM,gBACJ,OAAO,WAAW,SAAS,YAAY,YACnC,CAAC,IACD,WAAW,SAAS;AAC1B,mBAAa,WAAW,EAAE,QAAQ,cAAc,CAAC;AAAA,IACnD;AAGA,UAAM,MAAM,cAAc,WAAW,WAAW,QAAQ;AAGxD,UAAM,cAAwB,CAAC,sBAAsB;AAEnD,0BAAoB,mBAAmB,WAAW,QAAQ;AAG1D,UAAI,WAAW,SAAS,UAAU;AAChC,cAAM,CAAC,MAAM,OAAO,IAAI;AAAA,UACtB,WAAW,SAAS,UAAU;AAAA,UAC9B,WAAW,SAAS;AAAA,QACtB;AACA;AAAA,UACE,EAAE,WAAW,mBAAmB,UAAU,WAAW,SAAS;AAAA,UAC9D;AAAA,UACA;AAAA,UACAE,UAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,aAAa,OAAO,WAAW;AAGpD,UAAM,kBACJ,UACA;AACF,IAAC,UAA6D,WAC5D,MAAM;AArGZ;AAsGQ,mBAAO,YAAP;AACA,UAAI,gBAAiB,iBAAgB;AAAA,IACvC;AAGF,UAAM,OAAoB,IAAI,SAAoB;AAEhD,YAAM,CAAC,OAAO,MAAM,SAAS,SAAS,QAAQ,MAAM,IAAI;AACxD,aAAO;AAAA,QACL,EAAE,WAAW,UAAU,WAAW,SAAS;AAAA,QAC3C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,EAAS,WAAW,SAAS,GAAG;AAClC,aAAO,WAAW,SAAS,GAAG,IAAI;AAEpC,WAAO,EAAE,QAAQ,IAAI;AAAA,EACvB,SAAS,OAAO;AACd,UAAM;AAAA,EACR;AACF;AAEA,IAAO,gBAAQ;","names":["Const","getAttribute","filter","str","elem","elementConfig","_a","_b","event","Triggers","Const","elem","getAttribute","scrollElements","context","i","onApply","session","collector","onApply","Triggers"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/web-source-browser",
3
3
  "description": "Browser DOM source for walkerOS",
4
- "version": "0.0.9",
4
+ "version": "0.1.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -20,13 +20,13 @@
20
20
  "build": "tsup --silent",
21
21
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
22
22
  "dev": "jest --watchAll --colors",
23
- "lint": "tsc && eslint \"**/*.ts*\" --rule '@typescript-eslint/no-explicit-any: off'",
23
+ "lint": "tsc && eslint \"**/*.ts*\"",
24
24
  "test": "jest",
25
25
  "update": "npx npm-check-updates -u && npm update"
26
26
  },
27
27
  "dependencies": {
28
- "@walkeros/collector": "0.0.8",
29
- "@walkeros/web-core": "0.0.8"
28
+ "@walkeros/collector": "0.1.0",
29
+ "@walkeros/web-core": "0.1.0"
30
30
  },
31
31
  "repository": {
32
32
  "url": "git+https://github.com/elbwalker/walkerOS.git",