@walkeros/web-source-browser 4.2.1 → 4.2.2-next-1782892388850

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/trigger.ts","../src/walker.ts","../src/triggerVisible.ts","../src/translation.ts","../src/elbLayer.ts","../src/config.ts","../src/types/index.ts","../src/tagger.ts"],"sourcesContent":["import type { Source, WalkerOS, On } from '@walkeros/core';\nimport type { Scope, Types, Env } from './types';\nimport type {\n BrowserPushData,\n BrowserPushOptions,\n BrowserPushContext,\n BrowserPush,\n BrowserArguments,\n} from './types/elb';\nimport { isString } from '@walkeros/core';\nimport { createPushResult } from '@walkeros/collector';\nimport {\n initTriggers,\n initScopeTrigger,\n processLoadTriggers,\n ready,\n destroyTriggers,\n} from './trigger';\nimport { destroyVisibilityTracking } from './triggerVisible';\nimport { initElbLayer, drainNonWalkerEvents } from './elbLayer';\nimport { translateToCoreCollector } from './translation';\nimport { getPageViewData } from './walker';\nimport { getConfig } from './config';\n\nexport * as SourceBrowser from './types';\n\n/**\n * Window-scoped single-instance sentinel. The browser source must be\n * single-instance per window: one elbLayer adoption, one set of DOM\n * listeners, one `window.elb`. A second/synchronous load of the tag on the\n * same page is a SEPARATE module instance, so a module-scoped counter cannot\n * see it (each load starts at 0). The marker therefore lives on the window\n * itself. A Symbol key avoids collision with page globals and is\n * non-enumerable by nature.\n */\nconst SINGLE_INSTANCE_KEY = Symbol.for('@walkeros/web-source-browser:instance');\n\ntype EnvWindow = Window & typeof globalThis;\n\nfunction resolveGuardWindow(\n envWindow: EnvWindow | undefined,\n): EnvWindow | undefined {\n return (\n envWindow ||\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined)\n );\n}\n\n/** For tests only. Clears the window-scoped single-instance sentinel. */\nexport function __resetInstanceCountForTests(): void {\n const win = resolveGuardWindow(undefined);\n if (win) Reflect.deleteProperty(win, SINGLE_INSTANCE_KEY);\n}\n\n/**\n * Inert source instance returned on a second load within the same window.\n * It satisfies the `Source.Instance` contract but performs no side effects:\n * `init` does not adopt elbLayer or bind DOM triggers, `push` resolves to a\n * successful no-op result, and `on`/`destroy` do nothing. This keeps a double\n * load from re-adopting `window.elbLayer` (the production crash vector)\n * without surfacing an error to the host page.\n */\nfunction createInertInstance(): Source.Instance<Types> {\n const fullConfig: Source.Config<Types> = {\n settings: getConfig({}, undefined),\n };\n const push: BrowserPush = ((..._args: Parameters<BrowserArguments>) =>\n Promise.resolve(createPushResult({ ok: true }))) satisfies BrowserPush;\n return {\n type: 'browser',\n config: fullConfig,\n push,\n on: async () => {},\n init: async () => {},\n destroy: async () => {},\n };\n}\n\n// Export walker utility functions\nexport {\n getAllEvents,\n getEvents,\n getGlobals,\n getElbAttributeName,\n getElbValues,\n} from './walker';\n\n// Export tagger functionality\nexport { createTagger } from './tagger';\nexport type { TaggerConfig, TaggerInstance } from './tagger';\n\n/**\n * Browser source implementation using environment injection.\n *\n * The factory body is side-effect-free: it constructs the Instance and\n * captures closure state. All eager setup (elbLayer drain, DOM listeners,\n * `window.elb` assignment) lives in the `init` lifecycle method, which\n * the collector calls after every source factory has registered. The\n * collector strictly gates `on()` delivery: lifecycle events are queued\n * in `instance.queueOn` until the source is started.\n */\nexport const sourceBrowser: Source.Init<Types> = async (context) => {\n const { config, env, logger } = context;\n const { elb, command, window, document } = env;\n\n const userSettings = config?.settings || {};\n const actualWindow =\n window ||\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n const actualDocument =\n document ||\n (typeof globalThis.document !== 'undefined'\n ? globalThis.document\n : undefined);\n\n // Single-instance per window. A second load on the same page is a separate\n // module instance, so the marker lives on the window, not in module scope.\n // Window-less environments (SSR/node/test without a window) are not guarded.\n const guardWindow = resolveGuardWindow(actualWindow);\n if (guardWindow) {\n if (Reflect.get(guardWindow, SINGLE_INSTANCE_KEY))\n return createInertInstance();\n // Set before init() runs so a synchronous second load is caught before\n // this first instance performs its own factory/init side effects.\n Object.defineProperty(guardWindow, SINGLE_INSTANCE_KEY, {\n value: true,\n enumerable: false,\n configurable: true,\n writable: false,\n });\n }\n\n const settings: Source.Settings<Types> = getConfig(\n userSettings,\n actualDocument as Document | undefined,\n );\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n const translationContext = {\n elb,\n settings,\n initScope: initScopeTrigger,\n };\n\n // Helper to send pageview event if enabled\n const sendPageview = (s: Source.Settings<Types>) => {\n if (!s.pageview) return;\n const [data, contextData] = getPageViewData(\n s.prefix || 'data-elb',\n s.scope as Scope,\n );\n translateToCoreCollector(\n translationContext,\n 'page view',\n data,\n 'load',\n contextData,\n );\n };\n\n // Lifecycle method — eager. The collector calls this AFTER all source\n // factories have registered. Side effects allowed: drains walker\n // commands from window.elbLayer, sets up DOM listeners, overrides\n // elbLayer.push for live captures.\n const init = async () => {\n if (!actualWindow || !actualDocument) return;\n\n if (settings.elbLayer !== false && elb) {\n initElbLayer(elb, {\n name: isString(settings.elbLayer) ? settings.elbLayer : 'elbLayer',\n prefix: settings.prefix,\n window: actualWindow as Window,\n logger,\n });\n }\n\n // Setup global triggers (click, submit) when DOM is ready\n await ready(initTriggers, translationContext, settings);\n\n // Set up automatic window.elb assignment if configured\n if (isString(settings.elb) && settings.elb) {\n (actualWindow as unknown as Record<string, unknown>)[settings.elb] = (\n ...args: unknown[]\n ) => {\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n translationContext,\n event,\n data as BrowserPushData | undefined,\n options as BrowserPushOptions | undefined,\n context as BrowserPushContext | undefined,\n nested as WalkerOS.Entities,\n custom as WalkerOS.Properties,\n );\n };\n }\n };\n\n // Lifecycle handler — fired by the collector only when this source is\n // started (config.init=true AND config.require empty). Pre-start events\n // are buffered in instance.queueOn by the collector and replayed on start.\n const handleEvent = async (event: On.Types) => {\n switch (event) {\n case 'run':\n if (actualDocument && actualWindow) {\n processLoadTriggers(translationContext, settings);\n drainNonWalkerEvents(elb, settings, actualWindow as Window, logger);\n sendPageview(settings);\n }\n break;\n\n default:\n break;\n }\n };\n\n const push: BrowserPush = ((...args: Parameters<BrowserArguments>) => {\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n translationContext,\n event,\n data,\n options,\n context,\n nested,\n custom,\n );\n }) satisfies BrowserPush;\n\n // Return stateless source instance with event handler and push method\n return {\n type: 'browser',\n config: fullConfig,\n push,\n on: handleEvent,\n init,\n destroy: async () => {\n // Remove all DOM trigger listeners registered via AbortController\n destroyTriggers(settings);\n // Cleanup visibility tracking and other resources\n if (actualDocument) {\n destroyVisibilityTracking(\n settings.scope || (actualDocument as Document),\n );\n }\n },\n };\n};\n\nexport default sourceBrowser;\n","import type { WalkerOS, Collector } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope, Settings, Context } from './types';\nimport { throttle, tryCatch } from '@walkeros/core';\nimport { Const, onApply } from '@walkeros/collector';\nimport { elb as elbOrg, getAttribute } from '@walkeros/web-core';\nimport {\n getElbAttributeName,\n getEvents,\n getPageViewData,\n getTriggerActions,\n queryAllComposed,\n} from './walker';\nimport {\n initVisibilityTracking,\n triggerVisible,\n destroyVisibilityTracking,\n} from './triggerVisible';\nimport { translateToCoreCollector } from './translation';\n\n// Module-level state is intentional. The walker.js browser source is\n// single-instance per window: one elb queue, one set of DOM listeners,\n// one scroll tracker. The state below is shared across all callers\n// because there is only ever one caller. If multi-instance ever becomes\n// a real requirement (e.g., micro-frontends with isolated walker queues),\n// refactor this into a per-instance closure returned by createSource()\n// and route every trigger function through that closure.\nlet scrollElements: Walker.ScrollElements = [];\nlet scrollListener: EventListenerOrEventListenerObject | undefined;\nlet globalAbortController: AbortController | undefined;\nlet pulseIntervals: ReturnType<typeof setInterval>[] = [];\nlet waitTimeouts: ReturnType<typeof setTimeout>[] = [];\n\n// Listeners registered before initTriggers (or after destroyTriggers) would\n// otherwise miss the AbortController and never be removed on teardown. This\n// helper guarantees every listener gets a signal from the current session's\n// controller, lazily creating one when needed.\nfunction ensureAbortController(): AbortController {\n if (!globalAbortController) {\n globalAbortController = new AbortController();\n }\n return globalAbortController;\n}\n\n// Reset function for testing\nexport function resetScrollListener() {\n scrollListener = undefined;\n scrollElements = [];\n}\n\nexport const createElb: (customLayer?: unknown) => unknown = (customLayer?) => {\n return (\n customLayer\n ? function () {\n (customLayer as unknown[]).push(arguments);\n }\n : elbOrg\n ) as unknown;\n};\n\nexport const Triggers: { [key: string]: Walker.Trigger } = {\n Click: 'click',\n Custom: 'custom',\n Hover: 'hover',\n Load: 'load',\n Pulse: 'pulse',\n Scroll: 'scroll',\n Submit: 'submit',\n Impression: 'impression',\n Visible: 'visible',\n Wait: 'wait',\n} as const;\n\nexport async function ready(\n fn: (context: Context, settings: Settings) => void,\n context: Context,\n settings: Settings,\n): Promise<void> {\n const readyFn = () => {\n fn(context, settings);\n };\n\n const scope = settings.scope;\n if (!scope) {\n readyFn();\n return;\n }\n const doc = (scope as Element).ownerDocument || (scope as Document);\n if (doc.readyState !== 'loading') {\n readyFn();\n } else {\n doc.addEventListener('DOMContentLoaded', readyFn);\n }\n}\n\n// Called once during source initialization to setup global listeners\nexport function initTriggers(context: Context, settings: Settings) {\n if (!settings.scope) return; // Skip if no scope available\n const requiredSettings = settings as Required<Settings>;\n initGlobalTrigger(context, requiredSettings);\n}\n\n// Called on each walker run to process load triggers\nexport function processLoadTriggers(context: Context, settings: Settings) {\n if (!settings.scope) return; // Skip if no scope available\n const requiredSettings = settings as Required<Settings>;\n initScopeTrigger(context, requiredSettings);\n}\n\nexport function initGlobalTrigger(context: Context, settings: Settings): void {\n const scope = settings.scope;\n\n if (!scope) return;\n\n // Abort any previously registered listeners before re-registering\n if (globalAbortController) globalAbortController.abort();\n globalAbortController = new AbortController();\n const { signal } = globalAbortController;\n\n scope.addEventListener(\n 'click',\n tryCatch(function (this: Scope, ev: unknown) {\n triggerClick.call(this, context, ev as MouseEvent);\n }) as EventListener,\n { signal },\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 { signal },\n );\n}\n\n// Removes all listeners registered via the global AbortController and\n// resets module-level scroll state. Safe to call before any init.\nexport function destroyTriggers(settings: Settings): void {\n if (globalAbortController) {\n globalAbortController.abort();\n globalAbortController = undefined;\n }\n scrollListener = undefined;\n scrollElements = [];\n pulseIntervals.forEach((id) => clearInterval(id));\n pulseIntervals = [];\n waitTimeouts.forEach((id) => clearTimeout(id));\n waitTimeouts = [];\n}\n\nexport function initScopeTrigger(context: Context, settings: Settings) {\n const elem = settings.scope;\n\n // Reset all scroll events @TODO check if it's right here\n scrollElements = [];\n\n // Clean up any existing visibility tracking to prevent observer accumulation\n const scope = elem;\n if (!scope) return;\n destroyVisibilityTracking(scope);\n // Initialize visibility tracking for this scope\n initVisibilityTracking(scope, 1000);\n\n // default data-elbaction\n const selectorAction = getElbAttributeName(\n settings.prefix,\n Const.Commands.Action,\n false,\n );\n const doc = (scope as Element).ownerDocument || (scope as Document);\n if (scope !== doc) {\n // Handle the elements action(s), too\n handleActionElem(context, scope as HTMLElement, selectorAction, settings);\n }\n\n // Handle all children action(s)\n queryAllComposed(scope, `[${selectorAction}]`, (elem) => {\n handleActionElem(context, elem as HTMLElement, selectorAction, settings);\n });\n\n if (scrollElements.length) scroll(context, scope, settings);\n}\n\nexport async function handleTrigger(\n context: Context,\n element: Element,\n trigger: string,\n // @TODO add triggerParams to filter for specific trigger\n): Promise<unknown[]> {\n const events = getEvents(element, trigger, context.settings.prefix);\n return Promise.all(\n events.map((event: Walker.Event) =>\n translateToCoreCollector(context, {\n name: `${event.entity} ${event.action}`,\n ...event,\n trigger,\n }),\n ),\n );\n}\n\nfunction handleActionElem(\n context: Context,\n elem: HTMLElement,\n selectorAction: string,\n settings: Settings,\n) {\n const actionAttr = getAttribute(elem, selectorAction);\n\n if (!actionAttr) return;\n\n // TriggersActionGroups ([trigger: string]: TriggerActions)\n Object.values(getTriggerActions(actionAttr)).forEach((triggerActions) =>\n // TriggerActions (Array<TriggerAction>)\n triggerActions.forEach((triggerAction: Walker.TriggerActions[0]) => {\n // TriggerAction ({ trigger, triggerParams, action, actionParams })\n switch (triggerAction.trigger) {\n case Triggers.Hover:\n triggerHover(context, elem);\n break;\n case Triggers.Load:\n triggerLoad(context, elem);\n break;\n case Triggers.Pulse:\n triggerPulse(context, elem, triggerAction.triggerParams);\n break;\n case Triggers.Scroll:\n triggerScroll(elem, triggerAction.triggerParams);\n break;\n case Triggers.Impression:\n triggerVisible(context, elem);\n break;\n case Triggers.Visible:\n triggerVisible(context, elem, { multiple: true });\n break;\n case Triggers.Wait:\n triggerWait(context, elem, triggerAction.triggerParams);\n break;\n }\n }),\n );\n}\n\n/**\n * Get the actual event target, piercing open shadow DOM boundaries.\n * Uses composedPath() to find the real target inside shadow roots.\n * For closed shadow DOM, falls back to the host element (by design).\n */\nfunction getComposedTarget(ev: Event): Element | undefined {\n const path = ev.composedPath?.();\n const target = path?.length ? path[0] : ev.target;\n if (!target || typeof target !== 'object' || !('tagName' in target))\n return undefined;\n return target as Element;\n}\n\nfunction triggerClick(context: Context, ev: MouseEvent) {\n const target = getComposedTarget(ev);\n if (target) handleTrigger(context, target, Triggers.Click);\n}\n\nfunction triggerHover(context: Context, elem: HTMLElement) {\n elem.addEventListener(\n 'mouseenter',\n tryCatch(function (this: Document, ev: MouseEvent) {\n const target = getComposedTarget(ev);\n if (target) handleTrigger(context, target, Triggers.Hover);\n }),\n { signal: ensureAbortController().signal },\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 const doc = elem.ownerDocument;\n const intervalId = setInterval(\n () => {\n // Only trigger when tab is active\n if (!doc.hidden) handleTrigger(context, elem, Triggers.Pulse);\n },\n parseInt(triggerParams || '') || 15000,\n );\n pulseIntervals.push(intervalId);\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 const target = getComposedTarget(ev);\n if (target) handleTrigger(context, target, Triggers.Submit);\n}\n\nfunction triggerWait(\n context: Context,\n elem: HTMLElement,\n triggerParams: string = '',\n) {\n const timeoutId = setTimeout(\n () => handleTrigger(context, elem, Triggers.Wait),\n parseInt(triggerParams || '') || 15000,\n );\n waitTimeouts.push(timeoutId);\n}\n\nfunction scroll(context: Context, scope: Scope, settings: Settings) {\n const doc = (scope as Element).ownerDocument || (scope as Document);\n const win = doc.defaultView!;\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 = win.scrollY + win.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 signal: ensureAbortController().signal,\n });\n }\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope } from './types';\nimport { assign, castValue, isArray, trim } from '@walkeros/core';\nimport { Const } from '@walkeros/collector';\nimport { getAttribute } from '@walkeros/web-core';\n\nexport function getElbAttributeName(\n prefix: string,\n name?: string,\n isProperty = true,\n): string {\n // separate dynamic properties from walker Const.Commands\n const separator = isProperty ? '-' : '';\n name = name != undefined ? separator + name : '';\n return prefix + name;\n}\n\nexport function getElbValues(\n prefix: string,\n element: Element,\n name: string,\n isProperty = true,\n): WalkerOS.Properties {\n const attributeValue =\n getAttribute(element, getElbAttributeName(prefix, name, isProperty)) || '';\n\n const elbValues = splitAttribute(attributeValue).reduce((values, str) => {\n let [key, val]: Walker.KeyVal = splitKeyVal(str);\n\n if (!key) return values;\n\n // Handle keys without value\n if (!val) {\n // Manually remove the : from key on empty values\n if (key.endsWith(':')) key = key.slice(0, -1);\n val = '';\n }\n\n // Dynamic values\n if (val.startsWith('#')) {\n val = val.slice(1); // Remove # symbol\n try {\n // Read property value from element\n let dynamicValue = (element as Element)[val as keyof Element];\n if (!dynamicValue && val === 'selected') {\n // Try to read selected value with chance of error\n dynamicValue = (element as HTMLSelectElement).options[\n (element as HTMLSelectElement).selectedIndex\n ].text;\n }\n\n val = String(dynamicValue);\n } catch (error) {\n val = '';\n }\n }\n\n if (key.endsWith('[]')) {\n key = key.slice(0, -2); // Remove [] symbol\n if (!isArray(values[key])) values[key] = [];\n (values[key] as WalkerOS.PropertyType[]).push(castValue(val));\n } else {\n values[key] = castValue(val);\n }\n\n return values;\n }, {} as WalkerOS.Properties);\n\n return elbValues;\n}\n\nexport function getAllEvents(\n scope: Scope,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\n const actualScope = scope;\n if (!actualScope) return [];\n let events: Walker.Events = [];\n const action = Const.Commands.Action;\n const actionSelector = `[${getElbAttributeName(prefix, action, false)}]`;\n\n const processElementEvents = (elem: Element) => {\n Object.keys(getElbValues(prefix, elem, action, false)).forEach(\n (trigger) => {\n events = events.concat(getEvents(elem, trigger, prefix));\n },\n );\n };\n\n // Check if the scope element itself has action attributes\n const doc =\n (actualScope as Element).ownerDocument || (actualScope as Document);\n if (\n actualScope !== doc &&\n (actualScope as Element).matches?.(actionSelector)\n ) {\n processElementEvents(actualScope as Element);\n }\n\n queryAllComposed(actualScope, actionSelector, processElementEvents);\n\n return events;\n}\n\nexport function getEvents(\n target: Element,\n trigger: string,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\n const events: Walker.Events = [];\n\n // Check for actions and get entity collection strategy\n const { actions, nearestOnly } = resolveAttributes(prefix, target, trigger);\n\n // Stop if there's no valid action combo\n if (!actions.length) return events;\n\n actions.forEach((triggerAction) => {\n const filter = splitAttribute(triggerAction.actionParams || '', ',').reduce(\n (filter, param) => {\n filter[trim(param)] = true;\n return filter;\n },\n {} as Walker.Filter,\n );\n\n // Get entities - using nearestOnly flag to determine collection strategy\n const entities = getEntities(prefix, target, filter, nearestOnly);\n\n // Use page as default entity if no one was set\n if (!entities.length) {\n const entity = 'page';\n // Only use explicit page properties and ignore generic properties\n const entitySelector = `[${getElbAttributeName(prefix, entity)}]`;\n\n // Get matching properties from the element and its parents\n const [data, context] = getThisAndParentProperties(\n target,\n entitySelector,\n prefix,\n entity,\n );\n\n entities.push({\n entity, // page\n data, // Consider only upper data\n nested: [], // Skip nested in this faked page case\n context,\n });\n }\n\n // Return a list of full events\n entities.forEach((entity) => {\n events.push({\n entity: entity.entity,\n action: triggerAction.action,\n data: entity.data,\n trigger,\n context: entity.context,\n nested: entity.nested ?? [],\n });\n });\n });\n\n return events;\n}\n\nexport function getGlobals(\n prefix: string = Const.Commands.Prefix,\n scope?: Scope,\n): WalkerOS.Properties {\n if (!scope) return {};\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 doc = (scope as Element).ownerDocument || (scope as Document);\n const win = doc.defaultView!;\n const loc = win.location;\n const page = 'page';\n const scopeElement =\n 'body' in scope ? (scope as 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 = doc.title;\n data.referrer = doc.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 true, // collect scoped generic (data-elb_) for real entities\n );\n\n // Add linked elements (data-elblink)\n queryAllComposed(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: Searches entire document including shadow roots.\n // Acceptable because link-parent usage is rare in practice.\n if (linkState === 'parent')\n queryAllComposed(\n element.ownerDocument.body,\n `[${linkName}=\"${linkId}:child\"]`,\n (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\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 queryAllComposed(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 queryAllComposed(\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 // Link-parent lookup does not cross shadow boundaries.\n // Uses simple queryAll (no shadow recursion) since this runs\n // during per-event entity traversal.\n const doc = elem.ownerDocument;\n let found: HTMLElement | null = null;\n queryAll(doc, `[${linkName}=\"${linkId}:parent\"]`, (el) => {\n if (!found) found = el as HTMLElement;\n });\n return found;\n }\n }\n\n // Shadow DOM traversal\n const win = elem.ownerDocument.defaultView!;\n if (\n !elem.parentElement &&\n elem.getRootNode &&\n elem.getRootNode() instanceof win.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 collectScoped = false,\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 const scopedName = Const.Commands.Scoped; // '_' -> data-elb_\n const scopedSelector = `[${getElbAttributeName(prefix, scopedName, false)}]`;\n\n // Get all bubbling-up properties with decreasing priority\n let contextI = 0; // Context counter\n while (parent) {\n // Scoped generic (data-elb_): same generic tier, bubble-up only.\n // The synthetic page entity ignores generics, so it skips scoped too.\n // Guard on scopedName so a falsy command constant degrades to \"no scoped\n // collection\" instead of an empty suffix that would match the bare prefix.\n if (collectScoped && scopedName && parent.matches(scopedSelector)) {\n data = assign(getElbValues(prefix, parent, scopedName, false), data);\n }\n\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 scope.querySelectorAll(selector).forEach(fn);\n}\n\n// Shadow-aware version that recurses into open shadow roots.\n// Use for discovery (init) and entity-scoped queries (small subtrees).\n// Avoid for per-event document-scoped queries (e.g. getGlobals).\nexport function queryAllComposed(\n scope: Document | Element | ShadowRoot,\n selector: string,\n fn: (element: Element) => void,\n): void {\n scope.querySelectorAll(selector).forEach(fn);\n\n const doc = (scope as Element).ownerDocument || (scope as Document);\n const win = doc.defaultView!;\n if (scope instanceof win.Element && scope.shadowRoot) {\n queryAllComposed(scope.shadowRoot, selector, fn);\n }\n scope.querySelectorAll('*').forEach((el) => {\n if (el.shadowRoot) {\n queryAllComposed(el.shadowRoot, selector, fn);\n }\n });\n}\n\nfunction resolveAttributes(\n prefix: string,\n target: Element,\n trigger: string,\n): { actions: Walker.TriggerActions; nearestOnly: boolean } {\n let element = target as Node['parentElement'];\n\n while (element) {\n // Check for data-elbactions first (takes precedence)\n const multiAttribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Actions, false),\n );\n\n if (multiAttribute) {\n const triggerActions = getTriggerActions(multiAttribute);\n if (triggerActions[trigger]) {\n return { actions: triggerActions[trigger], nearestOnly: false };\n }\n }\n\n // Check for data-elbaction (nearest entity only)\n const singleAttribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Action, false),\n );\n\n if (singleAttribute) {\n const triggerActions = getTriggerActions(singleAttribute);\n // Action found on element or is not a click trigger\n if (triggerActions[trigger] || trigger !== 'click') {\n return { actions: triggerActions[trigger] || [], nearestOnly: true };\n }\n }\n\n element = getParent(prefix, element);\n }\n\n return { actions: [], nearestOnly: false };\n}\n\nfunction splitAttribute(str: string, separator = ';'): Walker.Attributes {\n const values: Walker.Attributes = [];\n\n if (!str) return values;\n\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\nfunction splitKeyVal(str: string): Walker.KeyVal {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key), trim(value)];\n}\n\nfunction parseAttribute(str: string): Walker.KeyVal {\n // action(a, b, c)\n const [key, value] = str.split('(', 2);\n const param = value ? value.slice(0, -1) : ''; // Remove the )\n // key = 'action'\n // param = 'a, b, c'\n return [key, param];\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Settings, Context } from './types';\nimport { tryCatch } from '@walkeros/core';\nimport { isVisible } from '@walkeros/web-core';\nimport { handleTrigger, Triggers } from './trigger';\n\n// Cache for element size calculations to reduce DOM queries\nconst elementSizeCache = new WeakMap<\n HTMLElement,\n { isLarge: boolean; lastChecked: number }\n>();\n\n// Cache for basic visibility checks to reduce expensive isVisible() calls\nconst visibilityCache = new WeakMap<\n HTMLElement,\n { isVisible: boolean; lastChecked: number }\n>();\n\n// Module-level visibility state management (stateless source architecture)\ninterface VisibilityState {\n observer?: IntersectionObserver;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean; context: Context; trigger: string }\n >;\n}\n\n// Module-level visibility state keyed by document/scope\nconst visibilityStates = new WeakMap<Document | Element, VisibilityState>();\n\n/**\n * Cached visibility check to reduce expensive isVisible() calls\n */\nfunction isElementVisible(element: HTMLElement): boolean {\n const now = Date.now();\n let cached = visibilityCache.get(element);\n\n // Cache visibility result for 500ms to balance accuracy with performance\n if (!cached || now - cached.lastChecked > 500) {\n const win = element.ownerDocument.defaultView!;\n const doc = element.ownerDocument;\n cached = {\n isVisible: isVisible(element, win, doc),\n lastChecked: now,\n };\n visibilityCache.set(element, cached);\n }\n\n return cached.isVisible;\n}\n\n/**\n * Element cleanup (unobserve + timer + cache cleanup)\n */\nexport function unobserveElement(\n scope: Document | Element,\n element: HTMLElement,\n): void {\n const state = visibilityStates.get(scope);\n if (!state) return;\n\n if (state.observer) {\n state.observer.unobserve(element);\n }\n\n // Clear timer\n const timer = state.timers.get(element);\n if (timer) {\n clearTimeout(timer);\n state.timers.delete(element);\n }\n\n // Clean up caches to prevent memory leaks\n elementSizeCache.delete(element);\n visibilityCache.delete(element);\n}\n\n/**\n * Creates an IntersectionObserver for the given scope\n */\nfunction createObserver(\n scope: Document | Element,\n): IntersectionObserver | undefined {\n const doc = (scope as Element).ownerDocument || (scope as Document);\n const win = doc.defaultView;\n if (!win || !win.IntersectionObserver) return undefined;\n\n return tryCatch(\n () =>\n new win.IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n handleIntersection(scope, entry);\n });\n },\n {\n rootMargin: '0px',\n threshold: [0, 0.5],\n },\n ),\n () => undefined,\n )();\n}\n\n/**\n * Handles intersection changes for observed elements\n */\nfunction handleIntersection(\n scope: Document | Element,\n entry: IntersectionObserverEntry,\n): void {\n const target = entry.target as HTMLElement;\n const state = visibilityStates.get(scope);\n\n if (!state) return;\n\n const existingTimer = state.timers.get(target);\n\n if (entry.intersectionRatio > 0) {\n // Optimize: Cache element size calculations to avoid repeated DOM queries\n const now = Date.now();\n let cached = elementSizeCache.get(target);\n\n // Cache element size for 1 second to reduce DOM queries\n if (!cached || now - cached.lastChecked > 1000) {\n const win = target.ownerDocument.defaultView!;\n cached = {\n isLarge: target.offsetHeight > win.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 targetWin = target.ownerDocument.defaultView!;\n const timer = targetWin.setTimeout(async () => {\n // Final visibility check before triggering (cached for performance)\n if (isElementVisible(target)) {\n // Get element configuration to access context\n const elementConfig = state.elementConfigs?.get(target);\n if (elementConfig?.context) {\n await handleTrigger(\n elementConfig.context,\n target as Element,\n elementConfig.trigger,\n );\n }\n\n // Get fresh element config reference for state update\n const currentConfig = state.elementConfigs?.get(target);\n\n // For multiple triggers, mark as visible after firing\n if (currentConfig?.multiple) {\n currentConfig.blocked = true;\n } else {\n // Clean up and unobserve only if not a multiple trigger\n unobserveElement(scope, target);\n }\n }\n }, state.duration);\n\n state.timers.set(target, timer);\n }\n return;\n }\n }\n\n // Element isn't sufficiently in viewport - clear existing timer\n if (existingTimer) {\n clearTimeout(existingTimer);\n state.timers.delete(target);\n }\n\n // For multiple triggers, mark as not visible for re-entry detection\n const elementConfig = state.elementConfigs?.get(target);\n if (elementConfig?.multiple) {\n elementConfig.blocked = false;\n }\n}\n\n/**\n * Initializes visibility tracking for a scope (document/element)\n */\nexport function initVisibilityTracking(\n scope: Document | Element,\n duration = 1000,\n): void {\n if (visibilityStates.has(scope)) return; // Already initialized\n\n visibilityStates.set(scope, {\n observer: createObserver(scope),\n timers: new WeakMap(),\n duration,\n });\n}\n\n/**\n * Main trigger function for visible elements\n */\nexport function triggerVisible(\n context: Context,\n element: HTMLElement,\n config: { multiple?: boolean } = { multiple: false },\n): void {\n const scope = context.settings.scope;\n if (!scope) return;\n const state = visibilityStates.get(scope);\n\n if (state?.observer && element) {\n // Store element config for later use in intersection handling\n if (!state.elementConfigs) {\n state.elementConfigs = new WeakMap();\n }\n state.elementConfigs.set(element, {\n multiple: config.multiple ?? false,\n blocked: false,\n context,\n trigger: config.multiple ? 'visible' : 'impression',\n });\n state.observer.observe(element);\n }\n}\n\n/**\n * Destroys visibility tracking for a scope, cleaning up all resources\n */\nexport function destroyVisibilityTracking(scope?: Document | Element): void {\n if (!scope) return; // No scope provided, nothing to clean up\n\n const state = visibilityStates.get(scope);\n if (!state) return;\n\n if (state.observer) {\n state.observer.disconnect();\n }\n\n visibilityStates.delete(scope);\n}\n","import type { WalkerOS, Elb, Collector } from '@walkeros/core';\nimport { isString, isObject, isElementOrDocument } from '@walkeros/core';\nimport { createPushResult } from '@walkeros/collector';\nimport type {\n BrowserPushData,\n BrowserPushOptions,\n BrowserPushContext,\n} from './types/elb';\nimport type { Context, Settings } from './types';\nimport { getEntities, getGlobals } from './walker';\n\n/**\n * Translation layer that converts flexible browser source inputs\n * to the strict core collector format\n */\nexport function translateToCoreCollector(\n context: Context,\n eventOrCommand: unknown,\n data?: BrowserPushData,\n options?: BrowserPushOptions,\n pushContext?: BrowserPushContext,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n): Promise<Elb.PushResult> {\n const { elb, settings } = context;\n\n // Handle walker commands. `walker init` is browser-only (re-scans a DOM\n // scope for `data-elb*` tags and fires load triggers) and is dispatched\n // here because the collector must stay DOM-free. All other walker\n // commands route through elb to commonHandleCommand on the collector.\n // `initScope` arrives on `context` from the source factory to avoid a\n // static import of `./trigger` (which would form a load-time cycle).\n if (isString(eventOrCommand) && eventOrCommand.startsWith('walker ')) {\n if (eventOrCommand === 'walker init' && context.initScope) {\n const scopes = normalizeInitScopes(data, settings);\n for (const scope of scopes) {\n context.initScope(context, { ...settings, scope });\n }\n return Promise.resolve(createPushResult({ ok: true }));\n }\n return elb(eventOrCommand, data as WalkerOS.Properties);\n }\n\n // Handle event objects - add source and globals if missing\n if (isObject(eventOrCommand)) {\n const event = eventOrCommand;\n if (!event.source && settings.scope) {\n const scopeDoc = ((settings.scope as Element).ownerDocument ||\n settings.scope) as Document;\n const scopeWin = scopeDoc.defaultView!;\n event.source = getBrowserSource(scopeWin, scopeDoc);\n }\n\n // Add globals if not already present\n if (!event.globals && settings.scope) {\n event.globals = getGlobals(settings.prefix, settings.scope);\n }\n\n return elb(event);\n }\n\n // Extract entity name from event string\n const [entity] = String(\n isObject(eventOrCommand) ? eventOrCommand.name : eventOrCommand,\n ).split(' ');\n\n // Get data and context either from elements or parameters\n let eventData = isObject(data) ? (data as WalkerOS.Properties) : {};\n let eventContext: WalkerOS.OrderedProperties = {};\n\n let elemParameter: undefined | Element;\n let dataIsElem = false;\n\n // Check if data parameter is an element\n if (isElementOrDocument(data)) {\n elemParameter = data as Element;\n dataIsElem = true;\n }\n\n // Check if contextData parameter is an element\n if (isElementOrDocument(pushContext)) {\n elemParameter = pushContext as Element;\n } else if (isObject(pushContext) && Object.keys(pushContext).length) {\n eventContext = pushContext as WalkerOS.OrderedProperties;\n }\n\n // Extract data from element if provided\n if (elemParameter) {\n const entityObj = getEntities(\n settings.prefix || 'data-elb',\n elemParameter,\n ).find((obj) => obj.entity === entity);\n if (entityObj) {\n if (dataIsElem) eventData = entityObj.data;\n if (entityObj.context) eventContext = entityObj.context;\n }\n }\n\n // Derive win/doc from scope for browser-specific APIs\n const scopeDoc = settings.scope\n ? (((settings.scope as Element).ownerDocument ||\n settings.scope) as Document)\n : undefined;\n const scopeWin = scopeDoc?.defaultView;\n\n // Special handling for page events\n if (entity === 'page' && scopeWin) {\n eventData.id = eventData.id || scopeWin.location.pathname;\n }\n\n // Collect globals from the DOM scope\n const eventGlobals = getGlobals(settings.prefix, settings.scope);\n\n // Build unified event from various elb usage patterns\n const event: WalkerOS.DeepPartialEvent = {\n name: String(eventOrCommand || ''),\n data: eventData,\n context: eventContext,\n globals: eventGlobals,\n nested,\n custom,\n trigger: isString(options) ? options : '',\n source:\n scopeWin && scopeDoc ? getBrowserSource(scopeWin, scopeDoc) : undefined,\n };\n\n return elb(event);\n}\n\n/**\n * Create source information for browser events\n */\nfunction getBrowserSource(win: Window, doc: Document): WalkerOS.Source {\n return {\n type: 'browser',\n platform: 'web',\n url: win.location.href,\n referrer: doc.referrer,\n };\n}\n\n/**\n * Local type guard: narrows `unknown` to `Element | Document`. Prefers the\n * native `instanceof` check (works in browsers and JSDOM) and falls back to\n * the WhatWG DOM `nodeType` property for realms where the global Element or\n * Document constructors are not in scope (cross-frame, certain test\n * runners). Returns an accurate `Element | Document` union so callers do\n * not need casts.\n */\nfunction isDomScope(value: unknown): value is Element | Document {\n if (!value || typeof value !== 'object') return false;\n if (typeof Element !== 'undefined' && value instanceof Element) return true;\n if (typeof Document !== 'undefined' && value instanceof Document) return true;\n if ('nodeType' in value) {\n const nodeType = value.nodeType;\n // 1 = ELEMENT_NODE, 9 = DOCUMENT_NODE per the WhatWG DOM standard.\n return nodeType === 1 || nodeType === 9;\n }\n return false;\n}\n\n/**\n * Normalize the `data` argument of `elb('walker init', data)` to an array\n * of Element/Document scopes. Falls back to `settings.scope` (or `document`\n * if settings.scope is not a DOM node) when no scope is provided.\n */\nfunction normalizeInitScopes(\n data: unknown,\n settings: Settings,\n): Array<Element | Document> {\n if (isDomScope(data)) return [data];\n if (Array.isArray(data)) {\n const filtered: Array<Element | Document> = [];\n for (const entry of data) {\n if (isDomScope(entry)) filtered.push(entry);\n }\n return filtered;\n }\n if (typeof data === 'undefined') {\n const fallback = settings.scope;\n if (isDomScope(fallback)) return [fallback];\n if (typeof globalThis.document !== 'undefined') {\n return [globalThis.document];\n }\n }\n return [];\n}\n","import type { WalkerOS, Elb, Logger } 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 *\n * Installs the live `push` override on `window.elbLayer` and drains any\n * walker commands (`walker *`) that were queued before initialization.\n * Non-walker events stay in the array — they are drained later from the\n * source's `on('run')` handler via `drainNonWalkerEvents`, anchored at\n * the last `walker run` entry.\n */\nexport function initElbLayer(\n elb: Elb.Fn,\n config: ELBLayerConfig & {\n prefix?: string;\n window?: Window;\n logger?: Logger.Instance;\n } = {},\n): void {\n const layerName = config.name || 'elbLayer';\n const windowObj = config.window;\n const logger = config.logger;\n if (!windowObj) return;\n\n // Ensure elbLayer exists on window\n const windowWithLayer = windowObj as typeof windowObj &\n Record<string, unknown>;\n if (!windowWithLayer[layerName]) {\n windowWithLayer[layerName] = [];\n }\n\n const elbLayer = windowWithLayer[layerName] as ELBLayer;\n\n const scope = windowObj.document as Document;\n\n logger?.debug('initElbLayer enter', {\n layerName,\n queuedItems: elbLayer.length,\n });\n\n // Override the push method to process items immediately\n elbLayer.push = function (...args: Array<Elb.Layer | IArguments>) {\n // Handle arguments object\n if (isArguments(args[0])) {\n const argsArray = [...Array.from(args[0])];\n const i = Array.prototype.push.apply(this, [argsArray]);\n // Process the arguments as a single command\n pushCommand(elb, config.prefix, argsArray, scope, logger);\n return i;\n }\n\n const i = Array.prototype.push.apply(this, args);\n\n // Process each pushed item immediately\n args.forEach((item) => {\n pushCommand(elb, config.prefix, item, scope, logger);\n });\n\n return i;\n };\n\n // Drain walker commands from any pre-existing queue items.\n // Non-walker events stay in the array for `drainNonWalkerEvents`.\n if (Array.isArray(elbLayer) && elbLayer.length > 0) {\n logger?.debug('initElbLayer drain walker commands', {\n count: elbLayer.length,\n });\n drainWalkerCommands(\n elb,\n config.prefix ?? 'data-elb',\n elbLayer,\n scope,\n logger,\n );\n }\n}\n\n/**\n * Drain walker commands (`walker *`) from the elbLayer queue.\n *\n * Called from `initElbLayer` during source init. Iterates the queue in\n * declaration order, pushes each walker command via `pushCommand`, then\n * removes the consumed entries from the live array. Non-walker events\n * stay in place.\n */\nfunction drainWalkerCommands(\n elb: Elb.Fn,\n prefix: string,\n elbLayer: ELBLayer,\n scope: Document,\n logger?: Logger.Instance,\n): void {\n const walkerCommand = 'walker '; // Space on purpose\n // Iterate a snapshot — the array may be mutated by side effects of elb.\n const snapshot = [...elbLayer];\n const consumed = new Set<number>();\n snapshot.forEach((pushedItem, idx) => {\n const item = normalizeItem(pushedItem);\n if (!item) return;\n const firstParam = item[0];\n const isCommand =\n !isObject(firstParam) &&\n isString(firstParam) &&\n firstParam.startsWith(walkerCommand);\n if (!isCommand) return;\n consumed.add(idx);\n pushCommand(elb, prefix, item, scope, logger);\n });\n // Remove consumed commands from the live array, descending index order\n // so splice indices remain valid.\n const indices = [...consumed].sort((a, b) => b - a);\n for (const i of indices) elbLayer.splice(i, 1);\n logger?.debug('drainWalkerCommands done', {\n consumed: consumed.size,\n remaining: elbLayer.length,\n });\n}\n\n/**\n * Drain non-walker events from the elbLayer queue, anchored at the\n * LAST `walker run` entry.\n *\n * Items before that anchor are stale — a prior run already had its chance.\n * Items at strictly greater indices are current and replay through\n * `pushCommand`. If no `walker run` is in the queue, anchor is `-1` and\n * the entire queue replays.\n *\n * Called from the browser source's `on('run')` handler.\n */\nexport function drainNonWalkerEvents(\n elb: Elb.Fn,\n settings: Pick<Settings, 'prefix'> & {\n elbLayer?: Settings['elbLayer'];\n },\n windowObj: Window,\n logger?: Logger.Instance,\n): void {\n const layerName = isString(settings.elbLayer)\n ? settings.elbLayer\n : 'elbLayer';\n const prefix = settings.prefix || 'data-elb';\n const layer = (windowObj as unknown as Record<string, unknown>)[layerName];\n if (!Array.isArray(layer)) return;\n const scope = windowObj.document as Document;\n\n let anchor = -1;\n layer.forEach((pushedItem, idx) => {\n const item = normalizeItem(pushedItem);\n if (!item) return;\n if (isString(item[0]) && item[0] === 'walker run') anchor = idx;\n });\n\n const drained: unknown[] = [];\n for (let i = anchor + 1; i < layer.length; i++) {\n const normalized = normalizeItem(layer[i]);\n if (normalized) drained.push(normalized);\n }\n // Remove drained tail from live array.\n layer.length = anchor + 1;\n logger?.debug('drainNonWalkerEvents', {\n anchor,\n drained: drained.length,\n });\n drained.forEach((item) => pushCommand(elb, prefix, item, scope, logger));\n}\n\n/**\n * Normalize a queue item into an Array (or null if invalid/empty).\n */\nfunction normalizeItem(pushedItem: unknown): unknown[] | null {\n const item = isArguments(pushedItem)\n ? [...Array.from(pushedItem)]\n : isArrayLike(pushedItem)\n ? Array.from(pushedItem as ArrayLike<unknown>)\n : [pushedItem];\n if (!Array.isArray(item) || item.length === 0) return null;\n if (item.length === 1 && !item[0]) return null;\n const firstParam = item[0];\n if (isObject(firstParam) && Object.keys(firstParam as object).length === 0) {\n return null;\n }\n if (\n !isObject(firstParam) &&\n isString(firstParam) &&\n firstParam.trim() === ''\n ) {\n return null;\n }\n return item;\n}\n\n/**\n * Push command directly using elb or translation based on type\n */\nfunction pushCommand(\n elb: Elb.Fn,\n prefix: string = 'data-elb',\n item: unknown,\n scope?: Document,\n logger?: Logger.Instance,\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 logger?.debug('pushCommand skipped (empty/invalid action)', {\n item,\n });\n return;\n }\n\n // Walker commands go directly to collector\n if (isString(action) && action.startsWith('walker ')) {\n logger?.debug('pushCommand walker command', {\n action,\n data: rest[0],\n });\n elb(action, rest[0]);\n return;\n }\n\n logger?.debug('pushCommand event (translated)', {\n action,\n rest,\n });\n translateToCoreCollector(\n {\n elb,\n settings: {\n prefix,\n scope,\n pageview: 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 logger?.debug('pushCommand skipped (empty object)');\n return;\n }\n logger?.debug('pushCommand object event', { item });\n // Object events go directly to elb\n elb(item as WalkerOS.DeepPartialEvent);\n }\n },\n (error) => {\n logger?.warn('pushCommand failed', { error, item });\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 { InitSettings, Settings } from './types';\n\n/**\n * Get browser source configuration with defaults\n * @param initSettings - Initial settings to override defaults\n * @param envDocument - Document from environment (optional)\n * @returns Complete settings object with all defaults applied\n */\nexport function getConfig(\n initSettings: InitSettings = {},\n envDocument?: Document,\n): Settings {\n return {\n prefix: 'data-elb',\n pageview: true,\n elb: 'elb',\n elbLayer: 'elbLayer',\n scope: envDocument || undefined,\n ...initSettings,\n };\n}\n","import type { Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema } from '../schemas';\nimport type { z } from '@walkeros/core/dev';\n\n// Export browser-specific elb types\nexport * from './elb';\nimport type { BrowserPush } from './elb';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n browser: {\n type: 'browser';\n platform: 'web';\n url?: string;\n referrer?: string;\n };\n }\n}\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// InitSettings: what users provide (all optional)\n// Override specific fields with non-serializable types\nexport interface InitSettings extends Partial<\n Omit<BaseSettings, 'scope' | 'elbLayer'>\n> {\n scope?: Element | Document;\n elbLayer?: boolean | string | Elb.Layer;\n}\n\n// Settings: resolved configuration\n// Override specific fields with non-serializable types\nexport interface Settings extends Omit<BaseSettings, 'scope' | 'elbLayer'> {\n scope?: Element | Document;\n elbLayer: boolean | string | Elb.Layer;\n}\n\nexport interface Mapping {}\n\nexport type Push = BrowserPush;\n\nexport interface Env extends Source.BaseEnv {\n elb: Elb.Fn;\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport interface Context {\n elb: Elb.Fn;\n settings: Settings;\n initScope?: (context: Context, settings: Settings) => void;\n}\n\n// ELB Layer types for async command handling\nexport type ELBLayer = Array<Elb.Layer | IArguments>;\nexport interface ELBLayerConfig {\n name?: string; // Property name for window.elbLayer (default: 'elbLayer')\n}\n\n// Scope type for DOM operations\nexport type Scope = Document | Element;\n","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 scoped: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((scoped: 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 scopedProperties: 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 scoped(\n keyOrScoped: string | WalkerOS.Properties,\n value?: WalkerOS.Property,\n ): TaggerInstance {\n if (isString(keyOrScoped)) {\n scopedProperties[keyOrScoped] = value;\n } else {\n Object.assign(scopedProperties, keyOrScoped);\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 scoped generic attribute (data-elb_): branch-scoped, bubble-up\n // only. Suffix must match Const.Commands.Scoped ('_').\n if (Object.keys(scopedProperties).length > 0) {\n attributes[`${prefix}_`] = serializeKeyValue(scopedProperties);\n }\n\n // Add action attributes\n if (Object.keys(actionProperties).length > 0) {\n attributes[`${prefix}action`] = serializeKeyValue(actionProperties);\n }\n\n // Add actions attributes (for all entities)\n if (Object.keys(actionsProperties).length > 0) {\n attributes[`${prefix}actions`] = serializeKeyValue(actionsProperties);\n }\n\n // Add context attributes\n if (Object.keys(contextProperties).length > 0) {\n attributes[`${prefix}context`] = serializeKeyValue(contextProperties);\n }\n\n // Add global attributes\n if (Object.keys(globalProperties).length > 0) {\n attributes[`${prefix}globals`] = serializeKeyValue(globalProperties);\n }\n\n // Add link attributes\n if (Object.keys(linkProperties).length > 0) {\n attributes[`${prefix}link`] = serializeKeyValue(linkProperties);\n }\n\n return attributes;\n },\n };\n\n return instance;\n };\n}\n"],"mappings":"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","names":["import_core","import_collector","import_core","import_collector","import_web_core","filter","str","elem","import_core","import_web_core","elementConfig","_a","_b","import_core","import_collector","event","scopeDoc","scopeWin","Triggers","elem","scrollElements","context","import_core","i","import_core","context"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/trigger.ts","../src/walker.ts","../src/triggerVisible.ts","../src/translation.ts","../src/elbLayer.ts","../src/config.ts","../src/types/index.ts","../src/tagger.ts"],"sourcesContent":["import type { Source, WalkerOS, On } from '@walkeros/core';\nimport type { Scope, Types, Env } from './types';\nimport type {\n BrowserPushData,\n BrowserPushOptions,\n BrowserPushContext,\n BrowserPush,\n BrowserArguments,\n} from './types/elb';\nimport { isString } from '@walkeros/core';\nimport { createPushResult } from '@walkeros/collector';\nimport {\n initTriggers,\n initScopeTrigger,\n processLoadTriggers,\n ready,\n destroyTriggers,\n} from './trigger';\nimport { initElbLayer, drainNonWalkerEvents } from './elbLayer';\nimport { translateToCoreCollector } from './translation';\nimport { getPageViewData } from './walker';\nimport { getConfig } from './config';\n\nexport * as SourceBrowser from './types';\n\n/**\n * Window-scoped single-instance sentinel. The browser source must be\n * single-instance per window: one elbLayer adoption, one set of DOM\n * listeners, one `window.elb`. A second/synchronous load of the tag on the\n * same page is a SEPARATE module instance, so a module-scoped counter cannot\n * see it (each load starts at 0). The marker therefore lives on the window\n * itself. A Symbol key avoids collision with page globals and is\n * non-enumerable by nature.\n */\nconst SINGLE_INSTANCE_KEY = Symbol.for('@walkeros/web-source-browser:instance');\n\ntype EnvWindow = Window & typeof globalThis;\n\nfunction resolveGuardWindow(\n envWindow: EnvWindow | undefined,\n): EnvWindow | undefined {\n return (\n envWindow ||\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined)\n );\n}\n\n/** For tests only. Clears the window-scoped single-instance sentinel. */\nexport function __resetInstanceCountForTests(): void {\n const win = resolveGuardWindow(undefined);\n if (win) Reflect.deleteProperty(win, SINGLE_INSTANCE_KEY);\n}\n\n/**\n * Inert source instance returned on a second load within the same window.\n * It satisfies the `Source.Instance` contract but performs no side effects:\n * `init` does not adopt elbLayer or bind DOM triggers, `push` resolves to a\n * successful no-op result, and `on`/`destroy` do nothing. This keeps a double\n * load from re-adopting `window.elbLayer` (the production crash vector)\n * without surfacing an error to the host page.\n */\nfunction createInertInstance(): Source.Instance<Types> {\n const fullConfig: Source.Config<Types> = {\n settings: getConfig({}, undefined),\n };\n const push: BrowserPush = ((..._args: Parameters<BrowserArguments>) =>\n Promise.resolve(createPushResult({ ok: true }))) satisfies BrowserPush;\n return {\n type: 'browser',\n config: fullConfig,\n push,\n on: async () => {},\n init: async () => {},\n destroy: async () => {},\n };\n}\n\n// Export walker utility functions\nexport {\n getAllEvents,\n getEvents,\n getGlobals,\n getElbAttributeName,\n getElbValues,\n} from './walker';\n\n// Export tagger functionality\nexport { createTagger } from './tagger';\nexport type { TaggerConfig, TaggerInstance } from './tagger';\n\n/**\n * Browser source implementation using environment injection.\n *\n * The factory body is side-effect-free: it constructs the Instance and\n * captures closure state. All eager setup (elbLayer drain, DOM listeners,\n * `window.elb` assignment) lives in the `init` lifecycle method, which\n * the collector calls after every source factory has registered. The\n * collector strictly gates `on()` delivery: lifecycle events are queued\n * in `instance.queueOn` until the source is started.\n */\nexport const sourceBrowser: Source.Init<Types> = async (context) => {\n const { config, env, logger } = context;\n const { elb, command, window, document } = env;\n\n const userSettings = config?.settings || {};\n const actualWindow =\n window ||\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n const actualDocument =\n document ||\n (typeof globalThis.document !== 'undefined'\n ? globalThis.document\n : undefined);\n\n // Single-instance per window. A second load on the same page is a separate\n // module instance, so the marker lives on the window, not in module scope.\n // Window-less environments (SSR/node/test without a window) are not guarded.\n const guardWindow = resolveGuardWindow(actualWindow);\n if (guardWindow) {\n if (Reflect.get(guardWindow, SINGLE_INSTANCE_KEY))\n return createInertInstance();\n // Set before init() runs so a synchronous second load is caught before\n // this first instance performs its own factory/init side effects.\n Object.defineProperty(guardWindow, SINGLE_INSTANCE_KEY, {\n value: true,\n enumerable: false,\n configurable: true,\n writable: false,\n });\n }\n\n const settings: Source.Settings<Types> = getConfig(\n userSettings,\n actualDocument as Document | undefined,\n );\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n const translationContext = {\n elb,\n settings,\n initScope: initScopeTrigger,\n };\n\n // Helper to send pageview event if enabled\n const sendPageview = (s: Source.Settings<Types>) => {\n if (!s.pageview) return;\n const [data, contextData] = getPageViewData(\n s.prefix || 'data-elb',\n s.scope as Scope,\n );\n translateToCoreCollector(\n translationContext,\n 'page view',\n data,\n 'load',\n contextData,\n );\n };\n\n // Lifecycle method — eager. The collector calls this AFTER all source\n // factories have registered. Side effects allowed: drains walker\n // commands from window.elbLayer, sets up DOM listeners, overrides\n // elbLayer.push for live captures.\n const init = async () => {\n if (!actualWindow || !actualDocument) return;\n\n if (settings.elbLayer !== false && elb) {\n initElbLayer(elb, {\n name: isString(settings.elbLayer) ? settings.elbLayer : 'elbLayer',\n prefix: settings.prefix,\n window: actualWindow as Window,\n logger,\n });\n }\n\n // Setup global triggers (click, submit) when DOM is ready\n await ready(initTriggers, translationContext, settings);\n\n // Set up automatic window.elb assignment if configured\n if (isString(settings.elb) && settings.elb) {\n (actualWindow as unknown as Record<string, unknown>)[settings.elb] = (\n ...args: unknown[]\n ) => {\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n translationContext,\n event,\n data as BrowserPushData | undefined,\n options as BrowserPushOptions | undefined,\n context as BrowserPushContext | undefined,\n nested as WalkerOS.Entities,\n custom as WalkerOS.Properties,\n );\n };\n }\n };\n\n // Lifecycle handler — fired by the collector only when this source is\n // started (config.init=true AND config.require empty). Pre-start events\n // are buffered in instance.queueOn by the collector and replayed on start.\n const handleEvent = async (event: On.Types) => {\n switch (event) {\n case 'run':\n if (actualDocument && actualWindow) {\n processLoadTriggers(translationContext, settings);\n drainNonWalkerEvents(elb, settings, actualWindow as Window, logger);\n sendPageview(settings);\n }\n break;\n\n default:\n break;\n }\n };\n\n const push: BrowserPush = ((...args: Parameters<BrowserArguments>) => {\n const [event, data, options, context, nested, custom] = args;\n return translateToCoreCollector(\n translationContext,\n event,\n data,\n options,\n context,\n nested,\n custom,\n );\n }) satisfies BrowserPush;\n\n // Return stateless source instance with event handler and push method\n return {\n type: 'browser',\n config: fullConfig,\n push,\n on: handleEvent,\n init,\n destroy: async () => {\n // Iterates the scope registry: aborts root + per-scope listeners, clears\n // every scope's intervals/timeouts, and disconnects the shared\n // per-document observer(s). Reaches sub-scopes from `walker init <el>`,\n // not just the source's own document scope.\n destroyTriggers(settings);\n },\n };\n};\n\nexport default sourceBrowser;\n","import type { WalkerOS, Collector } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope, Settings, Context, ScopeState } 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 queryAllComposed,\n} from './walker';\nimport {\n initVisibilityTracking,\n triggerVisible,\n destroyVisibilityTracking,\n unobserveElement,\n} from './triggerVisible';\nimport { translateToCoreCollector } from './translation';\n\n// Module-level state is intentional. The walker.js browser source is\n// single-instance per window: one elb queue, one set of DOM listeners.\n// If multi-instance ever becomes a real requirement (e.g., micro-frontends\n// with isolated walker queues), refactor this into a per-instance closure\n// returned by createSource() and route every trigger function through it.\n//\n// Root click/submit delegation lives on an instance-level controller, aborted\n// only by destroyTriggers (or re-arming initGlobalTrigger). It is deliberately\n// SEPARATE from the per-scope controllers below: a sub-scope re-init must\n// never tear down page-wide click/submit.\nlet rootAbortController: AbortController | undefined;\n\n// Iterable on purpose: destroyTriggers must enumerate every active scope to\n// reach sub-scope intervals/observers (a WeakMap could not back full teardown).\n// Note: this holds strong references to init'd scope nodes (including detached\n// DOM elements). A node init'd via `walker init <el>` and later removed from\n// the DOM without a re-init or source destroy is retained until re-init\n// replaces its entry or destroyTriggers clears the Map. Bounded by the\n// source/page session and accepted per plan §4.\nconst scopeStates = new Map<Document | Element, ScopeState>();\n\n// Tear down a scope's prior state (if any), then install a fresh empty bucket.\nfunction resetScope(scope: Document | Element): ScopeState {\n const previous = scopeStates.get(scope);\n if (previous) {\n previous.abort.abort(); // removes hover + scroll listeners\n previous.intervalIds.forEach((id) => clearInterval(id));\n previous.timeoutIds.forEach((id) => clearTimeout(id));\n // Drop this scope's elements from the shared per-document observer.\n previous.observed.forEach((element) => unobserveElement(scope, element));\n }\n\n const fresh: ScopeState = {\n abort: new AbortController(),\n intervalIds: [],\n timeoutIds: [],\n scrollElements: [],\n observed: new Set(),\n };\n scopeStates.set(scope, fresh);\n return fresh;\n}\n\n// Reset function for testing: clears each active scope's scroll state.\nexport function resetScrollListener() {\n scopeStates.forEach((state) => {\n state.scrollElements = [];\n state.scrollListener = undefined;\n });\n}\n\nexport const createElb: (customLayer?: unknown) => unknown = (customLayer?) => {\n return (\n customLayer\n ? function () {\n (customLayer as unknown[]).push(arguments);\n }\n : elbOrg\n ) as unknown;\n};\n\nexport const Triggers: { [key: string]: Walker.Trigger } = {\n Click: 'click',\n Custom: 'custom',\n Hover: 'hover',\n Load: 'load',\n Pulse: 'pulse',\n Scroll: 'scroll',\n Submit: 'submit',\n Impression: 'impression',\n Visible: 'visible',\n Wait: 'wait',\n} as const;\n\nexport async function ready(\n fn: (context: Context, settings: Settings) => void,\n context: Context,\n settings: Settings,\n): Promise<void> {\n const readyFn = () => {\n fn(context, settings);\n };\n\n const scope = settings.scope;\n if (!scope) {\n readyFn();\n return;\n }\n const doc = (scope as Element).ownerDocument || (scope as Document);\n if (doc.readyState !== 'loading') {\n readyFn();\n } else {\n doc.addEventListener('DOMContentLoaded', readyFn);\n }\n}\n\n// Called once during source initialization to setup global listeners\nexport function initTriggers(context: Context, settings: Settings) {\n if (!settings.scope) return; // Skip if no scope available\n const requiredSettings = settings as Required<Settings>;\n initGlobalTrigger(context, requiredSettings);\n}\n\n// Called on each walker run to process load triggers\nexport function processLoadTriggers(context: Context, settings: Settings) {\n if (!settings.scope) return; // Skip if no scope available\n const requiredSettings = settings as Required<Settings>;\n initScopeTrigger(context, requiredSettings);\n}\n\nexport function initGlobalTrigger(context: Context, settings: Settings): void {\n const scope = settings.scope;\n\n if (!scope) return;\n\n // Abort any previously registered root listeners before re-registering.\n // This controller owns ONLY the root click/submit delegation.\n if (rootAbortController) rootAbortController.abort();\n rootAbortController = new AbortController();\n const { signal } = rootAbortController;\n\n scope.addEventListener(\n 'click',\n tryCatch(function (this: Scope, ev: unknown) {\n triggerClick.call(this, context, ev as MouseEvent);\n }) as EventListener,\n { signal },\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 { signal },\n );\n}\n\n// Full teardown: aborts the root click/submit controller, then enumerates the\n// scope registry so EVERY active scope (document and sub-scopes alike) has its\n// hover/scroll listeners aborted, intervals/timeouts cleared, and shared\n// per-document observer disconnected. Safe to call before any init.\nexport function destroyTriggers(_settings?: Settings): void {\n if (rootAbortController) {\n rootAbortController.abort();\n rootAbortController = undefined;\n }\n\n scopeStates.forEach((state, scope) => {\n state.abort.abort();\n state.intervalIds.forEach((id) => clearInterval(id));\n state.timeoutIds.forEach((id) => clearTimeout(id));\n // Normalizes to the owner document and disconnects the shared observer;\n // the second call for a same-document sub-scope is a harmless no-op.\n destroyVisibilityTracking(scope);\n });\n\n scopeStates.clear();\n}\n\n// Scope is the single carrier: it lives only in context.settings.scope. The\n// optional second argument is kept for signature compatibility (the Context\n// `initScope` slot calls this with a single, scope-aligned context) but is not\n// read. `walker init <el>` and `walker run` (document) are the same path,\n// differing only in the scope the carrier holds. Re-running on a scope tears\n// down that scope's prior state, then attaches fresh = one fresh init.\nexport function initScopeTrigger(context: Context, _settings?: Settings) {\n const scope = context.settings.scope;\n if (!scope) return;\n\n const bucket = resetScope(scope);\n\n // Idempotent \"ensure\" of the per-document observer (one per ownerDocument).\n // Never disconnect on a sub-scope re-init — resetScope already unobserved\n // this scope's elements above.\n initVisibilityTracking(scope, 1000);\n\n // default data-elbaction\n const selectorAction = getElbAttributeName(\n context.settings.prefix,\n Const.Commands.Action,\n false,\n );\n const doc = (scope as Element).ownerDocument || (scope as Document);\n if (scope !== doc) {\n // Handle the elements action(s), too\n handleActionElem(context, scope as HTMLElement, selectorAction, bucket);\n }\n\n // Handle all children action(s)\n queryAllComposed(scope, `[${selectorAction}]`, (elem) => {\n handleActionElem(context, elem as HTMLElement, selectorAction, bucket);\n });\n\n if (bucket.scrollElements.length) scroll(context, scope, bucket);\n}\n\nexport async function handleTrigger(\n context: Context,\n element: Element,\n trigger: string,\n // @TODO add triggerParams to filter for specific trigger\n): Promise<unknown[]> {\n const events = getEvents(element, trigger, context.settings.prefix);\n return Promise.all(\n events.map((event: Walker.Event) =>\n translateToCoreCollector(context, {\n name: `${event.entity} ${event.action}`,\n ...event,\n trigger,\n }),\n ),\n );\n}\n\nfunction handleActionElem(\n context: Context,\n elem: HTMLElement,\n selectorAction: string,\n bucket: ScopeState,\n) {\n const actionAttr = getAttribute(elem, selectorAction);\n\n if (!actionAttr) return;\n\n // TriggersActionGroups ([trigger: string]: TriggerActions)\n Object.values(getTriggerActions(actionAttr)).forEach((triggerActions) =>\n // TriggerActions (Array<TriggerAction>)\n triggerActions.forEach((triggerAction: Walker.TriggerActions[0]) => {\n // TriggerAction ({ trigger, triggerParams, action, actionParams })\n switch (triggerAction.trigger) {\n case Triggers.Hover:\n triggerHover(context, elem, bucket);\n break;\n case Triggers.Load:\n triggerLoad(context, elem);\n break;\n case Triggers.Pulse:\n triggerPulse(context, elem, bucket, triggerAction.triggerParams);\n break;\n case Triggers.Scroll:\n triggerScroll(elem, bucket, triggerAction.triggerParams);\n break;\n case Triggers.Impression:\n triggerVisible(context, elem);\n bucket.observed.add(elem);\n break;\n case Triggers.Visible:\n triggerVisible(context, elem, { multiple: true });\n bucket.observed.add(elem);\n break;\n case Triggers.Wait:\n triggerWait(context, elem, bucket, triggerAction.triggerParams);\n break;\n }\n }),\n );\n}\n\n/**\n * Get the actual event target, piercing open shadow DOM boundaries.\n * Uses composedPath() to find the real target inside shadow roots.\n * For closed shadow DOM, falls back to the host element (by design).\n */\nfunction getComposedTarget(ev: Event): Element | undefined {\n const path = ev.composedPath?.();\n const target = path?.length ? path[0] : ev.target;\n if (!target || typeof target !== 'object' || !('tagName' in target))\n return undefined;\n return target as Element;\n}\n\nfunction triggerClick(context: Context, ev: MouseEvent) {\n const target = getComposedTarget(ev);\n if (target) handleTrigger(context, target, Triggers.Click);\n}\n\nfunction triggerHover(context: Context, elem: HTMLElement, bucket: ScopeState) {\n elem.addEventListener(\n 'mouseenter',\n tryCatch(function (this: Document, ev: MouseEvent) {\n const target = getComposedTarget(ev);\n if (target) handleTrigger(context, target, Triggers.Hover);\n }),\n { signal: bucket.abort.signal },\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 bucket: ScopeState,\n triggerParams: string = '',\n) {\n const doc = elem.ownerDocument;\n const intervalId = setInterval(\n () => {\n // Only trigger when tab is active\n if (!doc.hidden) handleTrigger(context, elem, Triggers.Pulse);\n },\n parseInt(triggerParams || '') || 15000,\n );\n bucket.intervalIds.push(intervalId);\n}\n\nfunction triggerScroll(\n elem: HTMLElement,\n bucket: ScopeState,\n triggerParams: string = '',\n) {\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 bucket.scrollElements.push([elem, depth]);\n}\n\nfunction triggerSubmit(context: Context, ev: SubmitEvent) {\n const target = getComposedTarget(ev);\n if (target) handleTrigger(context, target, Triggers.Submit);\n}\n\nfunction triggerWait(\n context: Context,\n elem: HTMLElement,\n bucket: ScopeState,\n triggerParams: string = '',\n) {\n const timeoutId = setTimeout(\n () => handleTrigger(context, elem, Triggers.Wait),\n parseInt(triggerParams || '') || 15000,\n );\n bucket.timeoutIds.push(timeoutId);\n}\n\nfunction scroll(context: Context, scope: Scope, bucket: ScopeState) {\n const doc = (scope as Element).ownerDocument || (scope as Document);\n const win = doc.defaultView!;\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 = win.scrollY + win.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. The bucket is fresh per init, so\n // the scope's prior scroll listener was already aborted via its controller.\n if (!bucket.scrollListener) {\n bucket.scrollListener = throttle(function () {\n bucket.scrollElements = scrolling.call(\n scope,\n bucket.scrollElements,\n context,\n );\n });\n\n scope.addEventListener('scroll', bucket.scrollListener, {\n signal: bucket.abort.signal,\n });\n }\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { Scope } from './types';\nimport { assign, castValue, isArray, trim } from '@walkeros/core';\nimport { Const } from '@walkeros/collector';\nimport { getAttribute } from '@walkeros/web-core';\n\nexport function getElbAttributeName(\n prefix: string,\n name?: string,\n isProperty = true,\n): string {\n // separate dynamic properties from walker Const.Commands\n const separator = isProperty ? '-' : '';\n name = name != undefined ? separator + name : '';\n return prefix + name;\n}\n\nexport function getElbValues(\n prefix: string,\n element: Element,\n name: string,\n isProperty = true,\n): WalkerOS.Properties {\n const attributeValue =\n getAttribute(element, getElbAttributeName(prefix, name, isProperty)) || '';\n\n const elbValues = splitAttribute(attributeValue).reduce((values, str) => {\n let [key, val]: Walker.KeyVal = splitKeyVal(str);\n\n if (!key) return values;\n\n // Handle keys without value\n if (!val) {\n // Manually remove the : from key on empty values\n if (key.endsWith(':')) key = key.slice(0, -1);\n val = '';\n }\n\n // Dynamic values\n if (val.startsWith('#')) {\n val = val.slice(1); // Remove # symbol\n try {\n // Read property value from element\n let dynamicValue = (element as Element)[val as keyof Element];\n if (!dynamicValue && val === 'selected') {\n // Try to read selected value with chance of error\n dynamicValue = (element as HTMLSelectElement).options[\n (element as HTMLSelectElement).selectedIndex\n ].text;\n }\n\n val = String(dynamicValue);\n } catch (error) {\n val = '';\n }\n }\n\n if (key.endsWith('[]')) {\n key = key.slice(0, -2); // Remove [] symbol\n if (!isArray(values[key])) values[key] = [];\n (values[key] as WalkerOS.PropertyType[]).push(castValue(val));\n } else {\n values[key] = castValue(val);\n }\n\n return values;\n }, {} as WalkerOS.Properties);\n\n return elbValues;\n}\n\nexport function getAllEvents(\n scope: Scope,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\n const actualScope = scope;\n if (!actualScope) return [];\n let events: Walker.Events = [];\n const action = Const.Commands.Action;\n const actionSelector = `[${getElbAttributeName(prefix, action, false)}]`;\n\n const processElementEvents = (elem: Element) => {\n Object.keys(getElbValues(prefix, elem, action, false)).forEach(\n (trigger) => {\n events = events.concat(getEvents(elem, trigger, prefix));\n },\n );\n };\n\n // Check if the scope element itself has action attributes\n const doc =\n (actualScope as Element).ownerDocument || (actualScope as Document);\n if (\n actualScope !== doc &&\n (actualScope as Element).matches?.(actionSelector)\n ) {\n processElementEvents(actualScope as Element);\n }\n\n queryAllComposed(actualScope, actionSelector, processElementEvents);\n\n return events;\n}\n\nexport function getEvents(\n target: Element,\n trigger: string,\n prefix: string = Const.Commands.Prefix,\n): Walker.Events {\n const events: Walker.Events = [];\n\n // Check for actions and get entity collection strategy\n const { actions, nearestOnly } = resolveAttributes(prefix, target, trigger);\n\n // Stop if there's no valid action combo\n if (!actions.length) return events;\n\n actions.forEach((triggerAction) => {\n const filter = splitAttribute(triggerAction.actionParams || '', ',').reduce(\n (filter, param) => {\n filter[trim(param)] = true;\n return filter;\n },\n {} as Walker.Filter,\n );\n\n // Get entities - using nearestOnly flag to determine collection strategy\n const entities = getEntities(prefix, target, filter, nearestOnly);\n\n // Use page as default entity if no one was set\n if (!entities.length) {\n const entity = 'page';\n // Only use explicit page properties and ignore generic properties\n const entitySelector = `[${getElbAttributeName(prefix, entity)}]`;\n\n // Get matching properties from the element and its parents\n const [data, context] = getThisAndParentProperties(\n target,\n entitySelector,\n prefix,\n entity,\n );\n\n entities.push({\n entity, // page\n data, // Consider only upper data\n nested: [], // Skip nested in this faked page case\n context,\n });\n }\n\n // Return a list of full events\n entities.forEach((entity) => {\n events.push({\n entity: entity.entity,\n action: triggerAction.action,\n data: entity.data,\n trigger,\n context: entity.context,\n nested: entity.nested ?? [],\n });\n });\n });\n\n return events;\n}\n\nexport function getGlobals(\n prefix: string = Const.Commands.Prefix,\n scope?: Scope,\n): WalkerOS.Properties {\n if (!scope) return {};\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 doc = (scope as Element).ownerDocument || (scope as Document);\n const win = doc.defaultView!;\n const loc = win.location;\n const page = 'page';\n const scopeElement =\n 'body' in scope ? (scope as 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 = doc.title;\n data.referrer = doc.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 true, // collect scoped generic (data-elb_) for real entities\n );\n\n // Add linked elements (data-elblink)\n queryAllComposed(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: Searches entire document including shadow roots.\n // Acceptable because link-parent usage is rare in practice.\n if (linkState === 'parent')\n queryAllComposed(\n element.ownerDocument.body,\n `[${linkName}=\"${linkId}:child\"]`,\n (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\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 queryAllComposed(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 queryAllComposed(\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 // Link-parent lookup does not cross shadow boundaries.\n // Uses simple queryAll (no shadow recursion) since this runs\n // during per-event entity traversal.\n const doc = elem.ownerDocument;\n let found: HTMLElement | null = null;\n queryAll(doc, `[${linkName}=\"${linkId}:parent\"]`, (el) => {\n if (!found) found = el as HTMLElement;\n });\n return found;\n }\n }\n\n // Shadow DOM traversal\n const win = elem.ownerDocument.defaultView!;\n if (\n !elem.parentElement &&\n elem.getRootNode &&\n elem.getRootNode() instanceof win.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 collectScoped = false,\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 const scopedName = Const.Commands.Scoped; // '_' -> data-elb_\n const scopedSelector = `[${getElbAttributeName(prefix, scopedName, false)}]`;\n\n // Get all bubbling-up properties with decreasing priority\n let contextI = 0; // Context counter\n while (parent) {\n // Scoped generic (data-elb_): same generic tier, bubble-up only.\n // The synthetic page entity ignores generics, so it skips scoped too.\n // Guard on scopedName so a falsy command constant degrades to \"no scoped\n // collection\" instead of an empty suffix that would match the bare prefix.\n if (collectScoped && scopedName && parent.matches(scopedSelector)) {\n data = assign(getElbValues(prefix, parent, scopedName, false), data);\n }\n\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 scope.querySelectorAll(selector).forEach(fn);\n}\n\n// Shadow-aware version that recurses into open shadow roots.\n// Use for discovery (init) and entity-scoped queries (small subtrees).\n// Avoid for per-event document-scoped queries (e.g. getGlobals).\nexport function queryAllComposed(\n scope: Document | Element | ShadowRoot,\n selector: string,\n fn: (element: Element) => void,\n): void {\n scope.querySelectorAll(selector).forEach(fn);\n\n const doc = (scope as Element).ownerDocument || (scope as Document);\n const win = doc.defaultView!;\n if (scope instanceof win.Element && scope.shadowRoot) {\n queryAllComposed(scope.shadowRoot, selector, fn);\n }\n scope.querySelectorAll('*').forEach((el) => {\n if (el.shadowRoot) {\n queryAllComposed(el.shadowRoot, selector, fn);\n }\n });\n}\n\nfunction resolveAttributes(\n prefix: string,\n target: Element,\n trigger: string,\n): { actions: Walker.TriggerActions; nearestOnly: boolean } {\n let element = target as Node['parentElement'];\n\n while (element) {\n // Check for data-elbactions first (takes precedence)\n const multiAttribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Actions, false),\n );\n\n if (multiAttribute) {\n const triggerActions = getTriggerActions(multiAttribute);\n if (triggerActions[trigger]) {\n return { actions: triggerActions[trigger], nearestOnly: false };\n }\n }\n\n // Check for data-elbaction (nearest entity only)\n const singleAttribute = getAttribute(\n element,\n getElbAttributeName(prefix, Const.Commands.Action, false),\n );\n\n if (singleAttribute) {\n const triggerActions = getTriggerActions(singleAttribute);\n // Action found on element or is not a click trigger\n if (triggerActions[trigger] || trigger !== 'click') {\n return { actions: triggerActions[trigger] || [], nearestOnly: true };\n }\n }\n\n element = getParent(prefix, element);\n }\n\n return { actions: [], nearestOnly: false };\n}\n\nfunction splitAttribute(str: string, separator = ';'): Walker.Attributes {\n const values: Walker.Attributes = [];\n\n if (!str) return values;\n\n const reg = new RegExp(`(?:[^${separator}']+|'[^']*')+`, 'ig');\n return str.match(reg) || [];\n}\n\nfunction splitKeyVal(str: string): Walker.KeyVal {\n const [key, value] = str.split(/:(.+)/, 2);\n return [trim(key), trim(value)];\n}\n\nfunction parseAttribute(str: string): Walker.KeyVal {\n // action(a, b, c)\n const [key, value] = str.split('(', 2);\n const param = value ? value.slice(0, -1) : ''; // Remove the )\n // key = 'action'\n // param = 'a, b, c'\n return [key, param];\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Settings, Context } from './types';\nimport { tryCatch } from '@walkeros/core';\nimport { isVisible } from '@walkeros/web-core';\nimport { handleTrigger, Triggers } from './trigger';\n\n// Cache for element size calculations to reduce DOM queries\nconst elementSizeCache = new WeakMap<\n HTMLElement,\n { isLarge: boolean; lastChecked: number }\n>();\n\n// Cache for basic visibility checks to reduce expensive isVisible() calls\nconst visibilityCache = new WeakMap<\n HTMLElement,\n { isVisible: boolean; lastChecked: number }\n>();\n\n// Module-level visibility state management (stateless source architecture)\ninterface VisibilityState {\n observer?: IntersectionObserver;\n timers: WeakMap<HTMLElement, number>;\n duration: number;\n elementConfigs?: WeakMap<\n HTMLElement,\n { multiple: boolean; blocked: boolean; context: Context; trigger: string }\n >;\n}\n\n// Module-level visibility state keyed by the owner document. Both an element\n// sub-scope and its document normalize to the same key (see getScopeKey), so\n// there is exactly one IntersectionObserver per document: create-key and\n// lookup-key can never diverge, and iframes still get their own observer.\nconst visibilityStates = new WeakMap<Document | Element, VisibilityState>();\n\n/**\n * Normalize any scope (document or element) to its owner document. The\n * IntersectionObserver root is always the viewport, so per-sub-scope observers\n * would be meaningless; keying by ownerDocument gives one shared observer per\n * document and keeps the create/lookup keys aligned.\n */\nexport function getScopeKey(scope: Document | Element): Document | Element {\n return (scope as Element).ownerDocument || (scope as Document);\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 const win = element.ownerDocument.defaultView!;\n const doc = element.ownerDocument;\n cached = {\n isVisible: isVisible(element, win, doc),\n lastChecked: now,\n };\n visibilityCache.set(element, cached);\n }\n\n return cached.isVisible;\n}\n\n/**\n * Element cleanup (unobserve + timer + cache cleanup)\n */\nexport function unobserveElement(\n scope: Document | Element,\n element: HTMLElement,\n): void {\n const state = visibilityStates.get(getScopeKey(scope));\n if (!state) return;\n\n if (state.observer) {\n state.observer.unobserve(element);\n }\n\n // Drop the element's config so a re-init or teardown leaves no stale config\n // behind (read back in handleIntersection).\n state.elementConfigs?.delete(element);\n\n // Clear timer\n const timer = state.timers.get(element);\n if (timer) {\n clearTimeout(timer);\n state.timers.delete(element);\n }\n\n // Clean up caches to prevent memory leaks\n elementSizeCache.delete(element);\n visibilityCache.delete(element);\n}\n\n/**\n * Creates an IntersectionObserver for the given scope\n */\nfunction createObserver(\n scope: Document | Element,\n): IntersectionObserver | undefined {\n const doc = (scope as Element).ownerDocument || (scope as Document);\n const win = doc.defaultView;\n if (!win || !win.IntersectionObserver) return undefined;\n\n return tryCatch(\n () =>\n new win.IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n handleIntersection(scope, entry);\n });\n },\n {\n rootMargin: '0px',\n threshold: [0, 0.5],\n },\n ),\n () => undefined,\n )();\n}\n\n/**\n * Handles intersection changes for observed elements\n */\nfunction handleIntersection(\n scope: Document | Element,\n entry: IntersectionObserverEntry,\n): void {\n const target = entry.target as HTMLElement;\n const state = visibilityStates.get(getScopeKey(scope));\n\n if (!state) return;\n\n const existingTimer = state.timers.get(target);\n\n if (entry.intersectionRatio > 0) {\n // Optimize: Cache element size calculations to avoid repeated DOM queries\n const now = Date.now();\n let cached = elementSizeCache.get(target);\n\n // Cache element size for 1 second to reduce DOM queries\n if (!cached || now - cached.lastChecked > 1000) {\n const win = target.ownerDocument.defaultView!;\n cached = {\n isLarge: target.offsetHeight > win.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 targetWin = target.ownerDocument.defaultView!;\n const timer = targetWin.setTimeout(async () => {\n // Final visibility check before triggering (cached for performance)\n if (isElementVisible(target)) {\n // Get element configuration to access context\n const elementConfig = state.elementConfigs?.get(target);\n if (elementConfig?.context) {\n await handleTrigger(\n elementConfig.context,\n target as Element,\n elementConfig.trigger,\n );\n }\n\n // Get fresh element config reference for state update\n const currentConfig = state.elementConfigs?.get(target);\n\n // For multiple triggers, mark as visible after firing\n if (currentConfig?.multiple) {\n currentConfig.blocked = true;\n } else {\n // Clean up and unobserve only if not a multiple trigger\n unobserveElement(scope, target);\n }\n }\n }, state.duration);\n\n state.timers.set(target, timer);\n }\n return;\n }\n }\n\n // Element isn't sufficiently in viewport - clear existing timer\n if (existingTimer) {\n clearTimeout(existingTimer);\n state.timers.delete(target);\n }\n\n // For multiple triggers, mark as not visible for re-entry detection\n const elementConfig = state.elementConfigs?.get(target);\n if (elementConfig?.multiple) {\n elementConfig.blocked = false;\n }\n}\n\n/**\n * Initializes visibility tracking for a scope (document/element)\n */\nexport function initVisibilityTracking(\n scope: Document | Element,\n duration = 1000,\n): void {\n const key = getScopeKey(scope);\n if (visibilityStates.has(key)) return; // Already initialized for this document\n\n visibilityStates.set(key, {\n observer: createObserver(key),\n timers: new WeakMap(),\n duration,\n });\n}\n\n/**\n * Main trigger function for visible elements\n */\nexport function triggerVisible(\n context: Context,\n element: HTMLElement,\n config: { multiple?: boolean } = { multiple: false },\n): void {\n const scope = context.settings.scope;\n if (!scope) return;\n const state = visibilityStates.get(getScopeKey(scope));\n\n if (state?.observer && element) {\n // Store element config for later use in intersection handling\n if (!state.elementConfigs) {\n state.elementConfigs = new WeakMap();\n }\n state.elementConfigs.set(element, {\n multiple: config.multiple ?? false,\n blocked: false,\n context,\n trigger: config.multiple ? 'visible' : 'impression',\n });\n state.observer.observe(element);\n }\n}\n\n/**\n * Destroys visibility tracking for a scope, cleaning up all resources\n */\nexport function destroyVisibilityTracking(scope?: Document | Element): void {\n if (!scope) return; // No scope provided, nothing to clean up\n\n const key = getScopeKey(scope);\n const state = visibilityStates.get(key);\n if (!state) return;\n\n if (state.observer) {\n state.observer.disconnect();\n }\n\n visibilityStates.delete(key);\n}\n","import type { WalkerOS, Elb, Collector } from '@walkeros/core';\nimport { isString, isObject, isElementOrDocument } from '@walkeros/core';\nimport { createPushResult } from '@walkeros/collector';\nimport type {\n BrowserPushData,\n BrowserPushOptions,\n BrowserPushContext,\n} from './types/elb';\nimport type { Context, Settings } from './types';\nimport { getEntities, getGlobals } from './walker';\n\n/**\n * Translation layer that converts flexible browser source inputs\n * to the strict core collector format\n */\nexport function translateToCoreCollector(\n context: Context,\n eventOrCommand: unknown,\n data?: BrowserPushData,\n options?: BrowserPushOptions,\n pushContext?: BrowserPushContext,\n nested?: WalkerOS.Entities,\n custom?: WalkerOS.Properties,\n): Promise<Elb.PushResult> {\n const { elb, settings } = context;\n\n // Handle walker commands. `walker init` is browser-only (re-scans a DOM\n // scope for `data-elb*` tags and fires load triggers) and is dispatched\n // here because the collector must stay DOM-free. All other walker\n // commands route through elb to commonHandleCommand on the collector.\n // `initScope` arrives on `context` from the source factory to avoid a\n // static import of `./trigger` (which would form a load-time cycle).\n if (isString(eventOrCommand) && eventOrCommand.startsWith('walker ')) {\n if (eventOrCommand === 'walker init' && context.initScope) {\n const scopes = normalizeInitScopes(data, settings);\n for (const scope of scopes) {\n // Scope is a single carrier: build a scope-aligned context so the\n // trigger pipeline reads the new scope from context.settings.scope\n // everywhere (no diverging positional scope param).\n context.initScope({ ...context, settings: { ...settings, scope } });\n }\n return Promise.resolve(createPushResult({ ok: true }));\n }\n return elb(eventOrCommand, data as WalkerOS.Properties);\n }\n\n // Handle event objects - add source and globals if missing\n if (isObject(eventOrCommand)) {\n const event = eventOrCommand;\n if (!event.source && settings.scope) {\n const scopeDoc = ((settings.scope as Element).ownerDocument ||\n settings.scope) as Document;\n const scopeWin = scopeDoc.defaultView!;\n event.source = getBrowserSource(scopeWin, scopeDoc);\n }\n\n // Add globals if not already present\n if (!event.globals && settings.scope) {\n event.globals = getGlobals(settings.prefix, settings.scope);\n }\n\n return elb(event);\n }\n\n // Extract entity name from event string\n const [entity] = String(\n isObject(eventOrCommand) ? eventOrCommand.name : eventOrCommand,\n ).split(' ');\n\n // Get data and context either from elements or parameters\n let eventData = isObject(data) ? (data as WalkerOS.Properties) : {};\n let eventContext: WalkerOS.OrderedProperties = {};\n\n let elemParameter: undefined | Element;\n let dataIsElem = false;\n\n // Check if data parameter is an element\n if (isElementOrDocument(data)) {\n elemParameter = data as Element;\n dataIsElem = true;\n }\n\n // Check if contextData parameter is an element\n if (isElementOrDocument(pushContext)) {\n elemParameter = pushContext as Element;\n } else if (isObject(pushContext) && Object.keys(pushContext).length) {\n eventContext = pushContext as WalkerOS.OrderedProperties;\n }\n\n // Extract data from element if provided\n if (elemParameter) {\n const entityObj = getEntities(\n settings.prefix || 'data-elb',\n elemParameter,\n ).find((obj) => obj.entity === entity);\n if (entityObj) {\n if (dataIsElem) eventData = entityObj.data;\n if (entityObj.context) eventContext = entityObj.context;\n }\n }\n\n // Derive win/doc from scope for browser-specific APIs\n const scopeDoc = settings.scope\n ? (((settings.scope as Element).ownerDocument ||\n settings.scope) as Document)\n : undefined;\n const scopeWin = scopeDoc?.defaultView;\n\n // Special handling for page events\n if (entity === 'page' && scopeWin) {\n eventData.id = eventData.id || scopeWin.location.pathname;\n }\n\n // Collect globals from the DOM scope\n const eventGlobals = getGlobals(settings.prefix, settings.scope);\n\n // Build unified event from various elb usage patterns\n const event: WalkerOS.DeepPartialEvent = {\n name: String(eventOrCommand || ''),\n data: eventData,\n context: eventContext,\n globals: eventGlobals,\n nested,\n custom,\n trigger: isString(options) ? options : '',\n source:\n scopeWin && scopeDoc ? getBrowserSource(scopeWin, scopeDoc) : undefined,\n };\n\n return elb(event);\n}\n\n/**\n * Create source information for browser events\n */\nfunction getBrowserSource(win: Window, doc: Document): WalkerOS.Source {\n return {\n type: 'browser',\n platform: 'web',\n url: win.location.href,\n referrer: doc.referrer,\n };\n}\n\n/**\n * Local type guard: narrows `unknown` to `Element | Document`. Prefers the\n * native `instanceof` check (works in browsers and JSDOM) and falls back to\n * the WhatWG DOM `nodeType` property for realms where the global Element or\n * Document constructors are not in scope (cross-frame, certain test\n * runners). Returns an accurate `Element | Document` union so callers do\n * not need casts.\n */\nfunction isDomScope(value: unknown): value is Element | Document {\n if (!value || typeof value !== 'object') return false;\n if (typeof Element !== 'undefined' && value instanceof Element) return true;\n if (typeof Document !== 'undefined' && value instanceof Document) return true;\n if ('nodeType' in value) {\n const nodeType = value.nodeType;\n // 1 = ELEMENT_NODE, 9 = DOCUMENT_NODE per the WhatWG DOM standard.\n return nodeType === 1 || nodeType === 9;\n }\n return false;\n}\n\n/**\n * Normalize the `data` argument of `elb('walker init', data)` to an array\n * of Element/Document scopes. Falls back to `settings.scope` (or `document`\n * if settings.scope is not a DOM node) when no scope is provided.\n */\nfunction normalizeInitScopes(\n data: unknown,\n settings: Settings,\n): Array<Element | Document> {\n if (isDomScope(data)) return [data];\n if (Array.isArray(data)) {\n const filtered: Array<Element | Document> = [];\n for (const entry of data) {\n if (isDomScope(entry)) filtered.push(entry);\n }\n return filtered;\n }\n if (typeof data === 'undefined') {\n const fallback = settings.scope;\n if (isDomScope(fallback)) return [fallback];\n if (typeof globalThis.document !== 'undefined') {\n return [globalThis.document];\n }\n }\n return [];\n}\n","import type { WalkerOS, Elb, Logger } 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 *\n * Installs the live `push` override on `window.elbLayer` and drains any\n * walker commands (`walker *`) that were queued before initialization.\n * Non-walker events stay in the array — they are drained later from the\n * source's `on('run')` handler via `drainNonWalkerEvents`, anchored at\n * the last `walker run` entry.\n */\nexport function initElbLayer(\n elb: Elb.Fn,\n config: ELBLayerConfig & {\n prefix?: string;\n window?: Window;\n logger?: Logger.Instance;\n } = {},\n): void {\n const layerName = config.name || 'elbLayer';\n const windowObj = config.window;\n const logger = config.logger;\n if (!windowObj) return;\n\n // Ensure elbLayer exists on window\n const windowWithLayer = windowObj as typeof windowObj &\n Record<string, unknown>;\n if (!windowWithLayer[layerName]) {\n windowWithLayer[layerName] = [];\n }\n\n const elbLayer = windowWithLayer[layerName] as ELBLayer;\n\n const scope = windowObj.document as Document;\n\n logger?.debug('initElbLayer enter', {\n layerName,\n queuedItems: elbLayer.length,\n });\n\n // Override the push method to process items immediately\n elbLayer.push = function (...args: Array<Elb.Layer | IArguments>) {\n // Handle arguments object\n if (isArguments(args[0])) {\n const argsArray = [...Array.from(args[0])];\n const i = Array.prototype.push.apply(this, [argsArray]);\n // Process the arguments as a single command\n pushCommand(elb, config.prefix, argsArray, scope, logger);\n return i;\n }\n\n const i = Array.prototype.push.apply(this, args);\n\n // Process each pushed item immediately\n args.forEach((item) => {\n pushCommand(elb, config.prefix, item, scope, logger);\n });\n\n return i;\n };\n\n // Drain walker commands from any pre-existing queue items.\n // Non-walker events stay in the array for `drainNonWalkerEvents`.\n if (Array.isArray(elbLayer) && elbLayer.length > 0) {\n logger?.debug('initElbLayer drain walker commands', {\n count: elbLayer.length,\n });\n drainWalkerCommands(\n elb,\n config.prefix ?? 'data-elb',\n elbLayer,\n scope,\n logger,\n );\n }\n}\n\n/**\n * Drain walker commands (`walker *`) from the elbLayer queue.\n *\n * Called from `initElbLayer` during source init. Iterates the queue in\n * declaration order, pushes each walker command via `pushCommand`, then\n * removes the consumed entries from the live array. Non-walker events\n * stay in place.\n */\nfunction drainWalkerCommands(\n elb: Elb.Fn,\n prefix: string,\n elbLayer: ELBLayer,\n scope: Document,\n logger?: Logger.Instance,\n): void {\n const walkerCommand = 'walker '; // Space on purpose\n // Iterate a snapshot — the array may be mutated by side effects of elb.\n const snapshot = [...elbLayer];\n const consumed = new Set<number>();\n snapshot.forEach((pushedItem, idx) => {\n const item = normalizeItem(pushedItem);\n if (!item) return;\n const firstParam = item[0];\n const isCommand =\n !isObject(firstParam) &&\n isString(firstParam) &&\n firstParam.startsWith(walkerCommand);\n if (!isCommand) return;\n consumed.add(idx);\n pushCommand(elb, prefix, item, scope, logger);\n });\n // Remove consumed commands from the live array, descending index order\n // so splice indices remain valid.\n const indices = [...consumed].sort((a, b) => b - a);\n for (const i of indices) elbLayer.splice(i, 1);\n logger?.debug('drainWalkerCommands done', {\n consumed: consumed.size,\n remaining: elbLayer.length,\n });\n}\n\n/**\n * Drain non-walker events from the elbLayer queue, anchored at the\n * LAST `walker run` entry.\n *\n * Items before that anchor are stale — a prior run already had its chance.\n * Items at strictly greater indices are current and replay through\n * `pushCommand`. If no `walker run` is in the queue, anchor is `-1` and\n * the entire queue replays.\n *\n * Called from the browser source's `on('run')` handler.\n */\nexport function drainNonWalkerEvents(\n elb: Elb.Fn,\n settings: Pick<Settings, 'prefix'> & {\n elbLayer?: Settings['elbLayer'];\n },\n windowObj: Window,\n logger?: Logger.Instance,\n): void {\n const layerName = isString(settings.elbLayer)\n ? settings.elbLayer\n : 'elbLayer';\n const prefix = settings.prefix || 'data-elb';\n const layer = (windowObj as unknown as Record<string, unknown>)[layerName];\n if (!Array.isArray(layer)) return;\n const scope = windowObj.document as Document;\n\n let anchor = -1;\n layer.forEach((pushedItem, idx) => {\n const item = normalizeItem(pushedItem);\n if (!item) return;\n if (isString(item[0]) && item[0] === 'walker run') anchor = idx;\n });\n\n const drained: unknown[] = [];\n for (let i = anchor + 1; i < layer.length; i++) {\n const normalized = normalizeItem(layer[i]);\n if (normalized) drained.push(normalized);\n }\n // Remove drained tail from live array.\n layer.length = anchor + 1;\n logger?.debug('drainNonWalkerEvents', {\n anchor,\n drained: drained.length,\n });\n drained.forEach((item) => pushCommand(elb, prefix, item, scope, logger));\n}\n\n/**\n * Normalize a queue item into an Array (or null if invalid/empty).\n */\nfunction normalizeItem(pushedItem: unknown): unknown[] | null {\n const item = isArguments(pushedItem)\n ? [...Array.from(pushedItem)]\n : isArrayLike(pushedItem)\n ? Array.from(pushedItem as ArrayLike<unknown>)\n : [pushedItem];\n if (!Array.isArray(item) || item.length === 0) return null;\n if (item.length === 1 && !item[0]) return null;\n const firstParam = item[0];\n if (isObject(firstParam) && Object.keys(firstParam as object).length === 0) {\n return null;\n }\n if (\n !isObject(firstParam) &&\n isString(firstParam) &&\n firstParam.trim() === ''\n ) {\n return null;\n }\n return item;\n}\n\n/**\n * Push command directly using elb or translation based on type\n */\nfunction pushCommand(\n elb: Elb.Fn,\n prefix: string = 'data-elb',\n item: unknown,\n scope?: Document,\n logger?: Logger.Instance,\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 logger?.debug('pushCommand skipped (empty/invalid action)', {\n item,\n });\n return;\n }\n\n // Walker commands go directly to collector\n if (isString(action) && action.startsWith('walker ')) {\n logger?.debug('pushCommand walker command', {\n action,\n data: rest[0],\n });\n elb(action, rest[0]);\n return;\n }\n\n logger?.debug('pushCommand event (translated)', {\n action,\n rest,\n });\n translateToCoreCollector(\n {\n elb,\n settings: {\n prefix,\n scope,\n pageview: 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 logger?.debug('pushCommand skipped (empty object)');\n return;\n }\n logger?.debug('pushCommand object event', { item });\n // Object events go directly to elb\n elb(item as WalkerOS.DeepPartialEvent);\n }\n },\n (error) => {\n logger?.warn('pushCommand failed', { error, item });\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 { InitSettings, Settings } from './types';\n\n/**\n * Get browser source configuration with defaults\n * @param initSettings - Initial settings to override defaults\n * @param envDocument - Document from environment (optional)\n * @returns Complete settings object with all defaults applied\n */\nexport function getConfig(\n initSettings: InitSettings = {},\n envDocument?: Document,\n): Settings {\n return {\n prefix: 'data-elb',\n pageview: true,\n elb: 'elb',\n elbLayer: 'elbLayer',\n scope: envDocument || undefined,\n ...initSettings,\n };\n}\n","import type { Source, Elb } from '@walkeros/core';\nimport type { Walker } from '@walkeros/web-core';\nimport type { SettingsSchema } from '../schemas';\nimport type { z } from '@walkeros/core/dev';\n\n// Export browser-specific elb types\nexport * from './elb';\nimport type { BrowserPush } from './elb';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n browser: {\n type: 'browser';\n platform: 'web';\n url?: string;\n referrer?: string;\n };\n }\n}\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// InitSettings: what users provide (all optional)\n// Override specific fields with non-serializable types\nexport interface InitSettings extends Partial<\n Omit<BaseSettings, 'scope' | 'elbLayer'>\n> {\n scope?: Element | Document;\n elbLayer?: boolean | string | Elb.Layer;\n}\n\n// Settings: resolved configuration\n// Override specific fields with non-serializable types\nexport interface Settings extends Omit<BaseSettings, 'scope' | 'elbLayer'> {\n scope?: Element | Document;\n elbLayer: boolean | string | Elb.Layer;\n}\n\nexport interface Mapping {}\n\nexport type Push = BrowserPush;\n\nexport interface Env extends Source.BaseEnv {\n elb: Elb.Fn;\n window?: Window & typeof globalThis;\n document?: Document;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport interface Context {\n elb: Elb.Fn;\n settings: Settings;\n // Scope travels in context.settings.scope; the implementation reads it from\n // there. Called with a single, scope-aligned context for `walker init`.\n initScope?: (context: Context) => void;\n}\n\n// ELB Layer types for async command handling\nexport type ELBLayer = Array<Elb.Layer | IArguments>;\nexport interface ELBLayerConfig {\n name?: string; // Property name for window.elbLayer (default: 'elbLayer')\n}\n\n// Scope type for DOM operations\nexport type Scope = Document | Element;\n\n// Everything a single scope's init installs, bucketed so a re-init can tear the\n// scope's prior state down before attaching fresh. Keyed by the scope node, so\n// `walker run` (document) and `walker init <el>` (element) own independent\n// buckets that never reach into each other.\nexport interface ScopeState {\n abort: AbortController; // this scope's hover + scroll listeners\n intervalIds: ReturnType<typeof setInterval>[]; // pulse\n timeoutIds: ReturnType<typeof setTimeout>[]; // wait\n scrollElements: Walker.ScrollElements; // this scope's scroll targets\n scrollListener?: EventListenerOrEventListenerObject;\n observed: Set<HTMLElement>; // elements registered on the shared per-doc observer\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport { isString, isDefined } from '@walkeros/core';\n\nexport interface TaggerConfig {\n prefix?: string;\n}\n\nexport interface TaggerInstance {\n entity: (name: string) => TaggerInstance;\n data: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((data: WalkerOS.Properties) => TaggerInstance);\n scoped: ((key: string, value: WalkerOS.Property) => TaggerInstance) &\n ((scoped: 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 scopedProperties: 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 scoped(\n keyOrScoped: string | WalkerOS.Properties,\n value?: WalkerOS.Property,\n ): TaggerInstance {\n if (isString(keyOrScoped)) {\n scopedProperties[keyOrScoped] = value;\n } else {\n Object.assign(scopedProperties, keyOrScoped);\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 scoped generic attribute (data-elb_): branch-scoped, bubble-up\n // only. Suffix must match Const.Commands.Scoped ('_').\n if (Object.keys(scopedProperties).length > 0) {\n attributes[`${prefix}_`] = serializeKeyValue(scopedProperties);\n }\n\n // Add action attributes\n if (Object.keys(actionProperties).length > 0) {\n attributes[`${prefix}action`] = serializeKeyValue(actionProperties);\n }\n\n // Add actions attributes (for all entities)\n if (Object.keys(actionsProperties).length > 0) {\n attributes[`${prefix}actions`] = serializeKeyValue(actionsProperties);\n }\n\n // Add context attributes\n if (Object.keys(contextProperties).length > 0) {\n attributes[`${prefix}context`] = serializeKeyValue(contextProperties);\n }\n\n // Add global attributes\n if (Object.keys(globalProperties).length > 0) {\n attributes[`${prefix}globals`] = serializeKeyValue(globalProperties);\n }\n\n // Add link attributes\n if (Object.keys(linkProperties).length > 0) {\n attributes[`${prefix}link`] = serializeKeyValue(linkProperties);\n }\n\n return attributes;\n },\n };\n\n return instance;\n };\n}\n"],"mappings":"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","names":["import_core","import_collector","import_core","import_collector","import_web_core","filter","str","elem","import_core","import_web_core","elementConfig","_a","_b","import_core","import_collector","event","scopeDoc","scopeWin","Triggers","context","import_core","i","import_core","context"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{isString as e}from"@walkeros/core";import{createPushResult as t}from"@walkeros/collector";import{throttle as n,tryCatch as o}from"@walkeros/core";import{Const as r}from"@walkeros/collector";import{elb as i,getAttribute as s}from"@walkeros/web-core";import{assign as c,castValue as a,isArray as l,trim as u}from"@walkeros/core";import{Const as f}from"@walkeros/collector";import{getAttribute as d}from"@walkeros/web-core";function m(e,t,n=!0){return e+(t=null!=t?(n?"-":"")+t:"")}function p(e,t,n,o=!0){return E(d(t,m(e,n,o))||"").reduce((e,n)=>{let[o,r]=O(n);if(!o)return e;if(r||(o.endsWith(":")&&(o=o.slice(0,-1)),r=""),r.startsWith("#")){r=r.slice(1);try{let e=t[r];e||"selected"!==r||(e=t.options[t.selectedIndex].text),r=String(e)}catch(e){r=""}}return o.endsWith("[]")?(o=o.slice(0,-2),l(e[o])||(e[o]=[]),e[o].push(a(r))):e[o]=a(r),e},{})}function g(e,t=f.Commands.Prefix){var n;const o=e;if(!o)return[];let r=[];const i=f.Commands.Action,s=`[${m(t,i,!1)}]`,c=e=>{Object.keys(p(t,e,i,!1)).forEach(n=>{r=r.concat(b(e,n,t))})};return o!==(o.ownerDocument||o)&&(null==(n=o.matches)?void 0:n.call(o,s))&&c(o),j(o,s,c),r}function b(e,t,n=f.Commands.Prefix){const o=[],{actions:r,nearestOnly:i}=function(e,t,n){let o=t;for(;o;){const t=d(o,m(e,f.Commands.Actions,!1));if(t){const e=w(t);if(e[n])return{actions:e[n],nearestOnly:!1}}const r=d(o,m(e,f.Commands.Action,!1));if(r){const e=w(r);if(e[n]||"click"!==n)return{actions:e[n]||[],nearestOnly:!0}}o=k(e,o)}return{actions:[],nearestOnly:!1}}(n,e,t);return r.length?(r.forEach(r=>{const s=E(r.actionParams||"",",").reduce((e,t)=>(e[u(t)]=!0,e),{}),c=y(n,e,s,i);if(!c.length){const t="page",o=`[${m(n,t)}]`,[r,i]=C(e,o,n,t);c.push({entity:t,data:r,nested:[],context:i})}c.forEach(e=>{var n;o.push({entity:e.entity,action:r.action,data:e.data,trigger:t,context:e.context,nested:null!=(n=e.nested)?n:[]})})}),o):o}function h(e=f.Commands.Prefix,t){if(!t)return{};const n=m(e,f.Commands.Globals,!1);let o={};return x(t,`[${n}]`,t=>{o=c(o,p(e,t,f.Commands.Globals,!1))}),o}function w(e){const t={};return E(e).forEach(e=>{const[n,o]=O(e),[r,i]=$(n);if(!r)return;let[s,c]=$(o||"");s=s||r,t[r]||(t[r]=[]),t[r].push({trigger:r,triggerParams:i,action:s,actionParams:c})}),t}function y(e,t,n,o=!1){const r=[];let i=t;for(n=0!==Object.keys(n||{}).length?n:void 0;i;){const s=v(e,i,t,n);if(s&&(r.push(s),o))break;i=k(e,i)}return r}function v(e,t,n,o){const r=d(t,m(e));if(!r||o&&!o[r])return null;const i=[t],s=`[${m(e,r)}],[${m(e,"")}]`,a=m(e,f.Commands.Link,!1);let l={};const u=[],[g,b]=C(n||t,s,e,r,!0);j(t,`[${a}]`,n=>{const[o,r]=O(d(n,a));"parent"===r&&j(t.ownerDocument.body,`[${a}="${o}:child"]`,t=>{i.push(t);const n=v(e,t);n&&u.push(n)})});const h=[];i.forEach(e=>{e.matches(s)&&h.push(e),j(e,s,e=>h.push(e))});let w={};return h.forEach(t=>{w=c(w,p(e,t,"")),l=c(l,p(e,t,r))}),l=c(c(w,l),g),i.forEach(t=>{j(t,`[${m(e)}]`,t=>{const n=v(e,t);n&&u.push(n)})}),{entity:r,data:l,context:b,nested:u}}function k(e,t){const n=m(e,f.Commands.Link,!1);if(t.matches(`[${n}]`)){const[e,o]=O(d(t,n));if("child"===o){const o=t.ownerDocument;let r=null;return x(o,`[${n}="${e}:parent"]`,e=>{r||(r=e)}),r}}const o=t.ownerDocument.defaultView;return!t.parentElement&&t.getRootNode&&t.getRootNode()instanceof o.ShadowRoot?t.getRootNode().host:t.parentElement}function C(e,t,n,o,r=!1){let i={};const s={};let a=e;const l=`[${m(n,f.Commands.Context,!1)}]`,u=f.Commands.Scoped,d=`[${m(n,u,!1)}]`;let g=0;for(;a;)r&&u&&a.matches(d)&&(i=c(p(n,a,u,!1),i)),a.matches(t)&&(i=c(p(n,a,""),i),i=c(p(n,a,o),i)),a.matches(l)&&(Object.entries(p(n,a,f.Commands.Context,!1)).forEach(([e,t])=>{t&&!s[e]&&(s[e]=[t,g])}),++g),a=k(n,a);return[i,s]}function x(e,t,n){e.querySelectorAll(t).forEach(n)}function j(e,t,n){e.querySelectorAll(t).forEach(n);e instanceof(e.ownerDocument||e).defaultView.Element&&e.shadowRoot&&j(e.shadowRoot,t,n),e.querySelectorAll("*").forEach(e=>{e.shadowRoot&&j(e.shadowRoot,t,n)})}function E(e,t=";"){if(!e)return[];const n=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(n)||[]}function O(e){const[t,n]=e.split(/:(.+)/,2);return[u(t),u(n)]}function $(e){const[t,n]=e.split("(",2);return[t,n?n.slice(0,-1):""]}import{tryCatch as A}from"@walkeros/core";import{isVisible as L}from"@walkeros/web-core";var D=new WeakMap,S=new WeakMap,P=new WeakMap;function T(e){const t=Date.now();let n=S.get(e);if(!n||t-n.lastChecked>500){const o=e.ownerDocument.defaultView,r=e.ownerDocument;n={isVisible:L(e,o,r),lastChecked:t},S.set(e,n)}return n.isVisible}function R(e){const t=(e.ownerDocument||e).defaultView;if(t&&t.IntersectionObserver)return A(()=>new t.IntersectionObserver(t=>{t.forEach(t=>{!function(e,t){var n,o;const r=t.target,i=P.get(e);if(!i)return;const s=i.timers.get(r);if(t.intersectionRatio>0){const o=Date.now();let c=D.get(r);if(!c||o-c.lastChecked>1e3){const e=r.ownerDocument.defaultView;c={isLarge:r.offsetHeight>e.innerHeight,lastChecked:o},D.set(r,c)}if(t.intersectionRatio>=.5||c.isLarge&&T(r)){const t=null==(n=i.elementConfigs)?void 0:n.get(r);if((null==t?void 0:t.multiple)&&t.blocked)return;if(!s){const t=r.ownerDocument.defaultView.setTimeout(async()=>{var t,n;if(T(r)){const o=null==(t=i.elementConfigs)?void 0:t.get(r);(null==o?void 0:o.context)&&await ce(o.context,r,o.trigger);const s=null==(n=i.elementConfigs)?void 0:n.get(r);(null==s?void 0:s.multiple)?s.blocked=!0:function(e,t){const n=P.get(e);if(!n)return;n.observer&&n.observer.unobserve(t);const o=n.timers.get(t);o&&(clearTimeout(o),n.timers.delete(t)),D.delete(t),S.delete(t)}(e,r)}},i.duration);i.timers.set(r,t)}return}}s&&(clearTimeout(s),i.timers.delete(r));const c=null==(o=i.elementConfigs)?void 0:o.get(r);(null==c?void 0:c.multiple)&&(c.blocked=!1)}(e,t)})},{rootMargin:"0px",threshold:[0,.5]}),()=>{})()}function W(e,t,n={multiple:!1}){var o;const r=e.settings.scope;if(!r)return;const i=P.get(r);(null==i?void 0:i.observer)&&t&&(i.elementConfigs||(i.elementConfigs=new WeakMap),i.elementConfigs.set(t,{multiple:null!=(o=n.multiple)&&o,blocked:!1,context:e,trigger:n.multiple?"visible":"impression"}),i.observer.observe(t))}function V(e){if(!e)return;const t=P.get(e);t&&(t.observer&&t.observer.disconnect(),P.delete(e))}import{isString as I,isObject as M,isElementOrDocument as N}from"@walkeros/core";import{createPushResult as q}from"@walkeros/collector";function H(e,t,n,o,r,i,s){const{elb:c,settings:a}=e;if(I(t)&&t.startsWith("walker ")){if("walker init"===t&&e.initScope){const t=function(e,t){if(z(e))return[e];if(Array.isArray(e)){const t=[];for(const n of e)z(n)&&t.push(n);return t}if(void 0===e){const e=t.scope;if(z(e))return[e];if(void 0!==globalThis.document)return[globalThis.document]}return[]}(n,a);for(const n of t)e.initScope(e,{...a,scope:n});return Promise.resolve(q({ok:!0}))}return c(t,n)}if(M(t)){const e=t;if(!e.source&&a.scope){const t=a.scope.ownerDocument||a.scope,n=t.defaultView;e.source=G(n,t)}return!e.globals&&a.scope&&(e.globals=h(a.prefix,a.scope)),c(e)}const[l]=String(M(t)?t.name:t).split(" ");let u,f=M(n)?n:{},d={},m=!1;if(N(n)&&(u=n,m=!0),N(r)?u=r:M(r)&&Object.keys(r).length&&(d=r),u){const e=y(a.prefix||"data-elb",u).find(e=>e.entity===l);e&&(m&&(f=e.data),e.context&&(d=e.context))}const p=a.scope?a.scope.ownerDocument||a.scope:void 0,g=null==p?void 0:p.defaultView;"page"===l&&g&&(f.id=f.id||g.location.pathname);const b=h(a.prefix,a.scope);return c({name:String(t||""),data:f,context:d,globals:b,nested:i,custom:s,trigger:I(o)?o:"",source:g&&p?G(g,p):void 0})}function G(e,t){return{type:"browser",platform:"web",url:e.location.href,referrer:t.referrer}}function z(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof Element&&e instanceof Element)return!0;if("undefined"!=typeof Document&&e instanceof Document)return!0;if("nodeType"in e){const t=e.nodeType;return 1===t||9===t}return!1}var B,Y,_=[],F=[],J=[];function K(){return Y||(Y=new AbortController),Y}var Q="click",U="hover",X="load",Z="pulse",ee="scroll",te="submit",ne="impression",oe="visible",re="wait";function ie(e,t){if(!t.scope)return;!function(e,t){const n=t.scope;if(!n)return;Y&&Y.abort();Y=new AbortController;const{signal:r}=Y;n.addEventListener("click",o(function(t){ue.call(this,e,t)}),{signal:r}),n.addEventListener("submit",o(function(t){fe.call(this,e,t)}),{signal:r})}(e,t)}function se(e,t){const o=t.scope;_=[];const i=o;if(!i)return;V(i),function(e,t=1e3){P.has(e)||P.set(e,{observer:R(e),timers:new WeakMap,duration:t})}(i,1e3);const s=m(t.prefix,r.Commands.Action,!1);i!==(i.ownerDocument||i)&&ae(e,i,s,t),j(i,`[${s}]`,n=>{ae(e,n,s,t)}),_.length&&function(e,t){const o=t.ownerDocument||t,r=o.defaultView,i=(e,t)=>e.filter(([e,n])=>{const o=r.scrollY+r.innerHeight,i=e.offsetTop;if(o<i)return!0;const s=e.clientHeight;return!(100*(1-(i+s-o)/(s||1))>=n)||(ce(t,e,ee),!1)});B||(B=n(function(){_=i.call(t,_,e)}),t.addEventListener("scroll",B,{signal:K().signal}))}(e,i)}async function ce(e,t,n){const o=b(t,n,e.settings.prefix);return Promise.all(o.map(t=>H(e,{name:`${t.entity} ${t.action}`,...t,trigger:n})))}function ae(e,t,n,r){const i=s(t,n);i&&Object.values(w(i)).forEach(n=>n.forEach(n=>{switch(n.trigger){case U:!function(e,t){t.addEventListener("mouseenter",o(function(t){const n=le(t);n&&ce(e,n,U)}),{signal:K().signal})}(e,t);break;case X:!function(e,t){ce(e,t,X)}(e,t);break;case Z:!function(e,t,n=""){const o=t.ownerDocument,r=setInterval(()=>{o.hidden||ce(e,t,Z)},parseInt(n||"")||15e3);F.push(r)}(e,t,n.triggerParams);break;case ee:!function(e,t=""){const n=parseInt(t||"")||50;if(n<0||n>100)return;_.push([e,n])}(t,n.triggerParams);break;case ne:W(e,t);break;case oe:W(e,t,{multiple:!0});break;case re:!function(e,t,n=""){const o=setTimeout(()=>ce(e,t,re),parseInt(n||"")||15e3);J.push(o)}(e,t,n.triggerParams)}}))}function le(e){var t;const n=null==(t=e.composedPath)?void 0:t.call(e),o=(null==n?void 0:n.length)?n[0]:e.target;if(o&&"object"==typeof o&&"tagName"in o)return o}function ue(e,t){const n=le(t);n&&ce(e,n,Q)}function fe(e,t){const n=le(t);n&&ce(e,n,te)}import{tryCatch as de,isString as me,isObject as pe}from"@walkeros/core";function ge(e,t={}){var n;const o=t.name||"elbLayer",r=t.window,i=t.logger;if(!r)return;const s=r;s[o]||(s[o]=[]);const c=s[o],a=r.document;null==i||i.debug("initElbLayer enter",{layerName:o,queuedItems:c.length}),c.push=function(...n){if(we(n[0])){const o=[...Array.from(n[0])],r=Array.prototype.push.apply(this,[o]);return he(e,t.prefix,o,a,i),r}const o=Array.prototype.push.apply(this,n);return n.forEach(n=>{he(e,t.prefix,n,a,i)}),o},Array.isArray(c)&&c.length>0&&(null==i||i.debug("initElbLayer drain walker commands",{count:c.length}),function(e,t,n,o,r){const i="walker ",s=[...n],c=new Set;s.forEach((n,s)=>{const a=be(n);if(!a)return;const l=a[0];!pe(l)&&me(l)&&l.startsWith(i)&&(c.add(s),he(e,t,a,o,r))});const a=[...c].sort((e,t)=>t-e);for(const e of a)n.splice(e,1);null==r||r.debug("drainWalkerCommands done",{consumed:c.size,remaining:n.length})}(e,null!=(n=t.prefix)?n:"data-elb",c,a,i))}function be(e){const t=we(e)?[...Array.from(e)]:null!=(n=e)&&"object"==typeof n&&"length"in n&&"number"==typeof n.length?Array.from(e):[e];var n;if(!Array.isArray(t)||0===t.length)return null;if(1===t.length&&!t[0])return null;const o=t[0];return pe(o)&&0===Object.keys(o).length||!pe(o)&&me(o)&&""===o.trim()?null:t}function he(e,t="data-elb",n,o,r){de(()=>{if(Array.isArray(n)){const[i,...s]=n;if(!i||me(i)&&""===i.trim())return void(null==r||r.debug("pushCommand skipped (empty/invalid action)",{item:n}));if(me(i)&&i.startsWith("walker "))return null==r||r.debug("pushCommand walker command",{action:i,data:s[0]}),void e(i,s[0]);null==r||r.debug("pushCommand event (translated)",{action:i,rest:s}),H({elb:e,settings:{prefix:t,scope:o,pageview:!1,elb:"",elbLayer:!1}},i,...s)}else if(n&&"object"==typeof n){if(0===Object.keys(n).length)return void(null==r||r.debug("pushCommand skipped (empty object)"));null==r||r.debug("pushCommand object event",{item:n}),e(n)}},e=>{null==r||r.warn("pushCommand failed",{error:e,item:n})})()}function we(e){return null!=e&&"object"==typeof e&&"[object Arguments]"===Object.prototype.toString.call(e)}function ye(e={},t){return{prefix:"data-elb",pageview:!0,elb:"elb",elbLayer:"elbLayer",scope:t||void 0,...e}}var ve={};import{isString as ke,isDefined as Ce}from"@walkeros/core";function xe(e={}){const t=e.prefix||"data-elb";return function(e){let n,o=e;const r={},i={},s={},c={},a={},l={},u={};function f(e){return Object.entries(e).map(([e,t])=>`${e}:${function(e){if(!Ce(e)||null===e)return"undefined";let t=String(e);return t=t.replace(/\\/g,"\\\\"),t=t.replace(/;/g,"\\;"),t=t.replace(/:/g,"\\:"),t=t.replace(/'/g,"\\'"),t}(t)}`).join(";")}const d={entity:e=>(n=e,o=e,d),data(e,t){const n=null!=o?o:"";return r[n]||(r[n]={}),ke(e)?r[n][e]=t:Object.assign(r[n],e),d},scoped:(e,t)=>(ke(e)?i[e]=t:Object.assign(i,e),d),action(e,t){if(ke(e))if(Ce(t))s[e]=t;else if(e.includes(":")){const[t,n]=e.split(":",2);s[t]=n}else s[e]=e;else Object.assign(s,e);return d},actions(e,t){if(ke(e))if(Ce(t))c[e]=t;else if(e.includes(":")){const[t,n]=e.split(":",2);c[t]=n}else c[e]=e;else Object.assign(c,e);return d},context:(e,t)=>(ke(e)?a[e]=t:Object.assign(a,e),d),globals:(e,t)=>(ke(e)?l[e]=t:Object.assign(l,e),d),link:(e,t)=>(ke(e)?u[e]=t:Object.assign(u,e),d),get(){const e={};return n&&(e[t]=n),Object.entries(r).forEach(([n,o])=>{if(Object.keys(o).length>0){e[n?`${t}-${n}`:`${t}-`]=f(o)}}),Object.keys(i).length>0&&(e[`${t}_`]=f(i)),Object.keys(s).length>0&&(e[`${t}action`]=f(s)),Object.keys(c).length>0&&(e[`${t}actions`]=f(c)),Object.keys(a).length>0&&(e[`${t}context`]=f(a)),Object.keys(l).length>0&&(e[`${t}globals`]=f(l)),Object.keys(u).length>0&&(e[`${t}link`]=f(u)),e}};return d}}var je=Symbol.for("@walkeros/web-source-browser:instance");function Ee(e){return e||(void 0!==globalThis.window?globalThis.window:void 0)}function Oe(){const e=Ee(void 0);e&&Reflect.deleteProperty(e,je)}var $e=async n=>{const{config:o,env:r,logger:i}=n,{elb:s,command:c,window:a,document:l}=r,u=(null==o?void 0:o.settings)||{},f=a||(void 0!==globalThis.window?globalThis.window:void 0),d=l||(void 0!==globalThis.document?globalThis.document:void 0),p=Ee(f);if(p){if(Reflect.get(p,je))return{type:"browser",config:{settings:ye({},void 0)},push:(...e)=>Promise.resolve(t({ok:!0})),on:async()=>{},init:async()=>{},destroy:async()=>{}};Object.defineProperty(p,je,{value:!0,enumerable:!1,configurable:!0,writable:!1})}const g=ye(u,d),b={elb:s,settings:g,initScope:se},h=e=>{if(!e.pageview)return;const[t,n]=function(e,t){const n=t.ownerDocument||t,o=n.defaultView.location,r="page",i="body"in t?t.body:t,[s,c]=C(i,`[${m(e,r)}]`,e,r);return s.domain=o.hostname,s.title=n.title,s.referrer=n.referrer,o.search&&(s.search=o.search),o.hash&&(s.hash=o.hash),[s,c]}(e.prefix||"data-elb",e.scope);H(b,"page view",t,"load",n)};return{type:"browser",config:{settings:g},push:(...e)=>{const[t,n,o,r,i,s]=e;return H(b,t,n,o,r,i,s)},on:async e=>{if("run"===e)d&&f&&(!function(e,t){if(!t.scope)return;se(e,t)}(b,g),function(e,t,n,o){const r=me(t.elbLayer)?t.elbLayer:"elbLayer",i=t.prefix||"data-elb",s=n[r];if(!Array.isArray(s))return;const c=n.document;let a=-1;s.forEach((e,t)=>{const n=be(e);n&&me(n[0])&&"walker run"===n[0]&&(a=t)});const l=[];for(let e=a+1;e<s.length;e++){const t=be(s[e]);t&&l.push(t)}s.length=a+1,null==o||o.debug("drainNonWalkerEvents",{anchor:a,drained:l.length}),l.forEach(t=>he(e,i,t,c,o))}(s,g,f,i),h(g))},init:async()=>{f&&d&&(!1!==g.elbLayer&&s&&ge(s,{name:e(g.elbLayer)?g.elbLayer:"elbLayer",prefix:g.prefix,window:f,logger:i}),await async function(e,t,n){const o=()=>{e(t,n)},r=n.scope;if(!r)return void o();const i=r.ownerDocument||r;"loading"!==i.readyState?o():i.addEventListener("DOMContentLoaded",o)}(ie,b,g),e(g.elb)&&g.elb&&(f[g.elb]=(...e)=>{const[t,n,o,r,i,s]=e;return H(b,t,n,o,r,i,s)}))},destroy:async()=>{Y&&(Y.abort(),Y=void 0),B=void 0,_=[],F.forEach(e=>clearInterval(e)),F=[],J.forEach(e=>clearTimeout(e)),J=[],d&&V(g.scope||d)}}},Ae=$e;export{ve as SourceBrowser,Oe as __resetInstanceCountForTests,xe as createTagger,Ae as default,g as getAllEvents,m as getElbAttributeName,p as getElbValues,b as getEvents,h as getGlobals,$e as sourceBrowser};//# sourceMappingURL=index.mjs.map
1
+ import{isString as e}from"@walkeros/core";import{createPushResult as t}from"@walkeros/collector";import{throttle as n,tryCatch as o}from"@walkeros/core";import{Const as r}from"@walkeros/collector";import{elb as s,getAttribute as i}from"@walkeros/web-core";import{assign as c,castValue as a,isArray as l,trim as u}from"@walkeros/core";import{Const as f}from"@walkeros/collector";import{getAttribute as d}from"@walkeros/web-core";function m(e,t,n=!0){return e+(t=null!=t?(n?"-":"")+t:"")}function g(e,t,n,o=!0){return j(d(t,m(e,n,o))||"").reduce((e,n)=>{let[o,r]=O(n);if(!o)return e;if(r||(o.endsWith(":")&&(o=o.slice(0,-1)),r=""),r.startsWith("#")){r=r.slice(1);try{let e=t[r];e||"selected"!==r||(e=t.options[t.selectedIndex].text),r=String(e)}catch(e){r=""}}return o.endsWith("[]")?(o=o.slice(0,-2),l(e[o])||(e[o]=[]),e[o].push(a(r))):e[o]=a(r),e},{})}function p(e,t=f.Commands.Prefix){var n;const o=e;if(!o)return[];let r=[];const s=f.Commands.Action,i=`[${m(t,s,!1)}]`,c=e=>{Object.keys(g(t,e,s,!1)).forEach(n=>{r=r.concat(b(e,n,t))})};return o!==(o.ownerDocument||o)&&(null==(n=o.matches)?void 0:n.call(o,i))&&c(o),x(o,i,c),r}function b(e,t,n=f.Commands.Prefix){const o=[],{actions:r,nearestOnly:s}=function(e,t,n){let o=t;for(;o;){const t=d(o,m(e,f.Commands.Actions,!1));if(t){const e=w(t);if(e[n])return{actions:e[n],nearestOnly:!1}}const r=d(o,m(e,f.Commands.Action,!1));if(r){const e=w(r);if(e[n]||"click"!==n)return{actions:e[n]||[],nearestOnly:!0}}o=k(e,o)}return{actions:[],nearestOnly:!1}}(n,e,t);return r.length?(r.forEach(r=>{const i=j(r.actionParams||"",",").reduce((e,t)=>(e[u(t)]=!0,e),{}),c=y(n,e,i,s);if(!c.length){const t="page",o=`[${m(n,t)}]`,[r,s]=E(e,o,n,t);c.push({entity:t,data:r,nested:[],context:s})}c.forEach(e=>{var n;o.push({entity:e.entity,action:r.action,data:e.data,trigger:t,context:e.context,nested:null!=(n=e.nested)?n:[]})})}),o):o}function h(e=f.Commands.Prefix,t){if(!t)return{};const n=m(e,f.Commands.Globals,!1);let o={};return C(t,`[${n}]`,t=>{o=c(o,g(e,t,f.Commands.Globals,!1))}),o}function w(e){const t={};return j(e).forEach(e=>{const[n,o]=O(e),[r,s]=$(n);if(!r)return;let[i,c]=$(o||"");i=i||r,t[r]||(t[r]=[]),t[r].push({trigger:r,triggerParams:s,action:i,actionParams:c})}),t}function y(e,t,n,o=!1){const r=[];let s=t;for(n=0!==Object.keys(n||{}).length?n:void 0;s;){const i=v(e,s,t,n);if(i&&(r.push(i),o))break;s=k(e,s)}return r}function v(e,t,n,o){const r=d(t,m(e));if(!r||o&&!o[r])return null;const s=[t],i=`[${m(e,r)}],[${m(e,"")}]`,a=m(e,f.Commands.Link,!1);let l={};const u=[],[p,b]=E(n||t,i,e,r,!0);x(t,`[${a}]`,n=>{const[o,r]=O(d(n,a));"parent"===r&&x(t.ownerDocument.body,`[${a}="${o}:child"]`,t=>{s.push(t);const n=v(e,t);n&&u.push(n)})});const h=[];s.forEach(e=>{e.matches(i)&&h.push(e),x(e,i,e=>h.push(e))});let w={};return h.forEach(t=>{w=c(w,g(e,t,"")),l=c(l,g(e,t,r))}),l=c(c(w,l),p),s.forEach(t=>{x(t,`[${m(e)}]`,t=>{const n=v(e,t);n&&u.push(n)})}),{entity:r,data:l,context:b,nested:u}}function k(e,t){const n=m(e,f.Commands.Link,!1);if(t.matches(`[${n}]`)){const[e,o]=O(d(t,n));if("child"===o){const o=t.ownerDocument;let r=null;return C(o,`[${n}="${e}:parent"]`,e=>{r||(r=e)}),r}}const o=t.ownerDocument.defaultView;return!t.parentElement&&t.getRootNode&&t.getRootNode()instanceof o.ShadowRoot?t.getRootNode().host:t.parentElement}function E(e,t,n,o,r=!1){let s={};const i={};let a=e;const l=`[${m(n,f.Commands.Context,!1)}]`,u=f.Commands.Scoped,d=`[${m(n,u,!1)}]`;let p=0;for(;a;)r&&u&&a.matches(d)&&(s=c(g(n,a,u,!1),s)),a.matches(t)&&(s=c(g(n,a,""),s),s=c(g(n,a,o),s)),a.matches(l)&&(Object.entries(g(n,a,f.Commands.Context,!1)).forEach(([e,t])=>{t&&!i[e]&&(i[e]=[t,p])}),++p),a=k(n,a);return[s,i]}function C(e,t,n){e.querySelectorAll(t).forEach(n)}function x(e,t,n){e.querySelectorAll(t).forEach(n);e instanceof(e.ownerDocument||e).defaultView.Element&&e.shadowRoot&&x(e.shadowRoot,t,n),e.querySelectorAll("*").forEach(e=>{e.shadowRoot&&x(e.shadowRoot,t,n)})}function j(e,t=";"){if(!e)return[];const n=new RegExp(`(?:[^${t}']+|'[^']*')+`,"ig");return e.match(n)||[]}function O(e){const[t,n]=e.split(/:(.+)/,2);return[u(t),u(n)]}function $(e){const[t,n]=e.split("(",2);return[t,n?n.slice(0,-1):""]}import{tryCatch as A}from"@walkeros/core";import{isVisible as L}from"@walkeros/web-core";var D,S=new WeakMap,I=new WeakMap,T=new WeakMap;function P(e){return e.ownerDocument||e}function R(e){const t=Date.now();let n=I.get(e);if(!n||t-n.lastChecked>500){const o=e.ownerDocument.defaultView,r=e.ownerDocument;n={isVisible:L(e,o,r),lastChecked:t},I.set(e,n)}return n.isVisible}function W(e,t){var n;const o=T.get(P(e));if(!o)return;o.observer&&o.observer.unobserve(t),null==(n=o.elementConfigs)||n.delete(t);const r=o.timers.get(t);r&&(clearTimeout(r),o.timers.delete(t)),S.delete(t),I.delete(t)}function V(e){const t=(e.ownerDocument||e).defaultView;if(t&&t.IntersectionObserver)return A(()=>new t.IntersectionObserver(t=>{t.forEach(t=>{!function(e,t){var n,o;const r=t.target,s=T.get(P(e));if(!s)return;const i=s.timers.get(r);if(t.intersectionRatio>0){const o=Date.now();let c=S.get(r);if(!c||o-c.lastChecked>1e3){const e=r.ownerDocument.defaultView;c={isLarge:r.offsetHeight>e.innerHeight,lastChecked:o},S.set(r,c)}if(t.intersectionRatio>=.5||c.isLarge&&R(r)){const t=null==(n=s.elementConfigs)?void 0:n.get(r);if((null==t?void 0:t.multiple)&&t.blocked)return;if(!i){const t=r.ownerDocument.defaultView.setTimeout(async()=>{var t,n;if(R(r)){const o=null==(t=s.elementConfigs)?void 0:t.get(r);(null==o?void 0:o.context)&&await se(o.context,r,o.trigger);const i=null==(n=s.elementConfigs)?void 0:n.get(r);(null==i?void 0:i.multiple)?i.blocked=!0:W(e,r)}},s.duration);s.timers.set(r,t)}return}}i&&(clearTimeout(i),s.timers.delete(r));const c=null==(o=s.elementConfigs)?void 0:o.get(r);(null==c?void 0:c.multiple)&&(c.blocked=!1)}(e,t)})},{rootMargin:"0px",threshold:[0,.5]}),()=>{})()}function M(e,t,n={multiple:!1}){var o;const r=e.settings.scope;if(!r)return;const s=T.get(P(r));(null==s?void 0:s.observer)&&t&&(s.elementConfigs||(s.elementConfigs=new WeakMap),s.elementConfigs.set(t,{multiple:null!=(o=n.multiple)&&o,blocked:!1,context:e,trigger:n.multiple?"visible":"impression"}),s.observer.observe(t))}import{isString as N,isObject as q,isElementOrDocument as H}from"@walkeros/core";import{createPushResult as G}from"@walkeros/collector";function z(e,t,n,o,r,s,i){const{elb:c,settings:a}=e;if(N(t)&&t.startsWith("walker ")){if("walker init"===t&&e.initScope){const t=function(e,t){if(Y(e))return[e];if(Array.isArray(e)){const t=[];for(const n of e)Y(n)&&t.push(n);return t}if(void 0===e){const e=t.scope;if(Y(e))return[e];if(void 0!==globalThis.document)return[globalThis.document]}return[]}(n,a);for(const n of t)e.initScope({...e,settings:{...a,scope:n}});return Promise.resolve(G({ok:!0}))}return c(t,n)}if(q(t)){const e=t;if(!e.source&&a.scope){const t=a.scope.ownerDocument||a.scope,n=t.defaultView;e.source=B(n,t)}return!e.globals&&a.scope&&(e.globals=h(a.prefix,a.scope)),c(e)}const[l]=String(q(t)?t.name:t).split(" ");let u,f=q(n)?n:{},d={},m=!1;if(H(n)&&(u=n,m=!0),H(r)?u=r:q(r)&&Object.keys(r).length&&(d=r),u){const e=y(a.prefix||"data-elb",u).find(e=>e.entity===l);e&&(m&&(f=e.data),e.context&&(d=e.context))}const g=a.scope?a.scope.ownerDocument||a.scope:void 0,p=null==g?void 0:g.defaultView;"page"===l&&p&&(f.id=f.id||p.location.pathname);const b=h(a.prefix,a.scope);return c({name:String(t||""),data:f,context:d,globals:b,nested:s,custom:i,trigger:N(o)?o:"",source:p&&g?B(p,g):void 0})}function B(e,t){return{type:"browser",platform:"web",url:e.location.href,referrer:t.referrer}}function Y(e){if(!e||"object"!=typeof e)return!1;if("undefined"!=typeof Element&&e instanceof Element)return!0;if("undefined"!=typeof Document&&e instanceof Document)return!0;if("nodeType"in e){const t=e.nodeType;return 1===t||9===t}return!1}var _=new Map;var F="click",J="hover",K="load",Q="pulse",U="scroll",X="submit",Z="impression",ee="visible",te="wait";function ne(e,t){if(!t.scope)return;!function(e,t){const n=t.scope;if(!n)return;D&&D.abort();D=new AbortController;const{signal:r}=D;n.addEventListener("click",o(function(t){ae.call(this,e,t)}),{signal:r}),n.addEventListener("submit",o(function(t){le.call(this,e,t)}),{signal:r})}(e,t)}function oe(e){D&&(D.abort(),D=void 0),_.forEach((e,t)=>{e.abort.abort(),e.intervalIds.forEach(e=>clearInterval(e)),e.timeoutIds.forEach(e=>clearTimeout(e)),function(e){if(!e)return;const t=P(e),n=T.get(t);n&&(n.observer&&n.observer.disconnect(),T.delete(t))}(t)}),_.clear()}function re(e,t){const o=e.settings.scope;if(!o)return;const s=function(e){const t=_.get(e);t&&(t.abort.abort(),t.intervalIds.forEach(e=>clearInterval(e)),t.timeoutIds.forEach(e=>clearTimeout(e)),t.observed.forEach(t=>W(e,t)));const n={abort:new AbortController,intervalIds:[],timeoutIds:[],scrollElements:[],observed:new Set};return _.set(e,n),n}(o);!function(e,t=1e3){const n=P(e);T.has(n)||T.set(n,{observer:V(n),timers:new WeakMap,duration:t})}(o,1e3);const i=m(e.settings.prefix,r.Commands.Action,!1);o!==(o.ownerDocument||o)&&ie(e,o,i,s),x(o,`[${i}]`,t=>{ie(e,t,i,s)}),s.scrollElements.length&&function(e,t,o){const r=t.ownerDocument||t,s=r.defaultView,i=(e,t)=>e.filter(([e,n])=>{const o=s.scrollY+s.innerHeight,r=e.offsetTop;if(o<r)return!0;const i=e.clientHeight;return!(100*(1-(r+i-o)/(i||1))>=n)||(se(t,e,U),!1)});o.scrollListener||(o.scrollListener=n(function(){o.scrollElements=i.call(t,o.scrollElements,e)}),t.addEventListener("scroll",o.scrollListener,{signal:o.abort.signal}))}(e,o,s)}async function se(e,t,n){const o=b(t,n,e.settings.prefix);return Promise.all(o.map(t=>z(e,{name:`${t.entity} ${t.action}`,...t,trigger:n})))}function ie(e,t,n,r){const s=i(t,n);s&&Object.values(w(s)).forEach(n=>n.forEach(n=>{switch(n.trigger){case J:!function(e,t,n){t.addEventListener("mouseenter",o(function(t){const n=ce(t);n&&se(e,n,J)}),{signal:n.abort.signal})}(e,t,r);break;case K:!function(e,t){se(e,t,K)}(e,t);break;case Q:!function(e,t,n,o=""){const r=t.ownerDocument,s=setInterval(()=>{r.hidden||se(e,t,Q)},parseInt(o||"")||15e3);n.intervalIds.push(s)}(e,t,r,n.triggerParams);break;case U:!function(e,t,n=""){const o=parseInt(n||"")||50;if(o<0||o>100)return;t.scrollElements.push([e,o])}(t,r,n.triggerParams);break;case Z:M(e,t),r.observed.add(t);break;case ee:M(e,t,{multiple:!0}),r.observed.add(t);break;case te:!function(e,t,n,o=""){const r=setTimeout(()=>se(e,t,te),parseInt(o||"")||15e3);n.timeoutIds.push(r)}(e,t,r,n.triggerParams)}}))}function ce(e){var t;const n=null==(t=e.composedPath)?void 0:t.call(e),o=(null==n?void 0:n.length)?n[0]:e.target;if(o&&"object"==typeof o&&"tagName"in o)return o}function ae(e,t){const n=ce(t);n&&se(e,n,F)}function le(e,t){const n=ce(t);n&&se(e,n,X)}import{tryCatch as ue,isString as fe,isObject as de}from"@walkeros/core";function me(e,t={}){var n;const o=t.name||"elbLayer",r=t.window,s=t.logger;if(!r)return;const i=r;i[o]||(i[o]=[]);const c=i[o],a=r.document;null==s||s.debug("initElbLayer enter",{layerName:o,queuedItems:c.length}),c.push=function(...n){if(be(n[0])){const o=[...Array.from(n[0])],r=Array.prototype.push.apply(this,[o]);return pe(e,t.prefix,o,a,s),r}const o=Array.prototype.push.apply(this,n);return n.forEach(n=>{pe(e,t.prefix,n,a,s)}),o},Array.isArray(c)&&c.length>0&&(null==s||s.debug("initElbLayer drain walker commands",{count:c.length}),function(e,t,n,o,r){const s="walker ",i=[...n],c=new Set;i.forEach((n,i)=>{const a=ge(n);if(!a)return;const l=a[0];!de(l)&&fe(l)&&l.startsWith(s)&&(c.add(i),pe(e,t,a,o,r))});const a=[...c].sort((e,t)=>t-e);for(const e of a)n.splice(e,1);null==r||r.debug("drainWalkerCommands done",{consumed:c.size,remaining:n.length})}(e,null!=(n=t.prefix)?n:"data-elb",c,a,s))}function ge(e){const t=be(e)?[...Array.from(e)]:null!=(n=e)&&"object"==typeof n&&"length"in n&&"number"==typeof n.length?Array.from(e):[e];var n;if(!Array.isArray(t)||0===t.length)return null;if(1===t.length&&!t[0])return null;const o=t[0];return de(o)&&0===Object.keys(o).length||!de(o)&&fe(o)&&""===o.trim()?null:t}function pe(e,t="data-elb",n,o,r){ue(()=>{if(Array.isArray(n)){const[s,...i]=n;if(!s||fe(s)&&""===s.trim())return void(null==r||r.debug("pushCommand skipped (empty/invalid action)",{item:n}));if(fe(s)&&s.startsWith("walker "))return null==r||r.debug("pushCommand walker command",{action:s,data:i[0]}),void e(s,i[0]);null==r||r.debug("pushCommand event (translated)",{action:s,rest:i}),z({elb:e,settings:{prefix:t,scope:o,pageview:!1,elb:"",elbLayer:!1}},s,...i)}else if(n&&"object"==typeof n){if(0===Object.keys(n).length)return void(null==r||r.debug("pushCommand skipped (empty object)"));null==r||r.debug("pushCommand object event",{item:n}),e(n)}},e=>{null==r||r.warn("pushCommand failed",{error:e,item:n})})()}function be(e){return null!=e&&"object"==typeof e&&"[object Arguments]"===Object.prototype.toString.call(e)}function he(e={},t){return{prefix:"data-elb",pageview:!0,elb:"elb",elbLayer:"elbLayer",scope:t||void 0,...e}}var we={};import{isString as ye,isDefined as ve}from"@walkeros/core";function ke(e={}){const t=e.prefix||"data-elb";return function(e){let n,o=e;const r={},s={},i={},c={},a={},l={},u={};function f(e){return Object.entries(e).map(([e,t])=>`${e}:${function(e){if(!ve(e)||null===e)return"undefined";let t=String(e);return t=t.replace(/\\/g,"\\\\"),t=t.replace(/;/g,"\\;"),t=t.replace(/:/g,"\\:"),t=t.replace(/'/g,"\\'"),t}(t)}`).join(";")}const d={entity:e=>(n=e,o=e,d),data(e,t){const n=null!=o?o:"";return r[n]||(r[n]={}),ye(e)?r[n][e]=t:Object.assign(r[n],e),d},scoped:(e,t)=>(ye(e)?s[e]=t:Object.assign(s,e),d),action(e,t){if(ye(e))if(ve(t))i[e]=t;else if(e.includes(":")){const[t,n]=e.split(":",2);i[t]=n}else i[e]=e;else Object.assign(i,e);return d},actions(e,t){if(ye(e))if(ve(t))c[e]=t;else if(e.includes(":")){const[t,n]=e.split(":",2);c[t]=n}else c[e]=e;else Object.assign(c,e);return d},context:(e,t)=>(ye(e)?a[e]=t:Object.assign(a,e),d),globals:(e,t)=>(ye(e)?l[e]=t:Object.assign(l,e),d),link:(e,t)=>(ye(e)?u[e]=t:Object.assign(u,e),d),get(){const e={};return n&&(e[t]=n),Object.entries(r).forEach(([n,o])=>{if(Object.keys(o).length>0){e[n?`${t}-${n}`:`${t}-`]=f(o)}}),Object.keys(s).length>0&&(e[`${t}_`]=f(s)),Object.keys(i).length>0&&(e[`${t}action`]=f(i)),Object.keys(c).length>0&&(e[`${t}actions`]=f(c)),Object.keys(a).length>0&&(e[`${t}context`]=f(a)),Object.keys(l).length>0&&(e[`${t}globals`]=f(l)),Object.keys(u).length>0&&(e[`${t}link`]=f(u)),e}};return d}}var Ee=Symbol.for("@walkeros/web-source-browser:instance");function Ce(e){return e||(void 0!==globalThis.window?globalThis.window:void 0)}function xe(){const e=Ce(void 0);e&&Reflect.deleteProperty(e,Ee)}var je=async n=>{const{config:o,env:r,logger:s}=n,{elb:i,command:c,window:a,document:l}=r,u=(null==o?void 0:o.settings)||{},f=a||(void 0!==globalThis.window?globalThis.window:void 0),d=l||(void 0!==globalThis.document?globalThis.document:void 0),g=Ce(f);if(g){if(Reflect.get(g,Ee))return{type:"browser",config:{settings:he({},void 0)},push:(...e)=>Promise.resolve(t({ok:!0})),on:async()=>{},init:async()=>{},destroy:async()=>{}};Object.defineProperty(g,Ee,{value:!0,enumerable:!1,configurable:!0,writable:!1})}const p=he(u,d),b={elb:i,settings:p,initScope:re},h=e=>{if(!e.pageview)return;const[t,n]=function(e,t){const n=t.ownerDocument||t,o=n.defaultView.location,r="page",s="body"in t?t.body:t,[i,c]=E(s,`[${m(e,r)}]`,e,r);return i.domain=o.hostname,i.title=n.title,i.referrer=n.referrer,o.search&&(i.search=o.search),o.hash&&(i.hash=o.hash),[i,c]}(e.prefix||"data-elb",e.scope);z(b,"page view",t,"load",n)};return{type:"browser",config:{settings:p},push:(...e)=>{const[t,n,o,r,s,i]=e;return z(b,t,n,o,r,s,i)},on:async e=>{if("run"===e)d&&f&&(!function(e,t){if(!t.scope)return;re(e)}(b,p),function(e,t,n,o){const r=fe(t.elbLayer)?t.elbLayer:"elbLayer",s=t.prefix||"data-elb",i=n[r];if(!Array.isArray(i))return;const c=n.document;let a=-1;i.forEach((e,t)=>{const n=ge(e);n&&fe(n[0])&&"walker run"===n[0]&&(a=t)});const l=[];for(let e=a+1;e<i.length;e++){const t=ge(i[e]);t&&l.push(t)}i.length=a+1,null==o||o.debug("drainNonWalkerEvents",{anchor:a,drained:l.length}),l.forEach(t=>pe(e,s,t,c,o))}(i,p,f,s),h(p))},init:async()=>{f&&d&&(!1!==p.elbLayer&&i&&me(i,{name:e(p.elbLayer)?p.elbLayer:"elbLayer",prefix:p.prefix,window:f,logger:s}),await async function(e,t,n){const o=()=>{e(t,n)},r=n.scope;if(!r)return void o();const s=r.ownerDocument||r;"loading"!==s.readyState?o():s.addEventListener("DOMContentLoaded",o)}(ne,b,p),e(p.elb)&&p.elb&&(f[p.elb]=(...e)=>{const[t,n,o,r,s,i]=e;return z(b,t,n,o,r,s,i)}))},destroy:async()=>{oe()}}},Oe=je;export{we as SourceBrowser,xe as __resetInstanceCountForTests,ke as createTagger,Oe as default,p as getAllEvents,m as getElbAttributeName,g as getElbValues,b as getEvents,h as getGlobals,je as sourceBrowser};//# sourceMappingURL=index.mjs.map