@walkeros/web-source-datalayer 0.1.1 → 0.2.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.
@@ -1,4 +1,29 @@
1
- import { Mapping } from '@walkeros/core';
1
+ import { Source, Mapping } from '@walkeros/core';
2
+
3
+ /**
4
+ * Example environment configurations for dataLayer source
5
+ *
6
+ * These environments provide standardized mock structures for testing
7
+ * dataLayer interception without requiring a real window object.
8
+ */
9
+ /**
10
+ * Environment interface for dataLayer source
11
+ */
12
+ interface DataLayerEnv extends Source.Env {
13
+ window?: typeof window;
14
+ }
15
+ /**
16
+ * Standard mock environment for testing dataLayer source
17
+ *
18
+ * Use this for testing dataLayer.push interception and event transformation
19
+ * without requiring a real browser environment.
20
+ */
21
+ declare const push: DataLayerEnv;
22
+
23
+ declare const env_push: typeof push;
24
+ declare namespace env {
25
+ export { env_push as push };
26
+ }
2
27
 
3
28
  /**
4
29
  * Sample gtag events that would be pushed to dataLayer
@@ -79,4 +104,4 @@ declare namespace mapping {
79
104
  export { mapping_add_to_cart as add_to_cart, mapping_config as config, mapping_configGA4 as configGA4, mapping_consentOnlyMapping as consentOnlyMapping, mapping_consentUpdate as consentUpdate, mapping_customEvent as customEvent, mapping_purchase as purchase, mapping_view_item as view_item };
80
105
  }
81
106
 
82
- export { events as Events, mapping as Mapping, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples };
107
+ export { events as Events, mapping as Mapping, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples, env };
@@ -1,4 +1,29 @@
1
- import { Mapping } from '@walkeros/core';
1
+ import { Source, Mapping } from '@walkeros/core';
2
+
3
+ /**
4
+ * Example environment configurations for dataLayer source
5
+ *
6
+ * These environments provide standardized mock structures for testing
7
+ * dataLayer interception without requiring a real window object.
8
+ */
9
+ /**
10
+ * Environment interface for dataLayer source
11
+ */
12
+ interface DataLayerEnv extends Source.Env {
13
+ window?: typeof window;
14
+ }
15
+ /**
16
+ * Standard mock environment for testing dataLayer source
17
+ *
18
+ * Use this for testing dataLayer.push interception and event transformation
19
+ * without requiring a real browser environment.
20
+ */
21
+ declare const push: DataLayerEnv;
22
+
23
+ declare const env_push: typeof push;
24
+ declare namespace env {
25
+ export { env_push as push };
26
+ }
2
27
 
3
28
  /**
4
29
  * Sample gtag events that would be pushed to dataLayer
@@ -79,4 +104,4 @@ declare namespace mapping {
79
104
  export { mapping_add_to_cart as add_to_cart, mapping_config as config, mapping_configGA4 as configGA4, mapping_consentOnlyMapping as consentOnlyMapping, mapping_consentUpdate as consentUpdate, mapping_customEvent as customEvent, mapping_purchase as purchase, mapping_view_item as view_item };
80
105
  }
81
106
 
82
- export { events as Events, mapping as Mapping, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples };
107
+ export { events as Events, mapping as Mapping, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples, env };
@@ -24,10 +24,26 @@ __export(examples_exports, {
24
24
  Mapping: () => mapping_exports,
25
25
  consentOnlyMapping: () => consentOnlyMapping,
26
26
  consentUpdateEvent: () => consentUpdate,
27
- dataLayerExamples: () => config2
27
+ dataLayerExamples: () => config2,
28
+ env: () => env_exports
28
29
  });
29
30
  module.exports = __toCommonJS(examples_exports);
30
31
 
32
+ // src/examples/env.ts
33
+ var env_exports = {};
34
+ __export(env_exports, {
35
+ push: () => push
36
+ });
37
+ var mockWindow = {
38
+ dataLayer: [],
39
+ addEventListener: jest.fn(),
40
+ removeEventListener: jest.fn()
41
+ };
42
+ var push = {
43
+ elb: jest.fn(),
44
+ window: mockWindow
45
+ };
46
+
31
47
  // src/examples/events.ts
32
48
  var events_exports = {};
33
49
  __export(events_exports, {
@@ -285,5 +301,6 @@ var consentOnlyMapping = {
285
301
  Mapping,
286
302
  consentOnlyMapping,
287
303
  consentUpdateEvent,
288
- dataLayerExamples
304
+ dataLayerExamples,
305
+ env
289
306
  });
@@ -4,6 +4,21 @@ var __export = (target, all) => {
4
4
  __defProp(target, name, { get: all[name], enumerable: true });
5
5
  };
6
6
 
7
+ // src/examples/env.ts
8
+ var env_exports = {};
9
+ __export(env_exports, {
10
+ push: () => push
11
+ });
12
+ var mockWindow = {
13
+ dataLayer: [],
14
+ addEventListener: jest.fn(),
15
+ removeEventListener: jest.fn()
16
+ };
17
+ var push = {
18
+ elb: jest.fn(),
19
+ window: mockWindow
20
+ };
21
+
7
22
  // src/examples/events.ts
8
23
  var events_exports = {};
9
24
  __export(events_exports, {
@@ -260,5 +275,6 @@ export {
260
275
  mapping_exports as Mapping,
261
276
  consentOnlyMapping,
262
277
  consentUpdate as consentUpdateEvent,
263
- config2 as dataLayerExamples
278
+ config2 as dataLayerExamples,
279
+ env_exports as env
264
280
  };
@@ -1 +1 @@
1
- "use strict";var Destination=(()=>{var e,t,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,o=(e,t)=>{for(var r in t)n(e,r,{get:t[r],enumerable:!0})},c={};o(c,{Events:()=>w,Mapping:()=>S,SourceDataLayer:()=>v,consentOnlyMapping:()=>C,consentUpdateEvent:()=>b,dataLayerExamples:()=>M,default:()=>G,sourceDataLayer:()=>N});var s=Object.getOwnPropertyNames,u=(e={"package.json"(e,t){t.exports={name:"@walkeros/core",description:"Core types and platform-agnostic utilities for walkerOS",version:"0.1.1",main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",license:"MIT",files:["dist/**"],scripts:{build:"tsup --silent",clean:"rm -rf .turbo && rm -rf node_modules && rm -rf dist",dev:"jest --watchAll --colors",lint:'tsc && eslint "**/*.ts*"',test:"jest",update:"npx npm-check-updates -u && npm update"},dependencies:{},devDependencies:{},repository:{url:"git+https://github.com/elbwalker/walkerOS.git",directory:"packages/core"},author:"elbwalker <hello@elbwalker.com>",homepage:"https://github.com/elbwalker/walkerOS#readme",bugs:{url:"https://github.com/elbwalker/walkerOS/issues"},keywords:["walker","walkerOS","analytics","tracking","data collection","measurement","data privacy","privacy friendly","web analytics","product analytics","core","types","utils"],funding:[{type:"GitHub Sponsors",url:"https://github.com/sponsors/elbwalker"}]}}},function(){return t||(0,e[s(e)[0]])((t={exports:{}}).exports,t),t.exports});function l(e){return Array.isArray(e)}function d(e){return"object"==typeof e&&null!==e&&!l(e)&&"[object Object]"===Object.prototype.toString.call(e)}function m(e){return"string"==typeof e}var{version:p}=u();function y(e,t,n){return function(...r){try{return e(...r)}catch(e){if(!t)return;return t(e)}finally{null==n||n()}}}var f=!1;function g(e,t={},n){if(t.filter){if(!0===y(()=>t.filter(n),()=>!1)())return}const r=function(e){if(d(e)&&m(e.event)){const{event:t,...n}=e;return{name:t,...n}}if(l(e)&&e.length>=2)return _(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return _(Array.from(e))}var t;return null}(n);if(!r)return;const a={name:`${t.prefix||"dataLayer"} ${r.name}`,data:r,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};y(()=>e(a),()=>{})()}function _(e){const[t,n,r]=e;if(!m(t))return null;let a,i={};switch(t){case"consent":if(!m(n)||e.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!d(r)||null===r)return null;a=`${t} ${n}`,i={...r};break;case"event":if(!m(n))return null;a=n,d(r)&&(i={...r});break;case"config":if(!m(n))return null;a=`${t} ${n}`,d(r)&&(i={...r});break;case"set":if(m(n))a=`${t} ${n}`,d(r)&&(i={...r});else{if(!d(n))return null;a=`${t} custom`,i={...n}}break;default:return null}return{name:a,...i}}var v={},w={};function b(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function h(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function k(){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 X(){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 O(){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 j(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function x(){return["set",{currency:"EUR",country:"DE"}]}function L(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}o(w,{add_to_cart:()=>X,config:()=>j,consentDefault:()=>h,consentUpdate:()=>b,directDataLayerEvent:()=>L,purchase:()=>k,setCustom:()=>x,view_item:()=>O});var S={};o(S,{add_to_cart:()=>U,config:()=>M,configGA4:()=>$,consentOnlyMapping:()=>C,consentUpdate:()=>E,customEvent:()=>q,purchase:()=>D,view_item:()=>P});var A,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}}}}},D={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"}}},P={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"}}},$={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},q={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},M={consent:{update:E},purchase:D,add_to_cart:U,view_item:P,"config G-XXXXXXXXXX":$,custom_event:q,"*":{data:{}}},C={consent:{update:E}},N=async(e,t)=>{try{const n=t||{},{elb:r,window:a}=n;if(!r)throw new Error("DataLayer source requires elb function in environment");const i={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},o={settings:i};a&&(function(e,t){const n=t.settings,r=(null==n?void 0:n.name)||"dataLayer",a=window[r];if(Array.isArray(a)&&!f){f=!0;try{for(const t of a)g(e,n,t)}finally{f=!1}}}(r,o),function(e,t){const n=t.settings,r=(null==n?void 0:n.name)||"dataLayer";window[r]||(window[r]=[]);const a=window[r];if(!Array.isArray(a))return;const i=a.push.bind(a);a.push=function(...t){if(f)return i(...t);f=!0;try{for(const r of t)g(e,n,r)}finally{f=!1}return i(...t)}}(r,o));return{type:"dataLayer",config:o,push:r,destroy:async()=>{const e=i.name||"dataLayer";a&&a[e]&&Array.isArray(a[e])}}}catch(e){throw e}},G=N;return A=c,((e,t,o,c)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let s of a(t))i.call(e,s)||s===o||n(e,s,{get:()=>t[s],enumerable:!(c=r(t,s))||c.enumerable});return e})(n({},"__esModule",{value:!0}),A)})();
1
+ "use strict";var Destination=(()=>{var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,a=(t,n)=>{for(var r in n)e(t,r,{get:n[r],enumerable:!0})},i={};function o(e){return Array.isArray(e)}function c(e){return"object"==typeof e&&null!==e&&!o(e)&&"[object Object]"===Object.prototype.toString.call(e)}function u(e){return"string"==typeof e}function s(e,t,n){return function(...r){try{return e(...r)}catch(e){if(!t)return;return t(e)}finally{null==n||n()}}}a(i,{Events:()=>g,Mapping:()=>O,SourceDataLayer:()=>y,consentOnlyMapping:()=>x,consentUpdateEvent:()=>v,dataLayerExamples:()=>S,default:()=>C,env:()=>p,sourceDataLayer:()=>M});var d=!1;function m(e,t={},n){if(t.filter){if(!0===s(()=>t.filter(n),()=>!1)())return}const r=function(e){if(c(e)&&u(e.event)){const{event:t,...n}=e;return{name:t,...n}}if(o(e)&&e.length>=2)return l(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return l(Array.from(e))}var t;return null}(n);if(!r)return;const a={name:`${t.prefix||"dataLayer"} ${r.name}`,data:r,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};s(()=>e(a),()=>{})()}function l(e){const[t,n,r]=e;if(!u(t))return null;let a,i={};switch(t){case"consent":if(!u(n)||e.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!c(r)||null===r)return null;a=`${t} ${n}`,i={...r};break;case"event":if(!u(n))return null;a=n,c(r)&&(i={...r});break;case"config":if(!u(n))return null;a=`${t} ${n}`,c(r)&&(i={...r});break;case"set":if(u(n))a=`${t} ${n}`,c(r)&&(i={...r});else{if(!c(n))return null;a=`${t} custom`,i={...n}}break;default:return null}return{name:a,...i}}var y={},p={};a(p,{push:()=>_});var f={dataLayer:[],addEventListener:jest.fn(),removeEventListener:jest.fn()},_={elb:jest.fn(),window:f},g={};function v(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function w(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function b(){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 h(){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 L(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function j(){return["set",{currency:"EUR",country:"DE"}]}function E(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}a(g,{add_to_cart:()=>h,config:()=>L,consentDefault:()=>w,consentUpdate:()=>v,directDataLayerEvent:()=>E,purchase:()=>b,setCustom:()=>j,view_item:()=>X});var O={};a(O,{add_to_cart:()=>k,config:()=>S,configGA4:()=>P,consentOnlyMapping:()=>x,consentUpdate:()=>U,customEvent:()=>q,purchase:()=>$,view_item:()=>D});var A,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}}}}},$={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"}}}}]}}}},k={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"}}},P={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},q={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},S={consent:{update:U},purchase:$,add_to_cart:k,view_item:D,"config G-XXXXXXXXXX":P,custom_event:q,"*":{data:{}}},x={consent:{update:U}},M=async(e,t)=>{try{const{elb:n,window:r}=t,a={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},i={settings:a};r&&(function(e,t){const n=t.settings,r=(null==n?void 0:n.name)||"dataLayer",a=window[r];if(Array.isArray(a)&&!d){d=!0;try{for(const t of a)m(e,n,t)}finally{d=!1}}}(n,i),function(e,t){const n=t.settings,r=(null==n?void 0:n.name)||"dataLayer";window[r]||(window[r]=[]);const a=window[r];if(!Array.isArray(a))return;const i=a.push.bind(a);a.push=function(...t){if(d)return i(...t);d=!0;try{for(const r of t)m(e,n,r)}finally{d=!1}return i(...t)}}(n,i));return{type:"dataLayer",config:i,push:n,destroy:async()=>{const e=a.name||"dataLayer";r&&r[e]&&Array.isArray(r[e])}}}catch(e){throw e}},C=M;return A=i,((a,i,o,c)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let u of n(i))r.call(a,u)||u===o||e(a,u,{get:()=>i[u],enumerable:!(c=t(i,u))||c.enumerable});return a})(e({},"__esModule",{value:!0}),A)})();
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Source, WalkerOS, Mapping } from '@walkeros/core';
1
+ import { Source, WalkerOS, Elb, Mapping as Mapping$1 } from '@walkeros/core';
2
2
 
3
3
  declare global {
4
4
  interface Window {
@@ -6,15 +6,19 @@ declare global {
6
6
  [key: string]: DataLayer | unknown;
7
7
  }
8
8
  }
9
- interface DataLayerSourceConfig extends Source.Config {
10
- settings: Settings;
11
- }
12
9
  type DataLayer = Array<unknown>;
13
10
  interface Settings extends Record<string, unknown> {
14
11
  name?: string;
15
12
  prefix?: string;
16
13
  filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;
17
14
  }
15
+ interface Mapping {
16
+ }
17
+ type Push = Elb.Fn;
18
+ interface Env extends Source.BaseEnv {
19
+ window?: Window & typeof globalThis;
20
+ }
21
+ type Types = Source.Types<Settings, Mapping, Push, Env>;
18
22
  type DataLayerEvent = {
19
23
  event: string;
20
24
  [key: string]: unknown;
@@ -31,11 +35,39 @@ type MappedEvent = {
31
35
 
32
36
  type index_DataLayer = DataLayer;
33
37
  type index_DataLayerEvent = DataLayerEvent;
34
- type index_DataLayerSourceConfig = DataLayerSourceConfig;
38
+ type index_Env = Env;
35
39
  type index_MappedEvent = MappedEvent;
40
+ type index_Mapping = Mapping;
41
+ type index_Push = Push;
36
42
  type index_Settings = Settings;
43
+ type index_Types = Types;
37
44
  declare namespace index {
38
- export type { index_DataLayer as DataLayer, index_DataLayerEvent as DataLayerEvent, index_DataLayerSourceConfig as DataLayerSourceConfig, index_MappedEvent as MappedEvent, index_Settings as Settings };
45
+ export type { index_DataLayer as DataLayer, index_DataLayerEvent as DataLayerEvent, index_Env as Env, index_MappedEvent as MappedEvent, index_Mapping as Mapping, index_Push as Push, index_Settings as Settings, index_Types as Types };
46
+ }
47
+
48
+ /**
49
+ * Example environment configurations for dataLayer source
50
+ *
51
+ * These environments provide standardized mock structures for testing
52
+ * dataLayer interception without requiring a real window object.
53
+ */
54
+ /**
55
+ * Environment interface for dataLayer source
56
+ */
57
+ interface DataLayerEnv extends Source.Env {
58
+ window?: typeof window;
59
+ }
60
+ /**
61
+ * Standard mock environment for testing dataLayer source
62
+ *
63
+ * Use this for testing dataLayer.push interception and event transformation
64
+ * without requiring a real browser environment.
65
+ */
66
+ declare const push: DataLayerEnv;
67
+
68
+ declare const env_push: typeof push;
69
+ declare namespace env {
70
+ export { env_push as push };
39
71
  }
40
72
 
41
73
  /**
@@ -77,33 +109,33 @@ declare namespace events {
77
109
  * Consent Mode Mapping - Primary use case
78
110
  * Maps gtag consent events to walker consent commands
79
111
  */
80
- declare const consentUpdate: Mapping.Rule;
112
+ declare const consentUpdate: Mapping$1.Rule;
81
113
  /**
82
114
  * E-commerce Event Mappings
83
115
  * Transform GA4 ecommerce events to WalkerOS events
84
116
  */
85
- declare const purchase: Mapping.Rule;
86
- declare const add_to_cart: Mapping.Rule;
87
- declare const view_item: Mapping.Rule;
117
+ declare const purchase: Mapping$1.Rule;
118
+ declare const add_to_cart: Mapping$1.Rule;
119
+ declare const view_item: Mapping$1.Rule;
88
120
  /**
89
121
  * Config Event Mapping
90
122
  * Transform GA4 config events to WalkerOS page events
91
123
  */
92
- declare const configGA4: Mapping.Rule;
124
+ declare const configGA4: Mapping$1.Rule;
93
125
  /**
94
126
  * Custom Event Mapping
95
127
  * Handle direct dataLayer pushes
96
128
  */
97
- declare const customEvent: Mapping.Rule;
129
+ declare const customEvent: Mapping$1.Rule;
98
130
  /**
99
131
  * Complete mapping configuration
100
132
  * Following the same pattern as destination mappings
101
133
  */
102
- declare const config: Mapping.Rules;
134
+ declare const config: Mapping$1.Rules;
103
135
  /**
104
136
  * Minimal consent-only mapping for focused use cases
105
137
  */
106
- declare const consentOnlyMapping: Mapping.Rules;
138
+ declare const consentOnlyMapping: Mapping$1.Rules;
107
139
 
108
140
  declare const mapping_add_to_cart: typeof add_to_cart;
109
141
  declare const mapping_config: typeof config;
@@ -123,6 +155,6 @@ declare namespace mapping {
123
155
  * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.
124
156
  * It works by replacing the dataLayer.push method with a custom handler.
125
157
  */
126
- declare const sourceDataLayer: Source.Init<DataLayerSourceConfig>;
158
+ declare const sourceDataLayer: Source.Init<Types>;
127
159
 
128
- export { events as Events, mapping as Mapping, index as SourceDataLayer, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples, sourceDataLayer as default, sourceDataLayer };
160
+ export { events as Events, mapping as Mapping, index as SourceDataLayer, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples, sourceDataLayer as default, env, sourceDataLayer };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Source, WalkerOS, Mapping } from '@walkeros/core';
1
+ import { Source, WalkerOS, Elb, Mapping as Mapping$1 } from '@walkeros/core';
2
2
 
3
3
  declare global {
4
4
  interface Window {
@@ -6,15 +6,19 @@ declare global {
6
6
  [key: string]: DataLayer | unknown;
7
7
  }
8
8
  }
9
- interface DataLayerSourceConfig extends Source.Config {
10
- settings: Settings;
11
- }
12
9
  type DataLayer = Array<unknown>;
13
10
  interface Settings extends Record<string, unknown> {
14
11
  name?: string;
15
12
  prefix?: string;
16
13
  filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;
17
14
  }
15
+ interface Mapping {
16
+ }
17
+ type Push = Elb.Fn;
18
+ interface Env extends Source.BaseEnv {
19
+ window?: Window & typeof globalThis;
20
+ }
21
+ type Types = Source.Types<Settings, Mapping, Push, Env>;
18
22
  type DataLayerEvent = {
19
23
  event: string;
20
24
  [key: string]: unknown;
@@ -31,11 +35,39 @@ type MappedEvent = {
31
35
 
32
36
  type index_DataLayer = DataLayer;
33
37
  type index_DataLayerEvent = DataLayerEvent;
34
- type index_DataLayerSourceConfig = DataLayerSourceConfig;
38
+ type index_Env = Env;
35
39
  type index_MappedEvent = MappedEvent;
40
+ type index_Mapping = Mapping;
41
+ type index_Push = Push;
36
42
  type index_Settings = Settings;
43
+ type index_Types = Types;
37
44
  declare namespace index {
38
- export type { index_DataLayer as DataLayer, index_DataLayerEvent as DataLayerEvent, index_DataLayerSourceConfig as DataLayerSourceConfig, index_MappedEvent as MappedEvent, index_Settings as Settings };
45
+ export type { index_DataLayer as DataLayer, index_DataLayerEvent as DataLayerEvent, index_Env as Env, index_MappedEvent as MappedEvent, index_Mapping as Mapping, index_Push as Push, index_Settings as Settings, index_Types as Types };
46
+ }
47
+
48
+ /**
49
+ * Example environment configurations for dataLayer source
50
+ *
51
+ * These environments provide standardized mock structures for testing
52
+ * dataLayer interception without requiring a real window object.
53
+ */
54
+ /**
55
+ * Environment interface for dataLayer source
56
+ */
57
+ interface DataLayerEnv extends Source.Env {
58
+ window?: typeof window;
59
+ }
60
+ /**
61
+ * Standard mock environment for testing dataLayer source
62
+ *
63
+ * Use this for testing dataLayer.push interception and event transformation
64
+ * without requiring a real browser environment.
65
+ */
66
+ declare const push: DataLayerEnv;
67
+
68
+ declare const env_push: typeof push;
69
+ declare namespace env {
70
+ export { env_push as push };
39
71
  }
40
72
 
41
73
  /**
@@ -77,33 +109,33 @@ declare namespace events {
77
109
  * Consent Mode Mapping - Primary use case
78
110
  * Maps gtag consent events to walker consent commands
79
111
  */
80
- declare const consentUpdate: Mapping.Rule;
112
+ declare const consentUpdate: Mapping$1.Rule;
81
113
  /**
82
114
  * E-commerce Event Mappings
83
115
  * Transform GA4 ecommerce events to WalkerOS events
84
116
  */
85
- declare const purchase: Mapping.Rule;
86
- declare const add_to_cart: Mapping.Rule;
87
- declare const view_item: Mapping.Rule;
117
+ declare const purchase: Mapping$1.Rule;
118
+ declare const add_to_cart: Mapping$1.Rule;
119
+ declare const view_item: Mapping$1.Rule;
88
120
  /**
89
121
  * Config Event Mapping
90
122
  * Transform GA4 config events to WalkerOS page events
91
123
  */
92
- declare const configGA4: Mapping.Rule;
124
+ declare const configGA4: Mapping$1.Rule;
93
125
  /**
94
126
  * Custom Event Mapping
95
127
  * Handle direct dataLayer pushes
96
128
  */
97
- declare const customEvent: Mapping.Rule;
129
+ declare const customEvent: Mapping$1.Rule;
98
130
  /**
99
131
  * Complete mapping configuration
100
132
  * Following the same pattern as destination mappings
101
133
  */
102
- declare const config: Mapping.Rules;
134
+ declare const config: Mapping$1.Rules;
103
135
  /**
104
136
  * Minimal consent-only mapping for focused use cases
105
137
  */
106
- declare const consentOnlyMapping: Mapping.Rules;
138
+ declare const consentOnlyMapping: Mapping$1.Rules;
107
139
 
108
140
  declare const mapping_add_to_cart: typeof add_to_cart;
109
141
  declare const mapping_config: typeof config;
@@ -123,6 +155,6 @@ declare namespace mapping {
123
155
  * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.
124
156
  * It works by replacing the dataLayer.push method with a custom handler.
125
157
  */
126
- declare const sourceDataLayer: Source.Init<DataLayerSourceConfig>;
158
+ declare const sourceDataLayer: Source.Init<Types>;
127
159
 
128
- export { events as Events, mapping as Mapping, index as SourceDataLayer, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples, sourceDataLayer as default, sourceDataLayer };
160
+ export { events as Events, mapping as Mapping, index as SourceDataLayer, consentOnlyMapping, consentUpdate$1 as consentUpdateEvent, config as dataLayerExamples, sourceDataLayer as default, env, sourceDataLayer };
package/dist/index.es5.js CHANGED
@@ -1 +1 @@
1
- "use strict";function _array_like_to_array(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function _array_with_holes(e){if(Array.isArray(e))return e}function _array_without_holes(e){if(Array.isArray(e))return _array_like_to_array(e)}function asyncGeneratorStep(e,t,r,n,a,o,i){try{var u=e[o](i),c=u.value}catch(e){return void r(e)}u.done?t(c):Promise.resolve(c).then(n,a)}function _async_to_generator(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var o=e.apply(t,r);function i(e){asyncGeneratorStep(o,n,a,i,u,"next",e)}function u(e){asyncGeneratorStep(o,n,a,i,u,"throw",e)}i(void 0)})}}function _define_property(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _iterable_to_array(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _iterable_to_array_limit(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o=[],i=!0,u=!1;try{for(r=r.call(e);!(i=(n=r.next()).done)&&(o.push(n.value),!t||o.length!==t);i=!0);}catch(e){u=!0,a=e}finally{try{i||null==r.return||r.return()}finally{if(u)throw a}}return o}}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){_define_property(e,t,r[t])})}return e}function _object_without_properties(e,t){if(null==e)return{};var r,n,a=_object_without_properties_loose(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function _object_without_properties_loose(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}function _sliced_to_array(e,t){return _array_with_holes(e)||_iterable_to_array_limit(e,t)||_unsupported_iterable_to_array(e,t)||_non_iterable_rest()}function _to_consumable_array(e){return _array_without_holes(e)||_iterable_to_array(e)||_unsupported_iterable_to_array(e)||_non_iterable_spread()}function _type_of(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}function _unsupported_iterable_to_array(e,t){if(e){if("string"==typeof e)return _array_like_to_array(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(r):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_array_like_to_array(e,t):void 0}}function _ts_generator(e,t){var r,n,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return i.next=u(0),i.throw=u(1),i.return=u(2),"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(u){return function(c){return function(u){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,u[0]&&(o=0)),o;)try{if(r=1,n&&(a=2&u[0]?n.return:u[0]?n.throw||((a=n.return)&&a.call(n),0):n.next)&&!(a=a.call(n,u[1])).done)return a;switch(n=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return o.label++,{value:u[1],done:!1};case 5:o.label++,n=u[1],u=[0];continue;case 7:u=o.ops.pop(),o.trys.pop();continue;default:if(!(a=o.trys,(a=a.length>0&&a[a.length-1])||6!==u[0]&&2!==u[0])){o=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){o.label=u[1];break}if(6===u[0]&&o.label<a[1]){o.label=a[1],a=u;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(u);break}a[2]&&o.ops.pop(),o.trys.pop();continue}u=t.call(e,o)}catch(e){u=[6,e],n=0}finally{r=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}([u,c])}}}var Destination=function(){var e,t,r=function(e){return Array.isArray(e)},n=function(e){return"object"==(void 0===e?"undefined":_type_of(e))&&null!==e&&!r(e)&&"[object Object]"===Object.prototype.toString.call(e)},a=function(e){return"string"==typeof e},o=function(e,t,r){return function(){for(var n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];try{return e.apply(void 0,_to_consumable_array(a))}catch(e){if(!t)return;return t(e)}finally{null==r||r()}}},i=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0;if(t.filter&&!0===o(function(){return t.filter(r)},function(){return!1})())return;var n=u(r);if(n){var a=t.prefix||"dataLayer",i={name:"".concat(a," ").concat(n.name),data:n,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:s(),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};o(function(){return e(i)},function(){})()}},u=function(e){if(n(e)&&a(e.event))return _object_spread({name:e.event},_object_without_properties(e,["event"]));if(r(e)&&e.length>=2)return c(e);if(l(e)){var t=Array.from(e);return c(t)}return null},c=function(e){var t,r=_sliced_to_array(e,3),o=r[0],i=r[1],u=r[2];if(!a(o))return null;var c={};switch(o){case"consent":if(!a(i)||e.length<3)return null;if("default"!==i&&"update"!==i)return null;if(!n(u)||null===u)return null;t="".concat(o," ").concat(i),c=_object_spread({},u);break;case"event":if(!a(i))return null;t=i,n(u)&&(c=_object_spread({},u));break;case"config":if(!a(i))return null;t="".concat(o," ").concat(i),n(u)&&(c=_object_spread({},u));break;case"set":if(a(i))t="".concat(o," ").concat(i),n(u)&&(c=_object_spread({},u));else{if(!n(i))return null;t="".concat(o," custom"),c=_object_spread({},i)}break;default:return null}return _object_spread({name:t},c)},l=function(e){return null!=e&&"object"===(void 0===e?"undefined":_type_of(e))&&"length"in e&&"number"==typeof e.length&&e.length>0},s=function(){return Math.random().toString(36).substring(2,15)},f=function(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]},_=function(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]},y=function(){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}]}]},d=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}]}]},p=function(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]},m=function(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]},b=function(){return["set",{currency:"EUR",country:"DE"}]},v=function(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}},g=Object.defineProperty,h=Object.getOwnPropertyDescriptor,w=Object.getOwnPropertyNames,j=Object.prototype.hasOwnProperty,O=function(e,t){for(var r in t)g(e,r,{get:t[r],enumerable:!0})},k={};O(k,{Events:function(){return X},Mapping:function(){return P},SourceDataLayer:function(){return A},consentOnlyMapping:function(){return C},consentUpdateEvent:function(){return f},dataLayerExamples:function(){return M},default:function(){return N},sourceDataLayer:function(){return T}});var S=Object.getOwnPropertyNames,x=((e={"package.json":function(e,t){t.exports={name:"@walkeros/core",description:"Core types and platform-agnostic utilities for walkerOS",version:"0.1.1",main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",license:"MIT",files:["dist/**"],scripts:{build:"tsup --silent",clean:"rm -rf .turbo && rm -rf node_modules && rm -rf dist",dev:"jest --watchAll --colors",lint:'tsc && eslint "**/*.ts*"',test:"jest",update:"npx npm-check-updates -u && npm update"},dependencies:{},devDependencies:{},repository:{url:"git+https://github.com/elbwalker/walkerOS.git",directory:"packages/core"},author:"elbwalker <hello@elbwalker.com>",homepage:"https://github.com/elbwalker/walkerOS#readme",bugs:{url:"https://github.com/elbwalker/walkerOS/issues"},keywords:["walker","walkerOS","analytics","tracking","data collection","measurement","data privacy","privacy friendly","web analytics","product analytics","core","types","utils"],funding:[{type:"GitHub Sponsors",url:"https://github.com/sponsors/elbwalker"}]}}},function(){return t||(0,e[S(e)[0]])((t={exports:{}}).exports,t),t.exports})().version,!1),A={},X={};O(X,{add_to_cart:function(){return d},config:function(){return m},consentDefault:function(){return _},consentUpdate:function(){return f},directDataLayerEvent:function(){return v},purchase:function(){return y},setCustom:function(){return b},view_item:function(){return p}});var P={};O(P,{add_to_cart:function(){return U},config:function(){return M},configGA4:function(){return G},consentOnlyMapping:function(){return C},consentUpdate:function(){return L},customEvent:function(){return q},purchase:function(){return D},view_item:function(){return I}});var E,L={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:function(e){return"granted"===e}},marketing:{key:"ad_storage",fn:function(e){return"granted"===e}}}}}},D={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"}}},I={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"}}},G={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},q={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},M={consent:{update:L},purchase:D,add_to_cart:U,view_item:I,"config G-XXXXXXXXXX":G,custom_event:q,"*":{data:{}}},C={consent:{update:L}},T=function(e,t){return _async_to_generator(function(){var r,n,a,o,u;return _ts_generator(this,function(c){try{if(n=(r=t||{}).elb,a=r.window,!n)throw new Error("DataLayer source requires elb function in environment");return o=_object_spread({name:"dataLayer",prefix:"dataLayer"},null==e?void 0:e.settings),u={settings:o},a&&(function(e,t){var r=t.settings,n=(null==r?void 0:r.name)||"dataLayer",a=window[n];if(Array.isArray(a)&&!x){x=!0;try{var o=!0,u=!1,c=void 0;try{for(var l,s=a[Symbol.iterator]();!(o=(l=s.next()).done);o=!0){var f=l.value;i(e,r,f)}}catch(e){u=!0,c=e}finally{try{o||null==s.return||s.return()}finally{if(u)throw c}}}finally{x=!1}}}(n,u),function(e,t){var r=t.settings,n=(null==r?void 0:r.name)||"dataLayer";window[n]||(window[n]=[]);var a=window[n];if(Array.isArray(a)){var o=a.push.bind(a);a.push=function(){for(var t=arguments.length,n=new Array(t),a=0;a<t;a++)n[a]=arguments[a];if(x)return o.apply(void 0,_to_consumable_array(n));x=!0;try{var u=!0,c=!1,l=void 0;try{for(var s,f=n[Symbol.iterator]();!(u=(s=f.next()).done);u=!0){var _=s.value;i(e,r,_)}}catch(e){c=!0,l=e}finally{try{u||null==f.return||f.return()}finally{if(c)throw l}}}finally{x=!1}return o.apply(void 0,_to_consumable_array(n))}}}(n,u)),[2,{type:"dataLayer",config:u,push:n,destroy:function(){return _async_to_generator(function(){var e;return _ts_generator(this,function(t){return e=o.name||"dataLayer",a&&a[e]&&Array.isArray(a[e]),[2]})})()}}]}catch(e){throw e}return[2]})})()},N=T;return E=k,function(e,t,r,n){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var a=!0,o=!1,i=void 0;try{for(var u,c=function(){var a=u.value;j.call(e,a)||a===r||g(e,a,{get:function(){return t[a]},enumerable:!(n=h(t,a))||n.enumerable})},l=w(t)[Symbol.iterator]();!(a=(u=l.next()).done);a=!0)c()}catch(e){o=!0,i=e}finally{try{a||null==l.return||l.return()}finally{if(o)throw i}}}return e}(g({},"__esModule",{value:!0}),E)}();
1
+ "use strict";function _array_like_to_array(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function _array_with_holes(t){if(Array.isArray(t))return t}function _array_without_holes(t){if(Array.isArray(t))return _array_like_to_array(t)}function asyncGeneratorStep(t,e,r,n,a,o,i){try{var u=t[o](i),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,a)}function _async_to_generator(t){return function(){var e=this,r=arguments;return new Promise(function(n,a){var o=t.apply(e,r);function i(t){asyncGeneratorStep(o,n,a,i,u,"next",t)}function u(t){asyncGeneratorStep(o,n,a,i,u,"throw",t)}i(void 0)})}}function _define_property(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function _iterable_to_array(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}function _iterable_to_array_limit(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,a,o=[],i=!0,u=!1;try{for(r=r.call(t);!(i=(n=r.next()).done)&&(o.push(n.value),!e||o.length!==e);i=!0);}catch(t){u=!0,a=t}finally{try{i||null==r.return||r.return()}finally{if(u)throw a}}return o}}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),n.forEach(function(e){_define_property(t,e,r[e])})}return t}function _object_without_properties(t,e){if(null==t)return{};var r,n,a=_object_without_properties_loose(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(a[r]=t[r])}return a}function _object_without_properties_loose(t,e){if(null==t)return{};var r,n,a={},o=Object.keys(t);for(n=0;n<o.length;n++)r=o[n],e.indexOf(r)>=0||(a[r]=t[r]);return a}function _sliced_to_array(t,e){return _array_with_holes(t)||_iterable_to_array_limit(t,e)||_unsupported_iterable_to_array(t,e)||_non_iterable_rest()}function _to_consumable_array(t){return _array_without_holes(t)||_iterable_to_array(t)||_unsupported_iterable_to_array(t)||_non_iterable_spread()}function _type_of(t){return t&&"undefined"!=typeof Symbol&&t.constructor===Symbol?"symbol":typeof t}function _unsupported_iterable_to_array(t,e){if(t){if("string"==typeof t)return _array_like_to_array(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(r):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_array_like_to_array(t,e):void 0}}function _ts_generator(t,e){var r,n,a,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return i.next=u(0),i.throw=u(1),i.return=u(2),"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(u){return function(c){return function(u){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,u[0]&&(o=0)),o;)try{if(r=1,n&&(a=2&u[0]?n.return:u[0]?n.throw||((a=n.return)&&a.call(n),0):n.next)&&!(a=a.call(n,u[1])).done)return a;switch(n=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return o.label++,{value:u[1],done:!1};case 5:o.label++,n=u[1],u=[0];continue;case 7:u=o.ops.pop(),o.trys.pop();continue;default:if(!(a=o.trys,(a=a.length>0&&a[a.length-1])||6!==u[0]&&2!==u[0])){o=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){o.label=u[1];break}if(6===u[0]&&o.label<a[1]){o.label=a[1],a=u;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(u);break}a[2]&&o.ops.pop(),o.trys.pop();continue}u=e.call(t,o)}catch(t){u=[6,t],n=0}finally{r=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}([u,c])}}}var Destination=function(){var t=function(t){return Array.isArray(t)},e=function(e){return"object"==(void 0===e?"undefined":_type_of(e))&&null!==e&&!t(e)&&"[object Object]"===Object.prototype.toString.call(e)},r=function(t){return"string"==typeof t},n=function(t,e,r){return function(){for(var n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];try{return t.apply(void 0,_to_consumable_array(a))}catch(t){if(!e)return;return e(t)}finally{null==r||r()}}},a=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0;if(e.filter&&!0===n(function(){return e.filter(r)},function(){return!1})())return;var a=o(r);if(a){var i=e.prefix||"dataLayer",u={name:"".concat(i," ").concat(a.name),data:a,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:c(),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};n(function(){return t(u)},function(){})()}},o=function(n){if(e(n)&&r(n.event))return _object_spread({name:n.event},_object_without_properties(n,["event"]));if(t(n)&&n.length>=2)return i(n);if(u(n)){var a=Array.from(n);return i(a)}return null},i=function(t){var n,a=_sliced_to_array(t,3),o=a[0],i=a[1],u=a[2];if(!r(o))return null;var c={};switch(o){case"consent":if(!r(i)||t.length<3)return null;if("default"!==i&&"update"!==i)return null;if(!e(u)||null===u)return null;n="".concat(o," ").concat(i),c=_object_spread({},u);break;case"event":if(!r(i))return null;n=i,e(u)&&(c=_object_spread({},u));break;case"config":if(!r(i))return null;n="".concat(o," ").concat(i),e(u)&&(c=_object_spread({},u));break;case"set":if(r(i))n="".concat(o," ").concat(i),e(u)&&(c=_object_spread({},u));else{if(!e(i))return null;n="".concat(o," custom"),c=_object_spread({},i)}break;default:return null}return _object_spread({name:n},c)},u=function(t){return null!=t&&"object"===(void 0===t?"undefined":_type_of(t))&&"length"in t&&"number"==typeof t.length&&t.length>0},c=function(){return Math.random().toString(36).substring(2,15)},l=function(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]},f=function(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]},s=function(){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}]}]},y=function(){return["event","view_item",{currency:"EUR",value:15.25,items:[{item_id:"SKU_12345",item_name:"Product Name",item_category:"Category",price:15.25}]}]},d=function(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]},p=function(){return["set",{currency:"EUR",country:"DE"}]},m=function(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}},v=Object.defineProperty,b=Object.getOwnPropertyDescriptor,g=Object.getOwnPropertyNames,h=Object.prototype.hasOwnProperty,w=function(t,e){for(var r in e)v(t,r,{get:e[r],enumerable:!0})},j={};w(j,{Events:function(){return E},Mapping:function(){return P},SourceDataLayer:function(){return S},consentOnlyMapping:function(){return C},consentUpdateEvent:function(){return l},dataLayerExamples:function(){return M},default:function(){return N},env:function(){return A},sourceDataLayer:function(){return T}});var O=!1,S={},A={};w(A,{push:function(){return k}});var X={dataLayer:[],addEventListener:jest.fn(),removeEventListener:jest.fn()},k={elb:jest.fn(),window:X},E={};w(E,{add_to_cart:function(){return _},config:function(){return d},consentDefault:function(){return f},consentUpdate:function(){return l},directDataLayerEvent:function(){return m},purchase:function(){return s},setCustom:function(){return p},view_item:function(){return y}});var P={};w(P,{add_to_cart:function(){return D},config:function(){return M},configGA4:function(){return G},consentOnlyMapping:function(){return C},consentUpdate:function(){return L},customEvent:function(){return q},purchase:function(){return U},view_item:function(){return I}});var x,L={name:"walker consent",settings:{command:{map:{functional:{value:!0},analytics:{key:"analytics_storage",fn:function(t){return"granted"===t}},marketing:{key:"ad_storage",fn:function(t){return"granted"===t}}}}}},U={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"}}}}]}}}},D={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"}}},I={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"}}},G={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},q={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},M={consent:{update:L},purchase:U,add_to_cart:D,view_item:I,"config G-XXXXXXXXXX":G,custom_event:q,"*":{data:{}}},C={consent:{update:L}},T=function(t,e){return _async_to_generator(function(){var r,n,o,i;return _ts_generator(this,function(u){try{return r=e.elb,n=e.window,o=_object_spread({name:"dataLayer",prefix:"dataLayer"},null==t?void 0:t.settings),i={settings:o},n&&(function(t,e){var r=e.settings,n=(null==r?void 0:r.name)||"dataLayer",o=window[n];if(Array.isArray(o)&&!O){O=!0;try{var i=!0,u=!1,c=void 0;try{for(var l,f=o[Symbol.iterator]();!(i=(l=f.next()).done);i=!0){var s=l.value;a(t,r,s)}}catch(t){u=!0,c=t}finally{try{i||null==f.return||f.return()}finally{if(u)throw c}}}finally{O=!1}}}(r,i),function(t,e){var r=e.settings,n=(null==r?void 0:r.name)||"dataLayer";window[n]||(window[n]=[]);var o=window[n];if(Array.isArray(o)){var i=o.push.bind(o);o.push=function(){for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];if(O)return i.apply(void 0,_to_consumable_array(n));O=!0;try{var u=!0,c=!1,l=void 0;try{for(var f,s=n[Symbol.iterator]();!(u=(f=s.next()).done);u=!0){var _=f.value;a(t,r,_)}}catch(t){c=!0,l=t}finally{try{u||null==s.return||s.return()}finally{if(c)throw l}}}finally{O=!1}return i.apply(void 0,_to_consumable_array(n))}}}(r,i)),[2,{type:"dataLayer",config:i,push:r,destroy:function(){return _async_to_generator(function(){var t;return _ts_generator(this,function(e){return t=o.name||"dataLayer",n&&n[t]&&Array.isArray(n[t]),[2]})})()}}]}catch(t){throw t}return[2]})})()},N=T;return x=j,function(t,e,r,n){if(e&&"object"===(void 0===e?"undefined":_type_of(e))||"function"==typeof e){var a=!0,o=!1,i=void 0;try{for(var u,c=function(){var a=u.value;h.call(t,a)||a===r||v(t,a,{get:function(){return e[a]},enumerable:!(n=b(e,a))||n.enumerable})},l=g(e)[Symbol.iterator]();!(a=(u=l.next()).done);a=!0)c()}catch(t){o=!0,i=t}finally{try{a||null==l.return||l.return()}finally{if(o)throw i}}}return t}(v({},"__esModule",{value:!0}),x)}();
package/dist/index.js CHANGED
@@ -1 +1 @@
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})},o={};i(o,{Events:()=>l,Mapping:()=>h,SourceDataLayer:()=>m,consentOnlyMapping:()=>k,consentUpdateEvent:()=>y,dataLayerExamples:()=>U,default:()=>$,sourceDataLayer:()=>A}),module.exports=(e=o,((e,i,o,c)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let u of a(i))r.call(e,u)||u===o||t(e,u,{get:()=>i[u],enumerable:!(c=n(i,u))||c.enumerable});return e})(t({},"__esModule",{value:!0}),e));var c=require("@walkeros/core"),u=!1;function s(e,t={},n){if(t.filter){if(!0===(0,c.tryCatch)(()=>t.filter(n),()=>!1)())return}const a=function(e){if((0,c.isObject)(e)&&(0,c.isString)(e.event)){const{event:t,...n}=e;return{name:t,...n}}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}(n);if(!a)return;const r={name:`${t.prefix||"dataLayer"} ${a.name}`,data:a,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};(0,c.tryCatch)(()=>e(r),()=>{})()}function d(e){const[t,n,a]=e;if(!(0,c.isString)(t))return null;let r,i={};switch(t){case"consent":if(!(0,c.isString)(n)||e.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!(0,c.isObject)(a)||null===a)return null;r=`${t} ${n}`,i={...a};break;case"event":if(!(0,c.isString)(n))return null;r=n,(0,c.isObject)(a)&&(i={...a});break;case"config":if(!(0,c.isString)(n))return null;r=`${t} ${n}`,(0,c.isObject)(a)&&(i={...a});break;case"set":if((0,c.isString)(n))r=`${t} ${n}`,(0,c.isObject)(a)&&(i={...a});else{if(!(0,c.isObject)(n))return null;r=`${t} custom`,i={...n}}break;default:return null}return{name:r,...i}}var m={},l={};function y(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function p(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function f(){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 g(){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 _(){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 v(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function w(){return["set",{currency:"EUR",country:"DE"}]}function b(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}i(l,{add_to_cart:()=>g,config:()=>v,consentDefault:()=>p,consentUpdate:()=>y,directDataLayerEvent:()=>b,purchase:()=>f,setCustom:()=>w,view_item:()=>_});var h={};i(h,{add_to_cart:()=>L,config:()=>U,configGA4:()=>E,consentOnlyMapping:()=>k,consentUpdate:()=>X,customEvent:()=>S,purchase:()=>O,view_item:()=>j});var X={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}}}}},O={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"}}}}]}}}},L={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"}}},j={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"}}},E={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},S={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},U={consent:{update:X},purchase:O,add_to_cart:L,view_item:j,"config G-XXXXXXXXXX":E,custom_event:S,"*":{data:{}}},k={consent:{update:X}},A=async(e,t)=>{try{const n=t||{},{elb:a,window:r}=n;if(!a)throw new Error("DataLayer source requires elb function in environment");const i={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},o={settings:i};r&&(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}}}(a,o),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)}}(a,o));return{type:"dataLayer",config:o,push:a,destroy:async()=>{const e=i.name||"dataLayer";r&&r[e]&&Array.isArray(r[e])}}}catch(e){throw e}},$=A;//# 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})},o={};i(o,{Events:()=>f,Mapping:()=>L,SourceDataLayer:()=>m,consentOnlyMapping:()=>P,consentUpdateEvent:()=>g,dataLayerExamples:()=>$,default:()=>D,env:()=>l,sourceDataLayer:()=>q}),module.exports=(e=o,((e,i,o,c)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let s of a(i))r.call(e,s)||s===o||t(e,s,{get:()=>i[s],enumerable:!(c=n(i,s))||c.enumerable});return e})(t({},"__esModule",{value:!0}),e));var c=require("@walkeros/core"),s=!1;function u(e,t={},n){if(t.filter){if(!0===(0,c.tryCatch)(()=>t.filter(n),()=>!1)())return}const a=function(e){if((0,c.isObject)(e)&&(0,c.isString)(e.event)){const{event:t,...n}=e;return{name:t,...n}}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}(n);if(!a)return;const r={name:`${t.prefix||"dataLayer"} ${a.name}`,data:a,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};(0,c.tryCatch)(()=>e(r),()=>{})()}function d(e){const[t,n,a]=e;if(!(0,c.isString)(t))return null;let r,i={};switch(t){case"consent":if(!(0,c.isString)(n)||e.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!(0,c.isObject)(a)||null===a)return null;r=`${t} ${n}`,i={...a};break;case"event":if(!(0,c.isString)(n))return null;r=n,(0,c.isObject)(a)&&(i={...a});break;case"config":if(!(0,c.isString)(n))return null;r=`${t} ${n}`,(0,c.isObject)(a)&&(i={...a});break;case"set":if((0,c.isString)(n))r=`${t} ${n}`,(0,c.isObject)(a)&&(i={...a});else{if(!(0,c.isObject)(n))return null;r=`${t} custom`,i={...n}}break;default:return null}return{name:r,...i}}var m={},l={};i(l,{push:()=>y});var p={dataLayer:[],addEventListener:jest.fn(),removeEventListener:jest.fn()},y={elb:jest.fn(),window:p},f={};function g(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function _(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function v(){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 w(){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 b(){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 X(){return["set",{currency:"EUR",country:"DE"}]}function j(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}i(f,{add_to_cart:()=>w,config:()=>h,consentDefault:()=>_,consentUpdate:()=>g,directDataLayerEvent:()=>j,purchase:()=>v,setCustom:()=>X,view_item:()=>b});var L={};i(L,{add_to_cart:()=>S,config:()=>$,configGA4:()=>k,consentOnlyMapping:()=>P,consentUpdate:()=>O,customEvent:()=>A,purchase:()=>E,view_item:()=>U});var O={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}}}}},E={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"}}},k={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},A={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},$={consent:{update:O},purchase:E,add_to_cart:S,view_item:U,"config G-XXXXXXXXXX":k,custom_event:A,"*":{data:{}}},P={consent:{update:O}},q=async(e,t)=>{try{const{elb:n,window:a}=t,r={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},i={settings:r};a&&(function(e,t){const n=t.settings,a=(null==n?void 0:n.name)||"dataLayer",r=window[a];if(Array.isArray(r)&&!s){s=!0;try{for(const t of r)u(e,n,t)}finally{s=!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(s)return i(...t);s=!0;try{for(const a of t)u(e,n,a)}finally{s=!1}return i(...t)}}(n,i));return{type:"dataLayer",config:i,push:n,destroy:async()=>{const e=r.name||"dataLayer";a&&a[e]&&Array.isArray(a[e])}}}catch(e){throw e}},D=q;//# 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/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { Source, Elb } from '@walkeros/core';\nimport type { Settings, DataLayerSourceConfig } 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-specific environment interface\n */\ninterface DataLayerEnvironment extends Source.Environment {\n window?: typeof window;\n}\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<DataLayerSourceConfig> = async (\n config: Partial<DataLayerSourceConfig>,\n env?: Source.Environment,\n) => {\n try {\n // Extract and validate environment dependencies\n const dataLayerEnv = (env || {}) as DataLayerEnvironment;\n const { elb, window: envWindow } = dataLayerEnv;\n\n if (!elb) {\n throw new Error('DataLayer source requires elb function in environment');\n }\n\n // Default configuration, merged with provided config\n const settings: Settings = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n // Full configuration with defaults\n const fullConfig: DataLayerSourceConfig = {\n settings,\n };\n\n // Initialize dataLayer interception if window is available\n if (envWindow) {\n // Process existing events in dataLayer\n processExistingEvents(elb, fullConfig);\n\n // Set up interception for new events\n interceptDataLayer(elb, fullConfig);\n }\n\n // DataLayer sources typically intercept existing dataLayer.push calls\n // The push method here forwards to the core collector elb function\n const push: Elb.Fn = elb;\n\n // Return stateless source instance\n return {\n type: 'dataLayer',\n config: fullConfig,\n push,\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 } catch (error) {\n throw error;\n }\n};\n\nexport default sourceDataLayer;\n","import type { WalkerOS, Source } 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 elb: Source.Environment['elb'],\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(elb, 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 elb: Source.Environment['elb'],\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(elb, 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 elb: Source.Environment['elb'],\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 WalkerOS event structure\n const walkerEvent: WalkerOS.Event = {\n name: eventName,\n data: transformedEvent as WalkerOS.Properties,\n context: {},\n globals: {},\n custom: {},\n consent: {},\n nested: [],\n user: {},\n id: generateId(),\n trigger: '',\n entity: '',\n action: '',\n timestamp: Date.now(),\n timing: 0,\n group: '',\n count: 0,\n version: { source: '1.0.0', tagging: 2 },\n source: {\n type: 'dataLayer',\n id: '',\n previous_id: '',\n },\n };\n\n // Push to elb\n tryCatch(\n () => elb(walkerEvent),\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\n/**\n * Generate simple ID\n */\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n","import type { WalkerOS, Source } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\n// DataLayer source configuration extending core source config\nexport interface DataLayerSourceConfig extends Source.Config {\n settings: Settings;\n}\n\nexport type DataLayer = Array<unknown>;\n\nexport interface Settings extends Record<string, unknown> {\n name?: string; // dataLayer variable name (default: 'dataLayer')\n prefix?: string; // Event prefix (default: 'gtag')\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\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","/**\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","config","add_to_cart","config","consentUpdate","purchase","view_item","config"]}
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, Elb } 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 try {\n // Extract environment dependencies\n const { elb, window: envWindow } = env;\n\n // Default configuration, merged with provided config\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n // Full configuration with defaults\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Initialize dataLayer interception if window is available\n if (envWindow) {\n // Process existing events in dataLayer\n processExistingEvents(elb, fullConfig);\n\n // Set up interception for new events\n interceptDataLayer(elb, fullConfig);\n }\n\n // DataLayer sources typically intercept existing dataLayer.push calls\n // The push method here forwards to the core collector elb function\n const push: Elb.Fn = elb;\n\n // Return stateless source instance\n return {\n type: 'dataLayer',\n config: fullConfig,\n push,\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 } catch (error) {\n throw error;\n }\n};\n\nexport default sourceDataLayer;\n","import type { WalkerOS, Source } 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 elb: Source.Env['elb'],\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(elb, 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 elb: Source.Env['elb'],\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(elb, 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 elb: Source.Env['elb'],\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 WalkerOS event structure\n const walkerEvent: WalkerOS.Event = {\n name: eventName,\n data: transformedEvent as WalkerOS.Properties,\n context: {},\n globals: {},\n custom: {},\n consent: {},\n nested: [],\n user: {},\n id: generateId(),\n trigger: '',\n entity: '',\n action: '',\n timestamp: Date.now(),\n timing: 0,\n group: '',\n count: 0,\n version: { source: '1.0.0', tagging: 2 },\n source: {\n type: 'dataLayer',\n id: '',\n previous_id: '',\n },\n };\n\n // Push to elb\n tryCatch(\n () => elb(walkerEvent),\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\n/**\n * Generate simple ID\n */\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n","import type { WalkerOS, Source, Elb } 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\nexport interface Settings extends Record<string, unknown> {\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 type { Source } 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/**\n * Environment interface for dataLayer source\n */\ninterface DataLayerEnv extends Source.Env {\n window?: typeof window;\n}\n\n/**\n * Mock window object with dataLayer array\n */\nconst mockWindow = {\n dataLayer: [] as unknown[],\n addEventListener: jest.fn(),\n removeEventListener: jest.fn(),\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 elb: jest.fn(),\n window: mockWindow as unknown as typeof window,\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","config","add_to_cart","config","consentUpdate","purchase","view_item","config","push"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,n)=>{for(var a in n)e(t,a,{get:n[a],enumerable:!0})};import{isArray as n,isObject as a,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(a(e)&&r(e.event)){const{event:t,...n}=e;return{name:t,...n}}if(n(e)&&e.length>=2)return u(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return u(Array.from(e))}var t;return null}(o);if(!c)return;const s={name:`${t.prefix||"dataLayer"} ${c.name}`,data:c,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};i(()=>e(s),()=>{})()}function u(e){const[t,n,i]=e;if(!r(t))return null;let o,c={};switch(t){case"consent":if(!r(n)||e.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!a(i)||null===i)return null;o=`${t} ${n}`,c={...i};break;case"event":if(!r(n))return null;o=n,a(i)&&(c={...i});break;case"config":if(!r(n))return null;o=`${t} ${n}`,a(i)&&(c={...i});break;case"set":if(r(n))o=`${t} ${n}`,a(i)&&(c={...i});else{if(!a(n))return null;o=`${t} custom`,c={...n}}break;default:return null}return{name:o,...c}}var s={},d={};function m(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function l(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function p(){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 y(){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 f(){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 g(){return["set",{currency:"EUR",country:"DE"}]}function v(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}t(d,{add_to_cart:()=>y,config:()=>_,consentDefault:()=>l,consentUpdate:()=>m,directDataLayerEvent:()=>v,purchase:()=>p,setCustom:()=>g,view_item:()=>f});var w={};t(w,{add_to_cart:()=>b,config:()=>k,configGA4:()=>E,consentOnlyMapping:()=>$,consentUpdate:()=>X,customEvent:()=>U,purchase:()=>h,view_item:()=>L});var X={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}}}}},h={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"}}}}]}}}},b={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"}}},L={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"}}},E={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},U={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},k={consent:{update:X},purchase:h,add_to_cart:b,view_item:L,"config G-XXXXXXXXXX":E,custom_event:U,"*":{data:{}}},$={consent:{update:X}},A=async(e,t)=>{try{const n=t||{},{elb:a,window:r}=n;if(!a)throw new Error("DataLayer source requires elb function in environment");const i={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},u={settings:i};r&&(function(e,t){const n=t.settings,a=(null==n?void 0:n.name)||"dataLayer",r=window[a];if(Array.isArray(r)&&!o){o=!0;try{for(const t of r)c(e,n,t)}finally{o=!1}}}(a,u),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(o)return i(...t);o=!0;try{for(const a of t)c(e,n,a)}finally{o=!1}return i(...t)}}(a,u));return{type:"dataLayer",config:u,push:a,destroy:async()=>{const e=i.name||"dataLayer";r&&r[e]&&Array.isArray(r[e])}}}catch(e){throw e}},q=A;export{d as Events,w as Mapping,s as SourceDataLayer,$ as consentOnlyMapping,m as consentUpdateEvent,k as dataLayerExamples,q as default,A as sourceDataLayer};//# sourceMappingURL=index.mjs.map
1
+ var e=Object.defineProperty,t=(t,n)=>{for(var a in n)e(t,a,{get:n[a],enumerable:!0})};import{isArray as n,isObject as a,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(a(e)&&r(e.event)){const{event:t,...n}=e;return{name:t,...n}}if(n(e)&&e.length>=2)return u(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return u(Array.from(e))}var t;return null}(o);if(!c)return;const s={name:`${t.prefix||"dataLayer"} ${c.name}`,data:c,context:{},globals:{},custom:{},consent:{},nested:[],user:{},id:Math.random().toString(36).substring(2,15),trigger:"",entity:"",action:"",timestamp:Date.now(),timing:0,group:"",count:0,version:{source:"1.0.0",tagging:2},source:{type:"dataLayer",id:"",previous_id:""}};i(()=>e(s),()=>{})()}function u(e){const[t,n,i]=e;if(!r(t))return null;let o,c={};switch(t){case"consent":if(!r(n)||e.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!a(i)||null===i)return null;o=`${t} ${n}`,c={...i};break;case"event":if(!r(n))return null;o=n,a(i)&&(c={...i});break;case"config":if(!r(n))return null;o=`${t} ${n}`,a(i)&&(c={...i});break;case"set":if(r(n))o=`${t} ${n}`,a(i)&&(c={...i});else{if(!a(n))return null;o=`${t} custom`,c={...n}}break;default:return null}return{name:o,...c}}var s={},d={};t(d,{push:()=>l});var m={dataLayer:[],addEventListener:jest.fn(),removeEventListener:jest.fn()},l={elb:jest.fn(),window:m},p={};function y(){return["consent","update",{ad_user_data:"granted",ad_personalization:"granted",ad_storage:"denied",analytics_storage:"granted"}]}function f(){return["consent","default",{ad_storage:"denied",analytics_storage:"denied",ad_user_data:"denied",ad_personalization:"denied"}]}function _(){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 g(){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 v(){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 w(){return["config","G-XXXXXXXXXX",{page_title:"Custom Page Title",page_location:"https://example.com/page",send_page_view:!1}]}function X(){return["set",{currency:"EUR",country:"DE"}]}function h(){return{event:"custom_event",custom_parameter:"custom_value",user_id:"user123"}}t(p,{add_to_cart:()=>g,config:()=>w,consentDefault:()=>f,consentUpdate:()=>y,directDataLayerEvent:()=>h,purchase:()=>_,setCustom:()=>X,view_item:()=>v});var L={};t(L,{add_to_cart:()=>U,config:()=>q,configGA4:()=>$,consentOnlyMapping:()=>x,consentUpdate:()=>b,customEvent:()=>A,purchase:()=>E,view_item:()=>k});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}}}}},E={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"}}},k={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"}}},$={name:"page view",data:{map:{title:"page_title",url:"page_location"}}},A={data:{map:{user_id:"user_id",custom_parameter:"custom_parameter"}}},q={consent:{update:b},purchase:E,add_to_cart:U,view_item:k,"config G-XXXXXXXXXX":$,custom_event:A,"*":{data:{}}},x={consent:{update:b}},j=async(e,t)=>{try{const{elb:n,window:a}=t,r={name:"dataLayer",prefix:"dataLayer",...null==e?void 0:e.settings},i={settings:r};a&&(function(e,t){const n=t.settings,a=(null==n?void 0:n.name)||"dataLayer",r=window[a];if(Array.isArray(r)&&!o){o=!0;try{for(const t of r)c(e,n,t)}finally{o=!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(o)return i(...t);o=!0;try{for(const a of t)c(e,n,a)}finally{o=!1}return i(...t)}}(n,i));return{type:"dataLayer",config:i,push:n,destroy:async()=>{const e=r.name||"dataLayer";a&&a[e]&&Array.isArray(a[e])}}}catch(e){throw e}},D=j;export{p as Events,L as Mapping,s as SourceDataLayer,x as consentOnlyMapping,y as consentUpdateEvent,q as dataLayerExamples,D as default,d as env,j as sourceDataLayer};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interceptor.ts","../src/types/index.ts","../src/examples/events.ts","../src/examples/mapping.ts","../src/index.ts"],"sourcesContent":["import type { WalkerOS, Source } 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 elb: Source.Environment['elb'],\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(elb, 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 elb: Source.Environment['elb'],\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(elb, 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 elb: Source.Environment['elb'],\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 WalkerOS event structure\n const walkerEvent: WalkerOS.Event = {\n name: eventName,\n data: transformedEvent as WalkerOS.Properties,\n context: {},\n globals: {},\n custom: {},\n consent: {},\n nested: [],\n user: {},\n id: generateId(),\n trigger: '',\n entity: '',\n action: '',\n timestamp: Date.now(),\n timing: 0,\n group: '',\n count: 0,\n version: { source: '1.0.0', tagging: 2 },\n source: {\n type: 'dataLayer',\n id: '',\n previous_id: '',\n },\n };\n\n // Push to elb\n tryCatch(\n () => elb(walkerEvent),\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\n/**\n * Generate simple ID\n */\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n","import type { WalkerOS, Source } from '@walkeros/core';\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\n// DataLayer source configuration extending core source config\nexport interface DataLayerSourceConfig extends Source.Config {\n settings: Settings;\n}\n\nexport type DataLayer = Array<unknown>;\n\nexport interface Settings extends Record<string, unknown> {\n name?: string; // dataLayer variable name (default: 'dataLayer')\n prefix?: string; // Event prefix (default: 'gtag')\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\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","/**\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, Elb } from '@walkeros/core';\nimport type { Settings, DataLayerSourceConfig } 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-specific environment interface\n */\ninterface DataLayerEnvironment extends Source.Environment {\n window?: typeof window;\n}\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<DataLayerSourceConfig> = async (\n config: Partial<DataLayerSourceConfig>,\n env?: Source.Environment,\n) => {\n try {\n // Extract and validate environment dependencies\n const dataLayerEnv = (env || {}) as DataLayerEnvironment;\n const { elb, window: envWindow } = dataLayerEnv;\n\n if (!elb) {\n throw new Error('DataLayer source requires elb function in environment');\n }\n\n // Default configuration, merged with provided config\n const settings: Settings = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n // Full configuration with defaults\n const fullConfig: DataLayerSourceConfig = {\n settings,\n };\n\n // Initialize dataLayer interception if window is available\n if (envWindow) {\n // Process existing events in dataLayer\n processExistingEvents(elb, fullConfig);\n\n // Set up interception for new events\n interceptDataLayer(elb, fullConfig);\n }\n\n // DataLayer sources typically intercept existing dataLayer.push calls\n // The push method here forwards to the core collector elb function\n const push: Elb.Fn = elb;\n\n // Return stateless source instance\n return {\n type: 'dataLayer',\n config: fullConfig,\n push,\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 } catch (error) {\n throw error;\n }\n};\n\nexport default sourceDataLayer;\n"],"mappings":"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","names":["config","add_to_cart","config","consentUpdate","purchase","view_item","config"]}
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 } 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 elb: Source.Env['elb'],\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(elb, 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 elb: Source.Env['elb'],\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(elb, 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 elb: Source.Env['elb'],\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 WalkerOS event structure\n const walkerEvent: WalkerOS.Event = {\n name: eventName,\n data: transformedEvent as WalkerOS.Properties,\n context: {},\n globals: {},\n custom: {},\n consent: {},\n nested: [],\n user: {},\n id: generateId(),\n trigger: '',\n entity: '',\n action: '',\n timestamp: Date.now(),\n timing: 0,\n group: '',\n count: 0,\n version: { source: '1.0.0', tagging: 2 },\n source: {\n type: 'dataLayer',\n id: '',\n previous_id: '',\n },\n };\n\n // Push to elb\n tryCatch(\n () => elb(walkerEvent),\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\n/**\n * Generate simple ID\n */\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n","import type { WalkerOS, Source, Elb } 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\nexport interface Settings extends Record<string, unknown> {\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 type { Source } 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/**\n * Environment interface for dataLayer source\n */\ninterface DataLayerEnv extends Source.Env {\n window?: typeof window;\n}\n\n/**\n * Mock window object with dataLayer array\n */\nconst mockWindow = {\n dataLayer: [] as unknown[],\n addEventListener: jest.fn(),\n removeEventListener: jest.fn(),\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 elb: jest.fn(),\n window: mockWindow as unknown as typeof window,\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, Elb } 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 try {\n // Extract environment dependencies\n const { elb, window: envWindow } = env;\n\n // Default configuration, merged with provided config\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n // Full configuration with defaults\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Initialize dataLayer interception if window is available\n if (envWindow) {\n // Process existing events in dataLayer\n processExistingEvents(elb, fullConfig);\n\n // Set up interception for new events\n interceptDataLayer(elb, fullConfig);\n }\n\n // DataLayer sources typically intercept existing dataLayer.push calls\n // The push method here forwards to the core collector elb function\n const push: Elb.Fn = elb;\n\n // Return stateless source instance\n return {\n type: 'dataLayer',\n config: fullConfig,\n push,\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 } catch (error) {\n throw error;\n }\n};\n\nexport default sourceDataLayer;\n"],"mappings":"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","names":["config","add_to_cart","config","consentUpdate","purchase","view_item","config","push"]}
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.1.1",
4
+ "version": "0.2.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -30,8 +30,8 @@
30
30
  "update": "npx npm-check-updates -u && npm update"
31
31
  },
32
32
  "dependencies": {
33
- "@walkeros/core": "0.1.1",
34
- "@walkeros/collector": "0.1.1"
33
+ "@walkeros/core": "0.2.0",
34
+ "@walkeros/collector": "0.2.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/gtag.js": "^0.0.20"