@walkeros/web-source-datalayer 4.7.0-next-1790722899482 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @walkeros/web-source-datalayer
2
2
 
3
- ## 4.7.0-next-1790722899482
3
+ ## 4.7.0
4
4
 
5
5
  ### Minor Changes
6
6
 
@@ -17,9 +17,14 @@
17
17
  option; the `Mapping` type is now an empty interface. The runtime never read
18
18
  `command`, so a consent rule only renames the push to `walker consent` and the
19
19
  consent fields stay in `data`, as the updated example shows.
20
+ - Updated dependencies [786a860]
20
21
  - Updated dependencies [74821ed]
21
22
  - Updated dependencies [06b498a]
23
+ - Updated dependencies [7e5e3de]
24
+ - Updated dependencies [b9668bf]
22
25
  - Updated dependencies [74821ed]
26
+ - Updated dependencies [64b06de]
27
+ - Updated dependencies [4b4937f]
23
28
  - Updated dependencies [74821ed]
24
29
  - Updated dependencies [74821ed]
25
30
  - Updated dependencies [74821ed]
@@ -29,10 +34,12 @@
29
34
  - Updated dependencies [74821ed]
30
35
  - Updated dependencies [74821ed]
31
36
  - Updated dependencies [74821ed]
37
+ - Updated dependencies [e860006]
32
38
  - Updated dependencies [74821ed]
33
39
  - Updated dependencies [74821ed]
34
- - @walkeros/collector@4.7.0-next-1790722899482
35
- - @walkeros/core@4.7.0-next-1790722899482
40
+ - Updated dependencies [4f89234]
41
+ - @walkeros/collector@4.7.0
42
+ - @walkeros/core@4.7.0
36
43
 
37
44
  ## 4.6.1
38
45
 
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,a=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,n=(e,a)=>{for(var r in a)t(e,r,{get:a[r],enumerable:!0})},o={};n(o,{examples:()=>y,schemas:()=>s}),module.exports=(e=o,((e,n,o,s)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let c of r(n))i.call(e,c)||c===o||t(e,c,{get:()=>n[c],enumerable:!(s=a(n,c))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};n(s,{EventPrefix:()=>p,JavaScriptVarName:()=>u,SettingsSchema:()=>m,settings:()=>g});var c=require("@walkeros/core/dev"),d=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=l.z.string().min(1).regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,"Must be a valid JavaScript identifier").describe("JavaScript variable name"),p=l.z.string().min(1).describe("Prefix for filtering dataLayer events"),m=d.z.object({name:u.default("dataLayer").describe("DataLayer variable name (default: dataLayer)").optional(),prefix:p.default("dataLayer").describe("Event prefix for filtering which events to process").optional(),filter:d.z.any().describe("Custom filter function: (event: unknown) => boolean | Promise<boolean>").optional()}),g=(0,c.zodToSchema)(m),y={};n(y,{createTrigger:()=>j,env:()=>v,step:()=>b,trigger:()=>P});var v={};n(v,{push:()=>h});var _=()=>{},w=()=>()=>Promise.resolve({ok:!0}),f={error:_,warn:_,info:_,debug:_,throw:e=>{throw"string"==typeof e?new Error(e):e},json:_,scope:()=>f},h={get push(){return w()},get command(){return w()},get elb(){return w()},get window(){return{dataLayer:[],addEventListener:_,removeEventListener:_}},logger:f},b={};n(b,{consentUpdate:()=>S,directEvent:()=>x,gtagAddToCart:()=>k,gtagPurchase:()=>L,gtagViewItem:()=>U});var L={title:"gtag purchase",description:"A gtag purchase call pushed to the dataLayer is captured as a walker dataLayer purchase event with item details.",trigger:{type:"gtag"},in:["event","purchase",{transaction_id:"T-12345",value:25.42,currency:"EUR",items:[{item_id:"SKU-1",item_name:"T-Shirt",quantity:1}]}],out:[["elb",{name:"dataLayer purchase",data:{transaction_id:"T-12345",value:25.42,currency:"EUR",items:[{item_id:"SKU-1",item_name:"T-Shirt",quantity:1}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},S={title:"Consent update",description:"A gtag consent update is captured from the dataLayer as a walker dataLayer consent update event.",trigger:{type:"gtag"},in:["consent","update",{ad_storage:"granted",analytics_storage:"granted"}],out:[["elb",{name:"dataLayer consent update",data:{ad_storage:"granted",analytics_storage:"granted"},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},k={title:"gtag add_to_cart",description:"A gtag add_to_cart call pushed to the dataLayer is captured as a walker dataLayer add_to_cart event.",trigger:{type:"gtag"},in:["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"T-Shirt",item_variant:"red",quantity:1,price:15.25}]}],out:[["elb",{name:"dataLayer add_to_cart",data:{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"T-Shirt",item_variant:"red",quantity:1,price:15.25}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},U={title:"gtag view_item",description:"A gtag view_item call pushed to the dataLayer is captured as a walker dataLayer view_item event with item data.",trigger:{type:"gtag"},in:["event","view_item",{currency:"EUR",value:29.99,items:[{item_id:"SKU_67890",item_name:"Sneakers",item_category:"Footwear",price:29.99}]}],out:[["elb",{name:"dataLayer view_item",data:{currency:"EUR",value:29.99,items:[{item_id:"SKU_67890",item_name:"Sneakers",item_category:"Footwear",price:29.99}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},x={title:"Direct dataLayer event",description:"A plain object pushed directly onto the dataLayer is captured as a walker dataLayer custom event.",trigger:{type:"direct"},in:{event:"custom_event",category:"engagement",label:"video_play"},out:[["elb",{name:"dataLayer custom_event",data:{category:"engagement",label:"video_play"},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},E=require("@walkeros/collector"),j=async e=>{let t;return{get flow(){return t},trigger:()=>async a=>{var r,i;if(!t){const a={...e};if(a.sources){a.sources={...a.sources};for(const[e,t]of Object.entries(a.sources))(null==(r=t.env)?void 0:r.window)||(a.sources[e]={...t,env:{...t.env,window:window}})}const n=await(0,E.startFlow)({...a,run:null==(i=a.run)||i});t={collector:n.collector,elb:n.elb}}const n=window;n.dataLayer||(n.dataLayer=[]),n.dataLayer.push(a)}}},P=(e,t)=>{const a=t.window;a.dataLayer||(a.dataLayer=[]),a.dataLayer.push(e)};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,a=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,n=(e,a)=>{for(var r in a)t(e,r,{get:a[r],enumerable:!0})},o={};n(o,{examples:()=>y,schemas:()=>s}),module.exports=(e=o,((e,n,o,s)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let c of r(n))i.call(e,c)||c===o||t(e,c,{get:()=>n[c],enumerable:!(s=a(n,c))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s={};n(s,{EventPrefix:()=>p,JavaScriptVarName:()=>u,SettingsSchema:()=>m,settings:()=>g});var c=require("@walkeros/core/dev"),d=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),u=l.z.string().min(1).regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,"Must be a valid JavaScript identifier").describe("JavaScript variable name"),p=l.z.string().min(1).describe("Prefix for filtering dataLayer events"),m=d.z.object({name:u.default("dataLayer").describe("DataLayer variable name (default: dataLayer)").optional(),prefix:p.default("dataLayer").describe("Event prefix for filtering which events to process").optional(),filter:d.z.any().describe("Custom filter function: (event: unknown) => boolean | Promise<boolean>").optional()}),g=(0,c.zodToSchema)(m),y={};n(y,{createTrigger:()=>j,env:()=>v,step:()=>h,trigger:()=>P});var v={};n(v,{push:()=>b});var _=()=>{},w=()=>()=>Promise.resolve({ok:!0}),f={error:_,warn:_,info:_,debug:_,throw:e=>{throw"string"==typeof e?new Error(e):e},json:_,scope:()=>f},b={get push(){return w()},get command(){return w()},get elb(){return w()},get window(){return{dataLayer:[],addEventListener:_,removeEventListener:_}},logger:f},h={};n(h,{consentUpdate:()=>S,directEvent:()=>U,gtagAddToCart:()=>k,gtagPurchase:()=>L,gtagViewItem:()=>E});var L={title:"gtag purchase",description:"A gtag purchase call pushed to the dataLayer is captured as a walker dataLayer purchase event with item details.",trigger:{type:"gtag"},in:["event","purchase",{transaction_id:"T-12345",value:25.42,currency:"EUR",items:[{item_id:"SKU-1",item_name:"T-Shirt",quantity:1}]}],out:[["elb",{name:"dataLayer purchase",data:{transaction_id:"T-12345",value:25.42,currency:"EUR",items:[{item_id:"SKU-1",item_name:"T-Shirt",quantity:1}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},S={title:"Consent update",description:"A gtag consent update is captured from the dataLayer as a walker dataLayer consent update event.",trigger:{type:"gtag"},in:["consent","update",{ad_storage:"granted",analytics_storage:"granted"}],out:[["elb",{name:"dataLayer consent update",data:{ad_storage:"granted",analytics_storage:"granted"},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},k={title:"gtag add_to_cart",description:"A gtag add_to_cart call pushed to the dataLayer is captured as a walker dataLayer add_to_cart event.",trigger:{type:"gtag"},in:["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"T-Shirt",item_variant:"red",quantity:1,price:15.25}]}],out:[["elb",{name:"dataLayer add_to_cart",data:{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"T-Shirt",item_variant:"red",quantity:1,price:15.25}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},E={title:"gtag view_item",description:"A gtag view_item call pushed to the dataLayer is captured as a walker dataLayer view_item event with item data.",trigger:{type:"gtag"},in:["event","view_item",{currency:"EUR",value:29.99,items:[{item_id:"SKU_67890",item_name:"Sneakers",item_category:"Footwear",price:29.99}]}],out:[["elb",{name:"dataLayer view_item",data:{currency:"EUR",value:29.99,items:[{item_id:"SKU_67890",item_name:"Sneakers",item_category:"Footwear",price:29.99}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},U={title:"Direct dataLayer event",description:"A plain object pushed directly onto the dataLayer is captured as a walker dataLayer custom event.",trigger:{type:"direct"},in:{event:"custom_event",category:"engagement",label:"video_play"},out:[["elb",{name:"dataLayer custom_event",data:{category:"engagement",label:"video_play"},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},x=require("@walkeros/collector"),j=async e=>{let t;return{get flow(){return t},trigger:()=>async a=>{var r,i;if(!t){const a={...e};if(a.sources){a.sources={...a.sources};for(const[e,t]of Object.entries(a.sources))(null==(r=t.env)?void 0:r.window)||(a.sources[e]={...t,env:{...t.env,window:window}})}const n=await(0,x.startFlow)({...a,run:null==(i=a.run)||i});t={collector:n.collector,elb:n.elb}}T(window,a)}}},P=(e,t)=>{const a=t.window;var r;"object"==typeof(r=a)&&null!==r&&"addEventListener"in r&&T(a,e)};function T(e,t){e.dataLayer||(e.dataLayer=[]),e.dataLayer.push(t)}//# sourceMappingURL=dev.js.map
package/dist/dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\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/dev';\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/dev';\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","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Source, Elb, Logger } 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 })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopLogger: Logger.Instance = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noop,\n scope: () => noopLogger,\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 logger: noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const gtagPurchase: Flow.StepExample = {\n title: 'gtag purchase',\n description:\n 'A gtag purchase call pushed to the dataLayer is captured as a walker dataLayer purchase event with item details.',\n trigger: { type: 'gtag' },\n in: [\n 'event',\n 'purchase',\n {\n transaction_id: 'T-12345',\n value: 25.42,\n currency: 'EUR',\n items: [{ item_id: 'SKU-1', item_name: 'T-Shirt', quantity: 1 }],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer purchase',\n data: {\n transaction_id: 'T-12345',\n value: 25.42,\n currency: 'EUR',\n items: [{ item_id: 'SKU-1', item_name: 'T-Shirt', quantity: 1 }],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const consentUpdate: Flow.StepExample = {\n title: 'Consent update',\n description:\n 'A gtag consent update is captured from the dataLayer as a walker dataLayer consent update event.',\n trigger: { type: 'gtag' },\n in: [\n 'consent',\n 'update',\n {\n ad_storage: 'granted',\n analytics_storage: 'granted',\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer consent update',\n data: {\n ad_storage: 'granted',\n analytics_storage: 'granted',\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const gtagAddToCart: Flow.StepExample = {\n title: 'gtag add_to_cart',\n description:\n 'A gtag add_to_cart call pushed to the dataLayer is captured as a walker dataLayer add_to_cart event.',\n trigger: { type: 'gtag' },\n in: [\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: 'T-Shirt',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer add_to_cart',\n data: {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'T-Shirt',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const gtagViewItem: Flow.StepExample = {\n title: 'gtag view_item',\n description:\n 'A gtag view_item call pushed to the dataLayer is captured as a walker dataLayer view_item event with item data.',\n trigger: { type: 'gtag' },\n in: [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 29.99,\n items: [\n {\n item_id: 'SKU_67890',\n item_name: 'Sneakers',\n item_category: 'Footwear',\n price: 29.99,\n },\n ],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer view_item',\n data: {\n currency: 'EUR',\n value: 29.99,\n items: [\n {\n item_id: 'SKU_67890',\n item_name: 'Sneakers',\n item_category: 'Footwear',\n price: 29.99,\n },\n ],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const directEvent: Flow.StepExample = {\n title: 'Direct dataLayer event',\n description:\n 'A plain object pushed directly onto the dataLayer is captured as a walker dataLayer custom event.',\n trigger: { type: 'direct' },\n in: {\n event: 'custom_event',\n category: 'engagement',\n label: 'video_play',\n },\n out: [\n [\n 'elb',\n {\n name: 'dataLayer custom_event',\n data: {\n category: 'engagement',\n label: 'video_play',\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\nconst createTrigger: Trigger.CreateFn<unknown, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<unknown, void> = () => async (content: unknown) => {\n // Lazy startFlow — source patches window.dataLayer.push during init\n if (!flow) {\n // Ensure dataLayer sources get the window env for interception\n const enrichedConfig = { ...config };\n if (enrichedConfig.sources) {\n enrichedConfig.sources = { ...enrichedConfig.sources };\n for (const [id, source] of Object.entries(enrichedConfig.sources)) {\n if (!source.env?.window) {\n enrichedConfig.sources[id] = {\n ...source,\n env: { ...source.env, window },\n };\n }\n }\n }\n const result = await startFlow({\n ...enrichedConfig,\n run: enrichedConfig.run ?? true,\n });\n flow = { collector: result.collector, elb: result.elb };\n }\n\n // Push to dataLayer — the interceptor catches it\n const win = window as Window & { dataLayer?: unknown[] };\n if (!win.dataLayer) win.dataLayer = [];\n win.dataLayer.push(content);\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Pushes step example input to window.dataLayer after source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n const win = env.window as Window & { dataLayer?: unknown[] };\n if (!win.dataLayer) win.dataLayer = [];\n win.dataLayer.push(input);\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["import_dev","import_dev","trigger"]}
1
+ {"version":3,"sources":["../src/dev.ts","../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["export * as schemas from './schemas';\nexport * as examples from './examples';\n","import { zodToSchema } from '@walkeros/core/dev';\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/dev';\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/dev';\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","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Source, Elb, Logger } 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 })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopLogger: Logger.Instance = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noop,\n scope: () => noopLogger,\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 logger: noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const gtagPurchase: Flow.StepExample = {\n title: 'gtag purchase',\n description:\n 'A gtag purchase call pushed to the dataLayer is captured as a walker dataLayer purchase event with item details.',\n trigger: { type: 'gtag' },\n in: [\n 'event',\n 'purchase',\n {\n transaction_id: 'T-12345',\n value: 25.42,\n currency: 'EUR',\n items: [{ item_id: 'SKU-1', item_name: 'T-Shirt', quantity: 1 }],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer purchase',\n data: {\n transaction_id: 'T-12345',\n value: 25.42,\n currency: 'EUR',\n items: [{ item_id: 'SKU-1', item_name: 'T-Shirt', quantity: 1 }],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const consentUpdate: Flow.StepExample = {\n title: 'Consent update',\n description:\n 'A gtag consent update is captured from the dataLayer as a walker dataLayer consent update event.',\n trigger: { type: 'gtag' },\n in: [\n 'consent',\n 'update',\n {\n ad_storage: 'granted',\n analytics_storage: 'granted',\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer consent update',\n data: {\n ad_storage: 'granted',\n analytics_storage: 'granted',\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const gtagAddToCart: Flow.StepExample = {\n title: 'gtag add_to_cart',\n description:\n 'A gtag add_to_cart call pushed to the dataLayer is captured as a walker dataLayer add_to_cart event.',\n trigger: { type: 'gtag' },\n in: [\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: 'T-Shirt',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer add_to_cart',\n data: {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'T-Shirt',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const gtagViewItem: Flow.StepExample = {\n title: 'gtag view_item',\n description:\n 'A gtag view_item call pushed to the dataLayer is captured as a walker dataLayer view_item event with item data.',\n trigger: { type: 'gtag' },\n in: [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 29.99,\n items: [\n {\n item_id: 'SKU_67890',\n item_name: 'Sneakers',\n item_category: 'Footwear',\n price: 29.99,\n },\n ],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer view_item',\n data: {\n currency: 'EUR',\n value: 29.99,\n items: [\n {\n item_id: 'SKU_67890',\n item_name: 'Sneakers',\n item_category: 'Footwear',\n price: 29.99,\n },\n ],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const directEvent: Flow.StepExample = {\n title: 'Direct dataLayer event',\n description:\n 'A plain object pushed directly onto the dataLayer is captured as a walker dataLayer custom event.',\n trigger: { type: 'direct' },\n in: {\n event: 'custom_event',\n category: 'engagement',\n label: 'video_play',\n },\n out: [\n [\n 'elb',\n {\n name: 'dataLayer custom_event',\n data: {\n category: 'engagement',\n label: 'video_play',\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport type { DataLayer } from '../types';\n\nconst createTrigger: Trigger.CreateFn<unknown, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<unknown, void> = () => async (content: unknown) => {\n // Lazy startFlow — source patches window.dataLayer.push during init\n if (!flow) {\n // Ensure dataLayer sources get the window env for interception\n const enrichedConfig = { ...config };\n if (enrichedConfig.sources) {\n enrichedConfig.sources = { ...enrichedConfig.sources };\n for (const [id, source] of Object.entries(enrichedConfig.sources)) {\n if (!source.env?.window) {\n enrichedConfig.sources[id] = {\n ...source,\n env: { ...source.env, window },\n };\n }\n }\n }\n const result = await startFlow({\n ...enrichedConfig,\n run: enrichedConfig.run ?? true,\n });\n flow = { collector: result.collector, elb: result.elb };\n }\n\n // Push to dataLayer — the interceptor catches it\n pushTo(window, content);\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Pushes step example input to window.dataLayer after source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n const win = env.window;\n if (!isWindow(win)) return;\n pushTo(win, input);\n};\n\nfunction pushTo(win: Window, content: DataLayer[number]): void {\n if (!win.dataLayer) win.dataLayer = [];\n win.dataLayer.push(content);\n}\n\nfunction isWindow(value: unknown): value is Window {\n return (\n typeof value === 'object' && value !== null && 'addEventListener' in value\n );\n}\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["import_dev","import_dev","trigger"]}
package/dist/dev.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,a)=>{for(var r in a)e(t,r,{get:a[r],enumerable:!0})},a={};t(a,{EventPrefix:()=>s,JavaScriptVarName:()=>o,SettingsSchema:()=>d,settings:()=>c});import{zodToSchema as r}from"@walkeros/core/dev";import{z as i}from"@walkeros/core/dev";import{z as n}from"@walkeros/core/dev";var o=n.string().min(1).regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,"Must be a valid JavaScript identifier").describe("JavaScript variable name"),s=n.string().min(1).describe("Prefix for filtering dataLayer events"),d=i.object({name:o.default("dataLayer").describe("DataLayer variable name (default: dataLayer)").optional(),prefix:s.default("dataLayer").describe("Event prefix for filtering which events to process").optional(),filter:i.any().describe("Custom filter function: (event: unknown) => boolean | Promise<boolean>").optional()}),c=r(d),l={};t(l,{createTrigger:()=>S,env:()=>m,step:()=>v,trigger:()=>k});var m={};t(m,{push:()=>y});var u=()=>{},p=()=>()=>Promise.resolve({ok:!0}),g={error:u,warn:u,info:u,debug:u,throw:e=>{throw"string"==typeof e?new Error(e):e},json:u,scope:()=>g},y={get push(){return p()},get command(){return p()},get elb(){return p()},get window(){return{dataLayer:[],addEventListener:u,removeEventListener:u}},logger:g},v={};t(v,{consentUpdate:()=>w,directEvent:()=>L,gtagAddToCart:()=>f,gtagPurchase:()=>_,gtagViewItem:()=>h});var _={title:"gtag purchase",description:"A gtag purchase call pushed to the dataLayer is captured as a walker dataLayer purchase event with item details.",trigger:{type:"gtag"},in:["event","purchase",{transaction_id:"T-12345",value:25.42,currency:"EUR",items:[{item_id:"SKU-1",item_name:"T-Shirt",quantity:1}]}],out:[["elb",{name:"dataLayer purchase",data:{transaction_id:"T-12345",value:25.42,currency:"EUR",items:[{item_id:"SKU-1",item_name:"T-Shirt",quantity:1}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},w={title:"Consent update",description:"A gtag consent update is captured from the dataLayer as a walker dataLayer consent update event.",trigger:{type:"gtag"},in:["consent","update",{ad_storage:"granted",analytics_storage:"granted"}],out:[["elb",{name:"dataLayer consent update",data:{ad_storage:"granted",analytics_storage:"granted"},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},f={title:"gtag add_to_cart",description:"A gtag add_to_cart call pushed to the dataLayer is captured as a walker dataLayer add_to_cart event.",trigger:{type:"gtag"},in:["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"T-Shirt",item_variant:"red",quantity:1,price:15.25}]}],out:[["elb",{name:"dataLayer add_to_cart",data:{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"T-Shirt",item_variant:"red",quantity:1,price:15.25}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},h={title:"gtag view_item",description:"A gtag view_item call pushed to the dataLayer is captured as a walker dataLayer view_item event with item data.",trigger:{type:"gtag"},in:["event","view_item",{currency:"EUR",value:29.99,items:[{item_id:"SKU_67890",item_name:"Sneakers",item_category:"Footwear",price:29.99}]}],out:[["elb",{name:"dataLayer view_item",data:{currency:"EUR",value:29.99,items:[{item_id:"SKU_67890",item_name:"Sneakers",item_category:"Footwear",price:29.99}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},L={title:"Direct dataLayer event",description:"A plain object pushed directly onto the dataLayer is captured as a walker dataLayer custom event.",trigger:{type:"direct"},in:{event:"custom_event",category:"engagement",label:"video_play"},out:[["elb",{name:"dataLayer custom_event",data:{category:"engagement",label:"video_play"},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]};import{startFlow as b}from"@walkeros/collector";var S=async e=>{let t;return{get flow(){return t},trigger:()=>async a=>{var r,i;if(!t){const a={...e};if(a.sources){a.sources={...a.sources};for(const[e,t]of Object.entries(a.sources))(null==(r=t.env)?void 0:r.window)||(a.sources[e]={...t,env:{...t.env,window:window}})}const n=await b({...a,run:null==(i=a.run)||i});t={collector:n.collector,elb:n.elb}}const n=window;n.dataLayer||(n.dataLayer=[]),n.dataLayer.push(a)}}},k=(e,t)=>{const a=t.window;a.dataLayer||(a.dataLayer=[]),a.dataLayer.push(e)};export{l as examples,a as schemas};//# sourceMappingURL=dev.mjs.map
1
+ var e=Object.defineProperty,t=(t,a)=>{for(var r in a)e(t,r,{get:a[r],enumerable:!0})},a={};t(a,{EventPrefix:()=>s,JavaScriptVarName:()=>o,SettingsSchema:()=>d,settings:()=>c});import{zodToSchema as r}from"@walkeros/core/dev";import{z as i}from"@walkeros/core/dev";import{z as n}from"@walkeros/core/dev";var o=n.string().min(1).regex(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,"Must be a valid JavaScript identifier").describe("JavaScript variable name"),s=n.string().min(1).describe("Prefix for filtering dataLayer events"),d=i.object({name:o.default("dataLayer").describe("DataLayer variable name (default: dataLayer)").optional(),prefix:s.default("dataLayer").describe("Event prefix for filtering which events to process").optional(),filter:i.any().describe("Custom filter function: (event: unknown) => boolean | Promise<boolean>").optional()}),c=r(d),l={};t(l,{createTrigger:()=>S,env:()=>m,step:()=>v,trigger:()=>k});var m={};t(m,{push:()=>y});var u=()=>{},p=()=>()=>Promise.resolve({ok:!0}),g={error:u,warn:u,info:u,debug:u,throw:e=>{throw"string"==typeof e?new Error(e):e},json:u,scope:()=>g},y={get push(){return p()},get command(){return p()},get elb(){return p()},get window(){return{dataLayer:[],addEventListener:u,removeEventListener:u}},logger:g},v={};t(v,{consentUpdate:()=>w,directEvent:()=>L,gtagAddToCart:()=>f,gtagPurchase:()=>_,gtagViewItem:()=>h});var _={title:"gtag purchase",description:"A gtag purchase call pushed to the dataLayer is captured as a walker dataLayer purchase event with item details.",trigger:{type:"gtag"},in:["event","purchase",{transaction_id:"T-12345",value:25.42,currency:"EUR",items:[{item_id:"SKU-1",item_name:"T-Shirt",quantity:1}]}],out:[["elb",{name:"dataLayer purchase",data:{transaction_id:"T-12345",value:25.42,currency:"EUR",items:[{item_id:"SKU-1",item_name:"T-Shirt",quantity:1}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},w={title:"Consent update",description:"A gtag consent update is captured from the dataLayer as a walker dataLayer consent update event.",trigger:{type:"gtag"},in:["consent","update",{ad_storage:"granted",analytics_storage:"granted"}],out:[["elb",{name:"dataLayer consent update",data:{ad_storage:"granted",analytics_storage:"granted"},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},f={title:"gtag add_to_cart",description:"A gtag add_to_cart call pushed to the dataLayer is captured as a walker dataLayer add_to_cart event.",trigger:{type:"gtag"},in:["event","add_to_cart",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"T-Shirt",item_variant:"red",quantity:1,price:15.25}]}],out:[["elb",{name:"dataLayer add_to_cart",data:{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"T-Shirt",item_variant:"red",quantity:1,price:15.25}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},h={title:"gtag view_item",description:"A gtag view_item call pushed to the dataLayer is captured as a walker dataLayer view_item event with item data.",trigger:{type:"gtag"},in:["event","view_item",{currency:"EUR",value:29.99,items:[{item_id:"SKU_67890",item_name:"Sneakers",item_category:"Footwear",price:29.99}]}],out:[["elb",{name:"dataLayer view_item",data:{currency:"EUR",value:29.99,items:[{item_id:"SKU_67890",item_name:"Sneakers",item_category:"Footwear",price:29.99}]},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]},L={title:"Direct dataLayer event",description:"A plain object pushed directly onto the dataLayer is captured as a walker dataLayer custom event.",trigger:{type:"direct"},in:{event:"custom_event",category:"engagement",label:"video_play"},out:[["elb",{name:"dataLayer custom_event",data:{category:"engagement",label:"video_play"},source:{type:"dataLayer",platform:"web",url:"https://example.com/",referrer:""}}]]};import{startFlow as b}from"@walkeros/collector";var S=async e=>{let t;return{get flow(){return t},trigger:()=>async a=>{var r,i;if(!t){const a={...e};if(a.sources){a.sources={...a.sources};for(const[e,t]of Object.entries(a.sources))(null==(r=t.env)?void 0:r.window)||(a.sources[e]={...t,env:{...t.env,window:window}})}const n=await b({...a,run:null==(i=a.run)||i});t={collector:n.collector,elb:n.elb}}E(window,a)}}},k=(e,t)=>{const a=t.window;var r;"object"==typeof(r=a)&&null!==r&&"addEventListener"in r&&E(a,e)};function E(e,t){e.dataLayer||(e.dataLayer=[]),e.dataLayer.push(t)}export{l as examples,a as schemas};//# sourceMappingURL=dev.mjs.map
package/dist/dev.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\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/dev';\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/dev';\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","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Source, Elb, Logger } 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 })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopLogger: Logger.Instance = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noop,\n scope: () => noopLogger,\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 logger: noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const gtagPurchase: Flow.StepExample = {\n title: 'gtag purchase',\n description:\n 'A gtag purchase call pushed to the dataLayer is captured as a walker dataLayer purchase event with item details.',\n trigger: { type: 'gtag' },\n in: [\n 'event',\n 'purchase',\n {\n transaction_id: 'T-12345',\n value: 25.42,\n currency: 'EUR',\n items: [{ item_id: 'SKU-1', item_name: 'T-Shirt', quantity: 1 }],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer purchase',\n data: {\n transaction_id: 'T-12345',\n value: 25.42,\n currency: 'EUR',\n items: [{ item_id: 'SKU-1', item_name: 'T-Shirt', quantity: 1 }],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const consentUpdate: Flow.StepExample = {\n title: 'Consent update',\n description:\n 'A gtag consent update is captured from the dataLayer as a walker dataLayer consent update event.',\n trigger: { type: 'gtag' },\n in: [\n 'consent',\n 'update',\n {\n ad_storage: 'granted',\n analytics_storage: 'granted',\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer consent update',\n data: {\n ad_storage: 'granted',\n analytics_storage: 'granted',\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const gtagAddToCart: Flow.StepExample = {\n title: 'gtag add_to_cart',\n description:\n 'A gtag add_to_cart call pushed to the dataLayer is captured as a walker dataLayer add_to_cart event.',\n trigger: { type: 'gtag' },\n in: [\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: 'T-Shirt',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer add_to_cart',\n data: {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'T-Shirt',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const gtagViewItem: Flow.StepExample = {\n title: 'gtag view_item',\n description:\n 'A gtag view_item call pushed to the dataLayer is captured as a walker dataLayer view_item event with item data.',\n trigger: { type: 'gtag' },\n in: [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 29.99,\n items: [\n {\n item_id: 'SKU_67890',\n item_name: 'Sneakers',\n item_category: 'Footwear',\n price: 29.99,\n },\n ],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer view_item',\n data: {\n currency: 'EUR',\n value: 29.99,\n items: [\n {\n item_id: 'SKU_67890',\n item_name: 'Sneakers',\n item_category: 'Footwear',\n price: 29.99,\n },\n ],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const directEvent: Flow.StepExample = {\n title: 'Direct dataLayer event',\n description:\n 'A plain object pushed directly onto the dataLayer is captured as a walker dataLayer custom event.',\n trigger: { type: 'direct' },\n in: {\n event: 'custom_event',\n category: 'engagement',\n label: 'video_play',\n },\n out: [\n [\n 'elb',\n {\n name: 'dataLayer custom_event',\n data: {\n category: 'engagement',\n label: 'video_play',\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\nconst createTrigger: Trigger.CreateFn<unknown, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<unknown, void> = () => async (content: unknown) => {\n // Lazy startFlow — source patches window.dataLayer.push during init\n if (!flow) {\n // Ensure dataLayer sources get the window env for interception\n const enrichedConfig = { ...config };\n if (enrichedConfig.sources) {\n enrichedConfig.sources = { ...enrichedConfig.sources };\n for (const [id, source] of Object.entries(enrichedConfig.sources)) {\n if (!source.env?.window) {\n enrichedConfig.sources[id] = {\n ...source,\n env: { ...source.env, window },\n };\n }\n }\n }\n const result = await startFlow({\n ...enrichedConfig,\n run: enrichedConfig.run ?? true,\n });\n flow = { collector: result.collector, elb: result.elb };\n }\n\n // Push to dataLayer — the interceptor catches it\n const win = window as Window & { dataLayer?: unknown[] };\n if (!win.dataLayer) win.dataLayer = [];\n win.dataLayer.push(content);\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Pushes step example input to window.dataLayer after source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n const win = env.window as Window & { dataLayer?: unknown[] };\n if (!win.dataLayer) win.dataLayer = [];\n win.dataLayer.push(input);\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["z","z","trigger"]}
1
+ {"version":3,"sources":["../src/schemas/index.ts","../src/schemas/settings.ts","../src/schemas/primitives.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import { zodToSchema } from '@walkeros/core/dev';\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/dev';\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/dev';\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","export * as env from './env';\nexport * as step from './step';\nexport { createTrigger, trigger } from './trigger';\n","import type { Source, Elb, Logger } 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 })) as Elb.Fn;\n return fn;\n};\n\n// Simple no-op logger for demo purposes\nconst noopLogger: Logger.Instance = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noop,\n scope: () => noopLogger,\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 logger: noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const gtagPurchase: Flow.StepExample = {\n title: 'gtag purchase',\n description:\n 'A gtag purchase call pushed to the dataLayer is captured as a walker dataLayer purchase event with item details.',\n trigger: { type: 'gtag' },\n in: [\n 'event',\n 'purchase',\n {\n transaction_id: 'T-12345',\n value: 25.42,\n currency: 'EUR',\n items: [{ item_id: 'SKU-1', item_name: 'T-Shirt', quantity: 1 }],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer purchase',\n data: {\n transaction_id: 'T-12345',\n value: 25.42,\n currency: 'EUR',\n items: [{ item_id: 'SKU-1', item_name: 'T-Shirt', quantity: 1 }],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const consentUpdate: Flow.StepExample = {\n title: 'Consent update',\n description:\n 'A gtag consent update is captured from the dataLayer as a walker dataLayer consent update event.',\n trigger: { type: 'gtag' },\n in: [\n 'consent',\n 'update',\n {\n ad_storage: 'granted',\n analytics_storage: 'granted',\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer consent update',\n data: {\n ad_storage: 'granted',\n analytics_storage: 'granted',\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const gtagAddToCart: Flow.StepExample = {\n title: 'gtag add_to_cart',\n description:\n 'A gtag add_to_cart call pushed to the dataLayer is captured as a walker dataLayer add_to_cart event.',\n trigger: { type: 'gtag' },\n in: [\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: 'T-Shirt',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer add_to_cart',\n data: {\n currency: 'EUR',\n value: 15.25,\n items: [\n {\n item_id: 'SKU_12345',\n item_name: 'T-Shirt',\n item_variant: 'red',\n quantity: 1,\n price: 15.25,\n },\n ],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const gtagViewItem: Flow.StepExample = {\n title: 'gtag view_item',\n description:\n 'A gtag view_item call pushed to the dataLayer is captured as a walker dataLayer view_item event with item data.',\n trigger: { type: 'gtag' },\n in: [\n 'event',\n 'view_item',\n {\n currency: 'EUR',\n value: 29.99,\n items: [\n {\n item_id: 'SKU_67890',\n item_name: 'Sneakers',\n item_category: 'Footwear',\n price: 29.99,\n },\n ],\n },\n ],\n out: [\n [\n 'elb',\n {\n name: 'dataLayer view_item',\n data: {\n currency: 'EUR',\n value: 29.99,\n items: [\n {\n item_id: 'SKU_67890',\n item_name: 'Sneakers',\n item_category: 'Footwear',\n price: 29.99,\n },\n ],\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n\nexport const directEvent: Flow.StepExample = {\n title: 'Direct dataLayer event',\n description:\n 'A plain object pushed directly onto the dataLayer is captured as a walker dataLayer custom event.',\n trigger: { type: 'direct' },\n in: {\n event: 'custom_event',\n category: 'engagement',\n label: 'video_play',\n },\n out: [\n [\n 'elb',\n {\n name: 'dataLayer custom_event',\n data: {\n category: 'engagement',\n label: 'video_play',\n },\n source: {\n type: 'dataLayer',\n platform: 'web',\n url: 'https://example.com/',\n referrer: '',\n },\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport type { DataLayer } from '../types';\n\nconst createTrigger: Trigger.CreateFn<unknown, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<unknown, void> = () => async (content: unknown) => {\n // Lazy startFlow — source patches window.dataLayer.push during init\n if (!flow) {\n // Ensure dataLayer sources get the window env for interception\n const enrichedConfig = { ...config };\n if (enrichedConfig.sources) {\n enrichedConfig.sources = { ...enrichedConfig.sources };\n for (const [id, source] of Object.entries(enrichedConfig.sources)) {\n if (!source.env?.window) {\n enrichedConfig.sources[id] = {\n ...source,\n env: { ...source.env, window },\n };\n }\n }\n }\n const result = await startFlow({\n ...enrichedConfig,\n run: enrichedConfig.run ?? true,\n });\n flow = { collector: result.collector, elb: result.elb };\n }\n\n // Push to dataLayer — the interceptor catches it\n pushTo(window, content);\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Pushes step example input to window.dataLayer after source init. */\nconst trigger = (input: unknown, env: Record<string, unknown>): void => {\n const win = env.window;\n if (!isWindow(win)) return;\n pushTo(win, input);\n};\n\nfunction pushTo(win: Window, content: DataLayer[number]): void {\n if (!win.dataLayer) win.dataLayer = [];\n win.dataLayer.push(content);\n}\n\nfunction isWindow(value: unknown): value is Window {\n return (\n typeof value === 'object' && value !== null && 'addEventListener' in value\n );\n}\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["z","z","trigger"]}
@@ -297,9 +297,7 @@ var createTrigger = async (config) => {
297
297
  });
298
298
  flow = { collector: result.collector, elb: result.elb };
299
299
  }
300
- const win = window;
301
- if (!win.dataLayer) win.dataLayer = [];
302
- win.dataLayer.push(content);
300
+ pushTo(window, content);
303
301
  };
304
302
  return {
305
303
  get flow() {
@@ -310,9 +308,16 @@ var createTrigger = async (config) => {
310
308
  };
311
309
  var trigger = (input, env) => {
312
310
  const win = env.window;
313
- if (!win.dataLayer) win.dataLayer = [];
314
- win.dataLayer.push(input);
311
+ if (!isWindow(win)) return;
312
+ pushTo(win, input);
315
313
  };
314
+ function pushTo(win, content) {
315
+ if (!win.dataLayer) win.dataLayer = [];
316
+ win.dataLayer.push(content);
317
+ }
318
+ function isWindow(value) {
319
+ return typeof value === "object" && value !== null && "addEventListener" in value;
320
+ }
316
321
  // Annotate the CommonJS export names for ESM import in node:
317
322
  0 && (module.exports = {
318
323
  createTrigger,
@@ -274,9 +274,7 @@ var createTrigger = async (config) => {
274
274
  });
275
275
  flow = { collector: result.collector, elb: result.elb };
276
276
  }
277
- const win = window;
278
- if (!win.dataLayer) win.dataLayer = [];
279
- win.dataLayer.push(content);
277
+ pushTo(window, content);
280
278
  };
281
279
  return {
282
280
  get flow() {
@@ -287,9 +285,16 @@ var createTrigger = async (config) => {
287
285
  };
288
286
  var trigger = (input, env) => {
289
287
  const win = env.window;
290
- if (!win.dataLayer) win.dataLayer = [];
291
- win.dataLayer.push(input);
288
+ if (!isWindow(win)) return;
289
+ pushTo(win, input);
292
290
  };
291
+ function pushTo(win, content) {
292
+ if (!win.dataLayer) win.dataLayer = [];
293
+ win.dataLayer.push(content);
294
+ }
295
+ function isWindow(value) {
296
+ return typeof value === "object" && value !== null && "addEventListener" in value;
297
+ }
293
298
  export {
294
299
  createTrigger,
295
300
  env_exports as env,
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/web-source-datalayer",
4
- "version": "4.7.0-next-1790722899482",
4
+ "version": "4.7.0",
5
5
  "type": "source",
6
6
  "platform": [
7
7
  "web"
8
8
  ],
9
9
  "renderer": "codebox",
10
+ "exports": {},
10
11
  "docs": "https://www.walkeros.io/docs/sources/web/datalayer",
11
12
  "source": "https://github.com/elbwalker/walkerOS/tree/main/packages/web/sources/dataLayer/src"
12
13
  },
@@ -37,7 +38,7 @@
37
38
  },
38
39
  "examples": {
39
40
  "createTrigger": {
40
- "$code": "async e=>{let t;return{get flow(){return t},trigger:()=>async a=>{var r,i;if(!t){const a={...e};if(a.sources){a.sources={...a.sources};for(const[e,t]of Object.entries(a.sources))(null==(r=t.env)?void 0:r.window)||(a.sources[e]={...t,env:{...t.env,window:window}})}const n=await b({...a,run:null==(i=a.run)||i});t={collector:n.collector,elb:n.elb}}const n=window;n.dataLayer||(n.dataLayer=[]),n.dataLayer.push(a)}}}"
41
+ "$code": "async e=>{let t;return{get flow(){return t},trigger:()=>async a=>{var r,i;if(!t){const a={...e};if(a.sources){a.sources={...a.sources};for(const[e,t]of Object.entries(a.sources))(null==(r=t.env)?void 0:r.window)||(a.sources[e]={...t,env:{...t.env,window:window}})}const n=await b({...a,run:null==(i=a.run)||i});t={collector:n.collector,elb:n.elb}}E(window,a)}}}"
41
42
  },
42
43
  "env": {
43
44
  "push": {
@@ -299,7 +300,7 @@
299
300
  }
300
301
  },
301
302
  "trigger": {
302
- "$code": "(e,t)=>{const a=t.window;a.dataLayer||(a.dataLayer=[]),a.dataLayer.push(e)}"
303
+ "$code": "(e,t)=>{const a=t.window;var r;\"object\"==typeof(r=a)&&null!==r&&\"addEventListener\"in r&&E(a,e)}"
303
304
  }
304
305
  }
305
306
  }
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": "4.7.0-next-1790722899482",
4
+ "version": "4.7.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -38,8 +38,8 @@
38
38
  "update": "npx npm-check-updates -u && npm update"
39
39
  },
40
40
  "dependencies": {
41
- "@walkeros/core": "4.7.0-next-1790722899482",
42
- "@walkeros/collector": "4.7.0-next-1790722899482"
41
+ "@walkeros/core": "4.7.0",
42
+ "@walkeros/collector": "4.7.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/gtag.js": "^0.0.20"