{"version":3,"sources":["../src/core/anonymizeIP.ts","../src/core/assign.ts","../src/core/constants.ts","../src/core/is.ts","../src/core/byPath.ts","../src/core/castValue.ts","../src/core/clone.ts","../src/core/getId.ts","../src/core/property.ts","../src/core/tryCatch.ts","../src/core/mapping.ts","../src/core/useHooks.ts","../src/core/invocations.ts","../src/core/handle.ts","../src/core/destination.ts","../src/core/on.ts","../src/core/consent.ts","../src/core/eventGenerator.ts","../src/core/getMarketingParameters.ts","../src/core/onLog.ts","../src/core/request.ts","../src/core/send.ts","../src/core/throwError.ts","../src/core/trim.ts","../src/core/userAgent.ts","../src/core/validate.ts"],"sourcesContent":["export function anonymizeIP(ip: string): string {\n  const ipv4Pattern = /^(?:\\d{1,3}\\.){3}\\d{1,3}$/;\n\n  if (!ipv4Pattern.test(ip)) return '';\n\n  return ip.replace(/\\.\\d+$/, '.0'); // Set the last octet to 0\n}\n","interface Assign {\n  merge?: boolean; // Merge array properties (default) instead of overriding them\n  shallow?: boolean; // Create a shallow copy (default) instead of updating the target object\n  extend?: boolean; // Extend the target with new properties (default) instead of only updating existing ones\n}\n\nconst defaultOptions: Assign = {\n  merge: true,\n  shallow: true,\n  extend: true,\n};\n\nexport function assign<T extends object, U extends object>(\n  target: T,\n  obj: U = {} as U,\n  options: Assign = {},\n): T & U {\n  options = { ...defaultOptions, ...options };\n\n  const finalObj = Object.entries(obj).reduce((acc, [key, sourceProp]) => {\n    const targetProp = target[key as keyof typeof target];\n\n    // Only merge arrays\n    if (\n      options.merge &&\n      Array.isArray(targetProp) &&\n      Array.isArray(sourceProp)\n    ) {\n      acc[key as keyof typeof acc] = sourceProp.reduce(\n        (acc, item) => {\n          // Remove duplicates\n          return acc.includes(item) ? acc : [...acc, item];\n        },\n        [...targetProp],\n      );\n    } else if (options.extend || key in target) {\n      // Extend the target with new properties or update existing ones\n      acc[key as keyof typeof acc] = sourceProp;\n    }\n\n    return acc;\n  }, {} as U);\n\n  // Handle shallow or deep copy based on options\n  if (options.shallow) {\n    return { ...target, ...finalObj };\n  } else {\n    Object.assign(target, finalObj);\n    return target as T & U;\n  }\n}\n","import type { WalkerOS } from '@elbwalker/types';\n\nexport type CommandTypes =\n  | 'Action'\n  | 'Config'\n  | 'Consent'\n  | 'Context'\n  | 'Custom'\n  | 'Destination'\n  | 'Elb'\n  | 'Globals'\n  | 'Hook'\n  | 'Init'\n  | 'Link'\n  | 'On'\n  | 'Prefix'\n  | 'Ready'\n  | 'Run'\n  | 'Session'\n  | 'User'\n  | 'Walker';\n\n// Define Commands with keys as CommandTypes\nexport const Commands: Record<CommandTypes, WalkerOS.Commands> = {\n  Action: 'action',\n  Config: 'config',\n  Consent: 'consent',\n  Context: 'context',\n  Custom: 'custom',\n  Destination: 'destination',\n  Elb: 'elb',\n  Globals: 'globals',\n  Hook: 'hook',\n  Init: 'init',\n  Link: 'link',\n  On: 'on',\n  Prefix: 'data-elb',\n  Ready: 'ready',\n  Run: 'run',\n  Session: 'session',\n  User: 'user',\n  Walker: 'walker',\n} as const;\n\nexport type StorageType = 'cookie' | 'local' | 'session';\n\nconst UtilsStorage: { [key: string]: StorageType } = {\n  Cookie: 'cookie',\n  Local: 'local',\n  Session: 'session',\n} as const;\n\nconst Utils = {\n  Storage: UtilsStorage,\n};\n\nexport const Const = {\n  Commands,\n  Utils,\n};\n\nexport default Const;\n","import type { WalkerOS } from '@elbwalker/types';\nimport { Const } from './constants';\n\nexport function isArguments(value: unknown): value is IArguments {\n  return Object.prototype.toString.call(value) === '[object Arguments]';\n}\n\nexport function isArray<T>(value: unknown): value is T[] {\n  return Array.isArray(value);\n}\n\nexport function isBoolean(value: unknown): value is boolean {\n  return typeof value === 'boolean';\n}\n\nexport function isCommand(entity: string) {\n  return entity === Const.Commands.Walker;\n}\n\nexport function isDefined<T>(val: T | undefined): val is T {\n  return typeof val !== 'undefined';\n}\n\nexport function isElementOrDocument(elem: unknown): elem is Element {\n  return elem === document || elem instanceof Element;\n}\n\nexport function isNumber(value: unknown): value is number {\n  return typeof value === 'number' && !Number.isNaN(value);\n}\n\nexport function isObject(value: unknown): value is WalkerOS.AnyObject {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    !isArray(value) &&\n    Object.prototype.toString.call(value) === '[object Object]'\n  );\n}\n\nexport function isSameType<T>(\n  variable: unknown,\n  type: T,\n): variable is typeof type {\n  return typeof variable === typeof type;\n}\n\nexport function isString(value: unknown): value is string {\n  return typeof value === 'string';\n}\n","import { WalkerOS } from '@elbwalker/types';\nimport { isArray, isDefined } from './is';\n\nexport function getByPath(\n  event: unknown,\n  key: string = '',\n  defaultValue?: unknown,\n  i: unknown = 0,\n): unknown {\n  // String dot notation for object (\"data.id\" -> { data: { id: 1 } })\n  const keys = key.split('.');\n  let values: unknown = event;\n\n  for (let index = 0; index < keys.length; index++) {\n    const k = keys[index];\n\n    if (k === '*' && isArray(values)) {\n      const remainingKeys = keys.slice(index + 1).join('.');\n      const result: unknown[] = [];\n\n      for (const item of values) {\n        const value = getByPath(item, remainingKeys, defaultValue, i);\n        result.push(value);\n      }\n\n      return result;\n    }\n\n    values =\n      values instanceof Object ? values[k as keyof typeof values] : undefined;\n\n    if (!values) break;\n  }\n\n  return isDefined(values) ? values : defaultValue;\n}\n\nexport function setByPath(\n  event: WalkerOS.Event,\n  key: string,\n  value: unknown,\n): WalkerOS.Event {\n  const keys = key.split('.');\n  let current: WalkerOS.AnyObject | WalkerOS.Event = event;\n\n  for (let i = 0; i < keys.length; i++) {\n    const k = keys[i] as keyof typeof current;\n\n    // Set the value if it's the last key\n    if (i === keys.length - 1) {\n      current[k] = value;\n    } else {\n      // Traverse to the next level\n      if (\n        !(k in current) ||\n        typeof current[k] !== 'object' ||\n        current[k] === null\n      ) {\n        current[k] = {};\n      }\n\n      // Move deeper into the object\n      current = current[k] as WalkerOS.AnyObject;\n    }\n  }\n\n  return event;\n}\n","import type { WalkerOS } from '@elbwalker/types';\n\nexport function castValue(value: unknown): WalkerOS.PropertyType {\n  if (value === 'true') return true;\n  if (value === 'false') return false;\n\n  const number = Number(value); // Converts \"\" to 0\n  if (value == number && value !== '') return number;\n\n  return String(value);\n}\n","export function clone<T>(\n  org: T,\n  visited: WeakMap<object, unknown> = new WeakMap(),\n): T {\n  // Handle primitive values and functions directly\n  if (typeof org !== 'object' || org === null) return org;\n\n  // Check for circular references\n  if (visited.has(org)) return visited.get(org) as T;\n\n  // Allow list of clonable types\n  const type = Object.prototype.toString.call(org);\n  if (type === '[object Object]') {\n    const clonedObj = {} as Record<string | symbol, unknown>;\n    visited.set(org as object, clonedObj); // Remember the reference\n\n    for (const key in org as Record<string | symbol, unknown>) {\n      if (Object.prototype.hasOwnProperty.call(org, key)) {\n        clonedObj[key] = clone(\n          (org as Record<string | symbol, unknown>)[key],\n          visited,\n        );\n      }\n    }\n    return clonedObj as T;\n  }\n\n  if (type === '[object Array]') {\n    const clonedArray = [] as unknown[];\n    visited.set(org as object, clonedArray); // Remember the reference\n\n    (org as unknown[]).forEach((item) => {\n      clonedArray.push(clone(item, visited));\n    });\n\n    return clonedArray as T;\n  }\n\n  if (type === '[object Date]') {\n    return new Date((org as unknown as Date).getTime()) as T;\n  }\n\n  if (type === '[object RegExp]') {\n    const reg = org as unknown as RegExp;\n    return new RegExp(reg.source, reg.flags) as T;\n  }\n\n  // Skip cloning for unsupported types and return reference\n  return org;\n}\n","export function getId(length = 6): string {\n  let str = '';\n  for (let l = 36; str.length < length; )\n    str += ((Math.random() * l) | 0).toString(l);\n  return str;\n}\n","import type { WalkerOS } from '@elbwalker/types';\nimport {\n  isArguments,\n  isArray,\n  isBoolean,\n  isDefined,\n  isNumber,\n  isObject,\n  isString,\n} from './is';\n\nexport function isPropertyType(value: unknown): value is WalkerOS.PropertyType {\n  return (\n    isBoolean(value) ||\n    isString(value) ||\n    isNumber(value) ||\n    !isDefined(value) ||\n    (isArray(value) && value.every(isPropertyType)) ||\n    (isObject(value) && Object.values(value).every(isPropertyType))\n  );\n}\n\nexport function filterValues(value: unknown): WalkerOS.Property | undefined {\n  if (isBoolean(value) || isString(value) || isNumber(value)) return value;\n\n  if (isArguments(value)) return filterValues(Array.from(value));\n\n  if (isArray(value)) {\n    return value\n      .map((item) => filterValues(item))\n      .filter((item): item is WalkerOS.PropertyType => item !== undefined);\n  }\n\n  if (isObject(value)) {\n    return Object.entries(value).reduce<Record<string, WalkerOS.Property>>(\n      (acc, [key, val]) => {\n        const filteredValue = filterValues(val);\n        if (filteredValue !== undefined) acc[key] = filteredValue;\n        return acc;\n      },\n      {},\n    );\n  }\n\n  return;\n}\n\nexport function castToProperty(value: unknown): WalkerOS.Property | undefined {\n  return isPropertyType(value) ? value : undefined;\n}\n","// Use function overload to support different return type depending on onError\n// Types\nexport function tryCatch<P extends unknown[], R, S>(\n  fn: (...args: P) => R | undefined,\n  onError: (err: unknown) => S,\n  onFinally?: () => void,\n): (...args: P) => R | S;\nexport function tryCatch<P extends unknown[], R>(\n  fn: (...args: P) => R | undefined,\n  onError?: undefined,\n  onFinally?: () => void,\n): (...args: P) => R | undefined;\n// Implementation\nexport function tryCatch<P extends unknown[], R, S>(\n  fn: (...args: P) => R | undefined,\n  onError?: (err: unknown) => S,\n  onFinally?: () => void,\n): (...args: P) => R | S | undefined {\n  return function (...args: P): R | S | undefined {\n    try {\n      return fn(...args);\n    } catch (err) {\n      if (!onError) return;\n      return onError(err);\n    } finally {\n      onFinally?.();\n    }\n  };\n}\n\n// Use function overload to support different return type depending on onError\n// Types\nexport function tryCatchAsync<P extends unknown[], R, S>(\n  fn: (...args: P) => R,\n  onError: (err: unknown) => S,\n  onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | S>;\nexport function tryCatchAsync<P extends unknown[], R>(\n  fn: (...args: P) => R,\n  onError?: undefined,\n  onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | undefined>;\n// Implementation\nexport function tryCatchAsync<P extends unknown[], R, S>(\n  fn: (...args: P) => R,\n  onError?: (err: unknown) => S,\n  onFinally?: () => void | Promise<void>,\n): (...args: P) => Promise<R | S | undefined> {\n  return async function (...args: P): Promise<R | S | undefined> {\n    try {\n      return await fn(...args);\n    } catch (err) {\n      if (!onError) return;\n      return await onError(err);\n    } finally {\n      await onFinally?.();\n    }\n  };\n}\n","import type { Mapping, WalkerOS } from '@elbwalker/types';\nimport { getGrantedConsent } from './consent';\nimport { getByPath } from './byPath';\nimport { isArray, isDefined, isString, isObject } from './is';\nimport { castToProperty } from './property';\nimport { tryCatchAsync } from './tryCatch';\n\nexport async function getMappingEvent(\n  event: WalkerOS.PartialEvent,\n  mapping?: Mapping.Config<unknown>,\n): Promise<Mapping.EventMapping> {\n  const [entity, action] = (event.event || '').split(' ');\n  if (!mapping || !entity || !action) return {};\n\n  let eventMapping: Mapping.EventConfig | undefined;\n  let mappingKey = '';\n  let entityKey = entity;\n  let actionKey = action;\n\n  const resolveEventMapping = (\n    eventMapping?:\n      | Mapping.EventConfig<unknown>\n      | Mapping.EventConfig<unknown>[],\n  ) => {\n    if (!eventMapping) return;\n    eventMapping = isArray(eventMapping) ? eventMapping : [eventMapping];\n\n    return eventMapping.find(\n      (eventMapping) =>\n        !eventMapping.condition || eventMapping.condition(event),\n    );\n  };\n\n  if (!mapping[entityKey]) entityKey = '*';\n  const entityMapping = mapping[entityKey];\n\n  if (entityMapping) {\n    if (!entityMapping[actionKey]) actionKey = '*';\n    eventMapping = resolveEventMapping(entityMapping[actionKey]);\n  }\n\n  // Fallback to * *\n  if (!eventMapping) {\n    entityKey = '*';\n    actionKey = '*';\n    eventMapping = resolveEventMapping(mapping[entityKey]?.[actionKey]);\n  }\n\n  if (eventMapping) mappingKey = `${entityKey} ${actionKey}`;\n\n  return { eventMapping, mappingKey };\n}\n\nexport async function getMappingValue(\n  value: WalkerOS.DeepPartialEvent | unknown | undefined,\n  data: Mapping.Data = {},\n  options: Mapping.Options = {},\n): Promise<WalkerOS.Property | undefined> {\n  if (!isDefined(value)) return;\n\n  // Get consent state in priority order: value.consent > options.consent > instance?.consent\n  const consentState =\n    ((isObject(value) && value.consent) as WalkerOS.Consent) ||\n    options.consent ||\n    options.instance?.consent;\n\n  const mappings = isArray(data) ? data : [data];\n\n  for (const mapping of mappings) {\n    const result = await tryCatchAsync(processMappingValue)(value, mapping, {\n      ...options,\n      consent: consentState,\n    });\n    if (isDefined(result)) return result;\n  }\n}\n\nasync function processMappingValue(\n  value: WalkerOS.DeepPartialEvent | unknown,\n  mapping: Mapping.Value,\n  options: Mapping.Options = {},\n): Promise<WalkerOS.Property | undefined> {\n  const { instance, consent: consentState } = options;\n\n  // Ensure mapping is an array for uniform processing\n  const mappings = isArray(mapping) ? mapping : [mapping];\n\n  // Loop over each mapping and return the first valid result\n  return mappings.reduce(async (accPromise, mappingItem) => {\n    const acc = await accPromise;\n    if (acc) return acc; // A valid result was already found\n\n    const mapping = isString(mappingItem) ? { key: mappingItem } : mappingItem;\n\n    if (!Object.keys(mapping).length) return;\n\n    const {\n      condition,\n      consent,\n      fn,\n      key,\n      loop,\n      map,\n      set,\n      validate,\n      value: staticValue,\n    } = mapping;\n\n    // Check if this mapping should be used\n    if (\n      condition &&\n      !(await tryCatchAsync(condition)(value, mappingItem, instance))\n    )\n      return;\n\n    // Check if consent is required and granted\n    if (consent && !getGrantedConsent(consent, consentState))\n      return staticValue;\n\n    let mappingValue: unknown = isDefined(staticValue) ? staticValue : value;\n\n    if (fn) {\n      // Use a custom function to get the value\n      mappingValue = await tryCatchAsync(fn)(value, mappingItem, options);\n    }\n\n    if (key) {\n      // Get dynamic value from the event\n      mappingValue = getByPath(value, key, staticValue);\n    }\n\n    if (loop) {\n      const [scope, itemMapping] = loop;\n\n      const data =\n        scope === 'this'\n          ? [value]\n          : await getMappingValue(value, scope, options);\n\n      if (isArray(data)) {\n        mappingValue = (\n          await Promise.all(\n            data.map((item) => getMappingValue(item, itemMapping, options)),\n          )\n        ).filter(isDefined);\n      }\n    } else if (map) {\n      mappingValue = await Object.entries(map).reduce(\n        async (mappedObjPromise, [mapKey, mapValue]) => {\n          const mappedObj = await mappedObjPromise;\n          const result = await getMappingValue(value, mapValue, options);\n          if (isDefined(result)) mappedObj[mapKey] = result;\n          return mappedObj;\n        },\n        Promise.resolve({} as WalkerOS.AnyObject),\n      );\n    } else if (set) {\n      mappingValue = await Promise.all(\n        set.map((item) => processMappingValue(value, item, options)),\n      );\n    }\n\n    // Validate the value\n    if (validate && !(await tryCatchAsync(validate)(mappingValue)))\n      mappingValue = undefined;\n\n    const property = castToProperty(mappingValue);\n\n    // Finally, check and convert the type\n    return isDefined(property) ? property : castToProperty(staticValue); // Always use value as a fallback\n  }, Promise.resolve(undefined as WalkerOS.Property | undefined));\n}\n","import type { Hooks } from '@elbwalker/types';\n\nexport function useHooks<P extends unknown[], R>(\n  fn: (...args: P) => R,\n  name: string,\n  hooks: Hooks.Functions,\n): (...args: P) => R {\n  return function (...args: P): R {\n    let result: R;\n    const preHook = ('pre' + name) as keyof Hooks.Functions;\n    const postHook = ('post' + name) as keyof Hooks.Functions;\n    const preHookFn = hooks[preHook] as unknown as Hooks.HookFn<typeof fn>;\n    const postHookFn = hooks[postHook] as unknown as Hooks.HookFn<typeof fn>;\n\n    if (preHookFn) {\n      // Call the original function within the preHook\n      result = preHookFn({ fn }, ...args);\n    } else {\n      // Regular function call\n      result = fn(...args);\n    }\n\n    if (postHookFn) {\n      // Call the post-hook function with fn, result, and the original args\n      result = postHookFn({ fn, result }, ...args);\n    }\n\n    return result;\n  };\n}\n","export function debounce<P extends unknown[], R>(\n  fn: (...args: P) => R,\n  wait = 1000,\n  immediate = false,\n) {\n  let timer: number | NodeJS.Timeout | null = null;\n  let result: R;\n  let hasCalledImmediately = false;\n\n  return (...args: P): Promise<R> => {\n    // Return value as promise\n    return new Promise((resolve) => {\n      const callNow = immediate && !hasCalledImmediately;\n\n      // abort previous invocation\n      if (timer) clearTimeout(timer);\n\n      timer = setTimeout(() => {\n        timer = null;\n        if (!immediate || hasCalledImmediately) {\n          result = fn(...args);\n          resolve(result);\n        }\n      }, wait);\n\n      if (callNow) {\n        hasCalledImmediately = true;\n        result = fn(...args);\n        resolve(result);\n      }\n    });\n  };\n}\n\ntype Timeout = ReturnType<typeof setTimeout>;\nexport function throttle<P extends unknown[], R>(\n  fn: (...args: P) => R | undefined,\n  delay = 1000,\n): (...args: P) => R | undefined {\n  let isBlocked: Timeout | null = null;\n\n  return function (...args: P): R | undefined {\n    // Skip since function is still blocked by previous call\n    if (isBlocked !== null) return;\n\n    // Set a blocking timeout\n    isBlocked = setTimeout(() => {\n      // Unblock function\n      isBlocked = null;\n    }, delay) as Timeout;\n\n    // Call the function\n    return fn(...args);\n  };\n}\n","import type { WalkerOS } from '@elbwalker/types';\nimport type { Destination } from '@elbwalker/types';\nimport type { Elb } from '@elbwalker/types';\nimport { Commands, Const } from './constants';\nimport { addDestination } from './destination';\nimport { assign } from './assign';\nimport { isObject, isSameType } from './is';\nimport { setConsent } from './consent';\n\nexport async function commonHandleCommand(\n  instance: WalkerOS.Instance,\n  action: string,\n  data?: unknown,\n  options?: unknown,\n): Promise<Elb.PushResult | undefined> {\n  let result: Elb.PushResult | undefined;\n\n  switch (action) {\n    case Const.Commands.Consent:\n      if (isObject(data)) {\n        result = await setConsent(instance, data as WalkerOS.Consent);\n      }\n      break;\n\n    case Const.Commands.Custom:\n      if (isObject(data)) {\n        instance.custom = assign(instance.custom, data as WalkerOS.Properties);\n      }\n      break;\n\n    case Const.Commands.Destination:\n      if (isObject(data) && typeof data.push === 'function') {\n        result = await addDestination(\n          instance,\n          data as Destination.DestinationInit,\n          options as Destination.Config,\n        );\n      }\n      break;\n\n    case Const.Commands.Globals:\n      if (isObject(data)) {\n        instance.globals = assign(\n          instance.globals,\n          data as WalkerOS.Properties,\n        );\n      }\n      break;\n\n    case Const.Commands.User:\n      if (isObject(data)) {\n        assign(instance.user, data as WalkerOS.User, { shallow: false });\n      }\n      break;\n  }\n\n  return result;\n}\n\nexport function createEventOrCommand(\n  instance: WalkerOS.Instance,\n  nameOrEvent: unknown,\n  defaults: WalkerOS.PartialEvent = {},\n): { event?: WalkerOS.Event; command?: string } {\n  // Determine the partial event\n  const partialEvent: WalkerOS.PartialEvent = isSameType(\n    nameOrEvent,\n    '' as string,\n  )\n    ? { event: nameOrEvent, ...defaults }\n    : { ...defaults, ...(nameOrEvent || {}) };\n\n  if (!partialEvent.event) throw new Error('Event name is required');\n\n  // Check for valid entity and action event format\n  const [entityValue, actionValue] = partialEvent.event.split(' ');\n  if (!entityValue || !actionValue) throw new Error('Event name is invalid');\n\n  // It's a walker command\n  if (entityValue === Commands.Walker) return { command: actionValue };\n\n  // Regular event\n  ++instance.count;\n\n  // Values that are eventually used by other properties\n  const {\n    timestamp = Date.now(),\n    group = instance.group,\n    count = instance.count,\n  } = partialEvent;\n\n  // Extract properties with default fallbacks\n  const {\n    event = `${entityValue} ${actionValue}`,\n    data = {},\n    context = {},\n    globals = instance.globals,\n    custom = {},\n    user = instance.user,\n    nested = [],\n    consent = instance.consent,\n    id = `${timestamp}-${group}-${count}`,\n    trigger = '',\n    entity = entityValue,\n    action = actionValue,\n    timing = 0,\n    version = {\n      source: instance.version,\n      tagging: instance.config.tagging || 0,\n    },\n    source = { type: '', id: '', previous_id: '' },\n  } = partialEvent;\n\n  const fullEvent: WalkerOS.Event = {\n    event,\n    data,\n    context,\n    globals,\n    custom,\n    user,\n    nested,\n    consent,\n    id,\n    trigger,\n    entity,\n    action,\n    timestamp,\n    timing,\n    group,\n    count,\n    version,\n    source,\n  };\n\n  return { event: fullEvent };\n}\n","import type {\n  Destination as WalkerOSDestination,\n  Mapping,\n  WalkerOS,\n  Elb,\n} from '@elbwalker/types';\nimport { getId } from './getId';\nimport { setByPath } from './byPath';\nimport { getMappingEvent, getMappingValue } from './mapping';\nimport { getGrantedConsent } from './consent';\nimport { tryCatchAsync } from './tryCatch';\nimport { assign } from './assign';\nimport { useHooks } from './useHooks';\nimport { isDefined, isObject } from './is';\nimport { debounce } from './invocations';\nimport { clone } from './clone';\nimport { createEventOrCommand } from './handle';\n\nexport type HandleCommandFn<T extends WalkerOS.Instance> = (\n  instance: T,\n  action: string,\n  data?: Elb.PushData,\n  options?: Elb.PushOptions,\n) => Promise<Elb.PushResult>;\n\nexport function createPush<T extends WalkerOS.Instance, F extends Elb.Fn>(\n  instance: T,\n  handleCommand: HandleCommandFn<T>,\n  prepareEvent: Elb.Fn<WalkerOS.PartialEvent>,\n): F {\n  return useHooks(\n    async (...args) => {\n      return await tryCatchAsync(\n        async (...args: Parameters<Elb.Arguments>): Promise<Elb.PushResult> => {\n          const [nameOrEvent, pushData, options] = args;\n          const partialEvent = prepareEvent(...args);\n\n          const { event, command } = createEventOrCommand(\n            instance,\n            nameOrEvent,\n            partialEvent,\n          );\n\n          const result = command\n            ? await handleCommand(instance, command, pushData, options)\n            : await pushToDestinations(instance, event);\n\n          return result;\n        },\n        (error) => {\n          // Call custom error handling\n          if (instance.config.onError) instance.config.onError(error, instance);\n\n          return createPushResult({ ok: false });\n        },\n      )(...args);\n    },\n    'Push',\n    instance.hooks,\n  ) as unknown as F;\n}\n\nexport async function addDestination(\n  instance: WalkerOS.Instance,\n  data: WalkerOSDestination.DestinationInit,\n  options?: WalkerOSDestination.Config,\n) {\n  // Prefer explicit given config over default config\n  const config = options || data.config || { init: false };\n  // @TODO might not be the best solution to use options || data.config\n\n  const destination: WalkerOSDestination.Destination = {\n    ...data,\n    config,\n  };\n\n  let id = config.id; // Use given id\n  if (!id) {\n    // Generate a new id if none was given\n    do {\n      id = getId(4);\n    } while (instance.destinations[id]);\n  }\n\n  // Add the destination\n  instance.destinations[id] = destination;\n\n  // Process previous events if not disabled\n  if (config.queue !== false) destination.queue = [...instance.queue];\n\n  return pushToDestinations(instance, undefined, { [id]: destination });\n}\n\nexport async function pushToDestinations(\n  instance: WalkerOS.Instance,\n  event?: WalkerOS.Event,\n  destinations?: WalkerOS.Destinations,\n): Promise<Elb.PushResult> {\n  const { allowed, consent, globals, user } = instance;\n\n  // Check if instance is allowed to push\n  if (!allowed) return createPushResult({ ok: false });\n\n  // Add event to the instance queue\n  if (event) instance.queue.push(event);\n\n  // Use given destinations or use internal destinations\n  if (!destinations) destinations = instance.destinations;\n\n  const results = await Promise.all(\n    // Process all destinations in parallel\n    Object.entries(destinations).map(async ([id, destination]) => {\n      // Create a queue of events to be processed\n      let currentQueue = (destination.queue || []).map((event) => ({\n        ...event,\n        consent,\n      }));\n\n      // Reset original queue while processing to enable async processing\n      destination.queue = [];\n\n      // Add event to queue stack\n      if (event) {\n        // Clone the event to avoid mutating the original event\n        let currentEvent = clone(event);\n\n        // Policy check\n        await Promise.all(\n          Object.entries(destination.config.policy || []).map(\n            async ([key, mapping]) => {\n              const value = await getMappingValue(event, mapping, { instance });\n              currentEvent = setByPath(currentEvent, key, value);\n            },\n          ),\n        );\n\n        // Add event to queue stack\n        currentQueue.push(currentEvent);\n      }\n\n      // Nothing to do here if the queue is empty\n      if (!currentQueue.length) return { id, destination, skipped: true };\n\n      const allowedEvents: WalkerOS.Events = [];\n      const skippedEvents = currentQueue.filter((queuedEvent) => {\n        const grantedConsent = getGrantedConsent(\n          destination.config.consent, // Required\n          consent, // Current instance state\n          queuedEvent.consent, // Individual event state\n        );\n\n        if (grantedConsent) {\n          queuedEvent.consent = grantedConsent; // Save granted consent states only\n\n          allowedEvents.push(queuedEvent); // Add to allowed queue\n          return false; // Remove from destination queue\n        }\n\n        return true; // Keep denied events in the queue\n      });\n\n      // Add skipped events back to the queue\n      destination.queue.concat(skippedEvents);\n\n      // Execution shall not pass if no events are allowed\n      if (!allowedEvents.length) {\n        return { id, destination, queue: currentQueue }; // Don't push if not allowed\n      }\n\n      // Initialize the destination if needed\n      const isInitialized = await tryCatchAsync(destinationInit)(\n        instance,\n        destination,\n      );\n\n      if (!isInitialized) return { id, destination, queue: currentQueue };\n\n      // Process the destinations event queue\n      let error = false;\n      if (!destination.dlq) destination.dlq = [];\n\n      // Process allowed events and store failed ones in the dead letter queue (DLQ)\n      await Promise.all(\n        allowedEvents.map(async (event) => {\n          // Merge event with instance state, prioritizing event properties\n          event.globals = assign(globals, event.globals);\n          event.user = assign(user, event.user);\n\n          await tryCatchAsync(destinationPush, (err) => {\n            // Call custom error handling if available\n            if (instance.config.onError) instance.config.onError(err, instance);\n            error = true; // oh no\n\n            // Add failed event to destinations DLQ\n            destination.dlq!.push([event, err]);\n\n            return false;\n          })(instance, destination, event);\n\n          return event;\n        }),\n      );\n\n      return { id, destination, error };\n    }),\n  );\n\n  const successful = [];\n  const queued = [];\n  const failed = [];\n\n  for (const result of results) {\n    if (result.skipped) continue;\n\n    const destination = result.destination;\n\n    const ref = { id: result.id, destination };\n\n    if (result.error) {\n      failed.push(ref);\n    } else if (result.queue && result.queue.length) {\n      // Merge queue with existing queue\n      destination.queue = (destination.queue || []).concat(result.queue);\n      queued.push(ref);\n    } else {\n      successful.push(ref);\n    }\n  }\n\n  return createPushResult({\n    ok: !failed.length,\n    event,\n    successful,\n    queued,\n    failed,\n  });\n}\n\nexport async function destinationInit<\n  Destination extends WalkerOSDestination.Destination,\n>(instance: WalkerOS.Instance, destination: Destination): Promise<boolean> {\n  // Check if the destination was initialized properly or try to do so\n  if (destination.init && !destination.config.init) {\n    const configResult = await useHooks(\n      destination.init,\n      'DestinationInit',\n      instance.hooks,\n    )(destination.config, instance);\n\n    // Actively check for errors (when false)\n    if (configResult === false) return configResult; // don't push if init is false\n\n    // Update the destination config if it was returned\n    destination.config = {\n      ...(configResult || destination.config),\n      init: true, // Remember that the destination was initialized\n    };\n  }\n\n  return true; // Destination is ready to push\n}\n\nexport async function destinationPush<\n  Destination extends WalkerOSDestination.Destination,\n>(\n  instance: WalkerOS.Instance,\n  destination: Destination,\n  event: WalkerOS.Event,\n): Promise<boolean> {\n  const { config } = destination;\n  const { eventMapping, mappingKey } = await getMappingEvent(\n    event,\n    config.mapping,\n  );\n\n  let data =\n    config.data && (await getMappingValue(event, config.data, { instance }));\n\n  if (eventMapping) {\n    // Check if event should be processed or ignored\n    if (eventMapping.ignore) return false;\n\n    // Check to use specific event names\n    if (eventMapping.name) event.event = eventMapping.name;\n\n    // Transform event to a custom data\n    if (eventMapping.data) {\n      const dataEvent =\n        eventMapping.data &&\n        (await getMappingValue(event, eventMapping.data, { instance }));\n      data =\n        isObject(data) && isObject(dataEvent) // Only merge objects\n          ? assign(data, dataEvent)\n          : dataEvent;\n    }\n  }\n\n  const options = { data, instance };\n\n  if (eventMapping?.batch && destination.pushBatch) {\n    const batched = eventMapping.batched || {\n      key: mappingKey || '',\n      events: [],\n      data: [],\n    };\n    batched.events.push(event);\n    if (isDefined(data)) batched.data.push(data);\n\n    eventMapping.batchFn =\n      eventMapping.batchFn ||\n      debounce((destination, instance) => {\n        useHooks(\n          destination.pushBatch!,\n          'DestinationPushBatch',\n          instance.hooks,\n        )(batched, config, options);\n\n        // Reset the batched queues\n        batched.events = [];\n        batched.data = [];\n      }, eventMapping.batch);\n\n    eventMapping.batched = batched;\n    eventMapping.batchFn(destination, instance);\n  } else {\n    // It's time to go to the destination's side now\n    await useHooks(destination.push, 'DestinationPush', instance.hooks)(\n      event,\n      config,\n      eventMapping,\n      options,\n    );\n  }\n\n  return true;\n}\n\nexport function createPushResult(\n  partialResult?: Partial<Elb.PushResult>,\n): Elb.PushResult {\n  return assign(\n    {\n      ok: !partialResult?.failed?.length,\n      successful: [],\n      queued: [],\n      failed: [],\n    },\n    partialResult,\n  );\n}\n","import type { On, WalkerOS } from '@elbwalker/types';\nimport { isArray } from './is';\nimport { Const } from './constants';\nimport { tryCatch } from './tryCatch';\n\nexport function on(\n  instance: WalkerOS.Instance,\n  type: On.Types,\n  option: WalkerOS.SingleOrArray<On.Options>,\n) {\n  const on = instance.on;\n  const onType: Array<On.Options> = on[type] || [];\n  const options = isArray(option) ? option : [option];\n\n  options.forEach((option) => {\n    onType.push(option);\n  });\n\n  // Update instance on state\n  (on[type] as typeof onType) = onType;\n\n  // Execute the on function directly\n  onApply(instance, type, options);\n}\n\nexport function onApply(\n  instance: WalkerOS.Instance,\n  type: On.Types,\n  options?: Array<On.Options>,\n  config?: WalkerOS.Consent,\n) {\n  // Use the optionally provided options\n  let onConfig = options || [];\n\n  if (!options) {\n    // Get the instance on events\n    onConfig = instance.on[type] || [];\n\n    // Add all available on events from the destinations\n    Object.values(instance.destinations).forEach((destination) => {\n      const onTypeConfig = destination.config.on?.[type];\n      if (onTypeConfig) onConfig = onConfig.concat(onTypeConfig);\n    });\n  }\n\n  if (!onConfig.length) return; // No on-events registered, nothing to do\n\n  switch (type) {\n    case Const.Commands.Consent:\n      onConsent(instance, onConfig as Array<On.ConsentConfig>, config);\n      break;\n    case Const.Commands.Ready:\n      onReady(instance, onConfig as Array<On.ReadyConfig>);\n      break;\n    case Const.Commands.Run:\n      onRun(instance, onConfig as Array<On.RunConfig>);\n      break;\n    case Const.Commands.Session:\n      onSession(instance, onConfig as Array<On.SessionConfig>);\n      break;\n    default:\n      break;\n  }\n}\n\nfunction onConsent(\n  instance: WalkerOS.Instance,\n  onConfig: Array<On.ConsentConfig>,\n  currentConsent?: WalkerOS.Consent,\n): void {\n  const consentState = currentConsent || instance.consent;\n\n  onConfig.forEach((consentConfig) => {\n    // Collect functions whose consent keys match the rule keys directly\n    // Directly execute functions whose consent keys match the rule keys\n    Object.keys(consentState) // consent keys\n      .filter((consent) => consent in consentConfig) // check for matching rule keys\n      .forEach((consent) => {\n        // Execute the function\n        tryCatch(consentConfig[consent])(instance, consentState);\n      });\n  });\n}\n\nfunction onReady(\n  instance: WalkerOS.Instance,\n  onConfig: Array<On.ReadyConfig>,\n): void {\n  if (instance.allowed)\n    onConfig.forEach((func) => {\n      tryCatch(func)(instance);\n    });\n}\n\nfunction onRun(\n  instance: WalkerOS.Instance,\n  onConfig: Array<On.RunConfig>,\n): void {\n  if (instance.allowed)\n    onConfig.forEach((func) => {\n      tryCatch(func)(instance);\n    });\n}\n\nfunction onSession(\n  instance: WalkerOS.Instance,\n  onConfig: Array<On.SessionConfig>,\n): void {\n  if (!instance.config.session) return; // Session handling is disabled\n\n  onConfig.forEach((func) => {\n    tryCatch(func)(instance, instance.session);\n  });\n}\n","import type { WalkerOS, Elb } from '@elbwalker/types';\nimport { assign } from './assign';\nimport { pushToDestinations, createPushResult } from './destination';\nimport { onApply } from './on';\n\nexport function getGrantedConsent(\n  required: WalkerOS.Consent | undefined,\n  state: WalkerOS.Consent = {},\n  individual: WalkerOS.Consent = {},\n): false | WalkerOS.Consent {\n  // Merge state and individual, prioritizing individual states\n  const states: WalkerOS.Consent = { ...state, ...individual };\n\n  const grantedStates: WalkerOS.Consent = {};\n  let hasRequiredConsent = required === undefined;\n\n  Object.keys(states).forEach((name) => {\n    if (states[name]) {\n      // consent granted\n      grantedStates[name] = true;\n\n      // Check if it's required and granted consent\n      if (required && required[name]) hasRequiredConsent = true;\n    }\n  });\n\n  return hasRequiredConsent ? grantedStates : false;\n}\n\nexport async function setConsent(\n  instance: WalkerOS.Instance,\n  data: WalkerOS.Consent,\n): Promise<Elb.PushResult> {\n  const { consent } = instance;\n\n  let runQueue = false;\n  const update: WalkerOS.Consent = {};\n  Object.entries(data).forEach(([name, granted]) => {\n    const state = !!granted;\n\n    update[name] = state;\n\n    // Only run queue if state was set to true\n    runQueue = runQueue || state;\n  });\n\n  // Update consent state\n  instance.consent = assign(consent, update);\n\n  // Run on consent events\n  onApply(instance, 'consent', undefined, update);\n\n  // Process previous events if not disabled\n  return runQueue\n    ? pushToDestinations(instance)\n    : createPushResult({ ok: true });\n}\n","import type { WalkerOS } from '@elbwalker/types';\nimport { assign } from './assign';\n\nexport function createEvent(\n  props: WalkerOS.DeepPartialEvent = {},\n): WalkerOS.Event {\n  const timestamp = props.timestamp || new Date().setHours(0, 13, 37, 0);\n  const group = props.group || 'gr0up';\n  const count = props.count || 1;\n  const id = `${timestamp}-${group}-${count}`;\n\n  const defaultEvent: WalkerOS.Event = {\n    event: 'entity action',\n    data: {\n      string: 'foo',\n      number: 1,\n      boolean: true,\n      array: [0, 'text', false],\n      not: undefined,\n    },\n    context: { dev: ['test', 1] },\n    globals: { lang: 'elb' },\n    custom: { completely: 'random' },\n    user: { id: 'us3r', device: 'c00k13', session: 's3ss10n' },\n    nested: [\n      {\n        type: 'child',\n        data: { is: 'subordinated' },\n        nested: [],\n        context: { element: ['child', 0] },\n      },\n    ],\n    consent: { functional: true },\n    id,\n    trigger: 'test',\n    entity: 'entity',\n    action: 'action',\n    timestamp,\n    timing: 3.14,\n    group,\n    count,\n    version: {\n      source: '0.0.7',\n      tagging: 1,\n    },\n    source: {\n      type: 'web',\n      id: 'https://localhost:80',\n      previous_id: 'http://remotehost:9001',\n    },\n  };\n\n  // Note: Always prefer the props over the defaults\n\n  // Merge properties\n  const event = assign(defaultEvent, props, { merge: false });\n\n  // Update conditions\n\n  // Entity and action from event\n  if (props.event) {\n    const [entity, action] = props.event.split(' ') ?? [];\n\n    if (entity && action) {\n      event.entity = entity;\n      event.action = action;\n    }\n  }\n\n  return event;\n}\n\nexport function getEvent(\n  name: string = 'entity action',\n  props: WalkerOS.DeepPartialEvent = {},\n): WalkerOS.Event {\n  const timestamp = props.timestamp || new Date().setHours(0, 13, 37, 0);\n\n  const quantity = 2;\n  const product1 = {\n    data: {\n      id: 'ers',\n      name: 'Everyday Ruck Snack',\n      color: 'black',\n      size: 'l',\n      price: 420,\n    },\n  };\n  const product2 = {\n    data: {\n      id: 'cc',\n      name: 'Cool Cap',\n      size: 'one size',\n      price: 42,\n    },\n  };\n\n  const defaultEvents: Record<string, WalkerOS.PartialEvent> = {\n    'cart view': {\n      data: {\n        currency: 'EUR',\n        value: product1.data.price * quantity,\n      },\n      context: { shopping: ['cart', 0] },\n      globals: { pagegroup: 'shop' },\n      nested: [\n        {\n          type: 'product',\n          data: { ...product1.data, quantity },\n          context: { shopping: ['cart', 0] },\n          nested: [],\n        },\n      ],\n      trigger: 'load',\n    },\n    'checkout view': {\n      data: {\n        step: 'payment',\n        currency: 'EUR',\n        value: product1.data.price + product2.data.price,\n      },\n      context: { shopping: ['checkout', 0] },\n      globals: { pagegroup: 'shop' },\n      nested: [\n        {\n          type: 'product',\n          ...product1,\n          context: { shopping: ['checkout', 0] },\n          nested: [],\n        },\n        {\n          type: 'product',\n          ...product2,\n          context: { shopping: ['checkout', 0] },\n          nested: [],\n        },\n      ],\n      trigger: 'load',\n    },\n    'order complete': {\n      data: {\n        id: '0rd3r1d',\n        currency: 'EUR',\n        shipping: 5.22,\n        taxes: 73.76,\n        total: 555,\n      },\n      context: { shopping: ['complete', 0] },\n      globals: { pagegroup: 'shop' },\n      nested: [\n        {\n          type: 'product',\n          ...product1,\n          context: { shopping: ['complete', 0] },\n          nested: [],\n        },\n        {\n          type: 'product',\n          ...product2,\n          context: { shopping: ['complete', 0] },\n          nested: [],\n        },\n        {\n          type: 'gift',\n          data: {\n            name: 'Surprise',\n          },\n          context: { shopping: ['complete', 0] },\n          nested: [],\n        },\n      ],\n      trigger: 'load',\n    },\n    'page view': {\n      data: {\n        domain: 'www.example.com',\n        title: 'walkerOS documentation',\n        referrer: 'https://www.elbwalker.com/',\n        search: '?foo=bar',\n        hash: '#hash',\n        id: '/docs/',\n      },\n      globals: { pagegroup: 'docs' },\n      trigger: 'load',\n    },\n    'product add': {\n      ...product1,\n      context: { shopping: ['intent', 0] },\n      globals: { pagegroup: 'shop' },\n      nested: [],\n      trigger: 'click',\n    },\n    'product view': {\n      ...product1,\n      context: { shopping: ['detail', 0] },\n      globals: { pagegroup: 'shop' },\n      nested: [],\n      trigger: 'load',\n    },\n    'product visible': {\n      data: { ...product1.data, position: 3, promo: true },\n      context: { shopping: ['discover', 0] },\n      globals: { pagegroup: 'shop' },\n      nested: [],\n      trigger: 'load',\n    },\n    'promotion visible': {\n      data: {\n        name: 'Setting up tracking easily',\n        position: 'hero',\n      },\n      context: { ab_test: ['engagement', 0] },\n      globals: { pagegroup: 'homepage' },\n      trigger: 'visible',\n    },\n    'session start': {\n      data: {\n        id: 's3ss10n',\n        start: timestamp,\n        isNew: true,\n        count: 1,\n        runs: 1,\n        isStart: true,\n        storage: true,\n        referrer: '',\n        device: 'c00k13',\n      },\n      user: {\n        id: 'us3r',\n        device: 'c00k13',\n        session: 's3ss10n',\n        hash: 'h4sh',\n        address: 'street number',\n        email: 'user@example.com',\n        phone: '+49 123 456 789',\n        userAgent: 'Mozilla...',\n        browser: 'Chrome',\n        browserVersion: '90',\n        deviceType: 'desktop',\n        language: 'de-DE',\n        country: 'DE',\n        region: 'HH',\n        city: 'Hamburg',\n        zip: '20354',\n        timezone: 'Berlin',\n        os: 'walkerOS',\n        osVersion: '1.0',\n        screenSize: '1337x420',\n        ip: '127.0.0.0',\n        internal: true,\n        custom: 'value',\n      },\n    },\n  };\n\n  return createEvent({ ...defaultEvents[name], ...props, event: name });\n}\n","import type { WalkerOS } from '@elbwalker/types';\nimport { assign } from './assign';\n\nexport interface MarketingParameters {\n  [key: string]: string;\n}\n\nexport function getMarketingParameters(\n  url: URL,\n  custom: MarketingParameters = {},\n): WalkerOS.Properties {\n  const clickId = 'clickId';\n  const data: WalkerOS.Properties = {};\n  const parameters: MarketingParameters = {\n    utm_campaign: 'campaign',\n    utm_content: 'content',\n    utm_medium: 'medium',\n    utm_source: 'source',\n    utm_term: 'term',\n    dclid: clickId,\n    fbclid: clickId,\n    gclid: clickId,\n    msclkid: clickId,\n    ttclid: clickId,\n    twclid: clickId,\n    igshid: clickId,\n    sclid: clickId,\n  };\n\n  Object.entries(assign(parameters, custom)).forEach(([key, name]) => {\n    const param = url.searchParams.get(key); // Search for the parameter in the URL\n    if (param) {\n      if (name === clickId) {\n        name = key;\n        data[clickId] = key; // Reference the clickId parameter\n      }\n\n      data[name] = param;\n    }\n  });\n\n  return data;\n}\n","export function onLog(message: unknown, verbose = false): void {\n  // eslint-disable-next-line no-console\n  if (verbose) console.dir(message, { depth: 4 });\n}\n","import type { WalkerOS } from '@elbwalker/types';\nimport { tryCatch } from './tryCatch';\nimport { castValue } from './castValue';\nimport { isArray, isObject } from './is';\n\nexport function requestToData(\n  parameter: unknown,\n): WalkerOS.AnyObject | undefined {\n  const str = String(parameter);\n  const queryString = str.split('?')[1] || str;\n\n  return tryCatch(() => {\n    const params = new URLSearchParams(queryString);\n    const result: WalkerOS.AnyObject = {};\n\n    params.forEach((value, key) => {\n      const keys = key.split(/[[\\]]+/).filter(Boolean);\n      let current: unknown = result;\n\n      keys.forEach((k, i) => {\n        const isLast = i === keys.length - 1;\n\n        if (isArray(current)) {\n          const index = parseInt(k, 10);\n          if (isLast) {\n            (current as Array<unknown>)[index] = castValue(value);\n          } else {\n            (current as Array<unknown>)[index] =\n              (current as Array<unknown>)[index] ||\n              (isNaN(parseInt(keys[i + 1], 10)) ? {} : []);\n            current = (current as Array<unknown>)[index];\n          }\n        } else if (isObject(current)) {\n          if (isLast) {\n            (current as WalkerOS.AnyObject)[k] = castValue(value);\n          } else {\n            (current as WalkerOS.AnyObject)[k] =\n              (current as WalkerOS.AnyObject)[k] ||\n              (isNaN(parseInt(keys[i + 1], 10)) ? {} : []);\n            current = (current as WalkerOS.AnyObject)[k];\n          }\n        }\n      });\n    });\n\n    return result;\n  })();\n}\n\nexport function requestToParameter(\n  data: WalkerOS.AnyObject | WalkerOS.PropertyType,\n): string {\n  if (!data) return '';\n\n  const params: string[] = [];\n  const encode = encodeURIComponent;\n\n  function addParam(key: string, value: unknown) {\n    if (value === undefined || value === null) return;\n\n    if (isArray(value)) {\n      value.forEach((item, index) => addParam(`${key}[${index}]`, item));\n    } else if (isObject(value)) {\n      Object.entries(value).forEach(([subKey, subValue]) =>\n        addParam(`${key}[${subKey}]`, subValue),\n      );\n    } else {\n      params.push(`${encode(key)}=${encode(String(value))}`);\n    }\n  }\n\n  if (typeof data === 'object') {\n    Object.entries(data).forEach(([key, value]) => addParam(key, value));\n  } else {\n    return encode(data);\n  }\n\n  return params.join('&');\n}\n","import type { WalkerOS } from '@elbwalker/types';\nimport { isSameType } from './is';\nimport { assign } from './assign';\n\nexport type SendDataValue = WalkerOS.Property | WalkerOS.Properties;\nexport type SendHeaders = { [key: string]: string };\n\nexport interface SendResponse {\n  ok: boolean;\n  data?: unknown;\n  error?: string;\n}\n\nexport function transformData(data?: SendDataValue): string | undefined {\n  if (data === undefined) return data;\n\n  return isSameType(data, '' as string) ? data : JSON.stringify(data);\n}\n\nexport function getHeaders(headers: SendHeaders = {}): SendHeaders {\n  return assign(\n    {\n      'Content-Type': 'application/json; charset=utf-8',\n    },\n    headers,\n  );\n}\n","export function throwError(error: unknown): never {\n  throw new Error(String(error));\n}\n","export function trim(str: string): string {\n  // Remove quotes and whitespaces\n  return str ? str.trim().replace(/^'|'$/g, '').trim() : '';\n}\n","import type { WalkerOS } from '@elbwalker/types';\n\nexport function parseUserAgent(userAgent?: string): WalkerOS.User {\n  if (!userAgent) return {};\n\n  return {\n    userAgent,\n    browser: getBrowser(userAgent),\n    browserVersion: getBrowserVersion(userAgent),\n    os: getOS(userAgent),\n    osVersion: getOSVersion(userAgent),\n    deviceType: getDeviceType(userAgent),\n  };\n}\n\nexport function getBrowser(userAgent: string): string | undefined {\n  const browsers = [\n    { name: 'Edge', substr: 'Edg' },\n    { name: 'Chrome', substr: 'Chrome' },\n    { name: 'Safari', substr: 'Safari', exclude: 'Chrome' },\n    { name: 'Firefox', substr: 'Firefox' },\n    { name: 'IE', substr: 'MSIE' },\n    { name: 'IE', substr: 'Trident' },\n  ];\n\n  for (const browser of browsers) {\n    if (\n      userAgent.includes(browser.substr) &&\n      (!browser.exclude || !userAgent.includes(browser.exclude))\n    ) {\n      return browser.name;\n    }\n  }\n}\n\nexport function getBrowserVersion(userAgent: string): string | undefined {\n  const rules = [\n    /Edg\\/([0-9]+)/, // Edge\n    /Chrome\\/([0-9]+)/, // Chrome\n    /Version\\/([0-9]+).*Safari/, // Safari\n    /Firefox\\/([0-9]+)/, // Firefox\n    /MSIE ([0-9]+)/, // IE 10 and older\n    /rv:([0-9]+).*Trident/, // IE 11\n  ];\n\n  for (const regex of rules) {\n    const match = userAgent.match(regex);\n    if (match) {\n      return match[1];\n    }\n  }\n}\n\nexport function getOS(userAgent: string): string | undefined {\n  const osList = [\n    { name: 'Windows', substr: 'Windows NT' },\n    { name: 'macOS', substr: 'Mac OS X' },\n    { name: 'Android', substr: 'Android' },\n    { name: 'iOS', substr: 'iPhone OS' },\n    { name: 'Linux', substr: 'Linux' },\n  ];\n\n  for (const os of osList) {\n    if (userAgent.includes(os.substr)) {\n      return os.name;\n    }\n  }\n}\n\nexport function getOSVersion(userAgent: string): string | undefined {\n  const osVersionRegex = /(?:Windows NT|Mac OS X|Android|iPhone OS) ([0-9._]+)/;\n  const match = userAgent.match(osVersionRegex);\n  return match ? match[1].replace(/_/g, '.') : undefined;\n}\n\nexport function getDeviceType(userAgent: string): string | undefined {\n  let deviceType = 'Desktop';\n\n  if (/Tablet|iPad/i.test(userAgent)) {\n    deviceType = 'Tablet';\n  } else if (\n    /Mobi|Android|iPhone|iPod|BlackBerry|Opera Mini|IEMobile|WPDesktop/i.test(\n      userAgent,\n    )\n  ) {\n    deviceType = 'Mobile';\n  }\n\n  return deviceType;\n}\n","import type { Schema, WalkerOS } from '@elbwalker/types';\nimport { isSameType } from './is';\nimport { throwError } from './throwError';\nimport { tryCatch } from './tryCatch';\n\nexport function validateEvent(\n  obj: unknown,\n  customContracts: Schema.Contracts = [],\n): WalkerOS.Event | never {\n  if (!isSameType(obj, {} as WalkerOS.AnyObject)) throwError('Invalid object');\n\n  let event: string;\n  let entity: string;\n  let action: string;\n\n  // Check if event.event is available and it's a string\n  if (isSameType(obj.event, '')) {\n    event = obj.event;\n    [entity, action] = event.split(' ');\n    if (!entity || !action) throwError('Invalid event name');\n  } else if (isSameType(obj.entity, '') && isSameType(obj.action, '')) {\n    entity = obj.entity;\n    action = obj.action;\n    event = `${entity} ${action}`;\n  } else {\n    throwError('Missing or invalid event, entity, or action');\n  }\n\n  const basicContract: Schema.Contract = {\n    '*': {\n      '*': {\n        event: { maxLength: 255 }, // @TODO as general rule?\n        user: { allowedKeys: ['id', 'device', 'session'] },\n        consent: { allowedValues: [true, false] },\n        timestamp: { min: 0 },\n        timing: { min: 0 },\n        count: { min: 0 },\n        version: { allowedKeys: ['source', 'tagging'] },\n        source: { allowedKeys: ['type', 'id', 'previous_id'] },\n      },\n    },\n  };\n\n  const basicEvent: WalkerOS.Event = {\n    event,\n    data: {},\n    context: {},\n    custom: {},\n    globals: {},\n    user: {},\n    nested: [],\n    consent: {},\n    id: '',\n    trigger: '',\n    entity,\n    action,\n    timestamp: 0,\n    timing: 0,\n    group: '',\n    count: 0,\n    version: { source: '', tagging: 0 },\n    source: { type: '', id: '', previous_id: '' },\n  };\n\n  // Collect all relevant schemas for the event\n  const schemas = [basicContract]\n    .concat(customContracts)\n    .reduce((acc, contract) => {\n      return ['*', entity].reduce((entityAcc, e) => {\n        return ['*', action].reduce((actionAcc, a) => {\n          const schema = contract[e]?.[a];\n          return schema ? actionAcc.concat([schema]) : actionAcc;\n        }, entityAcc);\n      }, acc);\n    }, [] as Schema.Properties[]);\n\n  const result = schemas.reduce(\n    (acc, schema) => {\n      // Get all required properties\n      const requiredKeys = Object.keys(schema).filter((key) => {\n        const property = schema[key];\n        return property?.required === true;\n      });\n\n      // Validate both, ingested and required properties but only once\n      return [...Object.keys(obj), ...requiredKeys].reduce((acc, key) => {\n        const propertySchema = schema[key];\n        let value = obj[key];\n\n        if (propertySchema) {\n          // Update the value\n          value = tryCatch(validateProperty, (err) => {\n            throwError(String(err));\n          })(acc, key, value, propertySchema);\n        }\n\n        // Same type check\n        if (isSameType(value, acc[key])) acc[key] = value;\n\n        return acc;\n      }, acc);\n    },\n    // Not that beautiful but it works, narrowing down the type is tricky here\n    // it's important that basicEvent is defined as an WalkerOS.Event\n    basicEvent as unknown as WalkerOS.AnyObject,\n  ) as unknown as WalkerOS.Event;\n\n  // @TODO Final check for result.event === event.entity + ' ' + event.action\n\n  return result;\n}\n\nexport function validateProperty(\n  obj: WalkerOS.AnyObject,\n  key: string,\n  value: unknown,\n  schema: Schema.Property,\n): WalkerOS.Property | never {\n  // @TODO unknown to WalkerOS.Property\n\n  // Note regarding potentially malicious values\n  // Initial collection doesn't manipulate data\n  // Prefer context-specific checks in the destinations\n\n  // Custom validate function can change the value\n  if (schema.validate)\n    value = tryCatch(schema.validate, (err) => {\n      throwError(String(err));\n    })(value, key, obj);\n\n  if (schema.required && value === undefined)\n    throwError('Missing required property');\n\n  // Strings\n  if (isSameType(value, '' as string)) {\n    if (schema.maxLength && value.length > schema.maxLength) {\n      if (schema.strict) throwError('Value exceeds maxLength');\n      value = value.substring(0, schema.maxLength);\n    }\n  }\n\n  // Numbers\n  else if (isSameType(value, 1 as number)) {\n    if (isSameType(schema.min, 1) && value < schema.min) {\n      if (schema.strict) throwError('Value below min');\n      value = schema.min;\n    } else if (isSameType(schema.max, 1) && value > schema.max) {\n      if (schema.strict) throwError('Value exceeds max');\n      value = schema.max;\n    }\n  }\n\n  // @TODO boolean\n\n  // Objects\n  else if (isSameType(value, {} as WalkerOS.AnyObject)) {\n    if (schema.schema) {\n      const nestedSchema = schema.schema;\n\n      // @TODO handle return to update value as non unknown\n      // @TODO bug with multiple rules in property schema\n      Object.keys(nestedSchema).reduce((acc, key) => {\n        const propertySchema = nestedSchema[key];\n        let value = acc[key];\n\n        if (propertySchema) {\n          // Type check\n          if (propertySchema.type && typeof value !== propertySchema.type)\n            throwError(`Type doesn't match (${key})`);\n\n          // Update the value\n          value = tryCatch(validateProperty, (err) => {\n            throwError(String(err));\n          })(acc, key, value, propertySchema);\n        }\n\n        return value as WalkerOS.AnyObject;\n      }, value);\n    }\n\n    for (const objKey of Object.keys(value)) {\n      // Check for allowed keys if applicable\n      if (schema.allowedKeys && !schema.allowedKeys.includes(objKey)) {\n        if (schema.strict) throwError('Key not allowed');\n\n        delete value[objKey];\n      }\n    }\n  }\n\n  return value as WalkerOS.Property;\n}\n"],"mappings":"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","names":["acc","eventMapping","mapping","args","event","destination","instance","on","option","acc","key","value"]}