@walkeros/core 0.4.1 → 0.4.2

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/types/collector.ts","../src/types/data.ts","../src/types/destination.ts","../src/types/elb.ts","../src/types/flow.ts","../src/types/handler.ts","../src/types/hooks.ts","../src/types/mapping.ts","../src/types/on.ts","../src/types/request.ts","../src/types/schema.ts","../src/types/source.ts","../src/types/walkeros.ts","../src/types/storage.ts","../src/anonymizeIP.ts","../src/assign.ts","../src/is.ts","../src/clone.ts","../src/byPath.ts","../src/castValue.ts","../src/consent.ts","../src/createDestination.ts","../src/eventGenerator.ts","../src/getId.ts","../src/getMarketingParameters.ts","../src/invocations.ts","../src/property.ts","../src/tryCatch.ts","../src/mapping.ts","../src/mockEnv.ts","../src/onLog.ts","../src/request.ts","../src/send.ts","../src/throwError.ts","../src/trim.ts","../src/useHooks.ts","../src/userAgent.ts","../src/validate.ts"],"sourcesContent":["export * from './types';\n\nexport * from './anonymizeIP';\nexport * from './assign';\nexport * from './byPath';\nexport * from './castValue';\nexport * from './clone';\nexport * from './consent';\nexport * from './createDestination';\nexport * from './eventGenerator';\nexport * from './getId';\nexport * from './getMarketingParameters';\nexport * from './invocations';\nexport * from './is';\nexport * from './mapping';\nexport * from './mockEnv';\nexport * from './onLog';\nexport * from './property';\nexport * from './request';\nexport * from './send';\nexport * from './throwError';\nexport * from './trim';\nexport * from './tryCatch';\nexport * from './useHooks';\nexport * from './userAgent';\nexport * from './validate';\n","import type {\n Source,\n Destination,\n Elb as ElbTypes,\n Handler,\n Hooks,\n On,\n WalkerOS,\n Mapping,\n} from '.';\n\n/**\n * Core collector configuration interface\n */\nexport interface Config {\n /** Whether to run collector automatically */\n run?: boolean;\n /** Version for event tagging */\n tagging: number;\n /** Static global properties even on a new run */\n globalsStatic: WalkerOS.Properties;\n /** Static session data even on a new run */\n sessionStatic: Partial<SessionData>;\n /** Enable verbose logging */\n verbose: boolean;\n /** Error handler */\n onError?: Handler.Error;\n /** Log handler */\n onLog?: Handler.Log;\n}\n\n/**\n * Initialization configuration that extends Config with initial state\n */\nexport interface InitConfig extends Partial<Config> {\n /** Initial consent state */\n consent?: WalkerOS.Consent;\n /** Initial user data */\n user?: WalkerOS.User;\n /** Initial global properties */\n globals?: WalkerOS.Properties;\n /** Source configurations */\n sources?: Source.InitSources;\n /** Destination configurations */\n destinations?: Destination.InitDestinations;\n /** Initial custom properties */\n custom?: WalkerOS.Properties;\n}\n\nexport interface SessionData extends WalkerOS.Properties {\n isStart: boolean;\n storage: boolean;\n id?: string;\n start?: number;\n marketing?: true;\n updated?: number;\n isNew?: boolean;\n device?: string;\n count?: number;\n runs?: number;\n}\n\nexport interface Sources {\n [id: string]: Source.Instance;\n}\n\nexport interface Destinations {\n [id: string]: Destination.Instance;\n}\n\nexport type CommandType =\n | 'action'\n | 'config'\n | 'consent'\n | 'context'\n | 'destination'\n | 'elb'\n | 'globals'\n | 'hook'\n | 'init'\n | 'link'\n | 'run'\n | 'user'\n | 'walker'\n | string;\n\n/**\n * Context passed to collector.push for source mapping\n */\nexport interface PushContext {\n mapping?: Mapping.Config;\n}\n\n/**\n * Push function signature - handles events only\n */\nexport interface PushFn {\n (\n event: WalkerOS.DeepPartialEvent,\n context?: PushContext,\n ): Promise<ElbTypes.PushResult>;\n}\n\n/**\n * Command function signature - handles walker commands only\n */\nexport interface CommandFn {\n (command: 'config', config: Partial<Config>): Promise<ElbTypes.PushResult>;\n (command: 'consent', consent: WalkerOS.Consent): Promise<ElbTypes.PushResult>;\n <T extends Destination.Types>(\n command: 'destination',\n destination: Destination.Init<T> | Destination.Instance<T>,\n config?: Destination.Config<T>,\n ): Promise<ElbTypes.PushResult>;\n <K extends keyof Hooks.Functions>(\n command: 'hook',\n name: K,\n hookFn: Hooks.Functions[K],\n ): Promise<ElbTypes.PushResult>;\n (\n command: 'on',\n type: On.Types,\n rules: WalkerOS.SingleOrArray<On.Options>,\n ): Promise<ElbTypes.PushResult>;\n (command: 'user', user: WalkerOS.User): Promise<ElbTypes.PushResult>;\n (\n command: 'run',\n runState?: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n custom?: WalkerOS.Properties;\n },\n ): Promise<ElbTypes.PushResult>;\n (\n command: string,\n data?: unknown,\n options?: unknown,\n ): Promise<ElbTypes.PushResult>;\n}\n\n// Main Collector interface\nexport interface Instance {\n push: PushFn;\n command: CommandFn;\n allowed: boolean;\n config: Config;\n consent: WalkerOS.Consent;\n count: number;\n custom: WalkerOS.Properties;\n sources: Sources;\n destinations: Destinations;\n globals: WalkerOS.Properties;\n group: string;\n hooks: Hooks.Functions;\n on: On.OnConfig;\n queue: WalkerOS.Events;\n round: number;\n session: undefined | SessionData;\n timing: number;\n user: WalkerOS.User;\n version: string;\n}\n","import type { WalkerOS } from '.';\n\nexport interface Contract {\n version: string;\n globals: Globals;\n context: Contexts;\n entities: Entities;\n // @TODO data as ref\n}\n\nexport interface Globals {\n [name: string]: Global;\n}\n\nexport interface Contexts {\n [name: string]: Context;\n}\n\nexport interface Entities {\n [name: string]: Entity;\n}\n\nexport interface Properties {\n [name: string]: Property;\n}\n\nexport interface Global extends Property {}\n\nexport interface Context extends Property {}\n\nexport interface Entity {\n data: Properties;\n actions: Actions;\n}\n\nexport interface Actions {\n [name: string]: Action;\n}\n\nexport interface Action {\n trigger?: Trigger;\n}\n\nexport type Trigger = string; // @TODO Move to web data contract\n\nexport interface Property {\n type?: PropertyType; // @TODO support multiple\n required?: boolean;\n values?: PropertyValues;\n}\n\nexport type PropertyType = 'boolean' | 'string' | 'number';\n\nexport type PropertyValues = Array<WalkerOS.Property>;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Collector,\n Handler,\n Mapping as WalkerOSMapping,\n On,\n WalkerOS,\n} from '.';\n\n/**\n * Base environment requirements interface for walkerOS destinations\n *\n * This defines the core interface that destinations can use to declare\n * their runtime environment requirements. Platform-specific extensions\n * should extend this interface.\n */\nexport interface BaseEnv {\n /**\n * Generic global properties that destinations may require\n * Platform-specific implementations can extend this interface\n */\n [key: string]: unknown;\n}\n\n/**\n * Type bundle for destination generics.\n * Groups Settings, InitSettings, Mapping, and Env into a single type parameter.\n */\nexport interface Types<S = unknown, M = unknown, E = BaseEnv, I = S> {\n settings: S;\n initSettings: I;\n mapping: M;\n env: E;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n mapping: any;\n env: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Mapping<T extends TypesGeneric = Types> = T['mapping'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\n\n/**\n * Inference helper: Extract Types from Instance\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n config: Config<T>;\n queue?: WalkerOS.Events;\n dlq?: DLQ;\n type?: string;\n env?: Env<T>;\n init?: InitFn<T>;\n push: PushFn<T>;\n pushBatch?: PushBatchFn<T>;\n on?: On.OnFn;\n}\n\nexport interface Config<T extends TypesGeneric = Types> {\n consent?: WalkerOS.Consent;\n settings?: InitSettings<T>;\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n env?: Env<T>;\n id?: string;\n init?: boolean;\n loadScript?: boolean;\n mapping?: WalkerOSMapping.Rules<WalkerOSMapping.Rule<Mapping<T>>>;\n policy?: Policy;\n queue?: boolean;\n verbose?: boolean;\n onError?: Handler.Error;\n onLog?: Handler.Log;\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Partial<Mapping<T>> | Mapping<T>,\n Env<T>\n >\n>;\n\nexport interface Policy {\n [key: string]: WalkerOSMapping.Value;\n}\n\nexport type Init<T extends TypesGeneric = Types> = {\n code: Instance<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n};\n\nexport interface InitDestinations {\n [key: string]: Init<any>;\n}\n\nexport interface Destinations {\n [key: string]: Instance;\n}\n\nexport interface Context<T extends TypesGeneric = Types> {\n collector: Collector.Instance;\n config: Config<T>;\n data?: Data;\n env: Env<T>;\n}\n\nexport interface InitContext<T extends TypesGeneric = Types> {\n collector: Collector.Instance;\n config: Config<Types<Partial<Settings<T>>, Mapping<T>, Env<T>>>;\n data?: Data;\n env: Env<T>;\n}\n\nexport interface PushContext<T extends TypesGeneric = Types>\n extends Context<T> {\n mapping?: WalkerOSMapping.Rule<Mapping<T>>;\n}\n\nexport interface PushBatchContext<T extends TypesGeneric = Types>\n extends Context<T> {\n mapping?: WalkerOSMapping.Rule<Mapping<T>>;\n}\n\nexport type InitFn<T extends TypesGeneric = Types> = (\n context: InitContext<T>,\n) => WalkerOS.PromiseOrValue<void | false | Config<T>>;\n\nexport type PushFn<T extends TypesGeneric = Types> = (\n event: WalkerOS.Event,\n context: PushContext<T>,\n) => WalkerOS.PromiseOrValue<void>;\n\nexport type PushBatchFn<T extends TypesGeneric = Types> = (\n batch: Batch<Mapping<T>>,\n context: PushBatchContext<T>,\n) => void;\n\nexport type PushEvent<Mapping = unknown> = {\n event: WalkerOS.Event;\n mapping?: WalkerOSMapping.Rule<Mapping>;\n};\nexport type PushEvents<Mapping = unknown> = Array<PushEvent<Mapping>>;\n\nexport interface Batch<Mapping> {\n key: string;\n events: WalkerOS.Events;\n data: Array<Data>;\n mapping?: WalkerOSMapping.Rule<Mapping>;\n}\n\nexport type Data =\n | WalkerOS.Property\n | undefined\n | Array<WalkerOS.Property | undefined>;\n\nexport type Ref = {\n id: string;\n destination: Instance;\n};\n\nexport type Push = {\n queue?: WalkerOS.Events;\n error?: unknown;\n};\n\nexport type DLQ = Array<[WalkerOS.Event, unknown]>;\n\nexport type Result = {\n successful: Array<Ref>;\n queued: Array<Ref>;\n failed: Array<Ref>;\n};\n","import type { Destination, Hooks, On, WalkerOS } from '.';\n\n// Event signatures only\nexport interface EventFn<R = Promise<PushResult>> {\n (partialEvent: WalkerOS.DeepPartialEvent): R;\n (event: string): R;\n (event: string, data: WalkerOS.Properties): R;\n}\n\n// Complete function interface - can be extended by other interfaces\nexport interface Fn<R = Promise<PushResult>, Config = unknown>\n extends EventFn<R>,\n WalkerCommands<R, Config> {\n // Interface intentionally empty - combines EventFn and WalkerCommands\n}\n\n// Walker commands (clear, predefined list)\nexport interface WalkerCommands<R = Promise<PushResult>, Config = unknown> {\n (event: 'walker config', config: Partial<Config>): R;\n (event: 'walker consent', consent: WalkerOS.Consent): R;\n <T extends Destination.Types>(\n event: 'walker destination',\n destination: Destination.Init<T> | Destination.Instance<T>,\n config?: Destination.Config<T>,\n ): R;\n <K extends keyof Hooks.Functions>(\n event: 'walker hook',\n name: K,\n hookFn: Hooks.Functions[K],\n ): R;\n (\n event: 'walker on',\n type: On.Types,\n rules: WalkerOS.SingleOrArray<On.Options>,\n ): R;\n (event: 'walker user', user: WalkerOS.User): R;\n (\n event: 'walker run',\n runState: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n custom?: WalkerOS.Properties;\n },\n ): R;\n}\n\nexport type Event<R = Promise<PushResult>> = (\n partialEvent: WalkerOS.DeepPartialEvent,\n) => R;\n\n// Simplified push data types for core collector\nexport type PushData<Config = unknown> =\n | WalkerOS.DeepPartial<Config>\n | WalkerOS.Consent\n | WalkerOS.User\n | WalkerOS.Properties;\n\nexport interface PushResult extends Destination.Result {\n event?: WalkerOS.Event;\n ok: boolean;\n}\n\n// Simplified Layer type for core collector\nexport type Layer = Array<IArguments | WalkerOS.DeepPartialEvent | unknown[]>;\n","/**\n * Flow Configuration System\n *\n * Core types for walkerOS unified configuration.\n * Platform-agnostic, runtime-focused.\n *\n * The Flow system enables \"one config to rule them all\" - a single\n * walkeros.config.json file that manages multiple environments\n * (web_prod, web_stage, server_prod, etc.) with shared configuration,\n * variables, and reusable definitions.\n *\n * @packageDocumentation\n */\n\nimport type { Source, Destination, Collector } from '.';\n\n/**\n * Primitive value types for variables\n */\nexport type Primitive = string | number | boolean;\n\n/**\n * Complete multi-environment configuration.\n * This is the root type for walkeros.config.json files.\n *\n * @remarks\n * The Setup interface represents the entire configuration file,\n * containing multiple named environments that can share variables\n * and definitions.\n *\n * @example\n * ```json\n * {\n * \"version\": 1,\n * \"$schema\": \"https://walkeros.io/schema/flow/v1.json\",\n * \"variables\": {\n * \"CURRENCY\": \"USD\"\n * },\n * \"environments\": {\n * \"web_prod\": { \"platform\": \"web\", ... },\n * \"server_prod\": { \"platform\": \"server\", ... }\n * }\n * }\n * ```\n */\nexport interface Setup {\n /**\n * Configuration schema version.\n * Used for compatibility checks and migrations.\n *\n * @remarks\n * - Version 1: Initial Flow configuration system\n * - Future versions will be documented as they're released\n */\n version: 1;\n\n /**\n * JSON Schema reference for IDE validation and autocomplete.\n *\n * @remarks\n * When set, IDEs like VSCode will provide:\n * - Autocomplete for all fields\n * - Inline documentation\n * - Validation errors before deployment\n *\n * @example\n * \"$schema\": \"https://walkeros.io/schema/flow/v1.json\"\n */\n $schema?: string;\n\n /**\n * Shared variables for interpolation across all environments.\n *\n * @remarks\n * Variables can be referenced using `${VAR_NAME:default}` syntax.\n * Resolution order:\n * 1. Environment variable (process.env.VAR_NAME)\n * 2. Config variable (config.variables.VAR_NAME)\n * 3. Inline default value\n *\n * @example\n * ```json\n * {\n * \"variables\": {\n * \"CURRENCY\": \"USD\",\n * \"GA4_ID\": \"G-DEFAULT\"\n * },\n * \"environments\": {\n * \"prod\": {\n * \"collector\": {\n * \"globals\": {\n * \"currency\": \"${CURRENCY}\"\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n variables?: Record<string, Primitive>;\n\n /**\n * Reusable configuration definitions.\n *\n * @remarks\n * Definitions can be referenced using JSON Schema `$ref` syntax.\n * Useful for sharing mapping rules, common settings, etc.\n *\n * @example\n * ```json\n * {\n * \"definitions\": {\n * \"gtag_base_mapping\": {\n * \"page\": {\n * \"view\": { \"name\": \"page_view\" }\n * }\n * }\n * },\n * \"environments\": {\n * \"prod\": {\n * \"destinations\": {\n * \"gtag\": {\n * \"config\": {\n * \"mapping\": { \"$ref\": \"#/definitions/gtag_base_mapping\" }\n * }\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n definitions?: Record<string, unknown>;\n\n /**\n * Named environment configurations.\n *\n * @remarks\n * Each environment represents a deployment target:\n * - web_prod, web_stage, web_dev (client-side tracking)\n * - server_prod, server_stage (server-side collection)\n *\n * Environment names are arbitrary and user-defined.\n *\n * @example\n * ```json\n * {\n * \"environments\": {\n * \"web_prod\": {\n * \"platform\": \"web\",\n * \"sources\": { ... },\n * \"destinations\": { ... }\n * },\n * \"server_prod\": {\n * \"platform\": \"server\",\n * \"destinations\": { ... }\n * }\n * }\n * }\n * ```\n */\n environments: Record<string, Config>;\n}\n\n/**\n * Single environment configuration.\n * Represents one deployment target (e.g., web_prod, server_stage).\n *\n * @remarks\n * This is the core runtime configuration used by `startFlow()`.\n * Platform-agnostic and independent of build/deployment tools.\n *\n * Extensions (build, docker, etc.) are added via `[key: string]: unknown`.\n */\nexport interface Config {\n /**\n * Target platform for this environment.\n *\n * @remarks\n * - `web`: Browser-based tracking (IIFE bundles, browser sources)\n * - `server`: Node.js server-side collection (CJS bundles, HTTP sources)\n *\n * This determines:\n * - Available packages (web-* vs server-*)\n * - Default build settings\n * - Template selection\n */\n platform: 'web' | 'server';\n\n /**\n * Source configurations (data capture).\n *\n * @remarks\n * Sources capture events from various origins:\n * - Browser DOM interactions (clicks, page views)\n * - DataLayer pushes\n * - HTTP requests (server-side)\n * - Cloud function triggers\n *\n * Key = unique source identifier (arbitrary)\n * Value = source reference with package and config\n *\n * @example\n * ```json\n * {\n * \"sources\": {\n * \"browser\": {\n * \"package\": \"@walkeros/web-source-browser\",\n * \"config\": {\n * \"settings\": {\n * \"pageview\": true,\n * \"session\": true\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n sources?: Record<string, SourceReference>;\n\n /**\n * Destination configurations (data output).\n *\n * @remarks\n * Destinations send processed events to external services:\n * - Google Analytics (gtag)\n * - Meta Pixel (fbq)\n * - Custom APIs\n * - Data warehouses\n *\n * Key = unique destination identifier (arbitrary)\n * Value = destination reference with package and config\n *\n * @example\n * ```json\n * {\n * \"destinations\": {\n * \"gtag\": {\n * \"package\": \"@walkeros/web-destination-gtag\",\n * \"config\": {\n * \"settings\": {\n * \"ga4\": { \"measurementId\": \"G-XXXXXXXXXX\" }\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n destinations?: Record<string, DestinationReference>;\n\n /**\n * Collector configuration (event processing).\n *\n * @remarks\n * The collector is the central event processing engine.\n * Configuration includes:\n * - Consent management\n * - Global properties\n * - User identification\n * - Processing rules\n *\n * @see {@link Collector.InitConfig} for complete options\n *\n * @example\n * ```json\n * {\n * \"collector\": {\n * \"run\": true,\n * \"tagging\": 1,\n * \"consent\": {\n * \"functional\": true,\n * \"marketing\": false\n * },\n * \"globals\": {\n * \"currency\": \"USD\",\n * \"environment\": \"production\"\n * }\n * }\n * }\n * ```\n */\n collector?: Collector.InitConfig;\n\n /**\n * Environment-specific variables.\n *\n * @remarks\n * These override root-level variables for this specific environment.\n * Useful for environment-specific API keys, endpoints, etc.\n *\n * @example\n * ```json\n * {\n * \"env\": {\n * \"API_ENDPOINT\": \"https://api.production.com\",\n * \"DEBUG\": \"false\"\n * }\n * }\n * ```\n */\n env?: Record<string, string>;\n\n /**\n * Extension point for package-specific fields.\n *\n * @remarks\n * Allows packages to add their own configuration fields:\n * - CLI adds `build` field (Bundle.Config)\n * - Docker adds `docker` field (Docker.Config)\n * - Lambda adds `lambda` field (Lambda.Config)\n *\n * Core doesn't validate these fields - packages handle validation.\n */\n [key: string]: unknown;\n}\n\n/**\n * Source reference with inline package syntax.\n *\n * @remarks\n * References a source package and provides configuration.\n * The package is automatically downloaded and imported during build.\n */\nexport interface SourceReference {\n /**\n * Package specifier with optional version.\n *\n * @remarks\n * Formats:\n * - `\"@walkeros/web-source-browser\"` - Latest version\n * - `\"@walkeros/web-source-browser@2.0.0\"` - Specific version\n * - `\"@walkeros/web-source-browser@^2.0.0\"` - Semver range\n *\n * The CLI will:\n * 1. Parse the package reference\n * 2. Download from npm\n * 3. Auto-detect default or named export\n * 4. Generate import statement\n *\n * @example\n * \"package\": \"@walkeros/web-source-browser@latest\"\n */\n package: string;\n\n /**\n * Source-specific configuration.\n *\n * @remarks\n * Structure depends on the source package.\n * Passed to the source's initialization function.\n *\n * @example\n * ```json\n * {\n * \"config\": {\n * \"settings\": {\n * \"pageview\": true,\n * \"session\": true,\n * \"elb\": \"elb\",\n * \"prefix\": \"data-elb\"\n * }\n * }\n * }\n * ```\n */\n config?: unknown;\n\n /**\n * Source environment configuration.\n *\n * @remarks\n * Environment-specific settings for the source.\n * Merged with default source environment.\n */\n env?: unknown;\n\n /**\n * Mark as primary source (provides main ELB).\n *\n * @remarks\n * The primary source's ELB function is returned by `startFlow()`.\n * Only one source should be marked as primary per environment.\n *\n * @default false\n */\n primary?: boolean;\n}\n\n/**\n * Destination reference with inline package syntax.\n *\n * @remarks\n * References a destination package and provides configuration.\n * Structure mirrors SourceReference for consistency.\n */\nexport interface DestinationReference {\n /**\n * Package specifier with optional version.\n *\n * @remarks\n * Same format as SourceReference.package\n *\n * @example\n * \"package\": \"@walkeros/web-destination-gtag@2.0.0\"\n */\n package: string;\n\n /**\n * Destination-specific configuration.\n *\n * @remarks\n * Structure depends on the destination package.\n * Typically includes:\n * - settings: API keys, IDs, endpoints\n * - mapping: Event transformation rules\n * - consent: Required consent states\n * - policy: Processing rules\n *\n * @example\n * ```json\n * {\n * \"config\": {\n * \"settings\": {\n * \"ga4\": {\n * \"measurementId\": \"G-XXXXXXXXXX\"\n * }\n * },\n * \"mapping\": {\n * \"page\": {\n * \"view\": {\n * \"name\": \"page_view\",\n * \"data\": { ... }\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n config?: unknown;\n\n /**\n * Destination environment configuration.\n *\n * @remarks\n * Environment-specific settings for the destination.\n * Merged with default destination environment.\n */\n env?: unknown;\n}\n","export type Error = (error: unknown, state?: unknown) => void;\n\nexport type Log = (message: string, verbose?: boolean) => void;\n","// Define a generic type for functions with specific parameters and return type\nexport type AnyFunction<P extends unknown[] = never[], R = unknown> = (\n ...args: P\n) => R;\n\n// Define a generic type for a dictionary of functions\nexport type Functions = {\n [key: string]: AnyFunction;\n};\n\n// Define a parameter interface to wrap the function and its result\ninterface Parameter<P extends unknown[], R> {\n fn: (...args: P) => R;\n result?: R;\n}\n\n// Define the HookFn type using generics for better type safety\nexport type HookFn<T extends AnyFunction> = (\n params: Parameter<Parameters<T>, ReturnType<T>>,\n ...args: Parameters<T>\n) => ReturnType<T>;\n","import type { Collector, Destination, WalkerOS } from '.';\n\n/**\n * Shared mapping configuration interface.\n * Used by both Source.Config and Destination.Config.\n */\nexport interface Config<T = unknown> {\n consent?: WalkerOS.Consent; // Required consent to process events\n data?: Value | Values; // Global data transformation\n mapping?: Rules<Rule<T>>; // Event-specific mapping rules\n policy?: Policy; // Pre-processing rules\n}\n\nexport interface Policy {\n [key: string]: Value;\n}\n\nexport interface Rules<T = Rule> {\n [entity: string]: Record<string, T | Array<T>> | undefined;\n}\n\nexport interface Rule<Settings = unknown> {\n batch?: number; // Bundle events for batch processing\n batchFn?: (\n destination: Destination.Instance,\n collector: Collector.Instance,\n ) => void;\n batched?: Destination.Batch<Settings>; // Batch of events to be processed\n condition?: Condition; // Added condition\n consent?: WalkerOS.Consent; // Required consent states process the event\n settings?: Settings; // Arbitrary but protected configurations for custom event config\n data?: Data; // Mapping of event data\n ignore?: boolean; // Choose to no process an event when set to true\n name?: string; // Use a custom event name\n policy?: Policy; // Event-level policy applied after config-level policy\n}\n\nexport interface Result {\n eventMapping?: Rule;\n mappingKey?: string;\n}\n\nexport type Data = Value | Values;\nexport type Value = ValueType | Array<ValueType>;\nexport type Values = Array<Value>;\nexport type ValueType = string | ValueConfig;\n\nexport interface ValueConfig {\n condition?: Condition;\n consent?: WalkerOS.Consent;\n fn?: Fn;\n key?: string;\n loop?: Loop;\n map?: Map;\n set?: Value[];\n validate?: Validate;\n value?: WalkerOS.PropertyType;\n}\n\nexport type Condition = (\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping?: Value,\n collector?: Collector.Instance,\n) => WalkerOS.PromiseOrValue<boolean>;\n\nexport type Fn = (\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping: Value,\n options: Options,\n) => WalkerOS.PromiseOrValue<WalkerOS.Property | unknown>;\n\nexport type Loop = [Value, Value];\n\nexport type Map = { [key: string]: Value };\n\nexport interface Options {\n consent?: WalkerOS.Consent;\n collector?: Collector.Instance;\n props?: unknown;\n}\n\nexport type Validate = (value?: unknown) => WalkerOS.PromiseOrValue<boolean>;\n","import type { Collector, WalkerOS } from './';\n\n// collector state for the on actions\nexport type Config = {\n consent?: Array<ConsentConfig>;\n ready?: Array<ReadyConfig>;\n run?: Array<RunConfig>;\n session?: Array<SessionConfig>;\n};\n\n// On types\nexport type Types = keyof Config;\n\n// Map each event type to its expected context type\nexport interface EventContextMap {\n consent: WalkerOS.Consent;\n session: Collector.SessionData;\n ready: undefined;\n run: undefined;\n}\n\n// Extract the context type for a specific event\nexport type EventContext<T extends Types> = EventContextMap[T];\n\n// Union of all possible context types\nexport type AnyEventContext = EventContextMap[keyof EventContextMap];\n\n// Legacy context interface (can be removed in future)\nexport interface Context {\n consent?: WalkerOS.Consent;\n session?: unknown;\n}\n\n// Parameters for the onAction function calls\nexport type Options = ConsentConfig | ReadyConfig | RunConfig | SessionConfig;\n\n// Consent\nexport interface ConsentConfig {\n [key: string]: ConsentFn;\n}\nexport type ConsentFn = (\n collector: Collector.Instance,\n consent: WalkerOS.Consent,\n) => void;\n\n// Ready\nexport type ReadyConfig = ReadyFn;\nexport type ReadyFn = (collector: Collector.Instance) => void;\n\n// Run\nexport type RunConfig = RunFn;\nexport type RunFn = (collector: Collector.Instance) => void;\n\n// Session\nexport type SessionConfig = SessionFn;\nexport type SessionFn = (\n collector: Collector.Instance,\n session?: unknown,\n) => void;\n\nexport interface OnConfig {\n consent?: ConsentConfig[];\n ready?: ReadyConfig[];\n run?: RunConfig[];\n session?: SessionConfig[];\n [key: string]:\n | ConsentConfig[]\n | ReadyConfig[]\n | RunConfig[]\n | SessionConfig[]\n | undefined;\n}\n\n// Destination on function type with automatic type inference\nexport type OnFn = <T extends Types>(\n event: T,\n context: EventContextMap[T],\n) => WalkerOS.PromiseOrValue<void>;\n\n// Runtime-compatible version for internal usage\nexport type OnFnRuntime = (\n event: Types,\n context: AnyEventContext,\n) => WalkerOS.PromiseOrValue<void>;\n","export interface Context {\n city?: string;\n country?: string;\n encoding?: string;\n hash?: string;\n ip?: string;\n language?: string;\n origin?: string;\n region?: string;\n userAgent?: string;\n [key: string]: string | undefined;\n}\n","import type { WalkerOS } from '.';\n\nexport type Contracts = Array<Contract>;\n\nexport type Contract = {\n [entity: string]: {\n [action: string]: Properties;\n };\n};\n\nexport type Properties = {\n [key: string]: Property | undefined;\n};\n\nexport type Property = {\n allowedKeys?: string[];\n allowedValues?: unknown[];\n // @TODO minLength?: number;\n maxLength?: number;\n max?: number;\n min?: number;\n required?: boolean;\n schema?: Properties;\n strict?: boolean;\n type?: string;\n validate?: (\n value: unknown,\n key: string,\n event: WalkerOS.AnyObject,\n ) => WalkerOS.Property;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Elb,\n On,\n Handler,\n Mapping as WalkerOSMapping,\n Collector,\n} from './index';\n\n/**\n * Base Env interface for dependency injection into sources.\n *\n * Sources receive all their dependencies through this environment object,\n * making them platform-agnostic and easily testable.\n */\nexport interface BaseEnv {\n [key: string]: unknown;\n push: Collector.PushFn;\n command: Collector.CommandFn;\n sources?: Collector.Sources;\n elb: Elb.Fn;\n}\n\n/**\n * Type bundle for source generics.\n * Groups Settings, Mapping, Push, Env, and InitSettings into a single type parameter.\n *\n * @template S - Settings configuration type\n * @template M - Mapping configuration type\n * @template P - Push function signature (flexible to support HTTP handlers, etc.)\n * @template E - Environment dependencies type\n * @template I - InitSettings configuration type (user input)\n */\nexport interface Types<\n S = unknown,\n M = unknown,\n P = Elb.Fn,\n E = BaseEnv,\n I = S,\n> {\n settings: S;\n initSettings: I;\n mapping: M;\n push: P;\n env: E;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n mapping: any;\n push: any;\n env: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Mapping<T extends TypesGeneric = Types> = T['mapping'];\nexport type Push<T extends TypesGeneric = Types> = T['push'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\n\n/**\n * Inference helper: Extract Types from Instance\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Config<T extends TypesGeneric = Types>\n extends WalkerOSMapping.Config<Mapping<T>> {\n settings?: InitSettings<T>;\n env?: Env<T>;\n id?: string;\n onError?: Handler.Error;\n disabled?: boolean;\n primary?: boolean;\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Partial<Mapping<T>> | Mapping<T>,\n Push<T>,\n Env<T>\n >\n>;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n type: string;\n config: Config<T>;\n push: Push<T>;\n destroy?(): void | Promise<void>;\n on?(event: On.Types, context?: unknown): void | Promise<void>;\n}\n\nexport type Init<T extends TypesGeneric = Types> = (\n config: Partial<Config<T>>,\n env: Env<T>,\n) => Instance<T> | Promise<Instance<T>>;\n\nexport type InitSource<T extends TypesGeneric = Types> = {\n code: Init<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n primary?: boolean;\n};\n\n/**\n * Sources configuration for collector.\n * Maps source IDs to their initialization configurations.\n */\nexport interface InitSources {\n [sourceId: string]: InitSource<any>;\n}\n","import type { Elb as ElbTypes } from '.';\n\nexport type AnyObject<T = unknown> = Record<string, T>;\nexport type Elb = ElbTypes.Fn;\nexport type AnyFunction = (...args: unknown[]) => unknown;\nexport type SingleOrArray<T> = T | Array<T>;\n\nexport type Events = Array<Event>;\nexport type PartialEvent = Partial<Event>;\nexport type DeepPartialEvent = DeepPartial<Event>;\nexport interface Event {\n name: string;\n data: Properties;\n context: OrderedProperties;\n globals: Properties;\n custom: Properties;\n user: User;\n nested: Entities;\n consent: Consent;\n id: string;\n trigger: string;\n entity: string;\n action: string;\n timestamp: number;\n timing: number;\n group: string;\n count: number;\n version: Version;\n source: Source;\n}\n\nexport interface Consent {\n [name: string]: boolean; // name of consent group or tool\n}\n\nexport interface User extends Properties {\n // IDs\n id?: string;\n device?: string;\n session?: string;\n hash?: string;\n // User related\n address?: string;\n email?: string;\n phone?: string;\n userAgent?: string;\n browser?: string;\n browserVersion?: string;\n deviceType?: string;\n language?: string;\n country?: string;\n region?: string;\n city?: string;\n zip?: string;\n timezone?: string;\n os?: string;\n osVersion?: string;\n screenSize?: string;\n ip?: string;\n internal?: boolean;\n}\n\nexport interface Version extends Properties {\n source: string;\n tagging: number;\n}\n\nexport interface Source extends Properties {\n type: SourceType;\n id: string; // https://github.com/elbwalker/walkerOS\n previous_id: string; // https://www.elbwalker.com/\n}\n\nexport type SourceType = 'web' | 'server' | 'app' | 'other' | string;\n\nexport type PropertyType =\n | boolean\n | string\n | number\n | { [key: string]: Property };\n\nexport type Property = PropertyType | Array<PropertyType>;\n\nexport interface Properties {\n [key: string]: Property | undefined;\n}\nexport interface OrderedProperties {\n [key: string]: [Property, number] | undefined;\n}\n\nexport type Entities = Array<Entity>;\nexport interface Entity {\n entity: string;\n data: Properties;\n nested: Entities;\n context: OrderedProperties;\n}\n\nexport type ConsentHandler = Record<string, AnyFunction>;\nexport type ActionHandler = AnyFunction;\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type PromiseOrValue<T> = T | Promise<T>;\n","export type StorageType = 'local' | 'session' | 'cookie';\n\nexport const Storage = {\n Local: 'local' as const,\n Session: 'session' as const,\n Cookie: 'cookie' as const,\n} as const;\n\nexport const Const = {\n Utils: {\n Storage,\n },\n} as const;\n","/**\n * Anonymizes an IPv4 address by setting the last octet to 0.\n *\n * @param ip The IP address to anonymize.\n * @returns The anonymized IP address or an empty string if the IP is invalid.\n */\nexport 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","/**\n * @interface Assign\n * @description Options for the assign function.\n * @property merge - Merge array properties instead of overriding them.\n * @property shallow - Create a shallow copy instead of updating the target object.\n * @property extend - Extend the target with new properties instead of only updating existing ones.\n */\ninterface Assign {\n merge?: boolean;\n shallow?: boolean;\n extend?: boolean;\n}\n\nconst defaultOptions: Assign = {\n merge: true,\n shallow: true,\n extend: true,\n};\n\n/**\n * Merges objects with advanced options.\n *\n * @template T, U\n * @param target - The target object to merge into.\n * @param obj - The source object to merge from.\n * @param options - Options for merging.\n * @returns The merged object.\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 './types';\n\n/**\n * Checks if a value is an arguments object.\n *\n * @param value The value to check.\n * @returns True if the value is an arguments object, false otherwise.\n */\nexport function isArguments(value: unknown): value is IArguments {\n return Object.prototype.toString.call(value) === '[object Arguments]';\n}\n\n/**\n * Checks if a value is an array.\n *\n * @param value The value to check.\n * @returns True if the value is an array, false otherwise.\n */\nexport function isArray<T>(value: unknown): value is T[] {\n return Array.isArray(value);\n}\n\n/**\n * Checks if a value is a boolean.\n *\n * @param value The value to check.\n * @returns True if the value is a boolean, false otherwise.\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * Checks if an entity is a walker command.\n *\n * @param entity The entity to check.\n * @returns True if the entity is a walker command, false otherwise.\n */\nexport function isCommand(entity: string) {\n return entity === 'walker';\n}\n\n/**\n * Checks if a value is defined.\n *\n * @param value The value to check.\n * @returns True if the value is defined, false otherwise.\n */\nexport function isDefined<T>(val: T | undefined): val is T {\n return typeof val !== 'undefined';\n}\n\n/**\n * Checks if a value is an element or the document.\n *\n * @param elem The value to check.\n * @returns True if the value is an element or the document, false otherwise.\n */\nexport function isElementOrDocument(elem: unknown): elem is Element {\n return elem === document || elem instanceof Element;\n}\n\n/**\n * Checks if a value is a function.\n *\n * @param value The value to check.\n * @returns True if the value is a function, false otherwise.\n */\nexport function isFunction(value: unknown): value is Function {\n return typeof value === 'function';\n}\n\n/**\n * Checks if a value is a number.\n *\n * @param value The value to check.\n * @returns True if the value is a number, false otherwise.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * Checks if a value is an object.\n *\n * @param value The value to check.\n * @returns True if the value is an object, false otherwise.\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\n/**\n * Checks if two variables have the same type.\n *\n * @param variable The first variable.\n * @param type The second variable.\n * @returns True if the variables have the same type, false otherwise.\n */\nexport function isSameType<T>(\n variable: unknown,\n type: T,\n): variable is typeof type {\n return typeof variable === typeof type;\n}\n\n/**\n * Checks if a value is a string.\n *\n * @param value The value to check.\n * @returns True if the value is a string, false otherwise.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n","/**\n * Creates a deep clone of a value.\n * Supports primitive values, objects, arrays, dates, and regular expressions.\n * Handles circular references.\n *\n * @template T\n * @param org - The value to clone.\n * @param visited - A map of visited objects to handle circular references.\n * @returns The cloned value.\n */\nexport 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","import type { WalkerOS } from './types';\nimport { isArray, isDefined, isObject } from './is';\nimport { clone } from './clone';\n\n/**\n * Gets a value from an object by a dot-notation string.\n * Supports wildcards for arrays.\n *\n * @example\n * getByPath({ data: { id: 1 } }, \"data.id\") // Returns 1\n *\n * @param event - The object to get the value from.\n * @param key - The dot-notation string.\n * @param defaultValue - The default value to return if the key is not found.\n * @returns The value from the object or the default value.\n */\nexport function getByPath(\n event: unknown,\n key: string = '',\n defaultValue?: unknown,\n): unknown {\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);\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\n/**\n * Sets a value in an object by a dot-notation string.\n *\n * @param obj - The object to set the value in.\n * @param key - The dot-notation string.\n * @param value - The value to set.\n * @returns A new object with the updated value.\n */\nexport function setByPath<T = unknown>(obj: T, key: string, value: unknown): T {\n if (!isObject(obj)) return obj;\n\n const clonedObj = clone(obj);\n const keys = key.split('.');\n let current: WalkerOS.AnyObject = clonedObj;\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 clonedObj as T;\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Casts a value to a specific type.\n *\n * @param value The value to cast.\n * @returns The casted value.\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","import type { WalkerOS } from './types';\n\n/**\n * Checks if the required consent is granted.\n *\n * @param required - The required consent states.\n * @param state - The current consent states.\n * @param individual - Individual consent states to prioritize.\n * @returns The granted consent states or false if not granted.\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","import type { Destination } from './types';\nimport type { TypesOf, Config } from './types/destination';\nimport { assign } from './assign';\n\n/**\n * Creates a new destination instance by merging a base destination with additional configuration.\n *\n * This utility enables elegant destination configuration while avoiding config side-effects\n * that could occur when reusing destination objects across multiple collector instances.\n *\n * @param baseDestination - The base destination to extend\n * @param config - Additional configuration to merge with the base destination's config\n * @returns A new destination instance with merged configuration\n *\n * @example\n * ```typescript\n * // Types are inferred automatically from destinationGtag\n * elb('walker destination', createDestination(destinationGtag, {\n * settings: { ga4: { measurementId: 'G-123' } }\n * }));\n * ```\n */\nexport function createDestination<I extends Destination.Instance>(\n baseDestination: I,\n config: Partial<Config<TypesOf<I>>>,\n): I {\n // Create a shallow copy of the base destination to avoid mutations\n const newDestination = { ...baseDestination };\n\n // Deep merge the config, handling nested objects like settings and mapping\n newDestination.config = assign(baseDestination.config, config, {\n shallow: true, // Create new object, don't mutate original\n merge: true, // Merge arrays\n extend: true, // Allow new properties\n });\n\n // Handle nested settings merging if both have settings\n if (baseDestination.config.settings && config.settings) {\n newDestination.config.settings = assign(\n baseDestination.config.settings as object,\n config.settings as object,\n { shallow: true, merge: true, extend: true },\n ) as typeof newDestination.config.settings;\n }\n\n // Handle nested mapping merging if both have mapping\n if (baseDestination.config.mapping && config.mapping) {\n newDestination.config.mapping = assign(\n baseDestination.config.mapping as object,\n config.mapping as object,\n { shallow: true, merge: true, extend: true },\n ) as typeof newDestination.config.mapping;\n }\n\n return newDestination;\n}\n","import type { WalkerOS } from './types';\nimport { assign } from './assign';\n\ndeclare const __VERSION__: string;\n\n/**\n * Creates a complete event with default values.\n * Used for testing and debugging.\n *\n * @param props - Properties to override the default values.\n * @returns A complete event.\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 name: '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 entity: '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: __VERSION__,\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.name) {\n const [entity, action] = props.name.split(' ') ?? [];\n\n if (entity && action) {\n event.entity = entity;\n event.action = action;\n }\n }\n\n return event;\n}\n\n/**\n * Creates a complete event with default values based on the event name.\n * Used for testing and debugging.\n *\n * @param name - The name of the event to create.\n * @param props - Properties to override the default values.\n * @returns A complete event.\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 entity: '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 entity: 'product',\n ...product1,\n context: { shopping: ['checkout', 0] },\n nested: [],\n },\n {\n entity: '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 entity: 'product',\n ...product1,\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n {\n entity: 'product',\n ...product2,\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n {\n entity: '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, name: name });\n}\n","/**\n * Generates a random string of a given length.\n *\n * @param length - The length of the random string.\n * @returns The random string.\n */\nexport 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 './types';\nimport { assign } from './assign';\n\nexport interface MarketingParameters {\n [key: string]: string;\n}\n\n/**\n * Extracts marketing parameters from a URL.\n *\n * @param url - The URL to extract the parameters from.\n * @param custom - Custom marketing parameters to extract.\n * @returns The extracted marketing parameters.\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","/**\n * Creates a debounced function that delays invoking `fn` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `fn` invocations and a `flush` method to immediately invoke them.\n *\n * @template P, R\n * @param fn The function to debounce.\n * @param wait The number of milliseconds to delay.\n * @param immediate Trigger the function on the leading edge, instead of the trailing.\n * @returns The new debounced function.\n */\nexport 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\n/**\n * Creates a throttled function that only invokes `fn` at most once per\n * every `delay` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `fn` invocations and a `flush` method to\n * immediately invoke them.\n *\n * @template P, R\n * @param fn The function to throttle.\n * @param delay The number of milliseconds to throttle invocations to.\n * @returns The new throttled function.\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 './types';\nimport {\n isArguments,\n isArray,\n isBoolean,\n isDefined,\n isNumber,\n isObject,\n isString,\n} from './is';\n\n/**\n * Checks if a value is a valid property type.\n *\n * @param value The value to check.\n * @returns True if the value is a valid property type, false otherwise.\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\n/**\n * Filters a value to only include valid property types.\n *\n * @param value The value to filter.\n * @returns The filtered value or undefined.\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\n/**\n * Casts a value to a valid property type.\n *\n * @param value The value to cast.\n * @returns The casted value or undefined.\n */\nexport function castToProperty(value: unknown): WalkerOS.Property | undefined {\n return isPropertyType(value) ? value : undefined;\n}\n","/**\n * A utility function that wraps a function in a try-catch block.\n *\n * @template P, R, S\n * @param fn The function to wrap.\n * @param onError A function to call when an error is caught.\n * @param onFinally A function to call in the finally block.\n * @returns The wrapped function.\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/**\n * A utility function that wraps an async function in a try-catch block.\n *\n * @template P, R, S\n * @param fn The async function to wrap.\n * @param onError A function to call when an error is caught.\n * @param onFinally A function to call in the finally block.\n * @returns The wrapped async function.\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, Collector } from './types';\nimport { getByPath, setByPath } from './byPath';\nimport { isArray, isDefined, isString, isObject } from './is';\nimport { castToProperty } from './property';\nimport { tryCatchAsync } from './tryCatch';\nimport { getGrantedConsent } from './consent';\nimport { assign } from './assign';\n\n/**\n * Gets the mapping for an event.\n *\n * @param event The event to get the mapping for (can be partial or full).\n * @param mapping The mapping rules.\n * @returns The mapping result.\n */\nexport async function getMappingEvent(\n event: WalkerOS.DeepPartialEvent | WalkerOS.PartialEvent | WalkerOS.Event,\n mapping?: Mapping.Rules,\n): Promise<Mapping.Result> {\n const [entity, action] = (event.name || '').split(' ');\n if (!mapping || !entity || !action) return {};\n\n let eventMapping: Mapping.Rule | undefined;\n let mappingKey = '';\n let entityKey = entity;\n let actionKey = action;\n\n const resolveEventMapping = (\n eventMapping?: Mapping.Rule | Mapping.Rule[],\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\n/**\n * Gets a value from a mapping.\n *\n * @param value The value to get the mapping from.\n * @param data The mapping data.\n * @param options The mapping options.\n * @returns The mapped value.\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 > collector?.consent\n const consentState =\n ((isObject(value) && value.consent) as WalkerOS.Consent) ||\n options.consent ||\n options.collector?.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 return;\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 { collector, 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(\n 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)\n ? { key: mappingItem }\n : 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, collector))\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 // Use a custom function to get the value\n if (fn) {\n mappingValue = await tryCatchAsync(fn)(value, mappingItem, options);\n }\n\n // Get dynamic value from the event\n if (key) {\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 },\n Promise.resolve(undefined as WalkerOS.Property | undefined),\n );\n}\n\n/**\n * Processes an event through mapping configuration.\n *\n * This is the unified mapping logic used by both sources and destinations.\n * It applies transformations in this order:\n * 1. Config-level policy - modifies the event itself (global rules)\n * 2. Mapping rules - finds matching rule based on entity-action\n * 3. Event-level policy - modifies the event based on specific mapping rule\n * 4. Data transformation - creates context data\n * 5. Ignore check and name override\n *\n * Sources can pass partial events, destinations pass full events.\n * getMappingValue works with both partial and full events.\n *\n * @param event - The event to process (can be partial or full, will be mutated by policies)\n * @param config - Mapping configuration (mapping, data, policy, consent)\n * @param collector - Collector instance for context\n * @returns Object with transformed event, data, mapping rule, and ignore flag\n */\nexport async function processEventMapping<\n T extends WalkerOS.DeepPartialEvent | WalkerOS.Event,\n>(\n event: T,\n config: Mapping.Config,\n collector: Collector.Instance,\n): Promise<{\n event: T;\n data?: WalkerOS.Property;\n mapping?: Mapping.Rule;\n mappingKey?: string;\n ignore: boolean;\n}> {\n // Step 1: Apply config-level policy (modifies event)\n if (config.policy) {\n await Promise.all(\n Object.entries(config.policy).map(async ([key, mapping]) => {\n const value = await getMappingValue(event, mapping, { collector });\n event = setByPath(event, key, value);\n }),\n );\n }\n\n // Step 2: Get event mapping rule\n const { eventMapping, mappingKey } = await getMappingEvent(\n event,\n config.mapping,\n );\n\n // Step 2.5: Apply event-level policy (modifies event)\n if (eventMapping?.policy) {\n await Promise.all(\n Object.entries(eventMapping.policy).map(async ([key, mapping]) => {\n const value = await getMappingValue(event, mapping, { collector });\n event = setByPath(event, key, value);\n }),\n );\n }\n\n // Step 3: Transform global data\n let data =\n config.data && (await getMappingValue(event, config.data, { collector }));\n\n if (eventMapping) {\n // Check if event should be ignored\n if (eventMapping.ignore) {\n return { event, data, mapping: eventMapping, mappingKey, ignore: true };\n }\n\n // Override event name if specified\n if (eventMapping.name) event.name = eventMapping.name;\n\n // Transform event-specific data\n if (eventMapping.data) {\n const dataEvent =\n eventMapping.data &&\n (await getMappingValue(event, eventMapping.data, { collector }));\n data =\n isObject(data) && isObject(dataEvent) // Only merge objects\n ? assign(data, dataEvent)\n : dataEvent;\n }\n }\n\n return { event, data, mapping: eventMapping, mappingKey, ignore: false };\n}\n","/**\n * Environment mocking utilities for walkerOS destinations\n *\n * Provides standardized tools for intercepting function calls in environment objects,\n * enabling consistent testing patterns across all destinations.\n */\n\ntype InterceptorFn = (\n path: string[],\n args: unknown[],\n original?: Function,\n) => unknown;\n\n/**\n * Creates a proxied environment that intercepts function calls\n *\n * Uses Proxy to wrap environment objects and capture all function calls,\n * allowing for call recording, mocking, or simulation.\n *\n * @param env - The environment object to wrap\n * @param interceptor - Function called for each intercepted call\n * @returns Proxied environment with interceptor applied\n *\n * @example\n * ```typescript\n * const calls: Array<{ path: string[]; args: unknown[] }> = [];\n *\n * const testEnv = mockEnv(env.push, (path, args) => {\n * calls.push({ path, args });\n * });\n *\n * // Use testEnv with destination\n * await destination.push(event, { env: testEnv });\n *\n * // Analyze captured calls\n * expect(calls).toContainEqual({\n * path: ['window', 'gtag'],\n * args: ['event', 'purchase', { value: 99.99 }]\n * });\n * ```\n */\nexport function mockEnv<T extends object>(\n env: T,\n interceptor: InterceptorFn,\n): T {\n const createProxy = (obj: object, path: string[] = []): object => {\n return new Proxy(obj, {\n get(target, prop: string) {\n const value = (target as Record<string, unknown>)[prop];\n const currentPath = [...path, prop];\n\n if (typeof value === 'function') {\n return (...args: unknown[]) => {\n return interceptor(currentPath, args, value);\n };\n }\n\n if (value && typeof value === 'object') {\n return createProxy(value as object, currentPath);\n }\n\n return value;\n },\n });\n };\n\n return createProxy(env) as T;\n}\n\n/**\n * Traverses environment object and replaces values using a replacer function\n *\n * Alternative to mockEnv for environments where Proxy is not suitable.\n * Performs deep traversal and allows value transformation at each level.\n *\n * @param env - The environment object to traverse\n * @param replacer - Function to transform values during traversal\n * @returns New environment object with transformed values\n *\n * @example\n * ```typescript\n * const recordedCalls: APICall[] = [];\n *\n * const recordingEnv = traverseEnv(originalEnv, (value, path) => {\n * if (typeof value === 'function') {\n * return (...args: unknown[]) => {\n * recordedCalls.push({\n * path: path.join('.'),\n * args: structuredClone(args)\n * });\n * return value(...args);\n * };\n * }\n * return value;\n * });\n * ```\n */\nexport function traverseEnv<T extends object>(\n env: T,\n replacer: (value: unknown, path: string[]) => unknown,\n): T {\n const traverse = (obj: unknown, path: string[] = []): unknown => {\n if (!obj || typeof obj !== 'object') return obj;\n\n const result: Record<string, unknown> | unknown[] = Array.isArray(obj)\n ? []\n : {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = [...path, key];\n if (Array.isArray(result)) {\n result[Number(key)] = replacer(value, currentPath);\n } else {\n (result as Record<string, unknown>)[key] = replacer(value, currentPath);\n }\n\n if (value && typeof value === 'object' && typeof value !== 'function') {\n if (Array.isArray(result)) {\n result[Number(key)] = traverse(value, currentPath);\n } else {\n (result as Record<string, unknown>)[key] = traverse(\n value,\n currentPath,\n );\n }\n }\n }\n\n return result;\n };\n\n return traverse(env) as T;\n}\n","/**\n * Logs a message to the console if verbose logging is enabled.\n *\n * @param message The message to log.\n * @param verbose Whether to log the message.\n */\nexport 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 './types';\nimport { tryCatch } from './tryCatch';\nimport { castValue } from './castValue';\nimport { isArray, isObject } from './is';\n\n/**\n * Converts a request string to a data object.\n *\n * @param parameter The request string to convert.\n * @returns The data object or undefined.\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\n/**\n * Converts a data object to a request string.\n *\n * @param data The data object to convert.\n * @returns The request string.\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 { SendDataValue, SendHeaders } from './types/send';\nimport { isSameType } from './is';\nimport { assign } from './assign';\n\nexport type { SendDataValue, SendHeaders, SendResponse } from './types/send';\n\n/**\n * Transforms data to a string.\n *\n * @param data The data to transform.\n * @returns The transformed data.\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\n/**\n * Gets the headers for a request.\n *\n * @param headers The headers to merge with the default headers.\n * @returns The merged headers.\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","/**\n * Throws an error.\n *\n * @param error The error to throw.\n */\nexport function throwError(error: unknown): never {\n throw new Error(String(error));\n}\n","/**\n * Trims quotes and whitespaces from a string.\n *\n * @param str The string to trim.\n * @returns The trimmed string.\n */\nexport function trim(str: string): string {\n // Remove quotes and whitespaces\n return str ? str.trim().replace(/^'|'$/g, '').trim() : '';\n}\n","import type { Hooks } from './types';\n\n/**\n * A utility function that wraps a function with hooks.\n *\n * @template P, R\n * @param fn The function to wrap.\n * @param name The name of the function.\n * @param hooks The hooks to use.\n * @returns The wrapped function.\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","import type { WalkerOS } from './types';\n\n/**\n * Parses a user agent string to extract browser, OS, and device information.\n *\n * @param userAgent The user agent string to parse.\n * @returns An object containing the parsed user agent information.\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\n/**\n * Gets the browser name from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The browser name or undefined.\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 return;\n}\n\n/**\n * Gets the browser version from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The browser version or undefined.\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 return;\n}\n\n/**\n * Gets the OS name from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The OS name or undefined.\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 return;\n}\n\n/**\n * Gets the OS version from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The OS version or undefined.\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\n/**\n * Gets the device type from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The device type or undefined.\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 './types';\nimport { isSameType } from './is';\nimport { throwError } from './throwError';\nimport { tryCatch } from './tryCatch';\n\n/**\n * Validates an event against a set of contracts.\n *\n * @param obj The event to validate.\n * @param customContracts The custom contracts to use.\n * @returns The validated event.\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.name is available and it's a string\n if (isSameType(obj.name, '')) {\n event = obj.name;\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 name, entity, or action');\n }\n\n const basicContract: Schema.Contract = {\n '*': {\n '*': {\n name: { 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 name: 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\n/**\n * Validates a property against a schema.\n *\n * @param obj The object to validate.\n * @param key The key of the property to validate.\n * @param value The value of the property to validate.\n * @param schema The schema to validate against.\n * @returns The validated property.\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","acc","key","value"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/types/collector.ts","../src/types/data.ts","../src/types/destination.ts","../src/types/elb.ts","../src/types/flow.ts","../src/types/hooks.ts","../src/types/logger.ts","../src/types/mapping.ts","../src/types/on.ts","../src/types/request.ts","../src/types/schema.ts","../src/types/source.ts","../src/types/walkeros.ts","../src/types/storage.ts","../src/anonymizeIP.ts","../src/flow.ts","../src/assign.ts","../src/is.ts","../src/clone.ts","../src/byPath.ts","../src/castValue.ts","../src/consent.ts","../src/createDestination.ts","../src/eventGenerator.ts","../src/getId.ts","../src/getMarketingParameters.ts","../src/invocations.ts","../src/logger.ts","../src/property.ts","../src/tryCatch.ts","../src/mapping.ts","../src/mockEnv.ts","../src/mockLogger.ts","../src/request.ts","../src/send.ts","../src/throwError.ts","../src/trim.ts","../src/useHooks.ts","../src/userAgent.ts","../src/validate.ts","../src/wrapInlineCode.ts"],"sourcesContent":["export * from './types';\n\nexport * from './anonymizeIP';\nexport * from './flow';\nexport * from './assign';\nexport * from './byPath';\nexport * from './castValue';\nexport * from './clone';\nexport * from './consent';\nexport * from './createDestination';\nexport * from './eventGenerator';\nexport * from './getId';\nexport * from './getMarketingParameters';\nexport * from './invocations';\nexport * from './is';\nexport * from './logger';\nexport * from './mapping';\nexport * from './mockEnv';\nexport * from './mockLogger';\nexport * from './property';\nexport * from './request';\nexport * from './send';\nexport * from './throwError';\nexport * from './trim';\nexport * from './tryCatch';\nexport * from './useHooks';\nexport * from './userAgent';\nexport * from './validate';\nexport * from './wrapInlineCode';\n","import type {\n Source,\n Destination,\n Elb as ElbTypes,\n Hooks,\n Logger,\n On,\n WalkerOS,\n Mapping,\n} from '.';\n\n/**\n * Core collector configuration interface\n */\nexport interface Config {\n /** Whether to run collector automatically */\n run?: boolean;\n /** Version for event tagging */\n tagging: number;\n /** Static global properties even on a new run */\n globalsStatic: WalkerOS.Properties;\n /** Static session data even on a new run */\n sessionStatic: Partial<SessionData>;\n /** Logger configuration */\n logger?: Logger.Config;\n}\n\n/**\n * Initialization configuration that extends Config with initial state\n */\nexport interface InitConfig extends Partial<Config> {\n /** Initial consent state */\n consent?: WalkerOS.Consent;\n /** Initial user data */\n user?: WalkerOS.User;\n /** Initial global properties */\n globals?: WalkerOS.Properties;\n /** Source configurations */\n sources?: Source.InitSources;\n /** Destination configurations */\n destinations?: Destination.InitDestinations;\n /** Initial custom properties */\n custom?: WalkerOS.Properties;\n}\n\nexport interface SessionData extends WalkerOS.Properties {\n isStart: boolean;\n storage: boolean;\n id?: string;\n start?: number;\n marketing?: true;\n updated?: number;\n isNew?: boolean;\n device?: string;\n count?: number;\n runs?: number;\n}\n\nexport interface Sources {\n [id: string]: Source.Instance;\n}\n\nexport interface Destinations {\n [id: string]: Destination.Instance;\n}\n\nexport type CommandType =\n | 'action'\n | 'config'\n | 'consent'\n | 'context'\n | 'destination'\n | 'elb'\n | 'globals'\n | 'hook'\n | 'init'\n | 'link'\n | 'run'\n | 'user'\n | 'walker'\n | string;\n\n/**\n * Context passed to collector.push for source mapping\n */\nexport interface PushContext {\n mapping?: Mapping.Config;\n}\n\n/**\n * Push function signature - handles events only\n */\nexport interface PushFn {\n (\n event: WalkerOS.DeepPartialEvent,\n context?: PushContext,\n ): Promise<ElbTypes.PushResult>;\n}\n\n/**\n * Command function signature - handles walker commands only\n */\nexport interface CommandFn {\n (command: 'config', config: Partial<Config>): Promise<ElbTypes.PushResult>;\n (command: 'consent', consent: WalkerOS.Consent): Promise<ElbTypes.PushResult>;\n <T extends Destination.Types>(\n command: 'destination',\n destination: Destination.Init<T> | Destination.Instance<T>,\n config?: Destination.Config<T>,\n ): Promise<ElbTypes.PushResult>;\n <K extends keyof Hooks.Functions>(\n command: 'hook',\n name: K,\n hookFn: Hooks.Functions[K],\n ): Promise<ElbTypes.PushResult>;\n (\n command: 'on',\n type: On.Types,\n rules: WalkerOS.SingleOrArray<On.Options>,\n ): Promise<ElbTypes.PushResult>;\n (command: 'user', user: WalkerOS.User): Promise<ElbTypes.PushResult>;\n (\n command: 'run',\n runState?: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n custom?: WalkerOS.Properties;\n },\n ): Promise<ElbTypes.PushResult>;\n (\n command: string,\n data?: unknown,\n options?: unknown,\n ): Promise<ElbTypes.PushResult>;\n}\n\n// Main Collector interface\nexport interface Instance {\n push: PushFn;\n command: CommandFn;\n allowed: boolean;\n config: Config;\n consent: WalkerOS.Consent;\n count: number;\n custom: WalkerOS.Properties;\n sources: Sources;\n destinations: Destinations;\n globals: WalkerOS.Properties;\n group: string;\n hooks: Hooks.Functions;\n logger: Logger.Instance;\n on: On.OnConfig;\n queue: WalkerOS.Events;\n round: number;\n session: undefined | SessionData;\n timing: number;\n user: WalkerOS.User;\n version: string;\n}\n","import type { WalkerOS } from '.';\n\nexport interface Contract {\n version: string;\n globals: Globals;\n context: Contexts;\n entities: Entities;\n // @TODO data as ref\n}\n\nexport interface Globals {\n [name: string]: Global;\n}\n\nexport interface Contexts {\n [name: string]: Context;\n}\n\nexport interface Entities {\n [name: string]: Entity;\n}\n\nexport interface Properties {\n [name: string]: Property;\n}\n\nexport interface Global extends Property {}\n\nexport interface Context extends Property {}\n\nexport interface Entity {\n data: Properties;\n actions: Actions;\n}\n\nexport interface Actions {\n [name: string]: Action;\n}\n\nexport interface Action {\n trigger?: Trigger;\n}\n\nexport type Trigger = string; // @TODO Move to web data contract\n\nexport interface Property {\n type?: PropertyType; // @TODO support multiple\n required?: boolean;\n values?: PropertyValues;\n}\n\nexport type PropertyType = 'boolean' | 'string' | 'number';\n\nexport type PropertyValues = Array<WalkerOS.Property>;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Collector,\n Logger,\n Mapping as WalkerOSMapping,\n On,\n WalkerOS,\n} from '.';\n\n/**\n * Base environment requirements interface for walkerOS destinations\n *\n * This defines the core interface that destinations can use to declare\n * their runtime environment requirements. Platform-specific extensions\n * should extend this interface.\n */\nexport interface BaseEnv {\n /**\n * Generic global properties that destinations may require\n * Platform-specific implementations can extend this interface\n */\n [key: string]: unknown;\n}\n\n/**\n * Type bundle for destination generics.\n * Groups Settings, InitSettings, Mapping, and Env into a single type parameter.\n */\nexport interface Types<S = unknown, M = unknown, E = BaseEnv, I = S> {\n settings: S;\n initSettings: I;\n mapping: M;\n env: E;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n mapping: any;\n env: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Mapping<T extends TypesGeneric = Types> = T['mapping'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\n\n/**\n * Inference helper: Extract Types from Instance\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n config: Config<T>;\n queue?: WalkerOS.Events;\n dlq?: DLQ;\n type?: string;\n env?: Env<T>;\n init?: InitFn<T>;\n push: PushFn<T>;\n pushBatch?: PushBatchFn<T>;\n on?: On.OnFn;\n}\n\nexport interface Config<T extends TypesGeneric = Types> {\n consent?: WalkerOS.Consent;\n settings?: InitSettings<T>;\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n env?: Env<T>;\n id?: string;\n init?: boolean;\n loadScript?: boolean;\n logger?: Logger.Config;\n mapping?: WalkerOSMapping.Rules<WalkerOSMapping.Rule<Mapping<T>>>;\n policy?: Policy;\n queue?: boolean;\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Partial<Mapping<T>> | Mapping<T>,\n Env<T>\n >\n>;\n\nexport interface Policy {\n [key: string]: WalkerOSMapping.Value;\n}\n\nexport type Init<T extends TypesGeneric = Types> = {\n code: Instance<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n};\n\nexport interface InitDestinations {\n [key: string]: Init<any>;\n}\n\nexport interface Destinations {\n [key: string]: Instance;\n}\n\nexport interface Context<T extends TypesGeneric = Types> {\n collector: Collector.Instance;\n config: Config<T>;\n data?: Data;\n env: Env<T>;\n logger: Logger.Instance;\n}\n\nexport interface InitContext<T extends TypesGeneric = Types> {\n collector: Collector.Instance;\n config: Config<Types<Partial<Settings<T>>, Mapping<T>, Env<T>>>;\n data?: Data;\n env: Env<T>;\n logger: Logger.Instance;\n}\n\nexport interface PushContext<T extends TypesGeneric = Types>\n extends Context<T> {\n mapping?: WalkerOSMapping.Rule<Mapping<T>>;\n}\n\nexport interface PushBatchContext<T extends TypesGeneric = Types>\n extends Context<T> {\n mapping?: WalkerOSMapping.Rule<Mapping<T>>;\n}\n\nexport type InitFn<T extends TypesGeneric = Types> = (\n context: InitContext<T>,\n) => WalkerOS.PromiseOrValue<void | false | Config<T>>;\n\nexport type PushFn<T extends TypesGeneric = Types> = (\n event: WalkerOS.Event,\n context: PushContext<T>,\n) => WalkerOS.PromiseOrValue<void>;\n\nexport type PushBatchFn<T extends TypesGeneric = Types> = (\n batch: Batch<Mapping<T>>,\n context: PushBatchContext<T>,\n) => void;\n\nexport type PushEvent<Mapping = unknown> = {\n event: WalkerOS.Event;\n mapping?: WalkerOSMapping.Rule<Mapping>;\n};\nexport type PushEvents<Mapping = unknown> = Array<PushEvent<Mapping>>;\n\nexport interface Batch<Mapping> {\n key: string;\n events: WalkerOS.Events;\n data: Array<Data>;\n mapping?: WalkerOSMapping.Rule<Mapping>;\n}\n\nexport type Data =\n | WalkerOS.Property\n | undefined\n | Array<WalkerOS.Property | undefined>;\n\nexport type Ref = {\n id: string;\n destination: Instance;\n};\n\nexport type Push = {\n queue?: WalkerOS.Events;\n error?: unknown;\n};\n\nexport type DLQ = Array<[WalkerOS.Event, unknown]>;\n\nexport type Result = {\n successful: Array<Ref>;\n queued: Array<Ref>;\n failed: Array<Ref>;\n};\n","import type { Destination, Hooks, On, WalkerOS } from '.';\n\n// Event signatures only\nexport interface EventFn<R = Promise<PushResult>> {\n (partialEvent: WalkerOS.DeepPartialEvent): R;\n (event: string): R;\n (event: string, data: WalkerOS.Properties): R;\n}\n\n// Complete function interface - can be extended by other interfaces\nexport interface Fn<R = Promise<PushResult>, Config = unknown>\n extends EventFn<R>,\n WalkerCommands<R, Config> {\n // Interface intentionally empty - combines EventFn and WalkerCommands\n}\n\n// Walker commands (clear, predefined list)\nexport interface WalkerCommands<R = Promise<PushResult>, Config = unknown> {\n (event: 'walker config', config: Partial<Config>): R;\n (event: 'walker consent', consent: WalkerOS.Consent): R;\n <T extends Destination.Types>(\n event: 'walker destination',\n destination: Destination.Init<T> | Destination.Instance<T>,\n config?: Destination.Config<T>,\n ): R;\n <K extends keyof Hooks.Functions>(\n event: 'walker hook',\n name: K,\n hookFn: Hooks.Functions[K],\n ): R;\n (\n event: 'walker on',\n type: On.Types,\n rules: WalkerOS.SingleOrArray<On.Options>,\n ): R;\n (event: 'walker user', user: WalkerOS.User): R;\n (\n event: 'walker run',\n runState: {\n consent?: WalkerOS.Consent;\n user?: WalkerOS.User;\n globals?: WalkerOS.Properties;\n custom?: WalkerOS.Properties;\n },\n ): R;\n}\n\nexport type Event<R = Promise<PushResult>> = (\n partialEvent: WalkerOS.DeepPartialEvent,\n) => R;\n\n// Simplified push data types for core collector\nexport type PushData<Config = unknown> =\n | WalkerOS.DeepPartial<Config>\n | WalkerOS.Consent\n | WalkerOS.User\n | WalkerOS.Properties;\n\nexport interface PushResult extends Destination.Result {\n event?: WalkerOS.Event;\n ok: boolean;\n}\n\n// Simplified Layer type for core collector\nexport type Layer = Array<IArguments | WalkerOS.DeepPartialEvent | unknown[]>;\n","/**\n * Flow Configuration System\n *\n * Core types for walkerOS unified configuration.\n * Platform-agnostic, runtime-focused.\n *\n * The Flow system enables \"one config to rule them all\" - a single\n * walkeros.config.json file that manages multiple flows\n * (web_prod, web_stage, server_prod, etc.) with shared configuration,\n * variables, and reusable definitions.\n *\n * @packageDocumentation\n */\n\nimport type { Source, Destination, Collector } from '.';\n\n/**\n * Primitive value types for variables\n */\nexport type Primitive = string | number | boolean;\n\n/**\n * Variables record type for interpolation.\n * Used at Setup, Config, Source, and Destination levels.\n */\nexport type Variables = Record<string, Primitive>;\n\n/**\n * Definitions record type for reusable configurations.\n * Used at Setup, Config, Source, and Destination levels.\n */\nexport type Definitions = Record<string, unknown>;\n\n/**\n * Packages configuration for build.\n */\nexport type Packages = Record<\n string,\n {\n version?: string;\n imports?: string[];\n path?: string; // Local path to package directory (takes precedence over version)\n }\n>;\n\n/**\n * Web platform configuration.\n *\n * @remarks\n * Presence of this key indicates web platform (browser-based tracking).\n * Builds to IIFE format, ES2020 target, browser platform.\n */\nexport interface Web {\n /**\n * Window property name for collector instance.\n * @default \"collector\"\n */\n windowCollector?: string;\n\n /**\n * Window property name for elb function.\n * @default \"elb\"\n */\n windowElb?: string;\n}\n\n/**\n * Server platform configuration.\n *\n * @remarks\n * Presence of this key indicates server platform (Node.js).\n * Builds to ESM format, Node18 target, node platform.\n * Reserved for future server-specific options.\n */\nexport interface Server {\n // Reserved for future server-specific options\n}\n\n/**\n * Complete multi-flow configuration.\n * Root type for walkeros.config.json files.\n *\n * @remarks\n * If only one flow exists, it's auto-selected without --flow flag.\n * Convention: use \"default\" as the flow name for single-flow configs.\n *\n * @example\n * ```json\n * {\n * \"version\": 1,\n * \"$schema\": \"https://walkeros.io/schema/flow/v1.json\",\n * \"variables\": { \"CURRENCY\": \"USD\" },\n * \"flows\": {\n * \"default\": { \"web\": {}, ... }\n * }\n * }\n * ```\n */\nexport interface Setup {\n /**\n * Configuration schema version.\n */\n version: 1;\n\n /**\n * JSON Schema reference for IDE validation.\n * @example \"https://walkeros.io/schema/flow/v1.json\"\n */\n $schema?: string;\n\n /**\n * Folders to include in the bundle output.\n * These folders are copied to dist/ during bundle, making them available\n * at runtime for both local and Docker execution.\n *\n * @remarks\n * Use for credential files, configuration, or other runtime assets.\n * Paths are relative to the config file location.\n * Default: `[\"./shared\"]` if the folder exists, otherwise `[]`.\n *\n * @example\n * ```json\n * {\n * \"include\": [\"./credentials\", \"./config\"]\n * }\n * ```\n */\n include?: string[];\n\n /**\n * Shared variables for interpolation.\n * Resolution: process.env > Config.variables > Setup.variables > inline default\n * Syntax: ${VAR_NAME} or ${VAR_NAME:default}\n */\n variables?: Variables;\n\n /**\n * Reusable configuration definitions.\n * Referenced via JSON Schema $ref syntax: { \"$ref\": \"#/definitions/name\" }\n */\n definitions?: Definitions;\n\n /**\n * Named flow configurations.\n * If only one flow exists, it's auto-selected.\n */\n flows: Record<string, Config>;\n}\n\n/**\n * Single flow configuration.\n * Represents one deployment target (e.g., web_prod, server_stage).\n *\n * @remarks\n * Platform is determined by presence of `web` or `server` key.\n * Exactly one must be present.\n *\n * Variables/definitions cascade: source/destination > config > setup\n */\nexport interface Config {\n /**\n * Web platform configuration.\n * Presence indicates web platform (browser-based tracking).\n * Mutually exclusive with `server`.\n */\n web?: Web;\n\n /**\n * Server platform configuration.\n * Presence indicates server platform (Node.js).\n * Mutually exclusive with `web`.\n */\n server?: Server;\n\n /**\n * Source configurations (data capture).\n *\n * @remarks\n * Sources capture events from various origins:\n * - Browser DOM interactions (clicks, page views)\n * - DataLayer pushes\n * - HTTP requests (server-side)\n * - Cloud function triggers\n *\n * Key = unique source identifier (arbitrary)\n * Value = source reference with package and config\n *\n * @example\n * ```json\n * {\n * \"sources\": {\n * \"browser\": {\n * \"package\": \"@walkeros/web-source-browser\",\n * \"config\": {\n * \"settings\": {\n * \"pageview\": true,\n * \"session\": true\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n sources?: Record<string, SourceReference>;\n\n /**\n * Destination configurations (data output).\n *\n * @remarks\n * Destinations send processed events to external services:\n * - Google Analytics (gtag)\n * - Meta Pixel (fbq)\n * - Custom APIs\n * - Data warehouses\n *\n * Key = unique destination identifier (arbitrary)\n * Value = destination reference with package and config\n *\n * @example\n * ```json\n * {\n * \"destinations\": {\n * \"gtag\": {\n * \"package\": \"@walkeros/web-destination-gtag\",\n * \"config\": {\n * \"settings\": {\n * \"ga4\": { \"measurementId\": \"G-XXXXXXXXXX\" }\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n destinations?: Record<string, DestinationReference>;\n\n /**\n * Collector configuration (event processing).\n *\n * @remarks\n * The collector is the central event processing engine.\n * Configuration includes:\n * - Consent management\n * - Global properties\n * - User identification\n * - Processing rules\n *\n * @see {@link Collector.InitConfig} for complete options\n *\n * @example\n * ```json\n * {\n * \"collector\": {\n * \"run\": true,\n * \"tagging\": 1,\n * \"consent\": {\n * \"functional\": true,\n * \"marketing\": false\n * },\n * \"globals\": {\n * \"currency\": \"USD\",\n * \"environment\": \"production\"\n * }\n * }\n * }\n * ```\n */\n collector?: Collector.InitConfig;\n\n /**\n * NPM packages to bundle.\n */\n packages?: Packages;\n\n /**\n * Flow-level variables.\n * Override Setup.variables, overridden by source/destination variables.\n */\n variables?: Variables;\n\n /**\n * Flow-level definitions.\n * Extend Setup.definitions, overridden by source/destination definitions.\n */\n definitions?: Definitions;\n}\n\n/**\n * Source reference with inline package syntax.\n *\n * @remarks\n * References a source package and provides configuration.\n * The package is automatically downloaded and imported during build.\n */\nexport interface SourceReference {\n /**\n * Package specifier with optional version.\n *\n * @remarks\n * Formats:\n * - `\"@walkeros/web-source-browser\"` - Latest version\n * - `\"@walkeros/web-source-browser@2.0.0\"` - Specific version\n * - `\"@walkeros/web-source-browser@^2.0.0\"` - Semver range\n *\n * The CLI will:\n * 1. Parse the package reference\n * 2. Download from npm\n * 3. Auto-detect default or named export\n * 4. Generate import statement\n *\n * @example\n * \"package\": \"@walkeros/web-source-browser@latest\"\n */\n package: string;\n\n /**\n * Resolved import variable name.\n *\n * @remarks\n * Auto-resolved from packages[package].imports[0] during getFlowConfig().\n * Can also be provided explicitly for advanced use cases.\n */\n code?: string;\n\n /**\n * Source-specific configuration.\n *\n * @remarks\n * Structure depends on the source package.\n * Passed to the source's initialization function.\n *\n * @example\n * ```json\n * {\n * \"config\": {\n * \"settings\": {\n * \"pageview\": true,\n * \"session\": true,\n * \"elb\": \"elb\",\n * \"prefix\": \"data-elb\"\n * }\n * }\n * }\n * ```\n */\n config?: unknown;\n\n /**\n * Source environment configuration.\n *\n * @remarks\n * Environment-specific settings for the source.\n * Merged with default source environment.\n */\n env?: unknown;\n\n /**\n * Mark as primary source (provides main ELB).\n *\n * @remarks\n * The primary source's ELB function is returned by `startFlow()`.\n * Only one source should be marked as primary per flow.\n *\n * @default false\n */\n primary?: boolean;\n\n /**\n * Source-level variables (highest priority in cascade).\n * Overrides flow and setup variables.\n */\n variables?: Variables;\n\n /**\n * Source-level definitions (highest priority in cascade).\n * Overrides flow and setup definitions.\n */\n definitions?: Definitions;\n}\n\n/**\n * Destination reference with inline package syntax.\n *\n * @remarks\n * References a destination package and provides configuration.\n * Structure mirrors SourceReference for consistency.\n */\nexport interface DestinationReference {\n /**\n * Package specifier with optional version.\n *\n * @remarks\n * Same format as SourceReference.package\n *\n * @example\n * \"package\": \"@walkeros/web-destination-gtag@2.0.0\"\n */\n package: string;\n\n /**\n * Resolved import variable name.\n *\n * @remarks\n * Auto-resolved from packages[package].imports[0] during getFlowConfig().\n * Can also be provided explicitly for advanced use cases.\n */\n code?: string;\n\n /**\n * Destination-specific configuration.\n *\n * @remarks\n * Structure depends on the destination package.\n * Typically includes:\n * - settings: API keys, IDs, endpoints\n * - mapping: Event transformation rules\n * - consent: Required consent states\n * - policy: Processing rules\n *\n * @example\n * ```json\n * {\n * \"config\": {\n * \"settings\": {\n * \"ga4\": {\n * \"measurementId\": \"G-XXXXXXXXXX\"\n * }\n * },\n * \"mapping\": {\n * \"page\": {\n * \"view\": {\n * \"name\": \"page_view\",\n * \"data\": { ... }\n * }\n * }\n * }\n * }\n * }\n * ```\n */\n config?: unknown;\n\n /**\n * Destination environment configuration.\n *\n * @remarks\n * Environment-specific settings for the destination.\n * Merged with default destination environment.\n */\n env?: unknown;\n\n /**\n * Destination-level variables (highest priority in cascade).\n * Overrides flow and setup variables.\n */\n variables?: Variables;\n\n /**\n * Destination-level definitions (highest priority in cascade).\n * Overrides flow and setup definitions.\n */\n definitions?: Definitions;\n}\n","// Define a generic type for functions with specific parameters and return type\nexport type AnyFunction<P extends unknown[] = never[], R = unknown> = (\n ...args: P\n) => R;\n\n// Define a generic type for a dictionary of functions\nexport type Functions = {\n [key: string]: AnyFunction;\n};\n\n// Define a parameter interface to wrap the function and its result\ninterface Parameter<P extends unknown[], R> {\n fn: (...args: P) => R;\n result?: R;\n}\n\n// Define the HookFn type using generics for better type safety\nexport type HookFn<T extends AnyFunction> = (\n params: Parameter<Parameters<T>, ReturnType<T>>,\n ...args: Parameters<T>\n) => ReturnType<T>;\n","/**\n * Log levels from most to least severe\n */\nexport enum Level {\n ERROR = 0,\n INFO = 1,\n DEBUG = 2,\n}\n\n/**\n * Normalized error context extracted from Error objects\n */\nexport interface ErrorContext {\n message: string;\n name: string;\n stack?: string;\n cause?: unknown;\n}\n\n/**\n * Context passed to log handlers\n * If an Error was passed, it's normalized into the error property\n */\nexport interface LogContext {\n [key: string]: unknown;\n error?: ErrorContext;\n}\n\n/**\n * Log message function signature\n * Accepts string or Error as message, with optional context\n */\nexport type LogFn = (\n message: string | Error,\n context?: unknown | Error,\n) => void;\n\n/**\n * Throw function signature - logs error then throws\n * Returns never as it always throws\n */\nexport type ThrowFn = (message: string | Error, context?: unknown) => never;\n\n/**\n * Default handler function (passed to custom handlers for chaining)\n */\nexport type DefaultHandler = (\n level: Level,\n message: string,\n context: LogContext,\n scope: string[],\n) => void;\n\n/**\n * Custom log handler function\n * Receives originalHandler to allow middleware-style chaining\n */\nexport type Handler = (\n level: Level,\n message: string,\n context: LogContext,\n scope: string[],\n originalHandler: DefaultHandler,\n) => void;\n\n/**\n * Logger instance with scoping support\n * All logs automatically include trace path from scoping\n */\nexport interface Instance {\n /**\n * Log an error message (always visible unless silenced)\n */\n error: LogFn;\n\n /**\n * Log an informational message\n */\n info: LogFn;\n\n /**\n * Log a debug message\n */\n debug: LogFn;\n\n /**\n * Log an error message and throw an Error\n * Combines logging and throwing in one call\n */\n throw: ThrowFn;\n\n /**\n * Create a scoped child logger with automatic trace path\n * @param name - Scope name (e.g., destination type, destination key)\n * @returns A new logger instance with the scope applied\n */\n scope: (name: string) => Instance;\n}\n\n/**\n * Logger configuration options\n */\nexport interface Config {\n /**\n * Minimum log level to display\n * @default Level.ERROR\n */\n level?: Level | keyof typeof Level;\n\n /**\n * Custom log handler function\n * Receives originalHandler to preserve default behavior\n */\n handler?: Handler;\n}\n\n/**\n * Internal config with resolved values and scope\n */\nexport interface InternalConfig {\n level: Level;\n handler?: Handler;\n scope: string[];\n}\n\n/**\n * Logger factory function type\n */\nexport type Factory = (config?: Config) => Instance;\n","import type { Collector, Destination, WalkerOS } from '.';\n\n/**\n * Shared mapping configuration interface.\n * Used by both Source.Config and Destination.Config.\n */\nexport interface Config<T = unknown> {\n consent?: WalkerOS.Consent; // Required consent to process events\n data?: Value | Values; // Global data transformation\n mapping?: Rules<Rule<T>>; // Event-specific mapping rules\n policy?: Policy; // Pre-processing rules\n}\n\nexport interface Policy {\n [key: string]: Value;\n}\n\nexport interface Rules<T = Rule> {\n [entity: string]: Record<string, T | Array<T>> | undefined;\n}\n\nexport interface Rule<Settings = unknown> {\n batch?: number; // Bundle events for batch processing\n batchFn?: (\n destination: Destination.Instance,\n collector: Collector.Instance,\n ) => void;\n batched?: Destination.Batch<Settings>; // Batch of events to be processed\n condition?: Condition; // Added condition\n consent?: WalkerOS.Consent; // Required consent states process the event\n settings?: Settings; // Arbitrary but protected configurations for custom event config\n data?: Data; // Mapping of event data\n ignore?: boolean; // Choose to no process an event when set to true\n name?: string; // Use a custom event name\n policy?: Policy; // Event-level policy applied after config-level policy\n}\n\nexport interface Result {\n eventMapping?: Rule;\n mappingKey?: string;\n}\n\nexport type Data = Value | Values;\nexport type Value = ValueType | Array<ValueType>;\nexport type Values = Array<Value>;\nexport type ValueType = string | ValueConfig;\n\nexport interface ValueConfig {\n condition?: Condition;\n consent?: WalkerOS.Consent;\n fn?: Fn;\n key?: string;\n loop?: Loop;\n map?: Map;\n set?: Value[];\n validate?: Validate;\n value?: WalkerOS.PropertyType;\n}\n\nexport type Condition = (\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping?: Value,\n collector?: Collector.Instance,\n) => WalkerOS.PromiseOrValue<boolean>;\n\nexport type Fn = (\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping: Value,\n options: Options,\n) => WalkerOS.PromiseOrValue<WalkerOS.Property | unknown>;\n\nexport type Loop = [Value, Value];\n\nexport type Map = { [key: string]: Value };\n\nexport interface Options {\n consent?: WalkerOS.Consent;\n collector?: Collector.Instance;\n props?: unknown;\n}\n\nexport type Validate = (value?: unknown) => WalkerOS.PromiseOrValue<boolean>;\n","import type { Collector, WalkerOS } from './';\n\n// collector state for the on actions\nexport type Config = {\n consent?: Array<ConsentConfig>;\n ready?: Array<ReadyConfig>;\n run?: Array<RunConfig>;\n session?: Array<SessionConfig>;\n};\n\n// On types\nexport type Types = keyof Config;\n\n// Map each event type to its expected context type\nexport interface EventContextMap {\n consent: WalkerOS.Consent;\n session: Collector.SessionData;\n ready: undefined;\n run: undefined;\n}\n\n// Extract the context type for a specific event\nexport type EventContext<T extends Types> = EventContextMap[T];\n\n// Union of all possible context types\nexport type AnyEventContext = EventContextMap[keyof EventContextMap];\n\n// Legacy context interface (can be removed in future)\nexport interface Context {\n consent?: WalkerOS.Consent;\n session?: unknown;\n}\n\n// Parameters for the onAction function calls\nexport type Options = ConsentConfig | ReadyConfig | RunConfig | SessionConfig;\n\n// Consent\nexport interface ConsentConfig {\n [key: string]: ConsentFn;\n}\nexport type ConsentFn = (\n collector: Collector.Instance,\n consent: WalkerOS.Consent,\n) => void;\n\n// Ready\nexport type ReadyConfig = ReadyFn;\nexport type ReadyFn = (collector: Collector.Instance) => void;\n\n// Run\nexport type RunConfig = RunFn;\nexport type RunFn = (collector: Collector.Instance) => void;\n\n// Session\nexport type SessionConfig = SessionFn;\nexport type SessionFn = (\n collector: Collector.Instance,\n session?: unknown,\n) => void;\n\nexport interface OnConfig {\n consent?: ConsentConfig[];\n ready?: ReadyConfig[];\n run?: RunConfig[];\n session?: SessionConfig[];\n [key: string]:\n | ConsentConfig[]\n | ReadyConfig[]\n | RunConfig[]\n | SessionConfig[]\n | undefined;\n}\n\n// Destination on function type with automatic type inference\nexport type OnFn = <T extends Types>(\n event: T,\n context: EventContextMap[T],\n) => WalkerOS.PromiseOrValue<void>;\n\n// Runtime-compatible version for internal usage\nexport type OnFnRuntime = (\n event: Types,\n context: AnyEventContext,\n) => WalkerOS.PromiseOrValue<void>;\n","export interface Context {\n city?: string;\n country?: string;\n encoding?: string;\n hash?: string;\n ip?: string;\n language?: string;\n origin?: string;\n region?: string;\n userAgent?: string;\n [key: string]: string | undefined;\n}\n","import type { WalkerOS } from '.';\n\nexport type Contracts = Array<Contract>;\n\nexport type Contract = {\n [entity: string]: {\n [action: string]: Properties;\n };\n};\n\nexport type Properties = {\n [key: string]: Property | undefined;\n};\n\nexport type Property = {\n allowedKeys?: string[];\n allowedValues?: unknown[];\n // @TODO minLength?: number;\n maxLength?: number;\n max?: number;\n min?: number;\n required?: boolean;\n schema?: Properties;\n strict?: boolean;\n type?: string;\n validate?: (\n value: unknown,\n key: string,\n event: WalkerOS.AnyObject,\n ) => WalkerOS.Property;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Elb,\n On,\n Logger,\n Mapping as WalkerOSMapping,\n Collector,\n} from './index';\n\n/**\n * Base Env interface for dependency injection into sources.\n *\n * Sources receive all their dependencies through this environment object,\n * making them platform-agnostic and easily testable.\n */\nexport interface BaseEnv {\n [key: string]: unknown;\n push: Collector.PushFn;\n command: Collector.CommandFn;\n sources?: Collector.Sources;\n elb: Elb.Fn;\n logger: Logger.Instance;\n}\n\n/**\n * Type bundle for source generics.\n * Groups Settings, Mapping, Push, Env, and InitSettings into a single type parameter.\n *\n * @template S - Settings configuration type\n * @template M - Mapping configuration type\n * @template P - Push function signature (flexible to support HTTP handlers, etc.)\n * @template E - Environment dependencies type\n * @template I - InitSettings configuration type (user input)\n */\nexport interface Types<\n S = unknown,\n M = unknown,\n P = Elb.Fn,\n E = BaseEnv,\n I = S,\n> {\n settings: S;\n initSettings: I;\n mapping: M;\n push: P;\n env: E;\n}\n\n/**\n * Generic constraint for Types - ensures T has required properties for indexed access\n */\nexport type TypesGeneric = {\n settings: any;\n initSettings: any;\n mapping: any;\n push: any;\n env: any;\n};\n\n/**\n * Type extractors for consistent usage with Types bundle\n */\nexport type Settings<T extends TypesGeneric = Types> = T['settings'];\nexport type InitSettings<T extends TypesGeneric = Types> = T['initSettings'];\nexport type Mapping<T extends TypesGeneric = Types> = T['mapping'];\nexport type Push<T extends TypesGeneric = Types> = T['push'];\nexport type Env<T extends TypesGeneric = Types> = T['env'];\n\n/**\n * Inference helper: Extract Types from Instance\n */\nexport type TypesOf<I> = I extends Instance<infer T> ? T : never;\n\nexport interface Config<T extends TypesGeneric = Types>\n extends WalkerOSMapping.Config<Mapping<T>> {\n settings?: InitSettings<T>;\n env?: Env<T>;\n id?: string;\n logger?: Logger.Config;\n disabled?: boolean;\n primary?: boolean;\n}\n\nexport type PartialConfig<T extends TypesGeneric = Types> = Config<\n Types<\n Partial<Settings<T>> | Settings<T>,\n Partial<Mapping<T>> | Mapping<T>,\n Push<T>,\n Env<T>\n >\n>;\n\nexport interface Instance<T extends TypesGeneric = Types> {\n type: string;\n config: Config<T>;\n push: Push<T>;\n destroy?(): void | Promise<void>;\n on?(event: On.Types, context?: unknown): void | Promise<void>;\n}\n\nexport type Init<T extends TypesGeneric = Types> = (\n config: Partial<Config<T>>,\n env: Env<T>,\n) => Instance<T> | Promise<Instance<T>>;\n\nexport type InitSource<T extends TypesGeneric = Types> = {\n code: Init<T>;\n config?: Partial<Config<T>>;\n env?: Partial<Env<T>>;\n primary?: boolean;\n};\n\n/**\n * Sources configuration for collector.\n * Maps source IDs to their initialization configurations.\n */\nexport interface InitSources {\n [sourceId: string]: InitSource<any>;\n}\n","import type { Elb as ElbTypes } from '.';\n\nexport type AnyObject<T = unknown> = Record<string, T>;\nexport type Elb = ElbTypes.Fn;\nexport type AnyFunction = (...args: unknown[]) => unknown;\nexport type SingleOrArray<T> = T | Array<T>;\n\nexport type Events = Array<Event>;\nexport type PartialEvent = Partial<Event>;\nexport type DeepPartialEvent = DeepPartial<Event>;\nexport interface Event {\n name: string;\n data: Properties;\n context: OrderedProperties;\n globals: Properties;\n custom: Properties;\n user: User;\n nested: Entities;\n consent: Consent;\n id: string;\n trigger: string;\n entity: string;\n action: string;\n timestamp: number;\n timing: number;\n group: string;\n count: number;\n version: Version;\n source: Source;\n}\n\nexport interface Consent {\n [name: string]: boolean; // name of consent group or tool\n}\n\nexport interface User extends Properties {\n // IDs\n id?: string;\n device?: string;\n session?: string;\n hash?: string;\n // User related\n address?: string;\n email?: string;\n phone?: string;\n userAgent?: string;\n browser?: string;\n browserVersion?: string;\n deviceType?: string;\n language?: string;\n country?: string;\n region?: string;\n city?: string;\n zip?: string;\n timezone?: string;\n os?: string;\n osVersion?: string;\n screenSize?: string;\n ip?: string;\n internal?: boolean;\n}\n\nexport interface Version extends Properties {\n source: string;\n tagging: number;\n}\n\nexport interface Source extends Properties {\n type: SourceType;\n id: string; // https://github.com/elbwalker/walkerOS\n previous_id: string; // https://www.elbwalker.com/\n}\n\nexport type SourceType = 'web' | 'server' | 'app' | 'other' | string;\n\nexport type PropertyType =\n | boolean\n | string\n | number\n | { [key: string]: Property };\n\nexport type Property = PropertyType | Array<PropertyType>;\n\nexport interface Properties {\n [key: string]: Property | undefined;\n}\nexport interface OrderedProperties {\n [key: string]: [Property, number] | undefined;\n}\n\nexport type Entities = Array<Entity>;\nexport interface Entity {\n entity: string;\n data: Properties;\n nested: Entities;\n context: OrderedProperties;\n}\n\nexport type ConsentHandler = Record<string, AnyFunction>;\nexport type ActionHandler = AnyFunction;\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type PromiseOrValue<T> = T | Promise<T>;\n","export type StorageType = 'local' | 'session' | 'cookie';\n\nexport const Storage = {\n Local: 'local' as const,\n Session: 'session' as const,\n Cookie: 'cookie' as const,\n} as const;\n\nexport const Const = {\n Utils: {\n Storage,\n },\n} as const;\n","/**\n * Anonymizes an IPv4 address by setting the last octet to 0.\n *\n * @param ip The IP address to anonymize.\n * @returns The anonymized IP address or an empty string if the IP is invalid.\n */\nexport 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","/**\n * Flow Configuration Utilities\n *\n * Functions for resolving and processing Flow configurations.\n *\n * @packageDocumentation\n */\n\nimport type { Flow } from './types';\n\n/**\n * Merge variables with cascade priority.\n * Later arguments have higher priority.\n */\nfunction mergeVariables(\n ...sources: (Flow.Variables | undefined)[]\n): Flow.Variables {\n const result: Flow.Variables = {};\n for (const source of sources) {\n if (source) {\n Object.assign(result, source);\n }\n }\n return result;\n}\n\n/**\n * Merge definitions with cascade priority.\n * Later arguments have higher priority.\n */\nfunction mergeDefinitions(\n ...sources: (Flow.Definitions | undefined)[]\n): Flow.Definitions {\n const result: Flow.Definitions = {};\n for (const source of sources) {\n if (source) {\n Object.assign(result, source);\n }\n }\n return result;\n}\n\n/**\n * Interpolate variables in a value.\n * Syntax: ${VAR_NAME} or ${VAR_NAME:default}\n */\nfunction interpolateVariables(\n value: unknown,\n variables: Flow.Variables,\n): unknown {\n if (typeof value === 'string') {\n return value.replace(\n /\\$\\{([^}:]+)(?::([^}]*))?\\}/g,\n (match, name, defaultValue) => {\n // Check process.env first\n if (\n typeof process !== 'undefined' &&\n process.env?.[name] !== undefined\n ) {\n return process.env[name]!;\n }\n // Then check variables\n if (variables[name] !== undefined) {\n return String(variables[name]);\n }\n // Use default if provided\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n // Throw for required variable\n throw new Error(`Variable \"${name}\" not found and no default provided`);\n },\n );\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => interpolateVariables(item, variables));\n }\n\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = interpolateVariables(val, variables);\n }\n return result;\n }\n\n return value;\n}\n\n/**\n * Resolve code from package reference.\n * Looks up the import name from the packages configuration.\n */\nfunction resolveCodeFromPackage(\n packageName: string | undefined,\n existingCode: string | undefined,\n packages: Flow.Packages | undefined,\n): string | undefined {\n // If code already exists, preserve it\n if (existingCode) return existingCode;\n\n // If no package or packages config, nothing to resolve\n if (!packageName || !packages) return undefined;\n\n // Look up the package in packages config\n const pkgConfig = packages[packageName];\n if (pkgConfig?.imports?.[0]) {\n return pkgConfig.imports[0];\n }\n\n return undefined;\n}\n\n/**\n * Resolve $ref references in a value.\n */\nfunction resolveRefs(value: unknown, definitions: Flow.Definitions): unknown {\n if (value !== null && typeof value === 'object') {\n // Check if this is a $ref object\n if (\n '$ref' in value &&\n typeof (value as Record<string, unknown>).$ref === 'string'\n ) {\n const ref = (value as Record<string, unknown>).$ref as string;\n const match = ref.match(/^#\\/definitions\\/(.+)$/);\n if (match) {\n const defName = match[1];\n if (definitions[defName] === undefined) {\n throw new Error(`Definition \"${defName}\" not found`);\n }\n return resolveRefs(definitions[defName], definitions);\n }\n throw new Error(`Invalid $ref format: ${ref}`);\n }\n\n // Recursively process object\n if (Array.isArray(value)) {\n return value.map((item) => resolveRefs(item, definitions));\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = resolveRefs(val, definitions);\n }\n return result;\n }\n\n return value;\n}\n\n/**\n * Get resolved flow configuration for a named flow.\n *\n * @param setup - The complete setup configuration\n * @param flowName - Flow name (auto-selected if only one exists)\n * @returns Resolved Config with variables/definitions interpolated and $refs resolved\n * @throws Error if flow selection is required but not specified, or flow not found\n *\n * @example\n * ```typescript\n * import { getFlowConfig } from '@walkeros/core';\n *\n * const setup = JSON.parse(fs.readFileSync('walkeros.config.json', 'utf8'));\n *\n * // Auto-select if only one flow\n * const config = getFlowConfig(setup);\n *\n * // Or specify flow\n * const prodConfig = getFlowConfig(setup, 'production');\n * ```\n */\nexport function getFlowConfig(\n setup: Flow.Setup,\n flowName?: string,\n): Flow.Config {\n const flowNames = Object.keys(setup.flows);\n\n // Auto-select if only one flow\n if (!flowName) {\n if (flowNames.length === 1) {\n flowName = flowNames[0];\n } else {\n throw new Error(\n `Multiple flows found (${flowNames.join(', ')}). Please specify a flow.`,\n );\n }\n }\n\n // Check flow exists\n const config = setup.flows[flowName];\n if (!config) {\n throw new Error(\n `Flow \"${flowName}\" not found. Available: ${flowNames.join(', ')}`,\n );\n }\n\n // Deep clone to avoid mutations\n const result = JSON.parse(JSON.stringify(config)) as Flow.Config;\n\n // Process sources with variable and definition cascade\n if (result.sources) {\n for (const [name, source] of Object.entries(result.sources)) {\n const vars = mergeVariables(\n setup.variables,\n config.variables,\n source.variables,\n );\n const defs = mergeDefinitions(\n setup.definitions,\n config.definitions,\n source.definitions,\n );\n\n let processedConfig = resolveRefs(source.config, defs);\n processedConfig = interpolateVariables(processedConfig, vars);\n\n // Resolve code from package reference\n const resolvedCode = resolveCodeFromPackage(\n source.package,\n source.code,\n result.packages,\n );\n\n result.sources[name] = {\n ...source,\n config: processedConfig,\n ...(resolvedCode && { code: resolvedCode }),\n };\n }\n }\n\n // Process destinations with variable and definition cascade\n if (result.destinations) {\n for (const [name, dest] of Object.entries(result.destinations)) {\n const vars = mergeVariables(\n setup.variables,\n config.variables,\n dest.variables,\n );\n const defs = mergeDefinitions(\n setup.definitions,\n config.definitions,\n dest.definitions,\n );\n\n let processedConfig = resolveRefs(dest.config, defs);\n processedConfig = interpolateVariables(processedConfig, vars);\n\n // Resolve code from package reference\n const resolvedCode = resolveCodeFromPackage(\n dest.package,\n dest.code,\n result.packages,\n );\n\n result.destinations[name] = {\n ...dest,\n config: processedConfig,\n ...(resolvedCode && { code: resolvedCode }),\n };\n }\n }\n\n // Process collector config\n if (result.collector) {\n const vars = mergeVariables(setup.variables, config.variables);\n const defs = mergeDefinitions(setup.definitions, config.definitions);\n\n let processedCollector = resolveRefs(result.collector, defs);\n processedCollector = interpolateVariables(processedCollector, vars);\n result.collector = processedCollector as typeof result.collector;\n }\n\n return result;\n}\n\n/**\n * Get platform from config (web or server).\n *\n * @param config - Flow configuration\n * @returns \"web\" or \"server\"\n * @throws Error if neither web nor server is present\n *\n * @example\n * ```typescript\n * import { getPlatform } from '@walkeros/core';\n *\n * const platform = getPlatform(config);\n * // Returns \"web\" or \"server\"\n * ```\n */\nexport function getPlatform(config: Flow.Config): 'web' | 'server' {\n if (config.web !== undefined) return 'web';\n if (config.server !== undefined) return 'server';\n throw new Error('Config must have web or server key');\n}\n","/**\n * @interface Assign\n * @description Options for the assign function.\n * @property merge - Merge array properties instead of overriding them.\n * @property shallow - Create a shallow copy instead of updating the target object.\n * @property extend - Extend the target with new properties instead of only updating existing ones.\n */\ninterface Assign {\n merge?: boolean;\n shallow?: boolean;\n extend?: boolean;\n}\n\nconst defaultOptions: Assign = {\n merge: true,\n shallow: true,\n extend: true,\n};\n\n/**\n * Merges objects with advanced options.\n *\n * @template T, U\n * @param target - The target object to merge into.\n * @param obj - The source object to merge from.\n * @param options - Options for merging.\n * @returns The merged object.\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 './types';\n\n/**\n * Checks if a value is an arguments object.\n *\n * @param value The value to check.\n * @returns True if the value is an arguments object, false otherwise.\n */\nexport function isArguments(value: unknown): value is IArguments {\n return Object.prototype.toString.call(value) === '[object Arguments]';\n}\n\n/**\n * Checks if a value is an array.\n *\n * @param value The value to check.\n * @returns True if the value is an array, false otherwise.\n */\nexport function isArray<T>(value: unknown): value is T[] {\n return Array.isArray(value);\n}\n\n/**\n * Checks if a value is a boolean.\n *\n * @param value The value to check.\n * @returns True if the value is a boolean, false otherwise.\n */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * Checks if an entity is a walker command.\n *\n * @param entity The entity to check.\n * @returns True if the entity is a walker command, false otherwise.\n */\nexport function isCommand(entity: string) {\n return entity === 'walker';\n}\n\n/**\n * Checks if a value is defined.\n *\n * @param value The value to check.\n * @returns True if the value is defined, false otherwise.\n */\nexport function isDefined<T>(val: T | undefined): val is T {\n return typeof val !== 'undefined';\n}\n\n/**\n * Checks if a value is an element or the document.\n *\n * @param elem The value to check.\n * @returns True if the value is an element or the document, false otherwise.\n */\nexport function isElementOrDocument(elem: unknown): elem is Element {\n return elem === document || elem instanceof Element;\n}\n\n/**\n * Checks if a value is a function.\n *\n * @param value The value to check.\n * @returns True if the value is a function, false otherwise.\n */\nexport function isFunction(value: unknown): value is Function {\n return typeof value === 'function';\n}\n\n/**\n * Checks if a value is a number.\n *\n * @param value The value to check.\n * @returns True if the value is a number, false otherwise.\n */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * Checks if a value is an object.\n *\n * @param value The value to check.\n * @returns True if the value is an object, false otherwise.\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\n/**\n * Checks if two variables have the same type.\n *\n * @param variable The first variable.\n * @param type The second variable.\n * @returns True if the variables have the same type, false otherwise.\n */\nexport function isSameType<T>(\n variable: unknown,\n type: T,\n): variable is typeof type {\n return typeof variable === typeof type;\n}\n\n/**\n * Checks if a value is a string.\n *\n * @param value The value to check.\n * @returns True if the value is a string, false otherwise.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n","/**\n * Creates a deep clone of a value.\n * Supports primitive values, objects, arrays, dates, and regular expressions.\n * Handles circular references.\n *\n * @template T\n * @param org - The value to clone.\n * @param visited - A map of visited objects to handle circular references.\n * @returns The cloned value.\n */\nexport 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","import type { WalkerOS } from './types';\nimport { isArray, isDefined, isObject } from './is';\nimport { clone } from './clone';\n\n/**\n * Gets a value from an object by a dot-notation string.\n * Supports wildcards for arrays.\n *\n * @example\n * getByPath({ data: { id: 1 } }, \"data.id\") // Returns 1\n *\n * @param event - The object to get the value from.\n * @param key - The dot-notation string.\n * @param defaultValue - The default value to return if the key is not found.\n * @returns The value from the object or the default value.\n */\nexport function getByPath(\n event: unknown,\n key: string = '',\n defaultValue?: unknown,\n): unknown {\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);\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\n/**\n * Sets a value in an object by a dot-notation string.\n *\n * @param obj - The object to set the value in.\n * @param key - The dot-notation string.\n * @param value - The value to set.\n * @returns A new object with the updated value.\n */\nexport function setByPath<T = unknown>(obj: T, key: string, value: unknown): T {\n if (!isObject(obj)) return obj;\n\n const clonedObj = clone(obj);\n const keys = key.split('.');\n let current: WalkerOS.AnyObject = clonedObj;\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 clonedObj as T;\n}\n","import type { WalkerOS } from './types';\n\n/**\n * Casts a value to a specific type.\n *\n * @param value The value to cast.\n * @returns The casted value.\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","import type { WalkerOS } from './types';\n\n/**\n * Checks if the required consent is granted.\n *\n * @param required - The required consent states.\n * @param state - The current consent states.\n * @param individual - Individual consent states to prioritize.\n * @returns The granted consent states or false if not granted.\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","import type { Destination } from './types';\nimport type { TypesOf, Config } from './types/destination';\nimport { assign } from './assign';\n\n/**\n * Creates a new destination instance by merging a base destination with additional configuration.\n *\n * This utility enables elegant destination configuration while avoiding config side-effects\n * that could occur when reusing destination objects across multiple collector instances.\n *\n * @param baseDestination - The base destination to extend\n * @param config - Additional configuration to merge with the base destination's config\n * @returns A new destination instance with merged configuration\n *\n * @example\n * ```typescript\n * // Types are inferred automatically from destinationGtag\n * elb('walker destination', createDestination(destinationGtag, {\n * settings: { ga4: { measurementId: 'G-123' } }\n * }));\n * ```\n */\nexport function createDestination<I extends Destination.Instance>(\n baseDestination: I,\n config: Partial<Config<TypesOf<I>>>,\n): I {\n // Create a shallow copy of the base destination to avoid mutations\n const newDestination = { ...baseDestination };\n\n // Deep merge the config, handling nested objects like settings and mapping\n newDestination.config = assign(baseDestination.config, config, {\n shallow: true, // Create new object, don't mutate original\n merge: true, // Merge arrays\n extend: true, // Allow new properties\n });\n\n // Handle nested settings merging if both have settings\n if (baseDestination.config.settings && config.settings) {\n newDestination.config.settings = assign(\n baseDestination.config.settings as object,\n config.settings as object,\n { shallow: true, merge: true, extend: true },\n ) as typeof newDestination.config.settings;\n }\n\n // Handle nested mapping merging if both have mapping\n if (baseDestination.config.mapping && config.mapping) {\n newDestination.config.mapping = assign(\n baseDestination.config.mapping as object,\n config.mapping as object,\n { shallow: true, merge: true, extend: true },\n ) as typeof newDestination.config.mapping;\n }\n\n return newDestination;\n}\n","import type { WalkerOS } from './types';\nimport { assign } from './assign';\n\ndeclare const __VERSION__: string;\n\n/**\n * Creates a complete event with default values.\n * Used for testing and debugging.\n *\n * @param props - Properties to override the default values.\n * @returns A complete event.\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 name: '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 entity: '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: __VERSION__,\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.name) {\n const [entity, action] = props.name.split(' ') ?? [];\n\n if (entity && action) {\n event.entity = entity;\n event.action = action;\n }\n }\n\n return event;\n}\n\n/**\n * Creates a complete event with default values based on the event name.\n * Used for testing and debugging.\n *\n * @param name - The name of the event to create.\n * @param props - Properties to override the default values.\n * @returns A complete event.\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 entity: '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 entity: 'product',\n ...product1,\n context: { shopping: ['checkout', 0] },\n nested: [],\n },\n {\n entity: '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 entity: 'product',\n ...product1,\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n {\n entity: 'product',\n ...product2,\n context: { shopping: ['complete', 0] },\n nested: [],\n },\n {\n entity: '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, name: name });\n}\n","/**\n * Generates a random string of a given length.\n *\n * @param length - The length of the random string.\n * @returns The random string.\n */\nexport 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 './types';\nimport { assign } from './assign';\n\nexport interface MarketingParameters {\n [key: string]: string;\n}\n\n/**\n * Extracts marketing parameters from a URL.\n *\n * @param url - The URL to extract the parameters from.\n * @param custom - Custom marketing parameters to extract.\n * @returns The extracted marketing parameters.\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","/**\n * Creates a debounced function that delays invoking `fn` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `fn` invocations and a `flush` method to immediately invoke them.\n *\n * @template P, R\n * @param fn The function to debounce.\n * @param wait The number of milliseconds to delay.\n * @param immediate Trigger the function on the leading edge, instead of the trailing.\n * @returns The new debounced function.\n */\nexport 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\n/**\n * Creates a throttled function that only invokes `fn` at most once per\n * every `delay` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `fn` invocations and a `flush` method to\n * immediately invoke them.\n *\n * @template P, R\n * @param fn The function to throttle.\n * @param delay The number of milliseconds to throttle invocations to.\n * @returns The new throttled function.\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 {\n Config,\n DefaultHandler,\n ErrorContext,\n Handler,\n Instance,\n InternalConfig,\n LogContext,\n} from './types/logger';\nimport { Level } from './types/logger';\n\n/**\n * Normalize an Error object into ErrorContext\n */\nfunction normalizeError(err: Error): ErrorContext {\n return {\n message: err.message,\n name: err.name,\n stack: err.stack,\n cause: (err as Error & { cause?: unknown }).cause,\n };\n}\n\n/**\n * Normalize message and context parameters\n * Handles Error objects passed as message or context\n */\nfunction normalizeParams(\n message: string | Error,\n context?: unknown | Error,\n): { message: string; context: LogContext } {\n let normalizedMessage: string;\n let normalizedContext: LogContext = {};\n\n // Handle message\n if (message instanceof Error) {\n normalizedMessage = message.message;\n normalizedContext.error = normalizeError(message);\n } else {\n normalizedMessage = message;\n }\n\n // Handle context\n if (context !== undefined) {\n if (context instanceof Error) {\n normalizedContext.error = normalizeError(context);\n } else if (typeof context === 'object' && context !== null) {\n normalizedContext = { ...normalizedContext, ...(context as object) };\n // If context has an error property that's an Error, normalize it\n if (\n 'error' in normalizedContext &&\n normalizedContext.error instanceof Error\n ) {\n normalizedContext.error = normalizeError(\n normalizedContext.error as unknown as Error,\n );\n }\n } else {\n normalizedContext.value = context;\n }\n }\n\n return { message: normalizedMessage, context: normalizedContext };\n}\n\n/**\n * Default console-based log handler\n */\nconst defaultHandler: DefaultHandler = (level, message, context, scope) => {\n const levelName = Level[level];\n const scopePath = scope.length > 0 ? ` [${scope.join(':')}]` : '';\n const prefix = `${levelName}${scopePath}`;\n\n const hasContext = Object.keys(context).length > 0;\n\n if (level === Level.ERROR) {\n if (hasContext) {\n console.error(prefix, message, context);\n } else {\n console.error(prefix, message);\n }\n } else {\n if (hasContext) {\n console.log(prefix, message, context);\n } else {\n console.log(prefix, message);\n }\n }\n};\n\n/**\n * Normalize log level from string or enum to enum value\n */\nfunction normalizeLevel(level: Level | keyof typeof Level): Level {\n if (typeof level === 'string') {\n return Level[level as keyof typeof Level];\n }\n return level;\n}\n\n/**\n * Create a logger instance\n *\n * @param config - Logger configuration\n * @returns Logger instance with all log methods and scoping support\n *\n * @example\n * ```typescript\n * // Basic usage\n * const logger = createLogger({ level: 'DEBUG' });\n * logger.info('Hello world');\n *\n * // With scoping\n * const destLogger = logger.scope('gtag').scope('myInstance');\n * destLogger.debug('Processing event'); // DEBUG [gtag:myInstance] Processing event\n *\n * // With custom handler\n * const logger = createLogger({\n * handler: (level, message, context, scope, originalHandler) => {\n * // Custom logic (e.g., send to Sentry)\n * originalHandler(level, message, context, scope);\n * }\n * });\n * ```\n *\n * // TODO: Consider compile-time stripping of debug logs in production builds\n * // e.g., if (__DEV__) { logger.debug(...) }\n */\nexport function createLogger(config: Config = {}): Instance {\n const level =\n config.level !== undefined ? normalizeLevel(config.level) : Level.ERROR;\n const customHandler = config.handler;\n const scope: string[] = [];\n\n return createLoggerInternal({ level, handler: customHandler, scope });\n}\n\n/**\n * Internal logger creation with resolved config\n */\nfunction createLoggerInternal(config: InternalConfig): Instance {\n const { level, handler, scope } = config;\n\n /**\n * Internal log function that checks level and delegates to handler\n */\n const log = (\n logLevel: Level,\n message: string | Error,\n context?: unknown | Error,\n ): void => {\n if (logLevel <= level) {\n const normalized = normalizeParams(message, context);\n\n if (handler) {\n // Custom handler with access to default handler\n handler(\n logLevel,\n normalized.message,\n normalized.context,\n scope,\n defaultHandler,\n );\n } else {\n defaultHandler(logLevel, normalized.message, normalized.context, scope);\n }\n }\n };\n\n /**\n * Log and throw - combines logging and throwing\n */\n const logAndThrow = (message: string | Error, context?: unknown): never => {\n // Always log errors regardless of level\n const normalized = normalizeParams(message, context);\n\n if (handler) {\n handler(\n Level.ERROR,\n normalized.message,\n normalized.context,\n scope,\n defaultHandler,\n );\n } else {\n defaultHandler(\n Level.ERROR,\n normalized.message,\n normalized.context,\n scope,\n );\n }\n\n // Throw with the message\n throw new Error(normalized.message);\n };\n\n return {\n error: (message, context) => log(Level.ERROR, message, context),\n info: (message, context) => log(Level.INFO, message, context),\n debug: (message, context) => log(Level.DEBUG, message, context),\n throw: logAndThrow,\n scope: (name: string) =>\n createLoggerInternal({\n level,\n handler,\n scope: [...scope, name],\n }),\n };\n}\n\n// Re-export Level enum for convenience\nexport { Level };\n","import type { WalkerOS } from './types';\nimport {\n isArguments,\n isArray,\n isBoolean,\n isDefined,\n isNumber,\n isObject,\n isString,\n} from './is';\n\n/**\n * Checks if a value is a valid property type.\n *\n * @param value The value to check.\n * @returns True if the value is a valid property type, false otherwise.\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\n/**\n * Filters a value to only include valid property types.\n *\n * @param value The value to filter.\n * @returns The filtered value or undefined.\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\n/**\n * Casts a value to a valid property type.\n *\n * @param value The value to cast.\n * @returns The casted value or undefined.\n */\nexport function castToProperty(value: unknown): WalkerOS.Property | undefined {\n return isPropertyType(value) ? value : undefined;\n}\n","/**\n * A utility function that wraps a function in a try-catch block.\n *\n * @template P, R, S\n * @param fn The function to wrap.\n * @param onError A function to call when an error is caught.\n * @param onFinally A function to call in the finally block.\n * @returns The wrapped function.\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/**\n * A utility function that wraps an async function in a try-catch block.\n *\n * @template P, R, S\n * @param fn The async function to wrap.\n * @param onError A function to call when an error is caught.\n * @param onFinally A function to call in the finally block.\n * @returns The wrapped async function.\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, Collector } from './types';\nimport { getByPath, setByPath } from './byPath';\nimport { isArray, isDefined, isString, isObject } from './is';\nimport { castToProperty } from './property';\nimport { tryCatchAsync } from './tryCatch';\nimport { getGrantedConsent } from './consent';\nimport { assign } from './assign';\n\n/**\n * Gets the mapping for an event.\n *\n * @param event The event to get the mapping for (can be partial or full).\n * @param mapping The mapping rules.\n * @returns The mapping result.\n */\nexport async function getMappingEvent(\n event: WalkerOS.DeepPartialEvent | WalkerOS.PartialEvent | WalkerOS.Event,\n mapping?: Mapping.Rules,\n): Promise<Mapping.Result> {\n const [entity, action] = (event.name || '').split(' ');\n if (!mapping || !entity || !action) return {};\n\n let eventMapping: Mapping.Rule | undefined;\n let mappingKey = '';\n let entityKey = entity;\n let actionKey = action;\n\n const resolveEventMapping = (\n eventMapping?: Mapping.Rule | Mapping.Rule[],\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\n/**\n * Gets a value from a mapping.\n *\n * @param value The value to get the mapping from.\n * @param data The mapping data.\n * @param options The mapping options.\n * @returns The mapped value.\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 > collector?.consent\n const consentState =\n ((isObject(value) && value.consent) as WalkerOS.Consent) ||\n options.consent ||\n options.collector?.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 return;\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 { collector, 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(\n 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)\n ? { key: mappingItem }\n : 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, collector))\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 // Use a custom function to get the value\n if (fn) {\n mappingValue = await tryCatchAsync(fn)(value, mappingItem, options);\n }\n\n // Get dynamic value from the event\n if (key) {\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 },\n Promise.resolve(undefined as WalkerOS.Property | undefined),\n );\n}\n\n/**\n * Processes an event through mapping configuration.\n *\n * This is the unified mapping logic used by both sources and destinations.\n * It applies transformations in this order:\n * 1. Config-level policy - modifies the event itself (global rules)\n * 2. Mapping rules - finds matching rule based on entity-action\n * 3. Event-level policy - modifies the event based on specific mapping rule\n * 4. Data transformation - creates context data\n * 5. Ignore check and name override\n *\n * Sources can pass partial events, destinations pass full events.\n * getMappingValue works with both partial and full events.\n *\n * @param event - The event to process (can be partial or full, will be mutated by policies)\n * @param config - Mapping configuration (mapping, data, policy, consent)\n * @param collector - Collector instance for context\n * @returns Object with transformed event, data, mapping rule, and ignore flag\n */\nexport async function processEventMapping<\n T extends WalkerOS.DeepPartialEvent | WalkerOS.Event,\n>(\n event: T,\n config: Mapping.Config,\n collector: Collector.Instance,\n): Promise<{\n event: T;\n data?: WalkerOS.Property;\n mapping?: Mapping.Rule;\n mappingKey?: string;\n ignore: boolean;\n}> {\n // Step 1: Apply config-level policy (modifies event)\n if (config.policy) {\n await Promise.all(\n Object.entries(config.policy).map(async ([key, mapping]) => {\n const value = await getMappingValue(event, mapping, { collector });\n event = setByPath(event, key, value);\n }),\n );\n }\n\n // Step 2: Get event mapping rule\n const { eventMapping, mappingKey } = await getMappingEvent(\n event,\n config.mapping,\n );\n\n // Step 2.5: Apply event-level policy (modifies event)\n if (eventMapping?.policy) {\n await Promise.all(\n Object.entries(eventMapping.policy).map(async ([key, mapping]) => {\n const value = await getMappingValue(event, mapping, { collector });\n event = setByPath(event, key, value);\n }),\n );\n }\n\n // Step 3: Transform global data\n let data =\n config.data && (await getMappingValue(event, config.data, { collector }));\n\n if (eventMapping) {\n // Check if event should be ignored\n if (eventMapping.ignore) {\n return { event, data, mapping: eventMapping, mappingKey, ignore: true };\n }\n\n // Override event name if specified\n if (eventMapping.name) event.name = eventMapping.name;\n\n // Transform event-specific data\n if (eventMapping.data) {\n const dataEvent =\n eventMapping.data &&\n (await getMappingValue(event, eventMapping.data, { collector }));\n data =\n isObject(data) && isObject(dataEvent) // Only merge objects\n ? assign(data, dataEvent)\n : dataEvent;\n }\n }\n\n return { event, data, mapping: eventMapping, mappingKey, ignore: false };\n}\n","/**\n * Environment mocking utilities for walkerOS destinations\n *\n * Provides standardized tools for intercepting function calls in environment objects,\n * enabling consistent testing patterns across all destinations.\n */\n\ntype InterceptorFn = (\n path: string[],\n args: unknown[],\n original?: Function,\n) => unknown;\n\n/**\n * Creates a proxied environment that intercepts function calls\n *\n * Uses Proxy to wrap environment objects and capture all function calls,\n * allowing for call recording, mocking, or simulation.\n *\n * @param env - The environment object to wrap\n * @param interceptor - Function called for each intercepted call\n * @returns Proxied environment with interceptor applied\n *\n * @example\n * ```typescript\n * const calls: Array<{ path: string[]; args: unknown[] }> = [];\n *\n * const testEnv = mockEnv(env.push, (path, args) => {\n * calls.push({ path, args });\n * });\n *\n * // Use testEnv with destination\n * await destination.push(event, { env: testEnv });\n *\n * // Analyze captured calls\n * expect(calls).toContainEqual({\n * path: ['window', 'gtag'],\n * args: ['event', 'purchase', { value: 99.99 }]\n * });\n * ```\n */\nexport function mockEnv<T extends object>(\n env: T,\n interceptor: InterceptorFn,\n): T {\n const createProxy = (obj: object, path: string[] = []): object => {\n return new Proxy(obj, {\n get(target, prop: string) {\n const value = (target as Record<string, unknown>)[prop];\n const currentPath = [...path, prop];\n\n if (typeof value === 'function') {\n return (...args: unknown[]) => {\n return interceptor(currentPath, args, value);\n };\n }\n\n if (value && typeof value === 'object') {\n return createProxy(value as object, currentPath);\n }\n\n return value;\n },\n });\n };\n\n return createProxy(env) as T;\n}\n\n/**\n * Traverses environment object and replaces values using a replacer function\n *\n * Alternative to mockEnv for environments where Proxy is not suitable.\n * Performs deep traversal and allows value transformation at each level.\n *\n * @param env - The environment object to traverse\n * @param replacer - Function to transform values during traversal\n * @returns New environment object with transformed values\n *\n * @example\n * ```typescript\n * const recordedCalls: APICall[] = [];\n *\n * const recordingEnv = traverseEnv(originalEnv, (value, path) => {\n * if (typeof value === 'function') {\n * return (...args: unknown[]) => {\n * recordedCalls.push({\n * path: path.join('.'),\n * args: structuredClone(args)\n * });\n * return value(...args);\n * };\n * }\n * return value;\n * });\n * ```\n */\nexport function traverseEnv<T extends object>(\n env: T,\n replacer: (value: unknown, path: string[]) => unknown,\n): T {\n const traverse = (obj: unknown, path: string[] = []): unknown => {\n if (!obj || typeof obj !== 'object') return obj;\n\n const result: Record<string, unknown> | unknown[] = Array.isArray(obj)\n ? []\n : {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = [...path, key];\n if (Array.isArray(result)) {\n result[Number(key)] = replacer(value, currentPath);\n } else {\n (result as Record<string, unknown>)[key] = replacer(value, currentPath);\n }\n\n if (value && typeof value === 'object' && typeof value !== 'function') {\n if (Array.isArray(result)) {\n result[Number(key)] = traverse(value, currentPath);\n } else {\n (result as Record<string, unknown>)[key] = traverse(\n value,\n currentPath,\n );\n }\n }\n }\n\n return result;\n };\n\n return traverse(env) as T;\n}\n","import type { Instance } from './types/logger';\n\n/**\n * Mock logger instance for testing\n * Includes all logger methods as jest.fn() plus tracking of scoped loggers\n * Extends Instance to ensure type compatibility\n */\nexport interface MockLogger extends Instance {\n error: jest.Mock;\n info: jest.Mock;\n debug: jest.Mock;\n throw: jest.Mock<never, [string | Error, unknown?]>;\n scope: jest.Mock<MockLogger, [string]>;\n\n /**\n * Array of all scoped loggers created by this logger\n * Useful for asserting on scoped logger calls in tests\n */\n scopedLoggers: MockLogger[];\n}\n\n/**\n * Create a mock logger for testing\n * All methods are jest.fn() that can be used for assertions\n *\n * @example\n * ```typescript\n * const mockLogger = createMockLogger();\n *\n * // Use in code under test\n * someFunction(mockLogger);\n *\n * // Assert on calls\n * expect(mockLogger.error).toHaveBeenCalledWith('error message');\n *\n * // Assert on scoped logger\n * const scoped = mockLogger.scopedLoggers[0];\n * expect(scoped.debug).toHaveBeenCalledWith('debug in scope');\n * ```\n */\nexport function createMockLogger(): MockLogger {\n const scopedLoggers: MockLogger[] = [];\n\n const mockThrow = jest.fn((message: string | Error): never => {\n const msg = message instanceof Error ? message.message : message;\n throw new Error(msg);\n }) as jest.Mock<never, [string | Error, unknown?]>;\n\n const mockScope = jest.fn((_name: string): MockLogger => {\n const scoped = createMockLogger();\n scopedLoggers.push(scoped);\n return scoped;\n }) as jest.Mock<MockLogger, [string]>;\n\n const mockLogger: MockLogger = {\n error: jest.fn(),\n info: jest.fn(),\n debug: jest.fn(),\n throw: mockThrow,\n scope: mockScope,\n scopedLoggers,\n };\n\n return mockLogger;\n}\n","import type { WalkerOS } from './types';\nimport { tryCatch } from './tryCatch';\nimport { castValue } from './castValue';\nimport { isArray, isObject } from './is';\n\n/**\n * Converts a request string to a data object.\n *\n * @param parameter The request string to convert.\n * @returns The data object or undefined.\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\n/**\n * Converts a data object to a request string.\n *\n * @param data The data object to convert.\n * @returns The request string.\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 { SendDataValue, SendHeaders } from './types/send';\nimport { isSameType } from './is';\nimport { assign } from './assign';\n\nexport type { SendDataValue, SendHeaders, SendResponse } from './types/send';\n\n/**\n * Transforms data to a string.\n *\n * @param data The data to transform.\n * @returns The transformed data.\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\n/**\n * Gets the headers for a request.\n *\n * @param headers The headers to merge with the default headers.\n * @returns The merged headers.\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","/**\n * Throws an error.\n *\n * @param error The error to throw.\n */\nexport function throwError(error: unknown): never {\n throw new Error(String(error));\n}\n","/**\n * Trims quotes and whitespaces from a string.\n *\n * @param str The string to trim.\n * @returns The trimmed string.\n */\nexport function trim(str: string): string {\n // Remove quotes and whitespaces\n return str ? str.trim().replace(/^'|'$/g, '').trim() : '';\n}\n","import type { Hooks } from './types';\n\n/**\n * A utility function that wraps a function with hooks.\n *\n * @template P, R\n * @param fn The function to wrap.\n * @param name The name of the function.\n * @param hooks The hooks to use.\n * @returns The wrapped function.\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","import type { WalkerOS } from './types';\n\n/**\n * Parses a user agent string to extract browser, OS, and device information.\n *\n * @param userAgent The user agent string to parse.\n * @returns An object containing the parsed user agent information.\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\n/**\n * Gets the browser name from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The browser name or undefined.\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 return;\n}\n\n/**\n * Gets the browser version from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The browser version or undefined.\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 return;\n}\n\n/**\n * Gets the OS name from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The OS name or undefined.\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 return;\n}\n\n/**\n * Gets the OS version from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The OS version or undefined.\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\n/**\n * Gets the device type from a user agent string.\n *\n * @param userAgent The user agent string.\n * @returns The device type or undefined.\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 './types';\nimport { isSameType } from './is';\nimport { throwError } from './throwError';\nimport { tryCatch } from './tryCatch';\n\n/**\n * Validates an event against a set of contracts.\n *\n * @param obj The event to validate.\n * @param customContracts The custom contracts to use.\n * @returns The validated event.\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.name is available and it's a string\n if (isSameType(obj.name, '')) {\n event = obj.name;\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 name, entity, or action');\n }\n\n const basicContract: Schema.Contract = {\n '*': {\n '*': {\n name: { 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 name: 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\n/**\n * Validates a property against a schema.\n *\n * @param obj The object to validate.\n * @param key The key of the property to validate.\n * @param value The value of the property to validate.\n * @param schema The schema to validate against.\n * @returns The validated property.\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","/**\n * Inline Code Wrapping Utilities\n *\n * Converts inline code strings to executable functions.\n * Used for mapping properties: condition, fn, validate.\n *\n * @packageDocumentation\n */\n\nimport type { Mapping } from './types';\n\n/**\n * Detect if code has explicit return statement.\n */\nfunction hasReturn(code: string): boolean {\n return /\\breturn\\b/.test(code);\n}\n\n/**\n * Wrap code with function body.\n * If code has no return, auto-wrap with return.\n */\nfunction wrapCode(code: string): string {\n return hasReturn(code) ? code : `return ${code}`;\n}\n\n/**\n * Wrap inline code string as Condition function.\n *\n * @param code - Inline code string\n * @returns Condition function matching Mapping.Condition signature\n *\n * @remarks\n * Available parameters in code:\n * - `value` - The event or partial event being processed\n * - `mapping` - Current mapping configuration\n * - `collector` - Collector instance\n *\n * If code has no explicit return, it's auto-wrapped with `return`.\n *\n * @example\n * ```typescript\n * // One-liner (auto-wrapped)\n * const fn = wrapCondition('value.data.total > 100');\n * fn(event, mapping, collector); // returns boolean\n *\n * // Multi-statement (explicit return)\n * const fn = wrapCondition('const threshold = 100; return value.data.total > threshold');\n * ```\n */\nexport function wrapCondition(code: string): Mapping.Condition {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function(\n 'value',\n 'mapping',\n 'collector',\n body,\n ) as Mapping.Condition;\n}\n\n/**\n * Wrap inline code string as Fn function.\n *\n * @param code - Inline code string\n * @returns Fn function matching Mapping.Fn signature\n *\n * @remarks\n * Available parameters in code:\n * - `value` - The event or partial event being processed\n * - `mapping` - Current mapping configuration\n * - `options` - Options object with consent and collector\n *\n * If code has no explicit return, it's auto-wrapped with `return`.\n *\n * @example\n * ```typescript\n * // One-liner (auto-wrapped)\n * const fn = wrapFn('value.user.email.split(\"@\")[1]');\n * fn(event, mapping, options); // returns domain\n *\n * // Multi-statement (explicit return)\n * const fn = wrapFn('const parts = value.user.email.split(\"@\"); return parts[1].toUpperCase()');\n * ```\n */\nexport function wrapFn(code: string): Mapping.Fn {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function('value', 'mapping', 'options', body) as Mapping.Fn;\n}\n\n/**\n * Wrap inline code string as Validate function.\n *\n * @param code - Inline code string\n * @returns Validate function matching Mapping.Validate signature\n *\n * @remarks\n * Available parameters in code:\n * - `value` - The current value being validated\n *\n * If code has no explicit return, it's auto-wrapped with `return`.\n *\n * @example\n * ```typescript\n * // One-liner (auto-wrapped)\n * const fn = wrapValidate('value && value.length > 0');\n * fn('hello'); // returns true\n *\n * // Multi-statement (explicit return)\n * const fn = wrapValidate('if (!value) return false; return value.length > 0');\n * ```\n */\nexport function wrapValidate(code: string): Mapping.Validate {\n const body = wrapCode(code);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n return new Function('value', body) as Mapping.Validate;\n}\n"],"mappings":"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","names":["Level","acc","eventMapping","mapping","acc","key","value"]}