@walkeros/web-source-datalayer 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,a=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,i=(e,a)=>{for(var r in a)t(e,r,{get:a[r],enumerable:!0})},o={};i(o,{Events:()=>S,Mapping:()=>x,SourceDataLayer:()=>l,consentOnlyMapping:()=>G,consentUpdateEvent:()=>O,dataLayerExamples:()=>R,default:()=>K,env:()=>w,schemas:()=>m,sourceDataLayer:()=>J}),module.exports=(e=o,((e,i,o,c)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let s of r(i))n.call(e,s)||s===o||t(e,s,{get:()=>i[s],enumerable:!(c=a(i,s))||c.enumerable});return e})(t({},"__esModule",{value:!0}),e));var c=require("@walkeros/core"),s=!1;function u(e,t={},a){if(t.filter){if(!0===(0,c.tryCatch)(()=>t.filter(a),()=>!1)())return}const r=function(e){if((0,c.isObject)(e)&&(0,c.isString)(e.event)){const{event:t,...a}=e;return{name:t,...a}}if((0,c.isArray)(e)&&e.length>=2)return d(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return d(Array.from(e))}var t;return null}(a);if(!r)return;const n=`${t.prefix||"dataLayer"} ${r.name}`,{name:i,...o}=r,s={name:n,data:o};(0,c.tryCatch)(()=>e(s),()=>{})()}function d(e){const[t,a,r]=e;if(!(0,c.isString)(t))return null;let n,i={};switch(t){case"consent":if(!(0,c.isString)(a)||e.length<3)return null;if("default"!==a&&"update"!==a)return null;if(!(0,c.isObject)(r)||null===r)return null;n=`${t} ${a}`,i={...r};break;case"event":if(!(0,c.isString)(a))return null;n=a,(0,c.isObject)(r)&&(i={...r});break;case"config":if(!(0,c.isString)(a))return null;n=`${t} ${a}`,(0,c.isObject)(r)&&(i={...r});break;case"set":if((0,c.isString)(a))n=`${t} ${a}`,(0,c.isObject)(r)&&(i={...r});else{if(!(0,c.isObject)(a))return null;n=`${t} custom`,i={...a}}break;default:return null}return{name:n,...i}}var l={},m={};i(m,{EventPrefix:()=>_,JavaScriptVarName:()=>g,SettingsSchema:()=>v,settings:()=>b});var f=require("@walkeros/core"),p=require("@walkeros/core"),y=require("@walkeros/core"),g=y.z.string().min(1).regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,"Must be a valid JavaScript identifier").describe("JavaScript variable name"),_=y.z.string().min(1).describe("Prefix for filtering dataLayer events"),v=p.z.object({name:g.default("dataLayer").describe("DataLayer variable name (default: dataLayer)").optional(),prefix:_.default("dataLayer").describe("Event prefix for filtering which events to process").optional(),filter:p.z.any().describe("Custom filter function: (event: unknown) => boolean | Promise<boolean>").optional()}),b=(0,f.zodToSchema)(v),w={};i(w,{push:()=>L});var h=()=>{},X=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),L={get push(){return X()},get command(){return X()},get elb(){return X()},get window(){return{dataLayer:[],addEventListener:h,removeEventListener:h}}},S={};function O(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function k(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function E(){return["event","purchase",{transaction_id:"T_12345",value:25.42,currency:"EUR",items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",quantity:1,price:25.42}]}]}function j(){return["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_variant:"red",quantity:1,price:15.25}]}]}function P(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]}function $(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function q(){return["set",{currency:"EUR",country:"DE"}]}function A(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}i(S,{add_to_cart:()=>j,config:()=>$,consentDefault:()=>k,consentUpdate:()=>O,directDataLayerEvent:()=>A,purchase:()=>E,setCustom:()=>q,view_item:()=>P});var x={};i(x,{add_to_cart:()=>C,config:()=>R,configGA4:()=>M,consentOnlyMapping:()=>G,consentUpdate:()=>U,customEvent:()=>N,purchase:()=>z,view_item:()=>D});var U={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:e=>"granted"===e},marketing:{key:"ad_storage",fn:e=>"granted"===e}}}}},z={name:"order complete",data:{map:{id:"transaction_id",total:"value",currency:"currency",nested:{loop:["items",{map:{type:{value:"product"},data:{map:{id:"item_id",name:"item_name",category:"item_category",quantity:"quantity",price:"price"}}}}]}}}},C={name:"product add",data:{map:{id:"items.0.item_id",name:"items.0.item_name",price:"value",currency:"currency",color:"items.0.item_variant",quantity:"items.0.quantity"}}},D={name:"product view",data:{map:{id:"items.0.item_id",name:"items.0.item_name",category:"items.0.item_category",price:"items.0.price",currency:"currency"}}},M={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},N={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},R={consent:{update:U},purchase:z,add_to_cart:C,view_item:D,"config G-XXXXXXXXXX":M,custom_event:N,"*":{data:{}}},G={consent:{update:U}},J=async(e,t)=>{const{elb:a,window:r}=t,n={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},i={settings:n};return r&&(function(e,t){const a=t.settings,r=(null==a?void 0:a.name)||"dataLayer",n=window[r];if(Array.isArray(n)&&!s){s=!0;try{for(const t of n)u(e,a,t)}finally{s=!1}}}(a,i),function(e,t){const a=t.settings,r=(null==a?void 0:a.name)||"dataLayer";window[r]||(window[r]=[]);const n=window[r];if(!Array.isArray(n))return;const i=n.push.bind(n);n.push=function(...t){if(s)return i(...t);s=!0;try{for(const r of t)u(e,a,r)}finally{s=!1}return i(...t)}}(a,i)),{type:"dataLayer",config:i,push:a,destroy:async()=>{const e=n.name||"dataLayer";r&&r[e]&&Array.isArray(r[e])}}},K=J;//# sourceMappingURL=index.js.map
1
+ "use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,i=(e,n)=>{for(var a in n)t(e,a,{get:n[a],enumerable:!0})},c={};i(c,{Events:()=>_,Mapping:()=>j,SourceDataLayer:()=>m,consentOnlyMapping:()=>q,consentUpdateEvent:()=>g,dataLayerExamples:()=>$,default:()=>D,env:()=>l,sourceDataLayer:()=>C}),module.exports=(e=c,((e,i,c,o)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let u of a(i))r.call(e,u)||u===c||t(e,u,{get:()=>i[u],enumerable:!(o=n(i,u))||o.enumerable});return e})(t({},"__esModule",{value:!0}),e));var o=require("@walkeros/core"),u=!1;function s(e,t={},n){if(t.filter){if(!0===(0,o.tryCatch)(()=>t.filter(n),()=>!1)())return}const a=function(e){if((0,o.isObject)(e)&&(0,o.isString)(e.event)){const{event:t,...n}=e;return{name:t,...n}}if((0,o.isArray)(e)&&e.length>=2)return d(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return d(Array.from(e))}var t;return null}(n);if(!a)return;const r=`${t.prefix||"dataLayer"} ${a.name}`,{name:i,...c}=a,u={name:r,data:c};(0,o.tryCatch)(()=>e(u),()=>{})()}function d(e){const[t,n,a]=e;if(!(0,o.isString)(t))return null;let r,i={};switch(t){case"consent":if(!(0,o.isString)(n)||e.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!(0,o.isObject)(a)||null===a)return null;r=`${t} ${n}`,i={...a};break;case"event":if(!(0,o.isString)(n))return null;r=n,(0,o.isObject)(a)&&(i={...a});break;case"config":if(!(0,o.isString)(n))return null;r=`${t} ${n}`,(0,o.isObject)(a)&&(i={...a});break;case"set":if((0,o.isString)(n))r=`${t} ${n}`,(0,o.isObject)(a)&&(i={...a});else{if(!(0,o.isObject)(n))return null;r=`${t} custom`,i={...n}}break;default:return null}return{name:r,...i}}var m={},l={};i(l,{push:()=>f});var p=()=>{},y=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),f={get push(){return y()},get command(){return y()},get elb(){return y()},get window(){return{dataLayer:[],addEventListener:p,removeEventListener:p}}},_={};function g(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function v(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function w(){return["event","purchase",{transaction_id:"T_12345",value:25.42,currency:"EUR",items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",quantity:1,price:25.42}]}]}function b(){return["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_variant:"red",quantity:1,price:15.25}]}]}function X(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]}function h(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function O(){return["set",{currency:"EUR",country:"DE"}]}function L(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}i(_,{add_to_cart:()=>b,config:()=>h,consentDefault:()=>v,consentUpdate:()=>g,directDataLayerEvent:()=>L,purchase:()=>w,setCustom:()=>O,view_item:()=>X});var j={};i(j,{add_to_cart:()=>S,config:()=>$,configGA4:()=>A,consentOnlyMapping:()=>q,consentUpdate:()=>E,customEvent:()=>P,purchase:()=>k,view_item:()=>U});var E={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:e=>"granted"===e},marketing:{key:"ad_storage",fn:e=>"granted"===e}}}}},k={name:"order complete",data:{map:{id:"transaction_id",total:"value",currency:"currency",nested:{loop:["items",{map:{type:{value:"product"},data:{map:{id:"item_id",name:"item_name",category:"item_category",quantity:"quantity",price:"price"}}}}]}}}},S={name:"product add",data:{map:{id:"items.0.item_id",name:"items.0.item_name",price:"value",currency:"currency",color:"items.0.item_variant",quantity:"items.0.quantity"}}},U={name:"product view",data:{map:{id:"items.0.item_id",name:"items.0.item_name",category:"items.0.item_category",price:"items.0.price",currency:"currency"}}},A={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},P={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},$={consent:{update:E},purchase:k,add_to_cart:S,view_item:U,"config G-XXXXXXXXXX":A,custom_event:P,"*":{data:{}}},q={consent:{update:E}},C=async(e,t)=>{const{elb:n,window:a}=t,r={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},i={settings:r};return a&&(function(e,t){const n=t.settings,a=(null==n?void 0:n.name)||"dataLayer",r=window[a];if(Array.isArray(r)&&!u){u=!0;try{for(const t of r)s(e,n,t)}finally{u=!1}}}(n,i),function(e,t){const n=t.settings,a=(null==n?void 0:n.name)||"dataLayer";window[a]||(window[a]=[]);const r=window[a];if(!Array.isArray(r))return;const i=r.push.bind(r);r.push=function(...t){if(u)return i(...t);u=!0;try{for(const a of t)s(e,n,a)}finally{u=!1}return i(...t)}}(n,i)),{type:"dataLayer",config:i,push:n,destroy:async()=>{const e=r.name||"dataLayer";a&&a[e]&&Array.isArray(a[e])}}},D=C;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/interceptor.ts","../src/types/index.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { Source } from '@walkeros/core';\nimport type { Types } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n// Export schemas\nexport * as schemas from './schemas';\n\n// Export examples\nexport * from './examples';\n\n/**\n * DataLayer source implementation using environment injection.\n *\n * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.\n * It works by replacing the dataLayer.push method with a custom handler.\n */\nexport const sourceDataLayer: Source.Init<Types> = async (\n config: Partial<Source.Config<Types>>,\n env: Source.Env<Types>,\n) => {\n const { elb, window: envWindow } = env;\n\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n if (envWindow) {\n processExistingEvents(elb, fullConfig);\n interceptDataLayer(elb, fullConfig);\n }\n\n return {\n type: 'dataLayer',\n config: fullConfig,\n push: elb,\n destroy: async () => {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (\n envWindow &&\n envWindow[dataLayerName] &&\n Array.isArray(envWindow[dataLayerName])\n ) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n};\n\nexport default sourceDataLayer;\n","import type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n push: Collector.PushFn,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!window[dataLayerName]) {\n window[dataLayerName] = [];\n }\n\n const dataLayer = window[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(push, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n push: Collector.PushFn,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = window[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n // Process all existing events\n for (const event of dataLayer) {\n processEvent(push, settings, event);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n push: Collector.PushFn,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.name}`;\n\n // Create partial WalkerOS event structure (collector will enrich it)\n const { name: _name, ...data } = transformedEvent;\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name: eventName,\n data: data as WalkerOS.Properties,\n };\n\n // Push to collector\n tryCatch(\n () => push(partialEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { name: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n const { event, ...rest } = rawEvent;\n return { name: event, ...rest };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { name: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Only allow 'default' and 'update' actions for consent\n if (action !== 'default' && action !== 'update') return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n name: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n","import type { WalkerOS, Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema } from '../schemas';\nimport { z } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\nexport type DataLayer = Array<unknown>;\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// Override filter to be actual function type (not serializable in schema)\nexport interface Settings extends Omit<BaseSettings, 'filter'> {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\nexport interface Mapping {}\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env>;\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n","import { zodToSchema } from '@walkeros/core';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core';\nimport { JavaScriptVarName, EventPrefix } from './primitives';\n\n/**\n * DataLayer source settings schema\n */\nexport const SettingsSchema = z.object({\n name: JavaScriptVarName.default('dataLayer')\n .describe('DataLayer variable name (default: dataLayer)')\n .optional(),\n\n prefix: EventPrefix.default('dataLayer')\n .describe('Event prefix for filtering which events to process')\n .optional(),\n\n filter: z\n .any()\n .describe(\n 'Custom filter function: (event: unknown) => boolean | Promise<boolean>',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core';\n\n/**\n * JavaScript variable name\n * Used for dataLayer variable naming\n */\nexport const JavaScriptVarName = z\n .string()\n .min(1)\n .regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/, 'Must be a valid JavaScript identifier')\n .describe('JavaScript variable name');\n\n/**\n * Event prefix\n * Used for filtering dataLayer events\n */\nexport const EventPrefix = z\n .string()\n .min(1)\n .describe('Prefix for filtering dataLayer events');\n","import type { Source, Elb } from '@walkeros/core';\n\n/**\n * Example environment configurations for dataLayer source\n *\n * These environments provide standardized mock structures for testing\n * dataLayer interception without requiring a real window object.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Elb.Fn;\n return fn;\n};\n\n/**\n * Environment interface for dataLayer source\n */\ninterface DataLayerEnv extends Source.BaseEnv {\n window?: typeof window;\n}\n\n/**\n * Mock window object with dataLayer array\n */\nconst createMockWindow = () => ({\n dataLayer: [] as unknown[],\n addEventListener: noop,\n removeEventListener: noop,\n});\n\n/**\n * Standard mock environment for testing dataLayer source\n *\n * Use this for testing dataLayer.push interception and event transformation\n * without requiring a real browser environment.\n */\nexport const push: DataLayerEnv = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n get window() {\n return createMockWindow() as unknown as typeof window;\n },\n};\n","/**\n * Sample gtag events that would be pushed to dataLayer\n * These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events\n */\n\n/**\n * Consent Mode Events - Primary use case\n */\nexport function consentUpdate(): unknown[] {\n return [\n 'consent',\n 'update',\n {\n ad_user_data: 'granted',\n ad_personalization: 'granted',\n ad_storage: 'denied',\n analytics_storage: 'granted',\n },\n ];\n}\n\nexport function consentDefault(): unknown[] {\n return [\n 'consent',\n 'default',\n {\n ad_storage: 'denied',\n analytics_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n },\n ];\n}\n\n/**\n * E-commerce Events\n */\nexport function purchase(): unknown[] {\n return [\n 'event',\n 'purchase',\n {\n transaction_id: 'T_12345',\n value: 25.42,\n currency: 'EUR',\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n quantity: 1,\n price: 25.42,\n },\n ],\n },\n ];\n}\n\nexport function add_to_cart(): unknown[] {\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ];\n}\n\nexport function view_item(): unknown[] {\n return [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n price: 15.25,\n },\n ],\n },\n ];\n}\n\n/**\n * Config Events\n */\nexport function config(): unknown[] {\n return [\n 'config',\n 'G-XXXXXXXXXX',\n {\n page_title: 'Custom Page Title',\n page_location: 'https://example.com/page',\n send_page_view: false,\n },\n ];\n}\n\n/**\n * Set Events\n */\nexport function setCustom(): unknown[] {\n return [\n 'set',\n {\n currency: 'EUR',\n country: 'DE',\n },\n ];\n}\n\n/**\n * Direct dataLayer object pushes (not gtag)\n */\nexport function directDataLayerEvent(): Record<string, unknown> {\n return {\n event: 'custom_event',\n custom_parameter: 'custom_value',\n user_id: 'user123',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\n\n/**\n * Consent Mode Mapping - Primary use case\n * Maps gtag consent events to walker consent commands\n */\nexport const consentUpdate: Mapping.Rule = {\n name: 'walker consent',\n settings: {\n command: {\n map: {\n functional: { value: true }, // Static value - always true for functional\n analytics: {\n key: 'analytics_storage',\n fn: (value: unknown) => value === 'granted',\n },\n marketing: {\n key: 'ad_storage',\n fn: (value: unknown) => value === 'granted',\n },\n },\n },\n },\n};\n\n/**\n * E-commerce Event Mappings\n * Transform GA4 ecommerce events to WalkerOS events\n */\nexport const purchase: Mapping.Rule = {\n name: 'order complete',\n data: {\n map: {\n id: 'transaction_id',\n total: 'value',\n currency: 'currency',\n nested: {\n loop: [\n 'items',\n {\n map: {\n type: { value: 'product' },\n data: {\n map: {\n id: 'item_id',\n name: 'item_name',\n category: 'item_category',\n quantity: 'quantity',\n price: 'price',\n },\n },\n },\n },\n ],\n },\n },\n },\n};\n\nexport const add_to_cart: Mapping.Rule = {\n name: 'product add',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n price: 'value',\n currency: 'currency',\n color: 'items.0.item_variant',\n quantity: 'items.0.quantity',\n },\n },\n};\n\nexport const view_item: Mapping.Rule = {\n name: 'product view',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n category: 'items.0.item_category',\n price: 'items.0.price',\n currency: 'currency',\n },\n },\n};\n\n/**\n * Config Event Mapping\n * Transform GA4 config events to WalkerOS page events\n */\nexport const configGA4: Mapping.Rule = {\n name: 'page view',\n data: {\n map: {\n title: 'page_title',\n url: 'page_location',\n },\n },\n};\n\n/**\n * Custom Event Mapping\n * Handle direct dataLayer pushes\n */\nexport const customEvent: Mapping.Rule = {\n // Keep original event name with gtag prefix\n data: {\n map: {\n // Map all properties as-is\n user_id: 'user_id',\n custom_parameter: 'custom_parameter',\n },\n },\n};\n\n/**\n * Complete mapping configuration\n * Following the same pattern as destination mappings\n */\nexport const config = {\n // Consent events\n consent: {\n update: consentUpdate,\n },\n\n // E-commerce events\n purchase: purchase,\n add_to_cart: add_to_cart,\n view_item: view_item,\n\n // Config events\n 'config G-XXXXXXXXXX': configGA4,\n\n // Custom events\n custom_event: customEvent,\n\n // Catch-all for unmapped events\n '*': {\n // Pass through with gtag prefix\n data: {\n // Copy all data as-is\n },\n },\n} as unknown as Mapping.Rules;\n\n/**\n * Minimal consent-only mapping for focused use cases\n */\nexport const consentOnlyMapping = {\n consent: {\n update: consentUpdate,\n },\n} as unknown as Mapping.Rules;\n"],"mappings":"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","names":["config","push","config","settings","import_core","import_core","import_core","add_to_cart","config","consentUpdate","purchase","view_item","config","settings"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/interceptor.ts","../src/types/index.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { Source } from '@walkeros/core';\nimport type { Types } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n// Export examples\nexport * from './examples';\n\n/**\n * DataLayer source implementation using environment injection.\n *\n * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.\n * It works by replacing the dataLayer.push method with a custom handler.\n */\nexport const sourceDataLayer: Source.Init<Types> = async (\n config: Partial<Source.Config<Types>>,\n env: Source.Env<Types>,\n) => {\n const { elb, window: envWindow } = env;\n\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n if (envWindow) {\n processExistingEvents(elb, fullConfig);\n interceptDataLayer(elb, fullConfig);\n }\n\n return {\n type: 'dataLayer',\n config: fullConfig,\n push: elb,\n destroy: async () => {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (\n envWindow &&\n envWindow[dataLayerName] &&\n Array.isArray(envWindow[dataLayerName])\n ) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n};\n\nexport default sourceDataLayer;\n","import type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n push: Collector.PushFn,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!window[dataLayerName]) {\n window[dataLayerName] = [];\n }\n\n const dataLayer = window[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(push, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n push: Collector.PushFn,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = window[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n // Process all existing events\n for (const event of dataLayer) {\n processEvent(push, settings, event);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n push: Collector.PushFn,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.name}`;\n\n // Create partial WalkerOS event structure (collector will enrich it)\n const { name: _name, ...data } = transformedEvent;\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name: eventName,\n data: data as WalkerOS.Properties,\n };\n\n // Push to collector\n tryCatch(\n () => push(partialEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { name: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n const { event, ...rest } = rawEvent;\n return { name: event, ...rest };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { name: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Only allow 'default' and 'update' actions for consent\n if (action !== 'default' && action !== 'update') return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n name: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n","import type { WalkerOS, Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema } from '../schemas';\nimport { z } from '@walkeros/core/dev';\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\nexport type DataLayer = Array<unknown>;\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// Override filter to be actual function type (not serializable in schema)\nexport interface Settings extends Omit<BaseSettings, 'filter'> {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n","import type { Source, Elb } from '@walkeros/core';\n\n/**\n * Example environment configurations for dataLayer source\n *\n * These environments provide standardized mock structures for testing\n * dataLayer interception without requiring a real window object.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Elb.Fn;\n return fn;\n};\n\n/**\n * Environment interface for dataLayer source\n */\ninterface DataLayerEnv extends Source.BaseEnv {\n window?: typeof window;\n}\n\n/**\n * Mock window object with dataLayer array\n */\nconst createMockWindow = () => ({\n dataLayer: [] as unknown[],\n addEventListener: noop,\n removeEventListener: noop,\n});\n\n/**\n * Standard mock environment for testing dataLayer source\n *\n * Use this for testing dataLayer.push interception and event transformation\n * without requiring a real browser environment.\n */\nexport const push: DataLayerEnv = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n get window() {\n return createMockWindow() as unknown as typeof window;\n },\n};\n","/**\n * Sample gtag events that would be pushed to dataLayer\n * These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events\n */\n\n/**\n * Consent Mode Events - Primary use case\n */\nexport function consentUpdate(): unknown[] {\n return [\n 'consent',\n 'update',\n {\n ad_user_data: 'granted',\n ad_personalization: 'granted',\n ad_storage: 'denied',\n analytics_storage: 'granted',\n },\n ];\n}\n\nexport function consentDefault(): unknown[] {\n return [\n 'consent',\n 'default',\n {\n ad_storage: 'denied',\n analytics_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n },\n ];\n}\n\n/**\n * E-commerce Events\n */\nexport function purchase(): unknown[] {\n return [\n 'event',\n 'purchase',\n {\n transaction_id: 'T_12345',\n value: 25.42,\n currency: 'EUR',\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n quantity: 1,\n price: 25.42,\n },\n ],\n },\n ];\n}\n\nexport function add_to_cart(): unknown[] {\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ];\n}\n\nexport function view_item(): unknown[] {\n return [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n price: 15.25,\n },\n ],\n },\n ];\n}\n\n/**\n * Config Events\n */\nexport function config(): unknown[] {\n return [\n 'config',\n 'G-XXXXXXXXXX',\n {\n page_title: 'Custom Page Title',\n page_location: 'https://example.com/page',\n send_page_view: false,\n },\n ];\n}\n\n/**\n * Set Events\n */\nexport function setCustom(): unknown[] {\n return [\n 'set',\n {\n currency: 'EUR',\n country: 'DE',\n },\n ];\n}\n\n/**\n * Direct dataLayer object pushes (not gtag)\n */\nexport function directDataLayerEvent(): Record<string, unknown> {\n return {\n event: 'custom_event',\n custom_parameter: 'custom_value',\n user_id: 'user123',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\n\n/**\n * Consent Mode Mapping - Primary use case\n * Maps gtag consent events to walker consent commands\n */\nexport const consentUpdate: Mapping.Rule = {\n name: 'walker consent',\n settings: {\n command: {\n map: {\n functional: { value: true }, // Static value - always true for functional\n analytics: {\n key: 'analytics_storage',\n fn: (value: unknown) => value === 'granted',\n },\n marketing: {\n key: 'ad_storage',\n fn: (value: unknown) => value === 'granted',\n },\n },\n },\n },\n};\n\n/**\n * E-commerce Event Mappings\n * Transform GA4 ecommerce events to WalkerOS events\n */\nexport const purchase: Mapping.Rule = {\n name: 'order complete',\n data: {\n map: {\n id: 'transaction_id',\n total: 'value',\n currency: 'currency',\n nested: {\n loop: [\n 'items',\n {\n map: {\n type: { value: 'product' },\n data: {\n map: {\n id: 'item_id',\n name: 'item_name',\n category: 'item_category',\n quantity: 'quantity',\n price: 'price',\n },\n },\n },\n },\n ],\n },\n },\n },\n};\n\nexport const add_to_cart: Mapping.Rule = {\n name: 'product add',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n price: 'value',\n currency: 'currency',\n color: 'items.0.item_variant',\n quantity: 'items.0.quantity',\n },\n },\n};\n\nexport const view_item: Mapping.Rule = {\n name: 'product view',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n category: 'items.0.item_category',\n price: 'items.0.price',\n currency: 'currency',\n },\n },\n};\n\n/**\n * Config Event Mapping\n * Transform GA4 config events to WalkerOS page events\n */\nexport const configGA4: Mapping.Rule = {\n name: 'page view',\n data: {\n map: {\n title: 'page_title',\n url: 'page_location',\n },\n },\n};\n\n/**\n * Custom Event Mapping\n * Handle direct dataLayer pushes\n */\nexport const customEvent: Mapping.Rule = {\n // Keep original event name with gtag prefix\n data: {\n map: {\n // Map all properties as-is\n user_id: 'user_id',\n custom_parameter: 'custom_parameter',\n },\n },\n};\n\n/**\n * Complete mapping configuration\n * Following the same pattern as destination mappings\n */\nexport const config = {\n // Consent events\n consent: {\n update: consentUpdate,\n },\n\n // E-commerce events\n purchase: purchase,\n add_to_cart: add_to_cart,\n view_item: view_item,\n\n // Config events\n 'config G-XXXXXXXXXX': configGA4,\n\n // Custom events\n custom_event: customEvent,\n\n // Catch-all for unmapped events\n '*': {\n // Pass through with gtag prefix\n data: {\n // Copy all data as-is\n },\n },\n} as unknown as Mapping.Rules;\n\n/**\n * Minimal consent-only mapping for focused use cases\n */\nexport const consentOnlyMapping = {\n consent: {\n update: consentUpdate,\n },\n} as unknown as Mapping.Rules;\n"],"mappings":"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","names":["config","push","config","add_to_cart","config","consentUpdate","purchase","view_item","config"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,a)=>{for(var n in a)e(t,n,{get:a[n],enumerable:!0})};import{isArray as a,isObject as n,isString as r,tryCatch as i}from"@walkeros/core";var o=!1;function c(e,t={},o){if(t.filter){if(!0===i(()=>t.filter(o),()=>!1)())return}const c=function(e){if(n(e)&&r(e.event)){const{event:t,...a}=e;return{name:t,...a}}if(a(e)&&e.length>=2)return s(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return s(Array.from(e))}var t;return null}(o);if(!c)return;const u=`${t.prefix||"dataLayer"} ${c.name}`,{name:d,...m}=c,l={name:u,data:m};i(()=>e(l),()=>{})()}function s(e){const[t,a,i]=e;if(!r(t))return null;let o,c={};switch(t){case"consent":if(!r(a)||e.length<3)return null;if("default"!==a&&"update"!==a)return null;if(!n(i)||null===i)return null;o=`${t} ${a}`,c={...i};break;case"event":if(!r(a))return null;o=a,n(i)&&(c={...i});break;case"config":if(!r(a))return null;o=`${t} ${a}`,n(i)&&(c={...i});break;case"set":if(r(a))o=`${t} ${a}`,n(i)&&(c={...i});else{if(!n(a))return null;o=`${t} custom`,c={...a}}break;default:return null}return{name:o,...c}}var u={},d={};t(d,{EventPrefix:()=>y,JavaScriptVarName:()=>p,SettingsSchema:()=>_,settings:()=>g});import{zodToSchema as m}from"@walkeros/core";import{z as l}from"@walkeros/core";import{z as f}from"@walkeros/core";var p=f.string().min(1).regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,"Must be a valid JavaScript identifier").describe("JavaScript variable name"),y=f.string().min(1).describe("Prefix for filtering dataLayer events"),_=l.object({name:p.default("dataLayer").describe("DataLayer variable name (default: dataLayer)").optional(),prefix:y.default("dataLayer").describe("Event prefix for filtering which events to process").optional(),filter:l.any().describe("Custom filter function: (event: unknown) => boolean | Promise<boolean>").optional()}),g=m(_),v={};t(v,{push:()=>h});var w=()=>{},b=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),h={get push(){return b()},get command(){return b()},get elb(){return b()},get window(){return{dataLayer:[],addEventListener:w,removeEventListener:w}}},X={};function L(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function k(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function E(){return["event","purchase",{transaction_id:"T_12345",value:25.42,currency:"EUR",items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",quantity:1,price:25.42}]}]}function $(){return["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_variant:"red",quantity:1,price:15.25}]}]}function x(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]}function A(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function U(){return["set",{currency:"EUR",country:"DE"}]}function P(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}t(X,{add_to_cart:()=>$,config:()=>A,consentDefault:()=>k,consentUpdate:()=>L,directDataLayerEvent:()=>P,purchase:()=>E,setCustom:()=>U,view_item:()=>x});var S={};t(S,{add_to_cart:()=>C,config:()=>j,configGA4:()=>N,consentOnlyMapping:()=>G,consentUpdate:()=>q,customEvent:()=>R,purchase:()=>z,view_item:()=>D});var q={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:e=>"granted"===e},marketing:{key:"ad_storage",fn:e=>"granted"===e}}}}},z={name:"order complete",data:{map:{id:"transaction_id",total:"value",currency:"currency",nested:{loop:["items",{map:{type:{value:"product"},data:{map:{id:"item_id",name:"item_name",category:"item_category",quantity:"quantity",price:"price"}}}}]}}}},C={name:"product add",data:{map:{id:"items.0.item_id",name:"items.0.item_name",price:"value",currency:"currency",color:"items.0.item_variant",quantity:"items.0.quantity"}}},D={name:"product view",data:{map:{id:"items.0.item_id",name:"items.0.item_name",category:"items.0.item_category",price:"items.0.price",currency:"currency"}}},N={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},R={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},j={consent:{update:q},purchase:z,add_to_cart:C,view_item:D,"config G-XXXXXXXXXX":N,custom_event:R,"*":{data:{}}},G={consent:{update:q}},J=async(e,t)=>{const{elb:a,window:n}=t,r={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},i={settings:r};return n&&(function(e,t){const a=t.settings,n=(null==a?void 0:a.name)||"dataLayer",r=window[n];if(Array.isArray(r)&&!o){o=!0;try{for(const t of r)c(e,a,t)}finally{o=!1}}}(a,i),function(e,t){const a=t.settings,n=(null==a?void 0:a.name)||"dataLayer";window[n]||(window[n]=[]);const r=window[n];if(!Array.isArray(r))return;const i=r.push.bind(r);r.push=function(...t){if(o)return i(...t);o=!0;try{for(const n of t)c(e,a,n)}finally{o=!1}return i(...t)}}(a,i)),{type:"dataLayer",config:i,push:a,destroy:async()=>{const e=r.name||"dataLayer";n&&n[e]&&Array.isArray(n[e])}}},K=J;export{X as Events,S as Mapping,u as SourceDataLayer,G as consentOnlyMapping,L as consentUpdateEvent,j as dataLayerExamples,K as default,v as env,d as schemas,J as sourceDataLayer};//# sourceMappingURL=index.mjs.map
1
+ var e=Object.defineProperty,t=(t,a)=>{for(var n in a)e(t,n,{get:a[n],enumerable:!0})};import{isArray as a,isObject as n,isString as r,tryCatch as i}from"@walkeros/core";var u=!1;function o(e,t={},u){if(t.filter){if(!0===i(()=>t.filter(u),()=>!1)())return}const o=function(e){if(n(e)&&r(e.event)){const{event:t,...a}=e;return{name:t,...a}}if(a(e)&&e.length>=2)return c(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return c(Array.from(e))}var t;return null}(u);if(!o)return;const s=`${t.prefix||"dataLayer"} ${o.name}`,{name:d,...m}=o,l={name:s,data:m};i(()=>e(l),()=>{})()}function c(e){const[t,a,i]=e;if(!r(t))return null;let u,o={};switch(t){case"consent":if(!r(a)||e.length<3)return null;if("default"!==a&&"update"!==a)return null;if(!n(i)||null===i)return null;u=`${t} ${a}`,o={...i};break;case"event":if(!r(a))return null;u=a,n(i)&&(o={...i});break;case"config":if(!r(a))return null;u=`${t} ${a}`,n(i)&&(o={...i});break;case"set":if(r(a))u=`${t} ${a}`,n(i)&&(o={...i});else{if(!n(a))return null;u=`${t} custom`,o={...a}}break;default:return null}return{name:u,...o}}var s={},d={};t(d,{push:()=>p});var m=()=>{},l=()=>()=>Promise.resolve({ok:!0,successful:[],queued:[],failed:[]}),p={get push(){return l()},get command(){return l()},get elb(){return l()},get window(){return{dataLayer:[],addEventListener:m,removeEventListener:m}}},f={};function _(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function y(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function g(){return["event","purchase",{transaction_id:"T_12345",value:25.42,currency:"EUR",items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",quantity:1,price:25.42}]}]}function v(){return["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_variant:"red",quantity:1,price:15.25}]}]}function w(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]}function X(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function h(){return["set",{currency:"EUR",country:"DE"}]}function L(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}t(f,{add_to_cart:()=>v,config:()=>X,consentDefault:()=>y,consentUpdate:()=>_,directDataLayerEvent:()=>L,purchase:()=>g,setCustom:()=>h,view_item:()=>w});var E={};t(E,{add_to_cart:()=>U,config:()=>P,configGA4:()=>A,consentOnlyMapping:()=>x,consentUpdate:()=>b,customEvent:()=>q,purchase:()=>k,view_item:()=>$});var b={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:e=>"granted"===e},marketing:{key:"ad_storage",fn:e=>"granted"===e}}}}},k={name:"order complete",data:{map:{id:"transaction_id",total:"value",currency:"currency",nested:{loop:["items",{map:{type:{value:"product"},data:{map:{id:"item_id",name:"item_name",category:"item_category",quantity:"quantity",price:"price"}}}}]}}}},U={name:"product add",data:{map:{id:"items.0.item_id",name:"items.0.item_name",price:"value",currency:"currency",color:"items.0.item_variant",quantity:"items.0.quantity"}}},$={name:"product view",data:{map:{id:"items.0.item_id",name:"items.0.item_name",category:"items.0.item_category",price:"items.0.price",currency:"currency"}}},A={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},q={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},P={consent:{update:b},purchase:k,add_to_cart:U,view_item:$,"config G-XXXXXXXXXX":A,custom_event:q,"*":{data:{}}},x={consent:{update:b}},C=async(e,t)=>{const{elb:a,window:n}=t,r={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},i={settings:r};return n&&(function(e,t){const a=t.settings,n=(null==a?void 0:a.name)||"dataLayer",r=window[n];if(Array.isArray(r)&&!u){u=!0;try{for(const t of r)o(e,a,t)}finally{u=!1}}}(a,i),function(e,t){const a=t.settings,n=(null==a?void 0:a.name)||"dataLayer";window[n]||(window[n]=[]);const r=window[n];if(!Array.isArray(r))return;const i=r.push.bind(r);r.push=function(...t){if(u)return i(...t);u=!0;try{for(const n of t)o(e,a,n)}finally{u=!1}return i(...t)}}(a,i)),{type:"dataLayer",config:i,push:a,destroy:async()=>{const e=r.name||"dataLayer";n&&n[e]&&Array.isArray(n[e])}}},D=C;export{f as Events,E as Mapping,s as SourceDataLayer,x as consentOnlyMapping,_ as consentUpdateEvent,P as dataLayerExamples,D as default,d as env,C as sourceDataLayer};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interceptor.ts","../src/types/index.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts","../src/index.ts"],"sourcesContent":["import type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n push: Collector.PushFn,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!window[dataLayerName]) {\n window[dataLayerName] = [];\n }\n\n const dataLayer = window[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(push, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n push: Collector.PushFn,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = window[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n // Process all existing events\n for (const event of dataLayer) {\n processEvent(push, settings, event);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n push: Collector.PushFn,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.name}`;\n\n // Create partial WalkerOS event structure (collector will enrich it)\n const { name: _name, ...data } = transformedEvent;\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name: eventName,\n data: data as WalkerOS.Properties,\n };\n\n // Push to collector\n tryCatch(\n () => push(partialEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { name: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n const { event, ...rest } = rawEvent;\n return { name: event, ...rest };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { name: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Only allow 'default' and 'update' actions for consent\n if (action !== 'default' && action !== 'update') return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n name: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n","import type { WalkerOS, Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema } from '../schemas';\nimport { z } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\nexport type DataLayer = Array<unknown>;\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// Override filter to be actual function type (not serializable in schema)\nexport interface Settings extends Omit<BaseSettings, 'filter'> {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\nexport interface Mapping {}\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env>;\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n","import { zodToSchema } from '@walkeros/core';\nimport { SettingsSchema } from './settings';\n\n// Export primitives\nexport * from './primitives';\n\n// Export Zod schemas and types\nexport { SettingsSchema, type Settings } from './settings';\n\n// JSON Schema exports (for website PropertyTable and documentation tools)\nexport const settings = zodToSchema(SettingsSchema);\n","import { z } from '@walkeros/core';\nimport { JavaScriptVarName, EventPrefix } from './primitives';\n\n/**\n * DataLayer source settings schema\n */\nexport const SettingsSchema = z.object({\n name: JavaScriptVarName.default('dataLayer')\n .describe('DataLayer variable name (default: dataLayer)')\n .optional(),\n\n prefix: EventPrefix.default('dataLayer')\n .describe('Event prefix for filtering which events to process')\n .optional(),\n\n filter: z\n .any()\n .describe(\n 'Custom filter function: (event: unknown) => boolean | Promise<boolean>',\n )\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { z } from '@walkeros/core';\n\n/**\n * JavaScript variable name\n * Used for dataLayer variable naming\n */\nexport const JavaScriptVarName = z\n .string()\n .min(1)\n .regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/, 'Must be a valid JavaScript identifier')\n .describe('JavaScript variable name');\n\n/**\n * Event prefix\n * Used for filtering dataLayer events\n */\nexport const EventPrefix = z\n .string()\n .min(1)\n .describe('Prefix for filtering dataLayer events');\n","import type { Source, Elb } from '@walkeros/core';\n\n/**\n * Example environment configurations for dataLayer source\n *\n * These environments provide standardized mock structures for testing\n * dataLayer interception without requiring a real window object.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Elb.Fn;\n return fn;\n};\n\n/**\n * Environment interface for dataLayer source\n */\ninterface DataLayerEnv extends Source.BaseEnv {\n window?: typeof window;\n}\n\n/**\n * Mock window object with dataLayer array\n */\nconst createMockWindow = () => ({\n dataLayer: [] as unknown[],\n addEventListener: noop,\n removeEventListener: noop,\n});\n\n/**\n * Standard mock environment for testing dataLayer source\n *\n * Use this for testing dataLayer.push interception and event transformation\n * without requiring a real browser environment.\n */\nexport const push: DataLayerEnv = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n get window() {\n return createMockWindow() as unknown as typeof window;\n },\n};\n","/**\n * Sample gtag events that would be pushed to dataLayer\n * These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events\n */\n\n/**\n * Consent Mode Events - Primary use case\n */\nexport function consentUpdate(): unknown[] {\n return [\n 'consent',\n 'update',\n {\n ad_user_data: 'granted',\n ad_personalization: 'granted',\n ad_storage: 'denied',\n analytics_storage: 'granted',\n },\n ];\n}\n\nexport function consentDefault(): unknown[] {\n return [\n 'consent',\n 'default',\n {\n ad_storage: 'denied',\n analytics_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n },\n ];\n}\n\n/**\n * E-commerce Events\n */\nexport function purchase(): unknown[] {\n return [\n 'event',\n 'purchase',\n {\n transaction_id: 'T_12345',\n value: 25.42,\n currency: 'EUR',\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n quantity: 1,\n price: 25.42,\n },\n ],\n },\n ];\n}\n\nexport function add_to_cart(): unknown[] {\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ];\n}\n\nexport function view_item(): unknown[] {\n return [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n price: 15.25,\n },\n ],\n },\n ];\n}\n\n/**\n * Config Events\n */\nexport function config(): unknown[] {\n return [\n 'config',\n 'G-XXXXXXXXXX',\n {\n page_title: 'Custom Page Title',\n page_location: 'https://example.com/page',\n send_page_view: false,\n },\n ];\n}\n\n/**\n * Set Events\n */\nexport function setCustom(): unknown[] {\n return [\n 'set',\n {\n currency: 'EUR',\n country: 'DE',\n },\n ];\n}\n\n/**\n * Direct dataLayer object pushes (not gtag)\n */\nexport function directDataLayerEvent(): Record<string, unknown> {\n return {\n event: 'custom_event',\n custom_parameter: 'custom_value',\n user_id: 'user123',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\n\n/**\n * Consent Mode Mapping - Primary use case\n * Maps gtag consent events to walker consent commands\n */\nexport const consentUpdate: Mapping.Rule = {\n name: 'walker consent',\n settings: {\n command: {\n map: {\n functional: { value: true }, // Static value - always true for functional\n analytics: {\n key: 'analytics_storage',\n fn: (value: unknown) => value === 'granted',\n },\n marketing: {\n key: 'ad_storage',\n fn: (value: unknown) => value === 'granted',\n },\n },\n },\n },\n};\n\n/**\n * E-commerce Event Mappings\n * Transform GA4 ecommerce events to WalkerOS events\n */\nexport const purchase: Mapping.Rule = {\n name: 'order complete',\n data: {\n map: {\n id: 'transaction_id',\n total: 'value',\n currency: 'currency',\n nested: {\n loop: [\n 'items',\n {\n map: {\n type: { value: 'product' },\n data: {\n map: {\n id: 'item_id',\n name: 'item_name',\n category: 'item_category',\n quantity: 'quantity',\n price: 'price',\n },\n },\n },\n },\n ],\n },\n },\n },\n};\n\nexport const add_to_cart: Mapping.Rule = {\n name: 'product add',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n price: 'value',\n currency: 'currency',\n color: 'items.0.item_variant',\n quantity: 'items.0.quantity',\n },\n },\n};\n\nexport const view_item: Mapping.Rule = {\n name: 'product view',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n category: 'items.0.item_category',\n price: 'items.0.price',\n currency: 'currency',\n },\n },\n};\n\n/**\n * Config Event Mapping\n * Transform GA4 config events to WalkerOS page events\n */\nexport const configGA4: Mapping.Rule = {\n name: 'page view',\n data: {\n map: {\n title: 'page_title',\n url: 'page_location',\n },\n },\n};\n\n/**\n * Custom Event Mapping\n * Handle direct dataLayer pushes\n */\nexport const customEvent: Mapping.Rule = {\n // Keep original event name with gtag prefix\n data: {\n map: {\n // Map all properties as-is\n user_id: 'user_id',\n custom_parameter: 'custom_parameter',\n },\n },\n};\n\n/**\n * Complete mapping configuration\n * Following the same pattern as destination mappings\n */\nexport const config = {\n // Consent events\n consent: {\n update: consentUpdate,\n },\n\n // E-commerce events\n purchase: purchase,\n add_to_cart: add_to_cart,\n view_item: view_item,\n\n // Config events\n 'config G-XXXXXXXXXX': configGA4,\n\n // Custom events\n custom_event: customEvent,\n\n // Catch-all for unmapped events\n '*': {\n // Pass through with gtag prefix\n data: {\n // Copy all data as-is\n },\n },\n} as unknown as Mapping.Rules;\n\n/**\n * Minimal consent-only mapping for focused use cases\n */\nexport const consentOnlyMapping = {\n consent: {\n update: consentUpdate,\n },\n} as unknown as Mapping.Rules;\n","import type { Source } from '@walkeros/core';\nimport type { Types } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n// Export schemas\nexport * as schemas from './schemas';\n\n// Export examples\nexport * from './examples';\n\n/**\n * DataLayer source implementation using environment injection.\n *\n * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.\n * It works by replacing the dataLayer.push method with a custom handler.\n */\nexport const sourceDataLayer: Source.Init<Types> = async (\n config: Partial<Source.Config<Types>>,\n env: Source.Env<Types>,\n) => {\n const { elb, window: envWindow } = env;\n\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n if (envWindow) {\n processExistingEvents(elb, fullConfig);\n interceptDataLayer(elb, fullConfig);\n }\n\n return {\n type: 'dataLayer',\n config: fullConfig,\n push: elb,\n destroy: async () => {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (\n envWindow &&\n envWindow[dataLayerName] &&\n Array.isArray(envWindow[dataLayerName])\n ) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n};\n\nexport default sourceDataLayer;\n"],"mappings":"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","names":["push","config","settings","z","z","add_to_cart","config","consentUpdate","purchase","view_item","config","settings"]}
1
+ {"version":3,"sources":["../src/interceptor.ts","../src/types/index.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts","../src/index.ts"],"sourcesContent":["import type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n push: Collector.PushFn,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!window[dataLayerName]) {\n window[dataLayerName] = [];\n }\n\n const dataLayer = window[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(push, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n push: Collector.PushFn,\n config: Source.Config,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = window[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n // Process all existing events\n for (const event of dataLayer) {\n processEvent(push, settings, event);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n push: Collector.PushFn,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.name}`;\n\n // Create partial WalkerOS event structure (collector will enrich it)\n const { name: _name, ...data } = transformedEvent;\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name: eventName,\n data: data as WalkerOS.Properties,\n };\n\n // Push to collector\n tryCatch(\n () => push(partialEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { name: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n const { event, ...rest } = rawEvent;\n return { name: event, ...rest };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { name: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Only allow 'default' and 'update' actions for consent\n if (action !== 'default' && action !== 'update') return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n name: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n","import type { WalkerOS, Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema } from '../schemas';\nimport { z } from '@walkeros/core/dev';\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\nexport type DataLayer = Array<unknown>;\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// Override filter to be actual function type (not serializable in schema)\nexport interface Settings extends Omit<BaseSettings, 'filter'> {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport interface Mapping {}\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n","import type { Source, Elb } from '@walkeros/core';\n\n/**\n * Example environment configurations for dataLayer source\n *\n * These environments provide standardized mock structures for testing\n * dataLayer interception without requiring a real window object.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\n// Create a properly typed elb/push/command function that returns a promise with PushResult\nconst createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Elb.Fn;\n return fn;\n};\n\n/**\n * Environment interface for dataLayer source\n */\ninterface DataLayerEnv extends Source.BaseEnv {\n window?: typeof window;\n}\n\n/**\n * Mock window object with dataLayer array\n */\nconst createMockWindow = () => ({\n dataLayer: [] as unknown[],\n addEventListener: noop,\n removeEventListener: noop,\n});\n\n/**\n * Standard mock environment for testing dataLayer source\n *\n * Use this for testing dataLayer.push interception and event transformation\n * without requiring a real browser environment.\n */\nexport const push: DataLayerEnv = {\n get push() {\n return createMockElbFn();\n },\n get command() {\n return createMockElbFn();\n },\n get elb() {\n return createMockElbFn();\n },\n get window() {\n return createMockWindow() as unknown as typeof window;\n },\n};\n","/**\n * Sample gtag events that would be pushed to dataLayer\n * These represent real-world gtag calls that the dataLayer source should transform to WalkerOS events\n */\n\n/**\n * Consent Mode Events - Primary use case\n */\nexport function consentUpdate(): unknown[] {\n return [\n 'consent',\n 'update',\n {\n ad_user_data: 'granted',\n ad_personalization: 'granted',\n ad_storage: 'denied',\n analytics_storage: 'granted',\n },\n ];\n}\n\nexport function consentDefault(): unknown[] {\n return [\n 'consent',\n 'default',\n {\n ad_storage: 'denied',\n analytics_storage: 'denied',\n ad_user_data: 'denied',\n ad_personalization: 'denied',\n },\n ];\n}\n\n/**\n * E-commerce Events\n */\nexport function purchase(): unknown[] {\n return [\n 'event',\n 'purchase',\n {\n transaction_id: 'T_12345',\n value: 25.42,\n currency: 'EUR',\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n quantity: 1,\n price: 25.42,\n },\n ],\n },\n ];\n}\n\nexport function add_to_cart(): unknown[] {\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ];\n}\n\nexport function view_item(): unknown[] {\n return [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'Product Name',\n item_category: 'Category',\n price: 15.25,\n },\n ],\n },\n ];\n}\n\n/**\n * Config Events\n */\nexport function config(): unknown[] {\n return [\n 'config',\n 'G-XXXXXXXXXX',\n {\n page_title: 'Custom Page Title',\n page_location: 'https://example.com/page',\n send_page_view: false,\n },\n ];\n}\n\n/**\n * Set Events\n */\nexport function setCustom(): unknown[] {\n return [\n 'set',\n {\n currency: 'EUR',\n country: 'DE',\n },\n ];\n}\n\n/**\n * Direct dataLayer object pushes (not gtag)\n */\nexport function directDataLayerEvent(): Record<string, unknown> {\n return {\n event: 'custom_event',\n custom_parameter: 'custom_value',\n user_id: 'user123',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport { isObject } from '@walkeros/core';\n\n/**\n * Consent Mode Mapping - Primary use case\n * Maps gtag consent events to walker consent commands\n */\nexport const consentUpdate: Mapping.Rule = {\n name: 'walker consent',\n settings: {\n command: {\n map: {\n functional: { value: true }, // Static value - always true for functional\n analytics: {\n key: 'analytics_storage',\n fn: (value: unknown) => value === 'granted',\n },\n marketing: {\n key: 'ad_storage',\n fn: (value: unknown) => value === 'granted',\n },\n },\n },\n },\n};\n\n/**\n * E-commerce Event Mappings\n * Transform GA4 ecommerce events to WalkerOS events\n */\nexport const purchase: Mapping.Rule = {\n name: 'order complete',\n data: {\n map: {\n id: 'transaction_id',\n total: 'value',\n currency: 'currency',\n nested: {\n loop: [\n 'items',\n {\n map: {\n type: { value: 'product' },\n data: {\n map: {\n id: 'item_id',\n name: 'item_name',\n category: 'item_category',\n quantity: 'quantity',\n price: 'price',\n },\n },\n },\n },\n ],\n },\n },\n },\n};\n\nexport const add_to_cart: Mapping.Rule = {\n name: 'product add',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n price: 'value',\n currency: 'currency',\n color: 'items.0.item_variant',\n quantity: 'items.0.quantity',\n },\n },\n};\n\nexport const view_item: Mapping.Rule = {\n name: 'product view',\n data: {\n map: {\n id: 'items.0.item_id',\n name: 'items.0.item_name',\n category: 'items.0.item_category',\n price: 'items.0.price',\n currency: 'currency',\n },\n },\n};\n\n/**\n * Config Event Mapping\n * Transform GA4 config events to WalkerOS page events\n */\nexport const configGA4: Mapping.Rule = {\n name: 'page view',\n data: {\n map: {\n title: 'page_title',\n url: 'page_location',\n },\n },\n};\n\n/**\n * Custom Event Mapping\n * Handle direct dataLayer pushes\n */\nexport const customEvent: Mapping.Rule = {\n // Keep original event name with gtag prefix\n data: {\n map: {\n // Map all properties as-is\n user_id: 'user_id',\n custom_parameter: 'custom_parameter',\n },\n },\n};\n\n/**\n * Complete mapping configuration\n * Following the same pattern as destination mappings\n */\nexport const config = {\n // Consent events\n consent: {\n update: consentUpdate,\n },\n\n // E-commerce events\n purchase: purchase,\n add_to_cart: add_to_cart,\n view_item: view_item,\n\n // Config events\n 'config G-XXXXXXXXXX': configGA4,\n\n // Custom events\n custom_event: customEvent,\n\n // Catch-all for unmapped events\n '*': {\n // Pass through with gtag prefix\n data: {\n // Copy all data as-is\n },\n },\n} as unknown as Mapping.Rules;\n\n/**\n * Minimal consent-only mapping for focused use cases\n */\nexport const consentOnlyMapping = {\n consent: {\n update: consentUpdate,\n },\n} as unknown as Mapping.Rules;\n","import type { Source } from '@walkeros/core';\nimport type { Types } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n// Export examples\nexport * from './examples';\n\n/**\n * DataLayer source implementation using environment injection.\n *\n * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.\n * It works by replacing the dataLayer.push method with a custom handler.\n */\nexport const sourceDataLayer: Source.Init<Types> = async (\n config: Partial<Source.Config<Types>>,\n env: Source.Env<Types>,\n) => {\n const { elb, window: envWindow } = env;\n\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n if (envWindow) {\n processExistingEvents(elb, fullConfig);\n interceptDataLayer(elb, fullConfig);\n }\n\n return {\n type: 'dataLayer',\n config: fullConfig,\n push: elb,\n destroy: async () => {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (\n envWindow &&\n envWindow[dataLayerName] &&\n Array.isArray(envWindow[dataLayerName])\n ) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n};\n\nexport default sourceDataLayer;\n"],"mappings":"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","names":["push","config","add_to_cart","config","consentUpdate","purchase","view_item","config"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/web-source-datalayer",
3
3
  "description": "DataLayer source for walkerOS",
4
- "version": "0.3.1",
4
+ "version": "0.4.1",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -16,6 +16,11 @@
16
16
  "types": "./dist/examples/index.d.ts",
17
17
  "import": "./dist/examples/index.mjs",
18
18
  "require": "./dist/examples/index.js"
19
+ },
20
+ "./dev": {
21
+ "types": "./dist/dev.d.ts",
22
+ "import": "./dist/dev.mjs",
23
+ "require": "./dist/dev.js"
19
24
  }
20
25
  },
21
26
  "files": [
@@ -30,8 +35,8 @@
30
35
  "update": "npx npm-check-updates -u && npm update"
31
36
  },
32
37
  "dependencies": {
33
- "@walkeros/core": "0.3.1",
34
- "@walkeros/collector": "0.3.1"
38
+ "@walkeros/core": "0.4.1",
39
+ "@walkeros/collector": "0.4.1"
35
40
  },
36
41
  "devDependencies": {
37
42
  "@types/gtag.js": "^0.0.20"