@walkeros/web-destination-gtag 4.3.1 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @walkeros/web-destination-gtag
2
2
 
3
+ ## 4.3.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 9f773b6: The GA4 destination now loads gtag.js first-party from your server
8
+ container. When `server_container_url` is set and script loading is enabled,
9
+ gtag.js is fetched from `<server_container_url>/gtag/js` instead of
10
+ googletagmanager.com. Without a server container configured, loading is
11
+ unchanged.
12
+ - @walkeros/core@4.3.2
13
+ - @walkeros/web-core@4.3.2
14
+
3
15
  ## 4.3.1
4
16
 
5
17
  ### Patch Changes
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,a=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,o=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},r={};o(r,{examples:()=>k,schemas:()=>s}),module.exports=(e=r,((e,o,r,s)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let d of n(o))i.call(e,d)||d===r||a(e,d,{get:()=>o[d],enumerable:!(s=t(o,d))||s.enumerable});return e})(a({},"__esModule",{value:!0}),e));var s={};o(s,{AdsSettingsSchema:()=>m,ConsentModeSchema:()=>p,GA4SettingsSchema:()=>u,GTMSettingsSchema:()=>v,MappingSchema:()=>f,SettingsSchema:()=>_,UserDataMappingSchema:()=>g,ads:()=>G,ga4:()=>z,gtm:()=>E,mapping:()=>w,settings:()=>A});var d=require("@walkeros/core/dev"),c=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),p=l.z.union([l.z.boolean(),l.z.record(l.z.string(),l.z.union([l.z.string(),l.z.array(l.z.string())]))]),u=l.z.object({measurementId:l.z.string().regex(/^G-[A-Z0-9]+$/,"Must be a valid GA4 Measurement ID (G-XXXXXXXXXX)").describe("GA4 Measurement ID from Google Analytics (like G-XXXXXXXXXX)"),debug:l.z.boolean().describe("Enable debug mode for GA4 (like true)").optional(),pageview:l.z.boolean().describe("Enable automatic pageview tracking (like true)").optional(),server_container_url:l.z.string().url().describe("Server-side GTM container URL (like https://server-container.com)").optional(),snakeCase:l.z.boolean().describe("Convert parameter names to snake_case (like true)").optional(),transport_url:l.z.string().url().describe("Custom transport URL for GA4 (like https://analytics.example.com/mp/collect)").optional(),data:l.z.any().describe("Custom data mapping configuration").optional()}),g=l.z.object({email:l.z.any().describe("Mapping value for user email (like user.email)").optional(),phone_number:l.z.any().describe("Mapping value for user phone number (like user.phone)").optional(),address:l.z.object({first_name:l.z.any().describe("Mapping value for first name (like data.firstName)").optional(),last_name:l.z.any().describe("Mapping value for last name (like data.lastName)").optional(),street:l.z.any().describe("Mapping value for street address").optional(),city:l.z.any().describe("Mapping value for city (like user.city)").optional(),region:l.z.any().describe("Mapping value for region/state (like user.region)").optional(),postal_code:l.z.any().describe("Mapping value for postal/zip code (like user.zip)").optional(),country:l.z.any().describe("Mapping value for country (like user.country)").optional()}).describe("Address mapping for enhanced conversions").optional()}),m=l.z.object({conversionId:l.z.string().regex(/^AW-[0-9]+$/,"Must be a valid Ads Conversion ID (AW-XXXXXXXXXX)").describe("Google Ads Conversion ID (required)"),currency:l.z.string().length(3).describe("Currency code (ISO 4217, e.g., USD, EUR)").optional(),data:l.z.any().describe("Custom data mapping (WalkerOS.Mapping.Value | Values)").optional(),enhancedConversions:g.describe("Enhanced conversions: maps event fields to Google user_data for improved measurement accuracy").optional()}),v=l.z.object({containerId:l.z.string().regex(/^GTM-[A-Z0-9]+$/,"Must be a valid GTM Container ID (GTM-XXXXXXX)").describe("GTM Container ID (required)"),dataLayer:l.z.string().describe("Custom dataLayer variable name (default: dataLayer)").optional(),domain:l.z.string().describe("Custom GTM domain for script loading").optional(),data:l.z.any().describe("Custom data mapping (WalkerOS.Mapping.Value | Values)").optional()}),_=c.z.object({como:p.describe("Consent mode configuration: false (disabled), true (use defaults), or custom mapping").optional(),como_advanced:c.z.union([c.z.boolean(),c.z.number()]).describe("Advanced consent mode (non-EU): emit denied default at page load with wait_for_update (true=500ms, or a number of ms)").optional(),ga4:u.describe("GA4-specific configuration settings (like { measurementId: G-XXXXXXXXXX })").optional(),ads:m.describe("Google Ads specific configuration settings (like { conversionId: AW-XXXXXXXXX })").optional(),gtm:v.describe("Google Tag Manager specific configuration settings (like { containerId: GTM-XXXXXXX })").optional()}).refine(e=>{var a,t,n;return(null==(a=e.ga4)?void 0:a.measurementId)||(null==(t=e.ads)?void 0:t.conversionId)||(null==(n=e.gtm)?void 0:n.containerId)},{message:"At least one Google tool must be configured (ga4.measurementId, ads.conversionId, or gtm.containerId)"}),X=require("@walkeros/core/dev"),b=X.z.object({}),y=X.z.object({label:X.z.string().describe("Conversion label for this specific event").optional()}),h=X.z.object({}),f=X.z.object({ga4:b.describe("GA4-specific event mapping").optional(),ads:y.describe("Google Ads-specific event mapping").optional(),gtm:h.describe("GTM-specific event mapping").optional()}),A=(0,d.zodToSchema)(_),w=(0,d.zodToSchema)(f),z=(0,d.zodToSchema)(u),G=(0,d.zodToSchema)(m),E=(0,d.zodToSchema)(v),k={};o(k,{env:()=>C,step:()=>I});var C={};o(C,{init:()=>M,push:()=>S,simulation:()=>U});var M={window:{dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},S={window:{gtag:Object.assign(()=>{},{}),dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},U=["call:window.gtag"],I={};o(I,{addToCart:()=>L,adsEnhancedConversions:()=>W,adsInit:()=>O,consentModeV2:()=>N,ga4Init:()=>j,ga4WithIncludeAll:()=>$,googleAdsConversion:()=>V,gtmDataLayerPush:()=>H,gtmInit:()=>P,multipleToolsSimultaneous:()=>Z,pageView:()=>D,purchase:()=>q});var R=require("@walkeros/core"),T=17e11,x=new Date(T),j={title:"GA4 init",description:"The destination bootstraps gtag and configures a GA4 property via its measurementId.",in:{settings:{ga4:{measurementId:"G-XXXXXX-1"}}},out:[["gtag","js",x],["gtag","config","G-XXXXXX-1",{}]]},O={title:"Google Ads init",description:"The destination bootstraps gtag and configures a Google Ads account via its conversionId.",in:{settings:{ads:{conversionId:"AW-123456789",currency:"EUR"}}},out:[["gtag","js",x],["gtag","config","AW-123456789"]]},P={title:"GTM init",description:"The destination initializes the dataLayer and pushes the gtm.js start event for a GTM container.",in:{settings:{gtm:{containerId:"GTM-XXXXXXX"}}},out:[["dataLayer.push",{"gtm.start":T,event:"gtm.js"}]]},q={title:"Purchase",description:"An order complete event is mapped to the GA4 purchase event with transaction details and nested product items.",in:(0,R.getEvent)("order complete",{timestamp:1700000100}),mapping:{name:"purchase",include:["data","context"],data:{map:{transaction_id:"data.id",value:"data.total",tax:"data.taxes",shipping:"data.shipping",currency:{key:"data.currency",value:"EUR"},items:{loop:["nested",{condition:e=>(0,R.isObject)(e)&&"product"===e.entity,map:{item_id:"data.id",item_name:"data.name",quantity:{key:"data.quantity",value:1}}}]}}}},out:[["gtag","event","purchase",{transaction_id:"0rd3r1d",value:555,tax:73.76,shipping:5.22,currency:"EUR",items:[{item_id:"ers",item_name:"Everyday Ruck Snack",quantity:1},{item_id:"cc",item_name:"Cool Cap",quantity:1}],data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555,context_shopping:"complete",send_to:"G-XXXXXX-1"}]]},L={title:"Add to cart",description:"A product add event is mapped to the GA4 add_to_cart event with item details and value.",in:(0,R.getEvent)("product add",{timestamp:1700000101}),mapping:{name:"add_to_cart",include:["data"],data:{map:{currency:{value:"EUR",key:"data.currency"},value:"data.price",items:{loop:["this",{map:{item_id:"data.id",item_variant:"data.color",quantity:{value:1,key:"data.quantity"}}}]}}}},out:[["gtag","event","add_to_cart",{currency:"EUR",value:420,items:[{item_id:"ers",item_variant:"black",quantity:1}],data_id:"ers",data_name:"Everyday Ruck Snack",data_color:"black",data_size:"l",data_price:420,send_to:"G-XXXXXX-1"}]]},D={title:"Page view",description:"A page view event is forwarded as a GA4 page_view event with no additional mapping.",in:(0,R.getEvent)("page view",{timestamp:1700000102}),mapping:void 0,out:[["gtag","event","page_view",{send_to:"G-XXXXXX-1"}]]},V={title:"Ads conversion",description:"An order complete event is sent as a Google Ads conversion with a configured label and transaction value.",in:(0,R.getEvent)("order complete",{timestamp:1700000103}),mapping:{name:"PURCHASE_CONV",settings:{ads:{label:"PURCHASE_CONV"}},data:{map:{value:"data.total"}}},out:[["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_CONV",currency:"EUR",value:555}]]},W={title:"Enhanced conversions",description:"enhancedConversions maps event fields into a gtag set user_data call sent immediately before the conversion event.",in:(0,R.getEvent)("order complete",{timestamp:1700000109,data:{id:"0rd3r1d",currency:"EUR",shipping:5.22,taxes:73.76,total:555,customerEmail:"buyer@shop.com",customerPhone:"+1234567890"}}),mapping:{name:"PURCHASE_EC2",settings:{ads:{label:"PURCHASE_EC2"}},data:{map:{value:"data.total"}}},out:[["gtag","set","user_data",{email:"buyer@shop.com",phone_number:"+1234567890"}],["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_EC2",currency:"EUR",value:555}]]},H={title:"GTM dataLayer push",description:"A page view event is pushed to window.dataLayer for GTM with the mapped event name and parameters.",in:(0,R.getEvent)("page view",{timestamp:1700000104}),mapping:{name:"page_view",settings:{gtm:{}},data:{map:{page_title:"data.title",page_location:"data.domain"}}},out:[["dataLayer.push",{event:"page_view",page_title:"walkerOS documentation",page_location:"www.example.com"}]]},N={title:"Consent Mode v2",description:"A walker consent command with marketing and functional granted updates gtag Consent Mode v2 parameters.",command:"consent",in:{marketing:!0,functional:!0},out:[["gtag","consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied"}],["gtag","consent","update",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted",analytics_storage:"granted"}]]},$={title:"GA4 include all",description:"Include flattens every event section into prefixed GA4 params, exposing data, context, user, source, and event fields.",in:(0,R.getEvent)("page view",{id:"ev-1700000106",timestamp:1700000106,source:{type:"collector",schema:"4",count:1,trace:"1700000106abcdef1700000106abcdef"}}),mapping:{include:["data","context","globals","user","source","event"]},out:[["gtag","event","page_view",{data_domain:"www.example.com",data_title:"walkerOS documentation",data_referrer:"https://www.walkeros.io/",data_search:"?foo=bar",data_hash:"#hash",data_id:"/docs/",context_dev:"test",globals_pagegroup:"docs",user_id:"us3r",user_device:"c00k13",user_session:"s3ss10n",source_type:"collector",source_schema:"4",source_count:1,source_trace:"1700000106abcdef1700000106abcdef",source_release_default:"4.3.1",event_entity:"page",event_action:"view",event_trigger:"load",event_id:"ev-1700000106",event_name:"page view",event_timestamp:1700000106,event_timing:3.14,send_to:"G-XXXXXX-1"}]]},Z={title:"Multi-tool push",description:"A single order event fans out to GA4, Google Ads, and GTM from one mapping rule with per-tool settings.",in:(0,R.getEvent)("order complete",{timestamp:1700000107}),mapping:{name:"purchase",include:["data"],settings:{ga4:{},ads:{label:"PURCHASE_CONV"},gtm:{}},data:{map:{value:"data.total",currency:{key:"data.currency",value:"EUR"}}}},out:[["gtag","event","purchase",{value:555,currency:"EUR",data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555,send_to:"G-XXXXXX-1"}],["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_CONV",currency:"EUR",value:555,data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555}],["dataLayer.push",{event:"purchase",value:555,currency:"EUR",data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555}]]};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,a=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,o=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},r={};o(r,{examples:()=>k,schemas:()=>s}),module.exports=(e=r,((e,o,r,s)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let d of n(o))i.call(e,d)||d===r||a(e,d,{get:()=>o[d],enumerable:!(s=t(o,d))||s.enumerable});return e})(a({},"__esModule",{value:!0}),e));var s={};o(s,{AdsSettingsSchema:()=>m,ConsentModeSchema:()=>p,GA4SettingsSchema:()=>u,GTMSettingsSchema:()=>v,MappingSchema:()=>f,SettingsSchema:()=>_,UserDataMappingSchema:()=>g,ads:()=>G,ga4:()=>z,gtm:()=>E,mapping:()=>w,settings:()=>A});var d=require("@walkeros/core/dev"),c=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),p=l.z.union([l.z.boolean(),l.z.record(l.z.string(),l.z.union([l.z.string(),l.z.array(l.z.string())]))]),u=l.z.object({measurementId:l.z.string().regex(/^G-[A-Z0-9]+$/,"Must be a valid GA4 Measurement ID (G-XXXXXXXXXX)").describe("GA4 Measurement ID from Google Analytics (like G-XXXXXXXXXX)"),debug:l.z.boolean().describe("Enable debug mode for GA4 (like true)").optional(),pageview:l.z.boolean().describe("Enable automatic pageview tracking (like true)").optional(),server_container_url:l.z.string().url().describe("Server-side GTM container URL (like https://server-container.com)").optional(),snakeCase:l.z.boolean().describe("Convert parameter names to snake_case (like true)").optional(),transport_url:l.z.string().url().describe("Custom transport URL for GA4 (like https://analytics.example.com/mp/collect)").optional(),data:l.z.any().describe("Custom data mapping configuration").optional()}),g=l.z.object({email:l.z.any().describe("Mapping value for user email (like user.email)").optional(),phone_number:l.z.any().describe("Mapping value for user phone number (like user.phone)").optional(),address:l.z.object({first_name:l.z.any().describe("Mapping value for first name (like data.firstName)").optional(),last_name:l.z.any().describe("Mapping value for last name (like data.lastName)").optional(),street:l.z.any().describe("Mapping value for street address").optional(),city:l.z.any().describe("Mapping value for city (like user.city)").optional(),region:l.z.any().describe("Mapping value for region/state (like user.region)").optional(),postal_code:l.z.any().describe("Mapping value for postal/zip code (like user.zip)").optional(),country:l.z.any().describe("Mapping value for country (like user.country)").optional()}).describe("Address mapping for enhanced conversions").optional()}),m=l.z.object({conversionId:l.z.string().regex(/^AW-[0-9]+$/,"Must be a valid Ads Conversion ID (AW-XXXXXXXXXX)").describe("Google Ads Conversion ID (required)"),currency:l.z.string().length(3).describe("Currency code (ISO 4217, e.g., USD, EUR)").optional(),data:l.z.any().describe("Custom data mapping (WalkerOS.Mapping.Value | Values)").optional(),enhancedConversions:g.describe("Enhanced conversions: maps event fields to Google user_data for improved measurement accuracy").optional()}),v=l.z.object({containerId:l.z.string().regex(/^GTM-[A-Z0-9]+$/,"Must be a valid GTM Container ID (GTM-XXXXXXX)").describe("GTM Container ID (required)"),dataLayer:l.z.string().describe("Custom dataLayer variable name (default: dataLayer)").optional(),domain:l.z.string().describe("Custom GTM domain for script loading").optional(),data:l.z.any().describe("Custom data mapping (WalkerOS.Mapping.Value | Values)").optional()}),_=c.z.object({como:p.describe("Consent mode configuration: false (disabled), true (use defaults), or custom mapping").optional(),como_advanced:c.z.union([c.z.boolean(),c.z.number()]).describe("Advanced consent mode (non-EU): emit denied default at page load with wait_for_update (true=500ms, or a number of ms)").optional(),ga4:u.describe("GA4-specific configuration settings (like { measurementId: G-XXXXXXXXXX })").optional(),ads:m.describe("Google Ads specific configuration settings (like { conversionId: AW-XXXXXXXXX })").optional(),gtm:v.describe("Google Tag Manager specific configuration settings (like { containerId: GTM-XXXXXXX })").optional()}).refine(e=>{var a,t,n;return(null==(a=e.ga4)?void 0:a.measurementId)||(null==(t=e.ads)?void 0:t.conversionId)||(null==(n=e.gtm)?void 0:n.containerId)},{message:"At least one Google tool must be configured (ga4.measurementId, ads.conversionId, or gtm.containerId)"}),X=require("@walkeros/core/dev"),b=X.z.object({}),y=X.z.object({label:X.z.string().describe("Conversion label for this specific event").optional()}),h=X.z.object({}),f=X.z.object({ga4:b.describe("GA4-specific event mapping").optional(),ads:y.describe("Google Ads-specific event mapping").optional(),gtm:h.describe("GTM-specific event mapping").optional()}),A=(0,d.zodToSchema)(_),w=(0,d.zodToSchema)(f),z=(0,d.zodToSchema)(u),G=(0,d.zodToSchema)(m),E=(0,d.zodToSchema)(v),k={};o(k,{env:()=>C,step:()=>I});var C={};o(C,{init:()=>M,push:()=>S,simulation:()=>U});var M={window:{dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},S={window:{gtag:Object.assign(()=>{},{}),dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},U=["call:window.gtag"],I={};o(I,{addToCart:()=>L,adsEnhancedConversions:()=>W,adsInit:()=>O,consentModeV2:()=>N,ga4Init:()=>j,ga4WithIncludeAll:()=>$,googleAdsConversion:()=>V,gtmDataLayerPush:()=>H,gtmInit:()=>P,multipleToolsSimultaneous:()=>Z,pageView:()=>D,purchase:()=>q});var R=require("@walkeros/core"),T=17e11,x=new Date(T),j={title:"GA4 init",description:"The destination bootstraps gtag and configures a GA4 property via its measurementId.",in:{settings:{ga4:{measurementId:"G-XXXXXX-1"}}},out:[["gtag","js",x],["gtag","config","G-XXXXXX-1",{}]]},O={title:"Google Ads init",description:"The destination bootstraps gtag and configures a Google Ads account via its conversionId.",in:{settings:{ads:{conversionId:"AW-123456789",currency:"EUR"}}},out:[["gtag","js",x],["gtag","config","AW-123456789"]]},P={title:"GTM init",description:"The destination initializes the dataLayer and pushes the gtm.js start event for a GTM container.",in:{settings:{gtm:{containerId:"GTM-XXXXXXX"}}},out:[["dataLayer.push",{"gtm.start":T,event:"gtm.js"}]]},q={title:"Purchase",description:"An order complete event is mapped to the GA4 purchase event with transaction details and nested product items.",in:(0,R.getEvent)("order complete",{timestamp:1700000100}),mapping:{name:"purchase",include:["data","context"],data:{map:{transaction_id:"data.id",value:"data.total",tax:"data.taxes",shipping:"data.shipping",currency:{key:"data.currency",value:"EUR"},items:{loop:["nested",{condition:e=>(0,R.isObject)(e)&&"product"===e.entity,map:{item_id:"data.id",item_name:"data.name",quantity:{key:"data.quantity",value:1}}}]}}}},out:[["gtag","event","purchase",{transaction_id:"0rd3r1d",value:555,tax:73.76,shipping:5.22,currency:"EUR",items:[{item_id:"ers",item_name:"Everyday Ruck Snack",quantity:1},{item_id:"cc",item_name:"Cool Cap",quantity:1}],data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555,context_shopping:"complete",send_to:"G-XXXXXX-1"}]]},L={title:"Add to cart",description:"A product add event is mapped to the GA4 add_to_cart event with item details and value.",in:(0,R.getEvent)("product add",{timestamp:1700000101}),mapping:{name:"add_to_cart",include:["data"],data:{map:{currency:{value:"EUR",key:"data.currency"},value:"data.price",items:{loop:["this",{map:{item_id:"data.id",item_variant:"data.color",quantity:{value:1,key:"data.quantity"}}}]}}}},out:[["gtag","event","add_to_cart",{currency:"EUR",value:420,items:[{item_id:"ers",item_variant:"black",quantity:1}],data_id:"ers",data_name:"Everyday Ruck Snack",data_color:"black",data_size:"l",data_price:420,send_to:"G-XXXXXX-1"}]]},D={title:"Page view",description:"A page view event is forwarded as a GA4 page_view event with no additional mapping.",in:(0,R.getEvent)("page view",{timestamp:1700000102}),mapping:void 0,out:[["gtag","event","page_view",{send_to:"G-XXXXXX-1"}]]},V={title:"Ads conversion",description:"An order complete event is sent as a Google Ads conversion with a configured label and transaction value.",in:(0,R.getEvent)("order complete",{timestamp:1700000103}),mapping:{name:"PURCHASE_CONV",settings:{ads:{label:"PURCHASE_CONV"}},data:{map:{value:"data.total"}}},out:[["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_CONV",currency:"EUR",value:555}]]},W={title:"Enhanced conversions",description:"enhancedConversions maps event fields into a gtag set user_data call sent immediately before the conversion event.",in:(0,R.getEvent)("order complete",{timestamp:1700000109,data:{id:"0rd3r1d",currency:"EUR",shipping:5.22,taxes:73.76,total:555,customerEmail:"buyer@shop.com",customerPhone:"+1234567890"}}),mapping:{name:"PURCHASE_EC2",settings:{ads:{label:"PURCHASE_EC2"}},data:{map:{value:"data.total"}}},out:[["gtag","set","user_data",{email:"buyer@shop.com",phone_number:"+1234567890"}],["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_EC2",currency:"EUR",value:555}]]},H={title:"GTM dataLayer push",description:"A page view event is pushed to window.dataLayer for GTM with the mapped event name and parameters.",in:(0,R.getEvent)("page view",{timestamp:1700000104}),mapping:{name:"page_view",settings:{gtm:{}},data:{map:{page_title:"data.title",page_location:"data.domain"}}},out:[["dataLayer.push",{event:"page_view",page_title:"walkerOS documentation",page_location:"www.example.com"}]]},N={title:"Consent Mode v2",description:"A walker consent command with marketing and functional granted updates gtag Consent Mode v2 parameters.",command:"consent",in:{marketing:!0,functional:!0},out:[["gtag","consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied"}],["gtag","consent","update",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted",analytics_storage:"granted"}]]},$={title:"GA4 include all",description:"Include flattens every event section into prefixed GA4 params, exposing data, context, user, source, and event fields.",in:(0,R.getEvent)("page view",{id:"ev-1700000106",timestamp:1700000106,source:{type:"collector",schema:"4",count:1,trace:"1700000106abcdef1700000106abcdef"}}),mapping:{include:["data","context","globals","user","source","event"]},out:[["gtag","event","page_view",{data_domain:"www.example.com",data_title:"walkerOS documentation",data_referrer:"https://www.walkeros.io/",data_search:"?foo=bar",data_hash:"#hash",data_id:"/docs/",context_dev:"test",globals_pagegroup:"docs",user_id:"us3r",user_device:"c00k13",user_session:"s3ss10n",source_type:"collector",source_schema:"4",source_count:1,source_trace:"1700000106abcdef1700000106abcdef",source_release_default:"4.3.2",event_entity:"page",event_action:"view",event_trigger:"load",event_id:"ev-1700000106",event_name:"page view",event_timestamp:1700000106,event_timing:3.14,send_to:"G-XXXXXX-1"}]]},Z={title:"Multi-tool push",description:"A single order event fans out to GA4, Google Ads, and GTM from one mapping rule with per-tool settings.",in:(0,R.getEvent)("order complete",{timestamp:1700000107}),mapping:{name:"purchase",include:["data"],settings:{ga4:{},ads:{label:"PURCHASE_CONV"},gtm:{}},data:{map:{value:"data.total",currency:{key:"data.currency",value:"EUR"}}}},out:[["gtag","event","purchase",{value:555,currency:"EUR",data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555,send_to:"G-XXXXXX-1"}],["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_CONV",currency:"EUR",value:555,data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555}],["dataLayer.push",{event:"purchase",value:555,currency:"EUR",data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555}]]};//# sourceMappingURL=dev.js.map
package/dist/dev.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,a=(a,t)=>{for(var n in t)e(a,n,{get:t[n],enumerable:!0})},t={};a(t,{AdsSettingsSchema:()=>c,ConsentModeSchema:()=>r,GA4SettingsSchema:()=>s,GTMSettingsSchema:()=>l,MappingSchema:()=>_,SettingsSchema:()=>p,UserDataMappingSchema:()=>d,ads:()=>h,ga4:()=>y,gtm:()=>f,mapping:()=>b,settings:()=>X});import{zodToSchema as n}from"@walkeros/core/dev";import{z as i}from"@walkeros/core/dev";import{z as o}from"@walkeros/core/dev";var r=o.union([o.boolean(),o.record(o.string(),o.union([o.string(),o.array(o.string())]))]),s=o.object({measurementId:o.string().regex(/^G-[A-Z0-9]+$/,"Must be a valid GA4 Measurement ID (G-XXXXXXXXXX)").describe("GA4 Measurement ID from Google Analytics (like G-XXXXXXXXXX)"),debug:o.boolean().describe("Enable debug mode for GA4 (like true)").optional(),pageview:o.boolean().describe("Enable automatic pageview tracking (like true)").optional(),server_container_url:o.string().url().describe("Server-side GTM container URL (like https://server-container.com)").optional(),snakeCase:o.boolean().describe("Convert parameter names to snake_case (like true)").optional(),transport_url:o.string().url().describe("Custom transport URL for GA4 (like https://analytics.example.com/mp/collect)").optional(),data:o.any().describe("Custom data mapping configuration").optional()}),d=o.object({email:o.any().describe("Mapping value for user email (like user.email)").optional(),phone_number:o.any().describe("Mapping value for user phone number (like user.phone)").optional(),address:o.object({first_name:o.any().describe("Mapping value for first name (like data.firstName)").optional(),last_name:o.any().describe("Mapping value for last name (like data.lastName)").optional(),street:o.any().describe("Mapping value for street address").optional(),city:o.any().describe("Mapping value for city (like user.city)").optional(),region:o.any().describe("Mapping value for region/state (like user.region)").optional(),postal_code:o.any().describe("Mapping value for postal/zip code (like user.zip)").optional(),country:o.any().describe("Mapping value for country (like user.country)").optional()}).describe("Address mapping for enhanced conversions").optional()}),c=o.object({conversionId:o.string().regex(/^AW-[0-9]+$/,"Must be a valid Ads Conversion ID (AW-XXXXXXXXXX)").describe("Google Ads Conversion ID (required)"),currency:o.string().length(3).describe("Currency code (ISO 4217, e.g., USD, EUR)").optional(),data:o.any().describe("Custom data mapping (WalkerOS.Mapping.Value | Values)").optional(),enhancedConversions:d.describe("Enhanced conversions: maps event fields to Google user_data for improved measurement accuracy").optional()}),l=o.object({containerId:o.string().regex(/^GTM-[A-Z0-9]+$/,"Must be a valid GTM Container ID (GTM-XXXXXXX)").describe("GTM Container ID (required)"),dataLayer:o.string().describe("Custom dataLayer variable name (default: dataLayer)").optional(),domain:o.string().describe("Custom GTM domain for script loading").optional(),data:o.any().describe("Custom data mapping (WalkerOS.Mapping.Value | Values)").optional()}),p=i.object({como:r.describe("Consent mode configuration: false (disabled), true (use defaults), or custom mapping").optional(),como_advanced:i.union([i.boolean(),i.number()]).describe("Advanced consent mode (non-EU): emit denied default at page load with wait_for_update (true=500ms, or a number of ms)").optional(),ga4:s.describe("GA4-specific configuration settings (like { measurementId: G-XXXXXXXXXX })").optional(),ads:c.describe("Google Ads specific configuration settings (like { conversionId: AW-XXXXXXXXX })").optional(),gtm:l.describe("Google Tag Manager specific configuration settings (like { containerId: GTM-XXXXXXX })").optional()}).refine(e=>{var a,t,n;return(null==(a=e.ga4)?void 0:a.measurementId)||(null==(t=e.ads)?void 0:t.conversionId)||(null==(n=e.gtm)?void 0:n.containerId)},{message:"At least one Google tool must be configured (ga4.measurementId, ads.conversionId, or gtm.containerId)"});import{z as u}from"@walkeros/core/dev";var m=u.object({}),g=u.object({label:u.string().describe("Conversion label for this specific event").optional()}),v=u.object({}),_=u.object({ga4:m.describe("GA4-specific event mapping").optional(),ads:g.describe("Google Ads-specific event mapping").optional(),gtm:v.describe("GTM-specific event mapping").optional()}),X=n(p),b=n(_),y=n(s),h=n(c),f=n(l),A={};a(A,{env:()=>w,step:()=>E});var w={};a(w,{init:()=>G,push:()=>k,simulation:()=>C});var G={window:{dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},k={window:{gtag:Object.assign(()=>{},{}),dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},C=["call:window.gtag"],E={};a(E,{addToCart:()=>L,adsEnhancedConversions:()=>V,adsInit:()=>x,consentModeV2:()=>D,ga4Init:()=>S,ga4WithIncludeAll:()=>q,googleAdsConversion:()=>O,gtmDataLayerPush:()=>W,gtmInit:()=>T,multipleToolsSimultaneous:()=>z,pageView:()=>P,purchase:()=>j});import{getEvent as M,isObject as U}from"@walkeros/core";var I=17e11,R=new Date(I),S={title:"GA4 init",description:"The destination bootstraps gtag and configures a GA4 property via its measurementId.",in:{settings:{ga4:{measurementId:"G-XXXXXX-1"}}},out:[["gtag","js",R],["gtag","config","G-XXXXXX-1",{}]]},x={title:"Google Ads init",description:"The destination bootstraps gtag and configures a Google Ads account via its conversionId.",in:{settings:{ads:{conversionId:"AW-123456789",currency:"EUR"}}},out:[["gtag","js",R],["gtag","config","AW-123456789"]]},T={title:"GTM init",description:"The destination initializes the dataLayer and pushes the gtm.js start event for a GTM container.",in:{settings:{gtm:{containerId:"GTM-XXXXXXX"}}},out:[["dataLayer.push",{"gtm.start":I,event:"gtm.js"}]]},j={title:"Purchase",description:"An order complete event is mapped to the GA4 purchase event with transaction details and nested product items.",in:M("order complete",{timestamp:1700000100}),mapping:{name:"purchase",include:["data","context"],data:{map:{transaction_id:"data.id",value:"data.total",tax:"data.taxes",shipping:"data.shipping",currency:{key:"data.currency",value:"EUR"},items:{loop:["nested",{condition:e=>U(e)&&"product"===e.entity,map:{item_id:"data.id",item_name:"data.name",quantity:{key:"data.quantity",value:1}}}]}}}},out:[["gtag","event","purchase",{transaction_id:"0rd3r1d",value:555,tax:73.76,shipping:5.22,currency:"EUR",items:[{item_id:"ers",item_name:"Everyday Ruck Snack",quantity:1},{item_id:"cc",item_name:"Cool Cap",quantity:1}],data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555,context_shopping:"complete",send_to:"G-XXXXXX-1"}]]},L={title:"Add to cart",description:"A product add event is mapped to the GA4 add_to_cart event with item details and value.",in:M("product add",{timestamp:1700000101}),mapping:{name:"add_to_cart",include:["data"],data:{map:{currency:{value:"EUR",key:"data.currency"},value:"data.price",items:{loop:["this",{map:{item_id:"data.id",item_variant:"data.color",quantity:{value:1,key:"data.quantity"}}}]}}}},out:[["gtag","event","add_to_cart",{currency:"EUR",value:420,items:[{item_id:"ers",item_variant:"black",quantity:1}],data_id:"ers",data_name:"Everyday Ruck Snack",data_color:"black",data_size:"l",data_price:420,send_to:"G-XXXXXX-1"}]]},P={title:"Page view",description:"A page view event is forwarded as a GA4 page_view event with no additional mapping.",in:M("page view",{timestamp:1700000102}),mapping:void 0,out:[["gtag","event","page_view",{send_to:"G-XXXXXX-1"}]]},O={title:"Ads conversion",description:"An order complete event is sent as a Google Ads conversion with a configured label and transaction value.",in:M("order complete",{timestamp:1700000103}),mapping:{name:"PURCHASE_CONV",settings:{ads:{label:"PURCHASE_CONV"}},data:{map:{value:"data.total"}}},out:[["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_CONV",currency:"EUR",value:555}]]},V={title:"Enhanced conversions",description:"enhancedConversions maps event fields into a gtag set user_data call sent immediately before the conversion event.",in:M("order complete",{timestamp:1700000109,data:{id:"0rd3r1d",currency:"EUR",shipping:5.22,taxes:73.76,total:555,customerEmail:"buyer@shop.com",customerPhone:"+1234567890"}}),mapping:{name:"PURCHASE_EC2",settings:{ads:{label:"PURCHASE_EC2"}},data:{map:{value:"data.total"}}},out:[["gtag","set","user_data",{email:"buyer@shop.com",phone_number:"+1234567890"}],["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_EC2",currency:"EUR",value:555}]]},W={title:"GTM dataLayer push",description:"A page view event is pushed to window.dataLayer for GTM with the mapped event name and parameters.",in:M("page view",{timestamp:1700000104}),mapping:{name:"page_view",settings:{gtm:{}},data:{map:{page_title:"data.title",page_location:"data.domain"}}},out:[["dataLayer.push",{event:"page_view",page_title:"walkerOS documentation",page_location:"www.example.com"}]]},D={title:"Consent Mode v2",description:"A walker consent command with marketing and functional granted updates gtag Consent Mode v2 parameters.",command:"consent",in:{marketing:!0,functional:!0},out:[["gtag","consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied"}],["gtag","consent","update",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted",analytics_storage:"granted"}]]},q={title:"GA4 include all",description:"Include flattens every event section into prefixed GA4 params, exposing data, context, user, source, and event fields.",in:M("page view",{id:"ev-1700000106",timestamp:1700000106,source:{type:"collector",schema:"4",count:1,trace:"1700000106abcdef1700000106abcdef"}}),mapping:{include:["data","context","globals","user","source","event"]},out:[["gtag","event","page_view",{data_domain:"www.example.com",data_title:"walkerOS documentation",data_referrer:"https://www.walkeros.io/",data_search:"?foo=bar",data_hash:"#hash",data_id:"/docs/",context_dev:"test",globals_pagegroup:"docs",user_id:"us3r",user_device:"c00k13",user_session:"s3ss10n",source_type:"collector",source_schema:"4",source_count:1,source_trace:"1700000106abcdef1700000106abcdef",source_release_default:"4.3.1",event_entity:"page",event_action:"view",event_trigger:"load",event_id:"ev-1700000106",event_name:"page view",event_timestamp:1700000106,event_timing:3.14,send_to:"G-XXXXXX-1"}]]},z={title:"Multi-tool push",description:"A single order event fans out to GA4, Google Ads, and GTM from one mapping rule with per-tool settings.",in:M("order complete",{timestamp:1700000107}),mapping:{name:"purchase",include:["data"],settings:{ga4:{},ads:{label:"PURCHASE_CONV"},gtm:{}},data:{map:{value:"data.total",currency:{key:"data.currency",value:"EUR"}}}},out:[["gtag","event","purchase",{value:555,currency:"EUR",data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555,send_to:"G-XXXXXX-1"}],["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_CONV",currency:"EUR",value:555,data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555}],["dataLayer.push",{event:"purchase",value:555,currency:"EUR",data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555}]]};export{A as examples,t as schemas};//# sourceMappingURL=dev.mjs.map
1
+ var e=Object.defineProperty,a=(a,t)=>{for(var n in t)e(a,n,{get:t[n],enumerable:!0})},t={};a(t,{AdsSettingsSchema:()=>c,ConsentModeSchema:()=>r,GA4SettingsSchema:()=>s,GTMSettingsSchema:()=>l,MappingSchema:()=>_,SettingsSchema:()=>p,UserDataMappingSchema:()=>d,ads:()=>h,ga4:()=>y,gtm:()=>f,mapping:()=>b,settings:()=>X});import{zodToSchema as n}from"@walkeros/core/dev";import{z as i}from"@walkeros/core/dev";import{z as o}from"@walkeros/core/dev";var r=o.union([o.boolean(),o.record(o.string(),o.union([o.string(),o.array(o.string())]))]),s=o.object({measurementId:o.string().regex(/^G-[A-Z0-9]+$/,"Must be a valid GA4 Measurement ID (G-XXXXXXXXXX)").describe("GA4 Measurement ID from Google Analytics (like G-XXXXXXXXXX)"),debug:o.boolean().describe("Enable debug mode for GA4 (like true)").optional(),pageview:o.boolean().describe("Enable automatic pageview tracking (like true)").optional(),server_container_url:o.string().url().describe("Server-side GTM container URL (like https://server-container.com)").optional(),snakeCase:o.boolean().describe("Convert parameter names to snake_case (like true)").optional(),transport_url:o.string().url().describe("Custom transport URL for GA4 (like https://analytics.example.com/mp/collect)").optional(),data:o.any().describe("Custom data mapping configuration").optional()}),d=o.object({email:o.any().describe("Mapping value for user email (like user.email)").optional(),phone_number:o.any().describe("Mapping value for user phone number (like user.phone)").optional(),address:o.object({first_name:o.any().describe("Mapping value for first name (like data.firstName)").optional(),last_name:o.any().describe("Mapping value for last name (like data.lastName)").optional(),street:o.any().describe("Mapping value for street address").optional(),city:o.any().describe("Mapping value for city (like user.city)").optional(),region:o.any().describe("Mapping value for region/state (like user.region)").optional(),postal_code:o.any().describe("Mapping value for postal/zip code (like user.zip)").optional(),country:o.any().describe("Mapping value for country (like user.country)").optional()}).describe("Address mapping for enhanced conversions").optional()}),c=o.object({conversionId:o.string().regex(/^AW-[0-9]+$/,"Must be a valid Ads Conversion ID (AW-XXXXXXXXXX)").describe("Google Ads Conversion ID (required)"),currency:o.string().length(3).describe("Currency code (ISO 4217, e.g., USD, EUR)").optional(),data:o.any().describe("Custom data mapping (WalkerOS.Mapping.Value | Values)").optional(),enhancedConversions:d.describe("Enhanced conversions: maps event fields to Google user_data for improved measurement accuracy").optional()}),l=o.object({containerId:o.string().regex(/^GTM-[A-Z0-9]+$/,"Must be a valid GTM Container ID (GTM-XXXXXXX)").describe("GTM Container ID (required)"),dataLayer:o.string().describe("Custom dataLayer variable name (default: dataLayer)").optional(),domain:o.string().describe("Custom GTM domain for script loading").optional(),data:o.any().describe("Custom data mapping (WalkerOS.Mapping.Value | Values)").optional()}),p=i.object({como:r.describe("Consent mode configuration: false (disabled), true (use defaults), or custom mapping").optional(),como_advanced:i.union([i.boolean(),i.number()]).describe("Advanced consent mode (non-EU): emit denied default at page load with wait_for_update (true=500ms, or a number of ms)").optional(),ga4:s.describe("GA4-specific configuration settings (like { measurementId: G-XXXXXXXXXX })").optional(),ads:c.describe("Google Ads specific configuration settings (like { conversionId: AW-XXXXXXXXX })").optional(),gtm:l.describe("Google Tag Manager specific configuration settings (like { containerId: GTM-XXXXXXX })").optional()}).refine(e=>{var a,t,n;return(null==(a=e.ga4)?void 0:a.measurementId)||(null==(t=e.ads)?void 0:t.conversionId)||(null==(n=e.gtm)?void 0:n.containerId)},{message:"At least one Google tool must be configured (ga4.measurementId, ads.conversionId, or gtm.containerId)"});import{z as u}from"@walkeros/core/dev";var m=u.object({}),g=u.object({label:u.string().describe("Conversion label for this specific event").optional()}),v=u.object({}),_=u.object({ga4:m.describe("GA4-specific event mapping").optional(),ads:g.describe("Google Ads-specific event mapping").optional(),gtm:v.describe("GTM-specific event mapping").optional()}),X=n(p),b=n(_),y=n(s),h=n(c),f=n(l),A={};a(A,{env:()=>w,step:()=>E});var w={};a(w,{init:()=>G,push:()=>k,simulation:()=>C});var G={window:{dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},k={window:{gtag:Object.assign(()=>{},{}),dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},C=["call:window.gtag"],E={};a(E,{addToCart:()=>L,adsEnhancedConversions:()=>V,adsInit:()=>x,consentModeV2:()=>D,ga4Init:()=>S,ga4WithIncludeAll:()=>q,googleAdsConversion:()=>O,gtmDataLayerPush:()=>W,gtmInit:()=>T,multipleToolsSimultaneous:()=>z,pageView:()=>P,purchase:()=>j});import{getEvent as M,isObject as U}from"@walkeros/core";var I=17e11,R=new Date(I),S={title:"GA4 init",description:"The destination bootstraps gtag and configures a GA4 property via its measurementId.",in:{settings:{ga4:{measurementId:"G-XXXXXX-1"}}},out:[["gtag","js",R],["gtag","config","G-XXXXXX-1",{}]]},x={title:"Google Ads init",description:"The destination bootstraps gtag and configures a Google Ads account via its conversionId.",in:{settings:{ads:{conversionId:"AW-123456789",currency:"EUR"}}},out:[["gtag","js",R],["gtag","config","AW-123456789"]]},T={title:"GTM init",description:"The destination initializes the dataLayer and pushes the gtm.js start event for a GTM container.",in:{settings:{gtm:{containerId:"GTM-XXXXXXX"}}},out:[["dataLayer.push",{"gtm.start":I,event:"gtm.js"}]]},j={title:"Purchase",description:"An order complete event is mapped to the GA4 purchase event with transaction details and nested product items.",in:M("order complete",{timestamp:1700000100}),mapping:{name:"purchase",include:["data","context"],data:{map:{transaction_id:"data.id",value:"data.total",tax:"data.taxes",shipping:"data.shipping",currency:{key:"data.currency",value:"EUR"},items:{loop:["nested",{condition:e=>U(e)&&"product"===e.entity,map:{item_id:"data.id",item_name:"data.name",quantity:{key:"data.quantity",value:1}}}]}}}},out:[["gtag","event","purchase",{transaction_id:"0rd3r1d",value:555,tax:73.76,shipping:5.22,currency:"EUR",items:[{item_id:"ers",item_name:"Everyday Ruck Snack",quantity:1},{item_id:"cc",item_name:"Cool Cap",quantity:1}],data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555,context_shopping:"complete",send_to:"G-XXXXXX-1"}]]},L={title:"Add to cart",description:"A product add event is mapped to the GA4 add_to_cart event with item details and value.",in:M("product add",{timestamp:1700000101}),mapping:{name:"add_to_cart",include:["data"],data:{map:{currency:{value:"EUR",key:"data.currency"},value:"data.price",items:{loop:["this",{map:{item_id:"data.id",item_variant:"data.color",quantity:{value:1,key:"data.quantity"}}}]}}}},out:[["gtag","event","add_to_cart",{currency:"EUR",value:420,items:[{item_id:"ers",item_variant:"black",quantity:1}],data_id:"ers",data_name:"Everyday Ruck Snack",data_color:"black",data_size:"l",data_price:420,send_to:"G-XXXXXX-1"}]]},P={title:"Page view",description:"A page view event is forwarded as a GA4 page_view event with no additional mapping.",in:M("page view",{timestamp:1700000102}),mapping:void 0,out:[["gtag","event","page_view",{send_to:"G-XXXXXX-1"}]]},O={title:"Ads conversion",description:"An order complete event is sent as a Google Ads conversion with a configured label and transaction value.",in:M("order complete",{timestamp:1700000103}),mapping:{name:"PURCHASE_CONV",settings:{ads:{label:"PURCHASE_CONV"}},data:{map:{value:"data.total"}}},out:[["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_CONV",currency:"EUR",value:555}]]},V={title:"Enhanced conversions",description:"enhancedConversions maps event fields into a gtag set user_data call sent immediately before the conversion event.",in:M("order complete",{timestamp:1700000109,data:{id:"0rd3r1d",currency:"EUR",shipping:5.22,taxes:73.76,total:555,customerEmail:"buyer@shop.com",customerPhone:"+1234567890"}}),mapping:{name:"PURCHASE_EC2",settings:{ads:{label:"PURCHASE_EC2"}},data:{map:{value:"data.total"}}},out:[["gtag","set","user_data",{email:"buyer@shop.com",phone_number:"+1234567890"}],["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_EC2",currency:"EUR",value:555}]]},W={title:"GTM dataLayer push",description:"A page view event is pushed to window.dataLayer for GTM with the mapped event name and parameters.",in:M("page view",{timestamp:1700000104}),mapping:{name:"page_view",settings:{gtm:{}},data:{map:{page_title:"data.title",page_location:"data.domain"}}},out:[["dataLayer.push",{event:"page_view",page_title:"walkerOS documentation",page_location:"www.example.com"}]]},D={title:"Consent Mode v2",description:"A walker consent command with marketing and functional granted updates gtag Consent Mode v2 parameters.",command:"consent",in:{marketing:!0,functional:!0},out:[["gtag","consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied"}],["gtag","consent","update",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted",analytics_storage:"granted"}]]},q={title:"GA4 include all",description:"Include flattens every event section into prefixed GA4 params, exposing data, context, user, source, and event fields.",in:M("page view",{id:"ev-1700000106",timestamp:1700000106,source:{type:"collector",schema:"4",count:1,trace:"1700000106abcdef1700000106abcdef"}}),mapping:{include:["data","context","globals","user","source","event"]},out:[["gtag","event","page_view",{data_domain:"www.example.com",data_title:"walkerOS documentation",data_referrer:"https://www.walkeros.io/",data_search:"?foo=bar",data_hash:"#hash",data_id:"/docs/",context_dev:"test",globals_pagegroup:"docs",user_id:"us3r",user_device:"c00k13",user_session:"s3ss10n",source_type:"collector",source_schema:"4",source_count:1,source_trace:"1700000106abcdef1700000106abcdef",source_release_default:"4.3.2",event_entity:"page",event_action:"view",event_trigger:"load",event_id:"ev-1700000106",event_name:"page view",event_timestamp:1700000106,event_timing:3.14,send_to:"G-XXXXXX-1"}]]},z={title:"Multi-tool push",description:"A single order event fans out to GA4, Google Ads, and GTM from one mapping rule with per-tool settings.",in:M("order complete",{timestamp:1700000107}),mapping:{name:"purchase",include:["data"],settings:{ga4:{},ads:{label:"PURCHASE_CONV"},gtm:{}},data:{map:{value:"data.total",currency:{key:"data.currency",value:"EUR"}}}},out:[["gtag","event","purchase",{value:555,currency:"EUR",data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555,send_to:"G-XXXXXX-1"}],["gtag","event","conversion",{send_to:"AW-123456789/PURCHASE_CONV",currency:"EUR",value:555,data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555}],["dataLayer.push",{event:"purchase",value:555,currency:"EUR",data_id:"0rd3r1d",data_currency:"EUR",data_shipping:5.22,data_taxes:73.76,data_total:555}]]};export{A as examples,t as schemas};//# sourceMappingURL=dev.mjs.map
@@ -1 +1 @@
1
- "use strict";var Destination=(()=>{var t=Object.defineProperty,e=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,r={};((e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})})(r,{DestinationGtag:()=>F,default:()=>H,destinationGtag:()=>z,resetConsentState:()=>q});var i=new Set;function a(t,e="https://www.googletagmanager.com/gtag/js?id=",n=globalThis.document){if(i.has(t))return;const o=n.createElement("script");o.src=e+t,n.head.appendChild(o),i.add(t)}function c(t){const e=t;return e.dataLayer=e.dataLayer||[],e.gtag||(e.gtag=function(){e.dataLayer.push(arguments)}),e.gtag}var s=Object.defineProperty,u=(t,e)=>{for(var n in e)s(t,n,{get:e[n],enumerable:!0})};function l(t,e){if("collector"===t)return"collector";if(!e)throw new Error(`stepId(${t}) requires an id`);return`${t}.${e}`}u({},{stepId:()=>l});function f(t,e){const n=t.destinations[e];if(!n)throw new Error(`Destination not found: ${e}`);return n}u({},{getDestination:()=>f});u({},{Level:()=>g});var d,g=((d=g||{})[d.ERROR=0]="ERROR",d[d.WARN=1]="WARN",d[d.INFO=2]="INFO",d[d.DEBUG=3]="DEBUG",d);function w(t,e){const n=t.transformers[e];if(!n)throw new Error(`Transformer not found: ${e}`);return n}u({},{getTransformer:()=>w});function m(t,e){const n=t.sources[e];if(!n)throw new Error(`Source not found: ${e}`);return n}u({},{getSource:()=>m});function p(t,e){const n=t.stores[e];if(!n)throw new Error(`Store not found: ${e}`);return n}async function v(t,e){return await t.get(e)}u({},{getStore:()=>p,getStoreValue:()=>v});var y={merge:!0,shallow:!0,extend:!0};function h(t,e={},n={}){n={...y,...n};const o=Object.entries(e).reduce((e,[o,r])=>{const i=t[o];return n.merge&&Array.isArray(i)&&Array.isArray(r)?e[o]=r.reduce((t,e)=>t.includes(e)?t:[...t,e],[...i]):(n.extend||o in t)&&(e[o]=r),e},{});return n.shallow?{...t,...o}:(Object.assign(t,o),t)}function b(t){return Array.isArray(t)}function j(t){return void 0!==t}function O(t){return"object"==typeof t&&null!==t&&!b(t)&&"[object Object]"===Object.prototype.toString.call(t)}function _(t){return"string"==typeof t}function I(t,e="",n){const o=e.split(".");let r=t;for(let t=0;t<o.length;t++){const e=o[t];if("*"===e&&b(r)){const e=o.slice(t+1).join("."),i=[];for(const t of r){const o=I(t,e,n);i.push(o)}return i}if(r=O(r)||b(r)?r[e]:void 0,void 0===r)break}return j(r)?r:n}function E(t){return function(t){return"boolean"==typeof t}(t)||_(t)||function(t){return"number"==typeof t&&!Number.isNaN(t)}(t)||!j(t)||b(t)&&t.every(E)||O(t)&&Object.values(t).every(E)}function A(t){return E(t)?t:void 0}function R(t,e,n){return async function(...o){try{return await t(...o)}catch(t){if(!e)return;return await e(t)}finally{await(null==n?void 0:n())}}}var C=class t extends Error{constructor(e,n){super(e,n),this.name="FatalError",Object.setPrototypeOf(this,t.prototype)}};async function $(t,e={},n={}){var o,r;if(!j(t))return;const i=O(t)&&t.consent||n.consent||(null==(o=n.collector)?void 0:o.consent),a=null!=(r=n.event)?r:O(t)?t:{};if(!n.collector)throw new Error("getMappingValue: context.collector is required");const c={event:a,mapping:e,collector:n.collector,logger:n.collector.logger,consent:i},s=b(e)?e:[e];for(const e of s){const o=await R(k,t=>{if(t instanceof C)throw t;n.collector&&n.collector.status.failed++,c.logger.error("mapping processing failed",{event:a,error:t})})(t,e,{...c,mapping:e});if(j(o))return o}}async function k(t,e,n){return(b(e)?e:[e]).reduce(async(e,o)=>{const r=await e;if(r)return r;const i=_(o)?{key:o}:o;if(!Object.keys(i).length)return;const{condition:a,consent:c,fn:s,key:u,loop:l,map:f,set:d,validate:g,value:w}=i,m={...n,mapping:o};if(a&&!await R(a,t=>{if(t instanceof C)throw t;return m.logger.error("mapping condition failed",{event:m.event,error:t}),!1})(t,m))return;if(c&&!function(t,e={},n={}){const o={...e,...n},r={};let i=!t||0===Object.keys(t).length;return Object.keys(o).forEach(e=>{o[e]&&(r[e]=!0,t&&t[e]&&(i=!0))}),!!i&&r}(c,m.consent))return w;let p=j(w)?w:t;if(s&&(p=await R(s,t=>{if(t instanceof C)throw t;m.logger.error("mapping fn failed",{event:m.event,error:t})})(t,m)),u&&(p=I(t,u,w)),l){const[e,n]=l,o="this"===e?[t]:await $(t,e,m);b(o)&&(p=(await Promise.all(o.map(t=>$(t,n,m)))).filter(j))}else f?p=await Object.entries(f).reduce(async(e,[n,o])=>{const r=await e,i=await $(t,o,m);return j(i)&&(r[n]=i),r},Promise.resolve({})):d&&(p=await Promise.all(d.map(e=>k(t,e,m))));g&&!await R(g,t=>{if(t instanceof C)throw t;return m.logger.error("mapping validate failed",{event:m.event,error:t}),!1})(p,m)&&(p=void 0);const v=A(p);return j(v)?v:A(w)},Promise.resolve(void 0))}var P="observe";function S(t){const e=(t.startsWith("call:")?t.slice(5):t).split(".");return e.some(t=>""===t)?[]:e}function D(t,e,n,o){const r=new Map;return new Proxy(t,{get(t,i){if("string"!=typeof i)return Reflect.get(t,i,t);const a=r.get(i);if(void 0!==a)return a;if(e.some(t=>1===t.length&&t[0]===i)){const e=Reflect.get(t,i,t);if("function"!=typeof e)return e;const a=`${o}.${i}`,c=(...o)=>{try{n(a,o)}catch(t){}return e.apply(t,o)};return r.set(i,c),c}const c=e.filter(t=>t.length>1&&t[0]===i).map(t=>t.slice(1));if(c.length>0){const e=Reflect.get(t,i,t);if(null===e||"object"!=typeof e)return e;const a=D(e,c,n,`${o}.${i}`);return r.set(i,a),a}return Reflect.get(t,i,t)}})}function L(t){var e;const n={window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document,...t},o=t&&t[P];if(function(t){if("object"!=typeof t||null===t)return!1;if(!("paths"in t)||!("record"in t))return!1;const{paths:e,record:n}=t;return Array.isArray(e)&&e.every(t=>"string"==typeof t)&&"function"==typeof n}(o)){delete n[P];const t=new Map;for(const n of o.paths){const o=S(n),r=o[0];if(void 0===r)continue;const i=null!=(e=t.get(r))?e:[];i.push(o.slice(1)),t.set(r,i)}for(const[e,r]of t){const t=n[e];null!==t&&"object"==typeof t&&(n[e]=D(t,r,o.record,e))}}return n}async function N(t,e,n,o,r){const i=O(e)?e:{},a=n.data?await $(t,n.data,{collector:r}):{},c=(null==o?void 0:o.data)?await $(t,o.data,{collector:r}):{},s=O(a)?a:{},u=O(c)?c:{};return h(h(i,s),u)}var T="dataLayer";function x(t,e,n,o){const{window:r,document:i}=L(n),{containerId:a,dataLayer:c,domain:s}=t,u=c||T,l=r[u],f=b(l)?l:[];r[u]=f,f.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),e&&a&&function(t,e,n,o=globalThis.document){const r=n!=T?"&l="+n:"",i=o.createElement("script");i.src=e+t+r,o.head.appendChild(i)}(a,s||"https://www.googletagmanager.com/gtm.js?id=",u,i)}var G={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]};function M(t){const{como:e=!0}=t;if(!1!==e)return!0===e?G:e}function U(t){const e=M(t);if(!e)return;const n=function(t){const e=new Set;return Object.values(t).forEach(t=>{(Array.isArray(t)?t:[t]).forEach(t=>e.add(t))}),[...e]}(e);if(!n.length)return;const o={};n.forEach(t=>o[t]="denied");const{como_advanced:r}=t;return r&&(o.wait_for_update="number"==typeof r?r:500),o}var F={},W=!1;function q(){W=!1}function B(t,e){const n=t.settings||{};if(W)return;if(!function(t,e){return!!(t&&Object.keys(t).length>0)||!!e.como_advanced}(t.consent,n))return;const o=U(n);if(!o)return;const{window:r}=L(e),i=c(r);i&&(i("consent","default",o),W=!0)}var V,z={type:"google-gtag",calls:["call:window.gtag"],config:{settings:{}},init({config:t,env:e,logger:n}){const{settings:o={},loadScript:r}=t,{ga4:i,ads:s,gtm:u}=o;return(null==i?void 0:i.measurementId)||(null==s?void 0:s.conversionId)||(null==u?void 0:u.containerId)||n.throw("Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId"),B(t,e),(null==i?void 0:i.measurementId)&&function(t,e,n,o){const{window:r,document:i}=L(n),{measurementId:s,transport_url:u,server_container_url:l,pageview:f}=t;s||o.throw("Config settings ga4.measurementId missing"),e&&a(s,void 0,i),c(r);const d={};u&&(d.transport_url=u),l&&(d.server_container_url=l),!1===f&&(d.send_page_view=!1);const g=r.gtag;g("js",new Date),g("config",s,d)}(i,r,e,n),(null==s?void 0:s.conversionId)&&function(t,e,n,o){const{window:r,document:i}=L(n),{conversionId:s}=t;s||o.throw("Config settings ads.conversionId missing"),t.currency||(t.currency="EUR"),e&&a(s,void 0,i),c(r);const u=r.gtag;u("js",new Date),t.enhancedConversions?u("config",s,{allow_enhanced_conversions:!0}):u("config",s)}(s,r,e,n),(null==u?void 0:u.containerId)&&x(u,r,e),t},async push(t,{config:e,rule:n={},data:o,env:r,collector:i,logger:a}){const{settings:c={}}=e,{ga4:s,ads:u,gtm:l}=c,f=n.settings||{},d=await N(t,o,e,s,i),g=await N(t,o,e,u,i),w=await N(t,o,e,l,i);let m;(null==s?void 0:s.measurementId)&&function(t,e,n,o,r){const{window:i}=L(o);e.measurementId||r.throw("Config settings ga4.measurementId missing");const a=O(n)?{...n}:{};let c=t.name;!1!==e.snakeCase&&(c=function(t,e=!0){return e?t.replace(/\s+/g,"_").toLowerCase():t}(c)),a.send_to=e.measurementId,e.debug&&(a.debug_mode=!0),(0,i.gtag)("event",c,a)}(t,s,d,r,a),(null==u?void 0:u.conversionId)&&(null==u?void 0:u.enhancedConversions)&&(m=await async function(t,e,n){const o=e.enhancedConversions;if(!o)return;const r={};if(o.email){const e=await $(t,o.email,{collector:n});e&&(r.email=e)}if(o.phone_number){const e=await $(t,o.phone_number,{collector:n});e&&(r.phone_number=e)}if(o.address){const e={};for(const[r,i]of Object.entries(o.address))if(i){const o=await $(t,i,{collector:n});o&&(e[r]=o)}Object.keys(e).length>0&&(r.address=e)}return Object.keys(r).length>0?r:void 0}(t,u,i)),(null==u?void 0:u.conversionId)&&n.name&&function(t,e,n={},o,r,i,a,c){const{conversionId:s,currency:u}=e,l=O(o)?o:{},f=n.label||r;f||a.throw("Config mapping ads.label missing");const d={send_to:`${s}/${f}`,currency:u||"EUR",...l},{window:g}=L(i),w=g.gtag;c&&w("set","user_data",c),w("event","conversion",d)}(0,u,f.ads,g,n.name,r,a,m),(null==l?void 0:l.containerId)&&function(t,e,n={},o,r){const{window:i}=L(r),a={event:t.name},c=e.dataLayer||T,s=i[c],u=b(s)?s:[];i[c]=u,u.push({...a,...O(o)?o:t})}(t,l,f.gtm,w,r)},on(t,e){var n;if("consent"!==t||!O(e.data))return;const o=e.data,r=(null==(n=e.config)?void 0:n.settings)||{},i=M(r);if(!i)return;const{window:a}=L(e.env),c=a.gtag;if(!c)return;if(!W){const t=U(r);t&&c("consent","default",t),W=!0}const s={};Object.entries(o).forEach(([t,e])=>{const n=i[t];if(!n)return;const o=Array.isArray(n)?n:[n],r=e?"granted":"denied";o.forEach(t=>{s[t]=r})}),0!==Object.keys(s).length&&c("consent","update",s)}},H=z;return V=r,((r,i,a,c)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let s of n(i))o.call(r,s)||s===a||t(r,s,{get:()=>i[s],enumerable:!(c=e(i,s))||c.enumerable});return r})(t({},"__esModule",{value:!0}),V)})();
1
+ "use strict";var Destination=(()=>{var t=Object.defineProperty,e=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,r={};((e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})})(r,{DestinationGtag:()=>F,default:()=>H,destinationGtag:()=>z,resetConsentState:()=>q});var i=new Set;function a(t,e="https://www.googletagmanager.com/gtag/js?id=",n=globalThis.document){if(i.has(t))return;const o=n.createElement("script");o.src=e+t,n.head.appendChild(o),i.add(t)}function c(t){const e=t;return e.dataLayer=e.dataLayer||[],e.gtag||(e.gtag=function(){e.dataLayer.push(arguments)}),e.gtag}var s=Object.defineProperty,u=(t,e)=>{for(var n in e)s(t,n,{get:e[n],enumerable:!0})};function l(t,e){if("collector"===t)return"collector";if(!e)throw new Error(`stepId(${t}) requires an id`);return`${t}.${e}`}u({},{stepId:()=>l});function f(t,e){const n=t.destinations[e];if(!n)throw new Error(`Destination not found: ${e}`);return n}u({},{getDestination:()=>f});u({},{Level:()=>g});var d,g=((d=g||{})[d.ERROR=0]="ERROR",d[d.WARN=1]="WARN",d[d.INFO=2]="INFO",d[d.DEBUG=3]="DEBUG",d);function w(t,e){const n=t.transformers[e];if(!n)throw new Error(`Transformer not found: ${e}`);return n}u({},{getTransformer:()=>w});function m(t,e){const n=t.sources[e];if(!n)throw new Error(`Source not found: ${e}`);return n}u({},{getSource:()=>m});function p(t,e){const n=t.stores[e];if(!n)throw new Error(`Store not found: ${e}`);return n}async function v(t,e){return await t.get(e)}u({},{getStore:()=>p,getStoreValue:()=>v});var y={merge:!0,shallow:!0,extend:!0};function h(t,e={},n={}){n={...y,...n};const o=Object.entries(e).reduce((e,[o,r])=>{const i=t[o];return n.merge&&Array.isArray(i)&&Array.isArray(r)?e[o]=r.reduce((t,e)=>t.includes(e)?t:[...t,e],[...i]):(n.extend||o in t)&&(e[o]=r),e},{});return n.shallow?{...t,...o}:(Object.assign(t,o),t)}function b(t){return Array.isArray(t)}function j(t){return void 0!==t}function O(t){return"object"==typeof t&&null!==t&&!b(t)&&"[object Object]"===Object.prototype.toString.call(t)}function _(t){return"string"==typeof t}function I(t,e="",n){const o=e.split(".");let r=t;for(let t=0;t<o.length;t++){const e=o[t];if("*"===e&&b(r)){const e=o.slice(t+1).join("."),i=[];for(const t of r){const o=I(t,e,n);i.push(o)}return i}if(r=O(r)||b(r)?r[e]:void 0,void 0===r)break}return j(r)?r:n}function E(t){return function(t){return"boolean"==typeof t}(t)||_(t)||function(t){return"number"==typeof t&&!Number.isNaN(t)}(t)||!j(t)||b(t)&&t.every(E)||O(t)&&Object.values(t).every(E)}function $(t){return E(t)?t:void 0}function A(t,e,n){return async function(...o){try{return await t(...o)}catch(t){if(!e)return;return await e(t)}finally{await(null==n?void 0:n())}}}var R=class t extends Error{constructor(e,n){super(e,n),this.name="FatalError",Object.setPrototypeOf(this,t.prototype)}};async function C(t,e={},n={}){var o,r;if(!j(t))return;const i=O(t)&&t.consent||n.consent||(null==(o=n.collector)?void 0:o.consent),a=null!=(r=n.event)?r:O(t)?t:{};if(!n.collector)throw new Error("getMappingValue: context.collector is required");const c={event:a,mapping:e,collector:n.collector,logger:n.collector.logger,consent:i},s=b(e)?e:[e];for(const e of s){const o=await A(k,t=>{if(t instanceof R)throw t;n.collector&&n.collector.status.failed++,c.logger.error("mapping processing failed",{event:a,error:t})})(t,e,{...c,mapping:e});if(j(o))return o}}async function k(t,e,n){return(b(e)?e:[e]).reduce(async(e,o)=>{const r=await e;if(r)return r;const i=_(o)?{key:o}:o;if(!Object.keys(i).length)return;const{condition:a,consent:c,fn:s,key:u,loop:l,map:f,set:d,validate:g,value:w}=i,m={...n,mapping:o};if(a&&!await A(a,t=>{if(t instanceof R)throw t;return m.logger.error("mapping condition failed",{event:m.event,error:t}),!1})(t,m))return;if(c&&!function(t,e={},n={}){const o={...e,...n},r={};let i=!t||0===Object.keys(t).length;return Object.keys(o).forEach(e=>{o[e]&&(r[e]=!0,t&&t[e]&&(i=!0))}),!!i&&r}(c,m.consent))return w;let p=j(w)?w:t;if(s&&(p=await A(s,t=>{if(t instanceof R)throw t;m.logger.error("mapping fn failed",{event:m.event,error:t})})(t,m)),u&&(p=I(t,u,w)),l){const[e,n]=l,o="this"===e?[t]:await C(t,e,m);b(o)&&(p=(await Promise.all(o.map(t=>C(t,n,m)))).filter(j))}else f?p=await Object.entries(f).reduce(async(e,[n,o])=>{const r=await e,i=await C(t,o,m);return j(i)&&(r[n]=i),r},Promise.resolve({})):d&&(p=await Promise.all(d.map(e=>k(t,e,m))));g&&!await A(g,t=>{if(t instanceof R)throw t;return m.logger.error("mapping validate failed",{event:m.event,error:t}),!1})(p,m)&&(p=void 0);const v=$(p);return j(v)?v:$(w)},Promise.resolve(void 0))}var P="observe";function S(t){const e=(t.startsWith("call:")?t.slice(5):t).split(".");return e.some(t=>""===t)?[]:e}function D(t,e,n,o){const r=new Map;return new Proxy(t,{get(t,i){if("string"!=typeof i)return Reflect.get(t,i,t);const a=r.get(i);if(void 0!==a)return a;if(e.some(t=>1===t.length&&t[0]===i)){const e=Reflect.get(t,i,t);if("function"!=typeof e)return e;const a=`${o}.${i}`,c=(...o)=>{try{n(a,o)}catch(t){}return e.apply(t,o)};return r.set(i,c),c}const c=e.filter(t=>t.length>1&&t[0]===i).map(t=>t.slice(1));if(c.length>0){const e=Reflect.get(t,i,t);if(null===e||"object"!=typeof e)return e;const a=D(e,c,n,`${o}.${i}`);return r.set(i,a),a}return Reflect.get(t,i,t)}})}function L(t){var e;const n={window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document,...t},o=t&&t[P];if(function(t){if("object"!=typeof t||null===t)return!1;if(!("paths"in t)||!("record"in t))return!1;const{paths:e,record:n}=t;return Array.isArray(e)&&e.every(t=>"string"==typeof t)&&"function"==typeof n}(o)){delete n[P];const t=new Map;for(const n of o.paths){const o=S(n),r=o[0];if(void 0===r)continue;const i=null!=(e=t.get(r))?e:[];i.push(o.slice(1)),t.set(r,i)}for(const[e,r]of t){const t=n[e];null!==t&&"object"==typeof t&&(n[e]=D(t,r,o.record,e))}}return n}async function N(t,e,n,o,r){const i=O(e)?e:{},a=n.data?await C(t,n.data,{collector:r}):{},c=(null==o?void 0:o.data)?await C(t,o.data,{collector:r}):{},s=O(a)?a:{},u=O(c)?c:{};return h(h(i,s),u)}var T="dataLayer";function x(t,e,n,o){const{window:r,document:i}=L(n),{containerId:a,dataLayer:c,domain:s}=t,u=c||T,l=r[u],f=b(l)?l:[];r[u]=f,f.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),e&&a&&function(t,e,n,o=globalThis.document){const r=n!=T?"&l="+n:"",i=o.createElement("script");i.src=e+t+r,o.head.appendChild(i)}(a,s||"https://www.googletagmanager.com/gtm.js?id=",u,i)}var G={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]};function M(t){const{como:e=!0}=t;if(!1!==e)return!0===e?G:e}function U(t){const e=M(t);if(!e)return;const n=function(t){const e=new Set;return Object.values(t).forEach(t=>{(Array.isArray(t)?t:[t]).forEach(t=>e.add(t))}),[...e]}(e);if(!n.length)return;const o={};n.forEach(t=>o[t]="denied");const{como_advanced:r}=t;return r&&(o.wait_for_update="number"==typeof r?r:500),o}var F={},W=!1;function q(){W=!1}function B(t,e){const n=t.settings||{};if(W)return;if(!function(t,e){return!!(t&&Object.keys(t).length>0)||!!e.como_advanced}(t.consent,n))return;const o=U(n);if(!o)return;const{window:r}=L(e),i=c(r);i&&(i("consent","default",o),W=!0)}var V,z={type:"google-gtag",calls:["call:window.gtag"],config:{settings:{}},init({config:t,env:e,logger:n}){const{settings:o={},loadScript:r}=t,{ga4:i,ads:s,gtm:u}=o;return(null==i?void 0:i.measurementId)||(null==s?void 0:s.conversionId)||(null==u?void 0:u.containerId)||n.throw("Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId"),B(t,e),(null==i?void 0:i.measurementId)&&function(t,e,n,o){const{window:r,document:i}=L(n),{measurementId:s,transport_url:u,server_container_url:l,pageview:f}=t;s||o.throw("Config settings ga4.measurementId missing"),e&&a(s,l?`${l.replace(/\/$/,"")}/gtag/js?id=`:void 0,i);c(r);const d={};u&&(d.transport_url=u),l&&(d.server_container_url=l),!1===f&&(d.send_page_view=!1);const g=r.gtag;g("js",new Date),g("config",s,d)}(i,r,e,n),(null==s?void 0:s.conversionId)&&function(t,e,n,o){const{window:r,document:i}=L(n),{conversionId:s}=t;s||o.throw("Config settings ads.conversionId missing"),t.currency||(t.currency="EUR"),e&&a(s,void 0,i),c(r);const u=r.gtag;u("js",new Date),t.enhancedConversions?u("config",s,{allow_enhanced_conversions:!0}):u("config",s)}(s,r,e,n),(null==u?void 0:u.containerId)&&x(u,r,e),t},async push(t,{config:e,rule:n={},data:o,env:r,collector:i,logger:a}){const{settings:c={}}=e,{ga4:s,ads:u,gtm:l}=c,f=n.settings||{},d=await N(t,o,e,s,i),g=await N(t,o,e,u,i),w=await N(t,o,e,l,i);let m;(null==s?void 0:s.measurementId)&&function(t,e,n,o,r){const{window:i}=L(o);e.measurementId||r.throw("Config settings ga4.measurementId missing");const a=O(n)?{...n}:{};let c=t.name;!1!==e.snakeCase&&(c=function(t,e=!0){return e?t.replace(/\s+/g,"_").toLowerCase():t}(c)),a.send_to=e.measurementId,e.debug&&(a.debug_mode=!0),(0,i.gtag)("event",c,a)}(t,s,d,r,a),(null==u?void 0:u.conversionId)&&(null==u?void 0:u.enhancedConversions)&&(m=await async function(t,e,n){const o=e.enhancedConversions;if(!o)return;const r={};if(o.email){const e=await C(t,o.email,{collector:n});e&&(r.email=e)}if(o.phone_number){const e=await C(t,o.phone_number,{collector:n});e&&(r.phone_number=e)}if(o.address){const e={};for(const[r,i]of Object.entries(o.address))if(i){const o=await C(t,i,{collector:n});o&&(e[r]=o)}Object.keys(e).length>0&&(r.address=e)}return Object.keys(r).length>0?r:void 0}(t,u,i)),(null==u?void 0:u.conversionId)&&n.name&&function(t,e,n={},o,r,i,a,c){const{conversionId:s,currency:u}=e,l=O(o)?o:{},f=n.label||r;f||a.throw("Config mapping ads.label missing");const d={send_to:`${s}/${f}`,currency:u||"EUR",...l},{window:g}=L(i),w=g.gtag;c&&w("set","user_data",c),w("event","conversion",d)}(0,u,f.ads,g,n.name,r,a,m),(null==l?void 0:l.containerId)&&function(t,e,n={},o,r){const{window:i}=L(r),a={event:t.name},c=e.dataLayer||T,s=i[c],u=b(s)?s:[];i[c]=u,u.push({...a,...O(o)?o:t})}(t,l,f.gtm,w,r)},on(t,e){var n;if("consent"!==t||!O(e.data))return;const o=e.data,r=(null==(n=e.config)?void 0:n.settings)||{},i=M(r);if(!i)return;const{window:a}=L(e.env),c=a.gtag;if(!c)return;if(!W){const t=U(r);t&&c("consent","default",t),W=!0}const s={};Object.entries(o).forEach(([t,e])=>{const n=i[t];if(!n)return;const o=Array.isArray(n)?n:[n],r=e?"granted":"denied";o.forEach(t=>{s[t]=r})}),0!==Object.keys(s).length&&c("consent","update",s)}},H=z;return V=r,((r,i,a,c)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let s of n(i))o.call(r,s)||s===a||t(r,s,{get:()=>i[s],enumerable:!(c=e(i,s))||c.enumerable});return r})(t({},"__esModule",{value:!0}),V)})();
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 _assert_this_initialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function asyncGeneratorStep(e,t,r,n,o,a,i){try{var c=e[a](i),u=c.value}catch(e){return void r(e)}c.done?t(u):Promise.resolve(u).then(n,o)}function _async_to_generator(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var a=e.apply(t,r);function i(e){asyncGeneratorStep(a,n,o,i,c,"next",e)}function c(e){asyncGeneratorStep(a,n,o,i,c,"throw",e)}i(void 0)})}}function _call_super(e,t,r){return t=_get_prototype_of(t),_possible_constructor_return(e,_is_native_reflect_construct()?Reflect.construct(t,r||[],_get_prototype_of(e).constructor):t.apply(e,r))}function _class_call_check(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _construct(e,t,r){return _construct=_is_native_reflect_construct()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&_set_prototype_of(o,r.prototype),o},_construct.apply(null,arguments)}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 _get_prototype_of(e){return _get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},_get_prototype_of(e)}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_set_prototype_of(e,t)}function _instanceof(e,t){return null!=t&&"undefined"!=typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function _is_native_function(e){return-1!==Function.toString.call(e).indexOf("[native code]")}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,o,a=[],i=!0,c=!1;try{for(r=r.call(e);!(i=(n=r.next()).done)&&(a.push(n.value),!t||a.length!==t);i=!0);}catch(e){c=!0,o=e}finally{try{i||null==r.return||r.return()}finally{if(c)throw o}}return a}}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 ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function _object_spread_props(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function _possible_constructor_return(e,t){return!t||"object"!==_type_of(t)&&"function"!=typeof t?_assert_this_initialized(e):t}function _set_prototype_of(e,t){return _set_prototype_of=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},_set_prototype_of(e,t)}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 _wrap_native_super(e){var t="function"==typeof Map?new Map:void 0;return _wrap_native_super=function(e){if(null===e||!_is_native_function(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return _construct(e,arguments,_get_prototype_of(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),_set_prototype_of(r,e)},_wrap_native_super(e)}function _is_native_reflect_construct(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(_is_native_reflect_construct=function(){return!!e})()}function _ts_generator(e,t){var r,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),c=Object.defineProperty;return c(i,"next",{value:u(0)}),c(i,"throw",{value:u(1)}),c(i,"return",{value:u(2)}),"function"==typeof Symbol&&c(i,Symbol.iterator,{value:function(){return this}}),i;function u(c){return function(u){return function(c){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,c[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,n=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){a=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){a.label=c[1];break}if(6===c[0]&&a.label<o[1]){a.label=o[1],o=c;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(c);break}o[2]&&a.ops.pop(),a.trys.pop();continue}c=t.call(e,a)}catch(e){c=[6,e],n=0}finally{r=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}}var Destination=function(){var e=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"https://www.googletagmanager.com/gtag/js?id=",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:globalThis.document;if(!x.has(e)){var n=r.createElement("script");n.src=t+e,r.head.appendChild(n),x.add(e)}},t=function(e){var t=e;return t.dataLayer=t.dataLayer||[],t.gtag||(t.gtag=function(){t.dataLayer.push(arguments)}),t.gtag},r=function(e,t){if("collector"===e)return"collector";if(!t)throw new Error("stepId(".concat(e,") requires an id"));return"".concat(e,".").concat(t)},n=function(e,t){var r=e.destinations[t];if(!r)throw new Error("Destination not found: ".concat(t));return r},o=function(e,t){var r=e.transformers[t];if(!r)throw new Error("Transformer not found: ".concat(t));return r},a=function(e,t){var r=e.sources[t];if(!r)throw new Error("Source not found: ".concat(t));return r},i=function(e,t){var r=e.stores[t];if(!r)throw new Error("Store not found: ".concat(t));return r},c=function(e,t){return _async_to_generator(function(){return _ts_generator(this,function(r){switch(r.label){case 0:return[4,e.get(t)];case 1:return[2,r.sent()]}})})()},u=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};r=_object_spread({},G,r);var n=Object.entries(t).reduce(function(t,n){var o=_sliced_to_array(n,2),a=o[0],i=o[1],c=e[a];return r.merge&&Array.isArray(c)&&Array.isArray(i)?t[a]=i.reduce(function(e,t){return e.includes(t)?e:_to_consumable_array(e).concat([t])},_to_consumable_array(c)):(r.extend||a in e)&&(t[a]=i),t},{});return r.shallow?_object_spread({},e,n):(Object.assign(e,n),e)},s=function(e){return Array.isArray(e)},l=function(e){return void 0!==e},f=function(e){return"object"==(void 0===e?"undefined":_type_of(e))&&null!==e&&!s(e)&&"[object Object]"===Object.prototype.toString.call(e)},_=function(e){return"string"==typeof e},d=function(e){return N(e)?e:void 0},p=function(e,t,r){return function(){for(var n=arguments.length,o=new Array(n),a=0;a<n;a++)o[a]=arguments[a];return _async_to_generator(function(){var n;return _ts_generator(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,4,6]),[4,e.apply(void 0,_to_consumable_array(o))];case 1:case 3:return[2,a.sent()];case 2:return n=a.sent(),t?[4,t(n)]:[2];case 4:return[4,null==r?void 0:r()];case 5:return a.sent(),[7];case 6:return[2]}})})()}},v=function(e){return _async_to_generator(function(e){var t,r,n,o,a,i,c,u,_,d,v,y,g,b,h,m,w=arguments;return _ts_generator(this,function(j){switch(j.label){case 0:if(t=w.length>1&&void 0!==w[1]?w[1]:{},r=w.length>2&&void 0!==w[2]?w[2]:{},!l(e))return[2];if(a=f(e)&&e.consent||r.consent||(null===(o=r.collector)||void 0===o?void 0:o.consent),i=null!==(n=r.event)&&void 0!==n?n:f(e)?e:{},!r.collector)throw new Error("getMappingValue: context.collector is required");c={event:i,mapping:t,collector:r.collector,logger:r.collector.logger,consent:a},u=s(t)?t:[t],_=!0,d=!1,v=void 0,j.label=1;case 1:j.trys.push([1,6,7,8]),y=u[Symbol.iterator](),j.label=2;case 2:return(_=(g=y.next()).done)?[3,5]:(b=g.value,[4,p(F,function(e){if(_instanceof(e,M))throw e;r.collector&&r.collector.status.failed++,c.logger.error("mapping processing failed",{event:i,error:e})})(e,b,_object_spread_props(_object_spread({},c),{mapping:b}))]);case 3:if(h=j.sent(),l(h))return[2,h];j.label=4;case 4:return _=!0,[3,2];case 5:return[3,8];case 6:return m=j.sent(),d=!0,v=m,[3,8];case 7:try{_||null==y.return||y.return()}finally{if(d)throw v}return[7];case 8:return[2]}})}).apply(this,arguments)},y=function(e){var t=(e.startsWith(B)?e.slice(5):e).split(".");return t.some(function(e){return""===e})?[]:t},g=function(e){var t=_object_spread({window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document},e),r=e&&e[U];if(function(e){if("object"!=(void 0===e?"undefined":_type_of(e))||null===e)return!1;if(!("paths"in e)||!("record"in e))return!1;var t=e.paths,r=e.record;return Array.isArray(t)&&t.every(function(e){return"string"==typeof e})&&"function"==typeof r}(r)){delete t[U];var n=new Map,o=!0,a=!1,i=void 0;try{for(var c,u=r.paths[Symbol.iterator]();!(o=(c=u.next()).done);o=!0){var s,l=c.value,f=y(l),_=f[0];if(void 0!==_){var d=null!==(s=n.get(_))&&void 0!==s?s:[];d.push(f.slice(1)),n.set(_,d)}}}catch(e){a=!0,i=e}finally{try{o||null==u.return||u.return()}finally{if(a)throw i}}var p=!0,v=!1,g=void 0;try{for(var b,h=n[Symbol.iterator]();!(p=(b=h.next()).done);p=!0){var m=_sliced_to_array(b.value,2),w=m[0],j=m[1],O=t[w];null!==O&&"object"==(void 0===O?"undefined":_type_of(O))&&(t[w]=z(O,j,r.record,w))}}catch(e){v=!0,g=e}finally{try{p||null==h.return||h.return()}finally{if(v)throw g}}}return t},b=function(e,t,r,n,o){return _async_to_generator(function(){var a,i,c,s,l,_,d;return _ts_generator(this,function(p){switch(p.label){case 0:return a=f(t)?t:{},r.data?[4,v(e,r.data,{collector:o})]:[3,2];case 1:return c=p.sent(),[3,3];case 2:c={},p.label=3;case 3:return i=c,(null==n?void 0:n.data)?[4,v(e,n.data,{collector:o})]:[3,5];case 4:return l=p.sent(),[3,6];case 5:l={},p.label=6;case 6:return s=l,_=f(i)?i:{},d=f(s)?s:{},[2,u(u(a,_),d)]}})})()},h=function(e,t,r){return _async_to_generator(function(){var n,o,a,i,c,u,s,l,f,_,d,p,y,g,b;return _ts_generator(this,function(h){switch(h.label){case 0:return(n=t.enhancedConversions)?(o={},n.email?[4,v(e,n.email,{collector:r})]:[3,2]):[2,void 0];case 1:(a=h.sent())&&(o.email=a),h.label=2;case 2:return n.phone_number?[4,v(e,n.phone_number,{collector:r})]:[3,4];case 3:(i=h.sent())&&(o.phone_number=i),h.label=4;case 4:if(!n.address)return[3,13];c={},u=!0,s=!1,l=void 0,h.label=5;case 5:h.trys.push([5,10,11,12]),f=Object.entries(n.address)[Symbol.iterator](),h.label=6;case 6:return(u=(_=f.next()).done)?[3,9]:(d=_sliced_to_array(_.value,2),p=d[0],(y=d[1])?[4,v(e,y,{collector:r})]:[3,8]);case 7:(g=h.sent())&&(c[p]=g),h.label=8;case 8:return u=!0,[3,6];case 9:return[3,12];case 10:return b=h.sent(),s=!0,l=b,[3,12];case 11:try{u||null==f.return||f.return()}finally{if(s)throw l}return[7];case 12:Object.keys(c).length>0&&(o.address=c),h.label=13;case 13:return[2,Object.keys(o).length>0?o:void 0]}})})()},m=function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:globalThis.document,o=r!=q?"&l="+r:"",a=n.createElement("script");a.src=t+e+o,n.head.appendChild(a)},w=function(e){var t=e.como,r=void 0===t||t;if(!1!==r)return!0===r?V:r},j=function(e){var t=w(e);if(t){var r=function(e){var t=new Set;return Object.values(e).forEach(function(e){(Array.isArray(e)?e:[e]).forEach(function(e){return t.add(e)})}),_to_consumable_array(t)}(t);if(r.length){var n={};r.forEach(function(e){return n[e]="denied"});var o=e.como_advanced;return o&&(n.wait_for_update="number"==typeof o?o:$),n}}},O=function(){J=!1},S=function(e,r){var n=e.settings||{};if(!J&&function(e,t){return!!(e&&Object.keys(e).length>0)||!!t.como_advanced}(e.consent,n)){var o=j(n);if(o){var a=g(r).window,i=t(a);i&&(i("consent","default",o),J=!0)}}},I=Object.defineProperty,E=Object.getOwnPropertyDescriptor,P=Object.getOwnPropertyNames,A=Object.prototype.hasOwnProperty,k={};!function(e,t){for(var r in t)I(e,r,{get:t[r],enumerable:!0})}(k,{DestinationGtag:function(){return H},default:function(){return X},destinationGtag:function(){return Q},resetConsentState:function(){return O}});var x=new Set,R=Object.defineProperty,C=function(e,t){for(var r in t)R(e,r,{get:t[r],enumerable:!0})};C({},{stepId:function(){return r}});C({},{getDestination:function(){return n}});C({},{Level:function(){return T}});var D,T=((D=T||{})[D.ERROR=0]="ERROR",D[D.WARN=1]="WARN",D[D.INFO=2]="INFO",D[D.DEBUG=3]="DEBUG",D);C({},{getTransformer:function(){return o}});C({},{getSource:function(){return a}});C({},{getStore:function(){return i},getStoreValue:function(){return c}});var G={merge:!0,shallow:!0,extend:!0};function L(e){for(var t=arguments.length>2?arguments[2]:void 0,r=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"").split("."),n=e,o=0;o<r.length;o++){var a=r[o];if("*"===a&&s(n)){var i=r.slice(o+1).join("."),c=[],u=!0,_=!1,d=void 0;try{for(var p,v=n[Symbol.iterator]();!(u=(p=v.next()).done);u=!0){var y=L(p.value,i,t);c.push(y)}}catch(e){_=!0,d=e}finally{try{u||null==v.return||v.return()}finally{if(_)throw d}}return c}if(void 0===(n=f(n)||s(n)?n[a]:void 0))break}return l(n)?n:t}function N(e){return function(e){return"boolean"==typeof e}(e)||_(e)||function(e){return"number"==typeof e&&!Number.isNaN(e)}(e)||!l(e)||s(e)&&e.every(N)||f(e)&&Object.values(e).every(N)}var M=function(){function e(t,r){var n;return _class_call_check(this,e),(n=_call_super(this,e,[t,r])).name="FatalError",Object.setPrototypeOf(n,e.prototype),n}return _inherits(e,_wrap_native_super(Error)),e}();function F(e,t,r){return _async_to_generator(function(){return _ts_generator(this,function(n){return[2,(s(t)?t:[t]).reduce(function(t,n){return _async_to_generator(function(){var o,a,i,c,u,f,y,g,b,h,m,w,j,O,S,I,E,P,A,k,x,R;return _ts_generator(this,function(C){switch(C.label){case 0:return[4,t];case 1:return(o=C.sent())?[2,o]:(a=_(n)?{key:n}:n,Object.keys(a).length?(i=a.condition,c=a.consent,u=a.fn,f=a.key,y=a.loop,g=a.map,b=a.set,h=a.validate,m=a.value,w=_object_spread_props(_object_spread({},r),{mapping:n}),(j=i)?[4,p(i,function(e){if(_instanceof(e,M))throw e;return w.logger.error("mapping condition failed",{event:w.event,error:e}),!1})(e,w)]:[3,3]):[2]);case 2:j=!C.sent(),C.label=3;case 3:return j?[2]:c&&!function(e){var t=_object_spread({},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}),r={},n=!e||0===Object.keys(e).length;return Object.keys(t).forEach(function(o){t[o]&&(r[o]=!0,e&&e[o]&&(n=!0))}),!!n&&r}(c,w.consent)?[2,m]:(O=l(m)?m:e,u?[4,p(u,function(e){if(_instanceof(e,M))throw e;w.logger.error("mapping fn failed",{event:w.event,error:e})})(e,w)]:[3,5]);case 4:O=C.sent(),C.label=5;case 5:return f&&(O=L(e,f,m)),y?(S=_sliced_to_array(y,2),I=S[0],E=S[1],"this"!==I?[3,6]:(A=[e],[3,8])):[3,11];case 6:return[4,v(e,I,w)];case 7:A=C.sent(),C.label=8;case 8:return s(P=A)?[4,Promise.all(P.map(function(e){return v(e,E,w)}))]:[3,10];case 9:O=C.sent().filter(l),C.label=10;case 10:return[3,17];case 11:return g?[4,Object.entries(g).reduce(function(t,r){var n=_sliced_to_array(r,2),o=n[0],a=n[1];return _async_to_generator(function(){var r,n;return _ts_generator(this,function(i){switch(i.label){case 0:return[4,t];case 1:return r=i.sent(),[4,v(e,a,w)];case 2:return n=i.sent(),[2,(l(n)&&(r[o]=n),r)]}})})()},Promise.resolve({}))]:[3,13];case 12:return O=C.sent(),[3,16];case 13:return(k=b)?[4,Promise.all(b.map(function(t){return F(e,t,w)}))]:[3,15];case 14:k=O=C.sent(),C.label=15;case 15:C.label=16;case 16:C.label=17;case 17:return(x=h)?[4,p(h,function(e){if(_instanceof(e,M))throw e;return w.logger.error("mapping validate failed",{event:w.event,error:e}),!1})(O,w)]:[3,19];case 18:x=!C.sent(),C.label=19;case 19:return x&&(O=void 0),R=d(O),[2,l(R)?R:d(m)]}})})()},Promise.resolve(void 0))]})})()}var U="observe",B="call:";function z(e,t,r,n){var o=new Map;return new Proxy(e,{get:function(e,a){if("string"!=typeof a)return Reflect.get(e,a,e);var i=o.get(a);if(void 0!==i)return i;if(t.some(function(e){return 1===e.length&&e[0]===a})){var c=Reflect.get(e,a,e);if("function"!=typeof c)return c;var u="".concat(n,".").concat(a),s=function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];try{r(u,n)}catch(e){}return c.apply(e,n)};return o.set(a,s),s}var l=t.filter(function(e){return e.length>1&&e[0]===a}).map(function(e){return e.slice(1)});if(l.length>0){var f=Reflect.get(e,a,e);if(null===f||"object"!=(void 0===f?"undefined":_type_of(f)))return f;var _=z(f,l,r,"".concat(n,".").concat(a));return o.set(a,_),_}return Reflect.get(e,a,e)}})}var W,q="dataLayer",K="https://www.googletagmanager.com/gtm.js?id=",V={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]},$=500,H={},J=!1,Q={type:"google-gtag",calls:["call:window.gtag"],config:{settings:{}},init:function(r){var n=r.config,o=r.env,a=r.logger,i=n.settings,c=void 0===i?{}:i,u=n.loadScript,l=c.ga4,f=c.ads,_=c.gtm;return(null==l?void 0:l.measurementId)||(null==f?void 0:f.conversionId)||(null==_?void 0:_.containerId)||a.throw("Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId"),S(n,o),(null==l?void 0:l.measurementId)&&function(r,n,o,a){var i=g(o),c=i.window,u=i.document,s=r.measurementId,l=r.transport_url,f=r.server_container_url,_=r.pageview;s||a.throw("Config settings ga4.measurementId missing"),n&&e(s,void 0,u),t(c);var d={};l&&(d.transport_url=l),f&&(d.server_container_url=f),!1===_&&(d.send_page_view=!1);var p=c.gtag;p("js",new Date),p("config",s,d)}(l,u,o,a),(null==f?void 0:f.conversionId)&&function(r,n,o,a){var i=g(o),c=i.window,u=i.document,s=r.conversionId;s||a.throw("Config settings ads.conversionId missing"),r.currency||(r.currency="EUR"),n&&e(s,void 0,u),t(c);var l=c.gtag;l("js",new Date),r.enhancedConversions?l("config",s,{allow_enhanced_conversions:!0}):l("config",s)}(f,u,o,a),(null==_?void 0:_.containerId)&&function(e,t,r){var n=g(r),o=n.window,a=n.document,i=e.containerId,c=e.dataLayer,u=e.domain,l=c||q,f=o[l],_=s(f)?f:[];o[l]=_,_.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),t&&i&&m(i,u||K,l,a)}(_,u,o),n},push:function(e,t){return _async_to_generator(function(e,t){var r,n,o,a,i,c,u,l,_,d,p,v,y,m,w,j,O;return _ts_generator(this,function(S){switch(S.label){case 0:return r=t.config,n=t.rule,o=void 0===n?{}:n,a=t.data,i=t.env,c=t.collector,u=t.logger,l=r.settings,d=(_=void 0===l?{}:l).ga4,p=_.ads,v=_.gtm,y=o.settings||{},[4,b(e,a,r,d,c)];case 1:return m=S.sent(),[4,b(e,a,r,p,c)];case 2:return w=S.sent(),[4,b(e,a,r,v,c)];case 3:return j=S.sent(),(null==d?void 0:d.measurementId)&&function(e,t,r,n,o){var a=g(n).window;t.measurementId||o.throw("Config settings ga4.measurementId missing");var i=f(r)?_object_spread({},r):{},c=e.name;!1!==t.snakeCase&&(c=function(e){return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]?e:e.replace(/\s+/g,"_").toLowerCase()}(c)),i.send_to=t.measurementId,t.debug&&(i.debug_mode=!0),(0,a.gtag)("event",c,i)}(e,d,m,i,u),(null==p?void 0:p.conversionId)&&(null==p?void 0:p.enhancedConversions)?[4,h(e,p,c)]:[3,5];case 4:O=S.sent(),S.label=5;case 5:return(null==p?void 0:p.conversionId)&&o.name&&function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0,a=arguments.length>5?arguments[5]:void 0,i=arguments.length>6?arguments[6]:void 0,c=arguments.length>7?arguments[7]:void 0,u=t.conversionId,s=t.currency,l=f(n)?n:{},_=r.label||o;_||i.throw("Config mapping ads.label missing");var d=_object_spread({send_to:"".concat(u,"/").concat(_),currency:s||"EUR"},l),p=g(a).window.gtag;c&&p("set","user_data",c),p("event","conversion",d)}(e,p,y.ads,w,o.name,i,u,O),(null==v?void 0:v.containerId)&&function(e,t){var r=arguments.length>3?arguments[3]:void 0,n=g(arguments.length>4?arguments[4]:void 0).window,o={event:e.name},a=t.dataLayer||q,i=n[a],c=s(i)?i:[];n[a]=c,c.push(_object_spread({},o,f(r)?r:e))}(e,v,y.gtm,j,i,u),[2]}})}).apply(this,arguments)},on:function(e,t){var r;if("consent"===e&&f(t.data)){var n=t.data,o=(null===(r=t.config)||void 0===r?void 0:r.settings)||{},a=w(o);if(a){var i=g(t.env).window.gtag;if(i){if(!J){var c=j(o);c&&i("consent","default",c),J=!0}var u={};Object.entries(n).forEach(function(e){var t=_sliced_to_array(e,2),r=t[0],n=t[1],o=a[r];if(o){var i=Array.isArray(o)?o:[o],c=n?"granted":"denied";i.forEach(function(e){u[e]=c})}}),0!==Object.keys(u).length&&i("consent","update",u)}}}}},X=Q;return W=k,function(e,t,r,n){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var o=!0,a=!1,i=void 0;try{for(var c,u=function(){var o=c.value;A.call(e,o)||o===r||I(e,o,{get:function(){return t[o]},enumerable:!(n=E(t,o))||n.enumerable})},s=P(t)[Symbol.iterator]();!(o=(c=s.next()).done);o=!0)u()}catch(e){a=!0,i=e}finally{try{o||null==s.return||s.return()}finally{if(a)throw i}}}return e}(I({},"__esModule",{value:!0}),W)}();
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 _assert_this_initialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function asyncGeneratorStep(e,t,r,n,o,a,i){try{var c=e[a](i),u=c.value}catch(e){return void r(e)}c.done?t(u):Promise.resolve(u).then(n,o)}function _async_to_generator(e){return function(){var t=this,r=arguments;return new Promise(function(n,o){var a=e.apply(t,r);function i(e){asyncGeneratorStep(a,n,o,i,c,"next",e)}function c(e){asyncGeneratorStep(a,n,o,i,c,"throw",e)}i(void 0)})}}function _call_super(e,t,r){return t=_get_prototype_of(t),_possible_constructor_return(e,_is_native_reflect_construct()?Reflect.construct(t,r||[],_get_prototype_of(e).constructor):t.apply(e,r))}function _class_call_check(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _construct(e,t,r){return _construct=_is_native_reflect_construct()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&_set_prototype_of(o,r.prototype),o},_construct.apply(null,arguments)}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 _get_prototype_of(e){return _get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},_get_prototype_of(e)}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_set_prototype_of(e,t)}function _instanceof(e,t){return null!=t&&"undefined"!=typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function _is_native_function(e){return-1!==Function.toString.call(e).indexOf("[native code]")}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,o,a=[],i=!0,c=!1;try{for(r=r.call(e);!(i=(n=r.next()).done)&&(a.push(n.value),!t||a.length!==t);i=!0);}catch(e){c=!0,o=e}finally{try{i||null==r.return||r.return()}finally{if(c)throw o}}return a}}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 ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function _object_spread_props(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function _possible_constructor_return(e,t){return!t||"object"!==_type_of(t)&&"function"!=typeof t?_assert_this_initialized(e):t}function _set_prototype_of(e,t){return _set_prototype_of=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},_set_prototype_of(e,t)}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 _wrap_native_super(e){var t="function"==typeof Map?new Map:void 0;return _wrap_native_super=function(e){if(null===e||!_is_native_function(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return _construct(e,arguments,_get_prototype_of(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),_set_prototype_of(r,e)},_wrap_native_super(e)}function _is_native_reflect_construct(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(_is_native_reflect_construct=function(){return!!e})()}function _ts_generator(e,t){var r,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),c=Object.defineProperty;return c(i,"next",{value:u(0)}),c(i,"throw",{value:u(1)}),c(i,"return",{value:u(2)}),"function"==typeof Symbol&&c(i,Symbol.iterator,{value:function(){return this}}),i;function u(c){return function(u){return function(c){if(r)throw new TypeError("Generator is already executing.");for(;i&&(i=0,c[0]&&(a=0)),a;)try{if(r=1,n&&(o=2&c[0]?n.return:c[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,c[1])).done)return o;switch(n=0,o&&(c=[2&c[0],o.value]),c[0]){case 0:case 1:o=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,n=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==c[0]&&2!==c[0])){a=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]<o[3])){a.label=c[1];break}if(6===c[0]&&a.label<o[1]){a.label=o[1],o=c;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(c);break}o[2]&&a.ops.pop(),a.trys.pop();continue}c=t.call(e,a)}catch(e){c=[6,e],n=0}finally{r=o=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}}var Destination=function(){var e=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"https://www.googletagmanager.com/gtag/js?id=",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:globalThis.document;if(!x.has(e)){var n=r.createElement("script");n.src=t+e,r.head.appendChild(n),x.add(e)}},t=function(e){var t=e;return t.dataLayer=t.dataLayer||[],t.gtag||(t.gtag=function(){t.dataLayer.push(arguments)}),t.gtag},r=function(e,t){if("collector"===e)return"collector";if(!t)throw new Error("stepId(".concat(e,") requires an id"));return"".concat(e,".").concat(t)},n=function(e,t){var r=e.destinations[t];if(!r)throw new Error("Destination not found: ".concat(t));return r},o=function(e,t){var r=e.transformers[t];if(!r)throw new Error("Transformer not found: ".concat(t));return r},a=function(e,t){var r=e.sources[t];if(!r)throw new Error("Source not found: ".concat(t));return r},i=function(e,t){var r=e.stores[t];if(!r)throw new Error("Store not found: ".concat(t));return r},c=function(e,t){return _async_to_generator(function(){return _ts_generator(this,function(r){switch(r.label){case 0:return[4,e.get(t)];case 1:return[2,r.sent()]}})})()},u=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};r=_object_spread({},G,r);var n=Object.entries(t).reduce(function(t,n){var o=_sliced_to_array(n,2),a=o[0],i=o[1],c=e[a];return r.merge&&Array.isArray(c)&&Array.isArray(i)?t[a]=i.reduce(function(e,t){return e.includes(t)?e:_to_consumable_array(e).concat([t])},_to_consumable_array(c)):(r.extend||a in e)&&(t[a]=i),t},{});return r.shallow?_object_spread({},e,n):(Object.assign(e,n),e)},s=function(e){return Array.isArray(e)},l=function(e){return void 0!==e},f=function(e){return"object"==(void 0===e?"undefined":_type_of(e))&&null!==e&&!s(e)&&"[object Object]"===Object.prototype.toString.call(e)},_=function(e){return"string"==typeof e},d=function(e){return N(e)?e:void 0},p=function(e,t,r){return function(){for(var n=arguments.length,o=new Array(n),a=0;a<n;a++)o[a]=arguments[a];return _async_to_generator(function(){var n;return _ts_generator(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,4,6]),[4,e.apply(void 0,_to_consumable_array(o))];case 1:case 3:return[2,a.sent()];case 2:return n=a.sent(),t?[4,t(n)]:[2];case 4:return[4,null==r?void 0:r()];case 5:return a.sent(),[7];case 6:return[2]}})})()}},v=function(e){return _async_to_generator(function(e){var t,r,n,o,a,i,c,u,_,d,v,y,g,b,h,m,w=arguments;return _ts_generator(this,function(j){switch(j.label){case 0:if(t=w.length>1&&void 0!==w[1]?w[1]:{},r=w.length>2&&void 0!==w[2]?w[2]:{},!l(e))return[2];if(a=f(e)&&e.consent||r.consent||(null===(o=r.collector)||void 0===o?void 0:o.consent),i=null!==(n=r.event)&&void 0!==n?n:f(e)?e:{},!r.collector)throw new Error("getMappingValue: context.collector is required");c={event:i,mapping:t,collector:r.collector,logger:r.collector.logger,consent:a},u=s(t)?t:[t],_=!0,d=!1,v=void 0,j.label=1;case 1:j.trys.push([1,6,7,8]),y=u[Symbol.iterator](),j.label=2;case 2:return(_=(g=y.next()).done)?[3,5]:(b=g.value,[4,p(F,function(e){if(_instanceof(e,M))throw e;r.collector&&r.collector.status.failed++,c.logger.error("mapping processing failed",{event:i,error:e})})(e,b,_object_spread_props(_object_spread({},c),{mapping:b}))]);case 3:if(h=j.sent(),l(h))return[2,h];j.label=4;case 4:return _=!0,[3,2];case 5:return[3,8];case 6:return m=j.sent(),d=!0,v=m,[3,8];case 7:try{_||null==y.return||y.return()}finally{if(d)throw v}return[7];case 8:return[2]}})}).apply(this,arguments)},y=function(e){var t=(e.startsWith(B)?e.slice(5):e).split(".");return t.some(function(e){return""===e})?[]:t},g=function(e){var t=_object_spread({window:"undefined"!=typeof window?window:globalThis.window,document:"undefined"!=typeof document?document:globalThis.document},e),r=e&&e[U];if(function(e){if("object"!=(void 0===e?"undefined":_type_of(e))||null===e)return!1;if(!("paths"in e)||!("record"in e))return!1;var t=e.paths,r=e.record;return Array.isArray(t)&&t.every(function(e){return"string"==typeof e})&&"function"==typeof r}(r)){delete t[U];var n=new Map,o=!0,a=!1,i=void 0;try{for(var c,u=r.paths[Symbol.iterator]();!(o=(c=u.next()).done);o=!0){var s,l=c.value,f=y(l),_=f[0];if(void 0!==_){var d=null!==(s=n.get(_))&&void 0!==s?s:[];d.push(f.slice(1)),n.set(_,d)}}}catch(e){a=!0,i=e}finally{try{o||null==u.return||u.return()}finally{if(a)throw i}}var p=!0,v=!1,g=void 0;try{for(var b,h=n[Symbol.iterator]();!(p=(b=h.next()).done);p=!0){var m=_sliced_to_array(b.value,2),w=m[0],j=m[1],O=t[w];null!==O&&"object"==(void 0===O?"undefined":_type_of(O))&&(t[w]=z(O,j,r.record,w))}}catch(e){v=!0,g=e}finally{try{p||null==h.return||h.return()}finally{if(v)throw g}}}return t},b=function(e,t,r,n,o){return _async_to_generator(function(){var a,i,c,s,l,_,d;return _ts_generator(this,function(p){switch(p.label){case 0:return a=f(t)?t:{},r.data?[4,v(e,r.data,{collector:o})]:[3,2];case 1:return c=p.sent(),[3,3];case 2:c={},p.label=3;case 3:return i=c,(null==n?void 0:n.data)?[4,v(e,n.data,{collector:o})]:[3,5];case 4:return l=p.sent(),[3,6];case 5:l={},p.label=6;case 6:return s=l,_=f(i)?i:{},d=f(s)?s:{},[2,u(u(a,_),d)]}})})()},h=function(e,t,r){return _async_to_generator(function(){var n,o,a,i,c,u,s,l,f,_,d,p,y,g,b;return _ts_generator(this,function(h){switch(h.label){case 0:return(n=t.enhancedConversions)?(o={},n.email?[4,v(e,n.email,{collector:r})]:[3,2]):[2,void 0];case 1:(a=h.sent())&&(o.email=a),h.label=2;case 2:return n.phone_number?[4,v(e,n.phone_number,{collector:r})]:[3,4];case 3:(i=h.sent())&&(o.phone_number=i),h.label=4;case 4:if(!n.address)return[3,13];c={},u=!0,s=!1,l=void 0,h.label=5;case 5:h.trys.push([5,10,11,12]),f=Object.entries(n.address)[Symbol.iterator](),h.label=6;case 6:return(u=(_=f.next()).done)?[3,9]:(d=_sliced_to_array(_.value,2),p=d[0],(y=d[1])?[4,v(e,y,{collector:r})]:[3,8]);case 7:(g=h.sent())&&(c[p]=g),h.label=8;case 8:return u=!0,[3,6];case 9:return[3,12];case 10:return b=h.sent(),s=!0,l=b,[3,12];case 11:try{u||null==f.return||f.return()}finally{if(s)throw l}return[7];case 12:Object.keys(c).length>0&&(o.address=c),h.label=13;case 13:return[2,Object.keys(o).length>0?o:void 0]}})})()},m=function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:globalThis.document,o=r!=q?"&l="+r:"",a=n.createElement("script");a.src=t+e+o,n.head.appendChild(a)},w=function(e){var t=e.como,r=void 0===t||t;if(!1!==r)return!0===r?V:r},j=function(e){var t=w(e);if(t){var r=function(e){var t=new Set;return Object.values(e).forEach(function(e){(Array.isArray(e)?e:[e]).forEach(function(e){return t.add(e)})}),_to_consumable_array(t)}(t);if(r.length){var n={};r.forEach(function(e){return n[e]="denied"});var o=e.como_advanced;return o&&(n.wait_for_update="number"==typeof o?o:$),n}}},O=function(){J=!1},S=function(e,r){var n=e.settings||{};if(!J&&function(e,t){return!!(e&&Object.keys(e).length>0)||!!t.como_advanced}(e.consent,n)){var o=j(n);if(o){var a=g(r).window,i=t(a);i&&(i("consent","default",o),J=!0)}}},I=Object.defineProperty,E=Object.getOwnPropertyDescriptor,P=Object.getOwnPropertyNames,A=Object.prototype.hasOwnProperty,k={};!function(e,t){for(var r in t)I(e,r,{get:t[r],enumerable:!0})}(k,{DestinationGtag:function(){return H},default:function(){return X},destinationGtag:function(){return Q},resetConsentState:function(){return O}});var x=new Set,R=Object.defineProperty,C=function(e,t){for(var r in t)R(e,r,{get:t[r],enumerable:!0})};C({},{stepId:function(){return r}});C({},{getDestination:function(){return n}});C({},{Level:function(){return T}});var D,T=((D=T||{})[D.ERROR=0]="ERROR",D[D.WARN=1]="WARN",D[D.INFO=2]="INFO",D[D.DEBUG=3]="DEBUG",D);C({},{getTransformer:function(){return o}});C({},{getSource:function(){return a}});C({},{getStore:function(){return i},getStoreValue:function(){return c}});var G={merge:!0,shallow:!0,extend:!0};function L(e){for(var t=arguments.length>2?arguments[2]:void 0,r=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"").split("."),n=e,o=0;o<r.length;o++){var a=r[o];if("*"===a&&s(n)){var i=r.slice(o+1).join("."),c=[],u=!0,_=!1,d=void 0;try{for(var p,v=n[Symbol.iterator]();!(u=(p=v.next()).done);u=!0){var y=L(p.value,i,t);c.push(y)}}catch(e){_=!0,d=e}finally{try{u||null==v.return||v.return()}finally{if(_)throw d}}return c}if(void 0===(n=f(n)||s(n)?n[a]:void 0))break}return l(n)?n:t}function N(e){return function(e){return"boolean"==typeof e}(e)||_(e)||function(e){return"number"==typeof e&&!Number.isNaN(e)}(e)||!l(e)||s(e)&&e.every(N)||f(e)&&Object.values(e).every(N)}var M=function(){function e(t,r){var n;return _class_call_check(this,e),(n=_call_super(this,e,[t,r])).name="FatalError",Object.setPrototypeOf(n,e.prototype),n}return _inherits(e,_wrap_native_super(Error)),e}();function F(e,t,r){return _async_to_generator(function(){return _ts_generator(this,function(n){return[2,(s(t)?t:[t]).reduce(function(t,n){return _async_to_generator(function(){var o,a,i,c,u,f,y,g,b,h,m,w,j,O,S,I,E,P,A,k,x,R;return _ts_generator(this,function(C){switch(C.label){case 0:return[4,t];case 1:return(o=C.sent())?[2,o]:(a=_(n)?{key:n}:n,Object.keys(a).length?(i=a.condition,c=a.consent,u=a.fn,f=a.key,y=a.loop,g=a.map,b=a.set,h=a.validate,m=a.value,w=_object_spread_props(_object_spread({},r),{mapping:n}),(j=i)?[4,p(i,function(e){if(_instanceof(e,M))throw e;return w.logger.error("mapping condition failed",{event:w.event,error:e}),!1})(e,w)]:[3,3]):[2]);case 2:j=!C.sent(),C.label=3;case 3:return j?[2]:c&&!function(e){var t=_object_spread({},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}),r={},n=!e||0===Object.keys(e).length;return Object.keys(t).forEach(function(o){t[o]&&(r[o]=!0,e&&e[o]&&(n=!0))}),!!n&&r}(c,w.consent)?[2,m]:(O=l(m)?m:e,u?[4,p(u,function(e){if(_instanceof(e,M))throw e;w.logger.error("mapping fn failed",{event:w.event,error:e})})(e,w)]:[3,5]);case 4:O=C.sent(),C.label=5;case 5:return f&&(O=L(e,f,m)),y?(S=_sliced_to_array(y,2),I=S[0],E=S[1],"this"!==I?[3,6]:(A=[e],[3,8])):[3,11];case 6:return[4,v(e,I,w)];case 7:A=C.sent(),C.label=8;case 8:return s(P=A)?[4,Promise.all(P.map(function(e){return v(e,E,w)}))]:[3,10];case 9:O=C.sent().filter(l),C.label=10;case 10:return[3,17];case 11:return g?[4,Object.entries(g).reduce(function(t,r){var n=_sliced_to_array(r,2),o=n[0],a=n[1];return _async_to_generator(function(){var r,n;return _ts_generator(this,function(i){switch(i.label){case 0:return[4,t];case 1:return r=i.sent(),[4,v(e,a,w)];case 2:return n=i.sent(),[2,(l(n)&&(r[o]=n),r)]}})})()},Promise.resolve({}))]:[3,13];case 12:return O=C.sent(),[3,16];case 13:return(k=b)?[4,Promise.all(b.map(function(t){return F(e,t,w)}))]:[3,15];case 14:k=O=C.sent(),C.label=15;case 15:C.label=16;case 16:C.label=17;case 17:return(x=h)?[4,p(h,function(e){if(_instanceof(e,M))throw e;return w.logger.error("mapping validate failed",{event:w.event,error:e}),!1})(O,w)]:[3,19];case 18:x=!C.sent(),C.label=19;case 19:return x&&(O=void 0),R=d(O),[2,l(R)?R:d(m)]}})})()},Promise.resolve(void 0))]})})()}var U="observe",B="call:";function z(e,t,r,n){var o=new Map;return new Proxy(e,{get:function(e,a){if("string"!=typeof a)return Reflect.get(e,a,e);var i=o.get(a);if(void 0!==i)return i;if(t.some(function(e){return 1===e.length&&e[0]===a})){var c=Reflect.get(e,a,e);if("function"!=typeof c)return c;var u="".concat(n,".").concat(a),s=function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];try{r(u,n)}catch(e){}return c.apply(e,n)};return o.set(a,s),s}var l=t.filter(function(e){return e.length>1&&e[0]===a}).map(function(e){return e.slice(1)});if(l.length>0){var f=Reflect.get(e,a,e);if(null===f||"object"!=(void 0===f?"undefined":_type_of(f)))return f;var _=z(f,l,r,"".concat(n,".").concat(a));return o.set(a,_),_}return Reflect.get(e,a,e)}})}var W,q="dataLayer",K="https://www.googletagmanager.com/gtm.js?id=",V={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]},$=500,H={},J=!1,Q={type:"google-gtag",calls:["call:window.gtag"],config:{settings:{}},init:function(r){var n=r.config,o=r.env,a=r.logger,i=n.settings,c=void 0===i?{}:i,u=n.loadScript,l=c.ga4,f=c.ads,_=c.gtm;return(null==l?void 0:l.measurementId)||(null==f?void 0:f.conversionId)||(null==_?void 0:_.containerId)||a.throw("Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId"),S(n,o),(null==l?void 0:l.measurementId)&&function(r,n,o,a){var i=g(o),c=i.window,u=i.document,s=r.measurementId,l=r.transport_url,f=r.server_container_url,_=r.pageview;if(s||a.throw("Config settings ga4.measurementId missing"),n){var d=f?"".concat(f.replace(/\/$/,""),"/gtag/js?id="):void 0;e(s,d,u)}t(c);var p={};l&&(p.transport_url=l),f&&(p.server_container_url=f),!1===_&&(p.send_page_view=!1);var v=c.gtag;v("js",new Date),v("config",s,p)}(l,u,o,a),(null==f?void 0:f.conversionId)&&function(r,n,o,a){var i=g(o),c=i.window,u=i.document,s=r.conversionId;s||a.throw("Config settings ads.conversionId missing"),r.currency||(r.currency="EUR"),n&&e(s,void 0,u),t(c);var l=c.gtag;l("js",new Date),r.enhancedConversions?l("config",s,{allow_enhanced_conversions:!0}):l("config",s)}(f,u,o,a),(null==_?void 0:_.containerId)&&function(e,t,r){var n=g(r),o=n.window,a=n.document,i=e.containerId,c=e.dataLayer,u=e.domain,l=c||q,f=o[l],_=s(f)?f:[];o[l]=_,_.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),t&&i&&m(i,u||K,l,a)}(_,u,o),n},push:function(e,t){return _async_to_generator(function(e,t){var r,n,o,a,i,c,u,l,_,d,p,v,y,m,w,j,O;return _ts_generator(this,function(S){switch(S.label){case 0:return r=t.config,n=t.rule,o=void 0===n?{}:n,a=t.data,i=t.env,c=t.collector,u=t.logger,l=r.settings,d=(_=void 0===l?{}:l).ga4,p=_.ads,v=_.gtm,y=o.settings||{},[4,b(e,a,r,d,c)];case 1:return m=S.sent(),[4,b(e,a,r,p,c)];case 2:return w=S.sent(),[4,b(e,a,r,v,c)];case 3:return j=S.sent(),(null==d?void 0:d.measurementId)&&function(e,t,r,n,o){var a=g(n).window;t.measurementId||o.throw("Config settings ga4.measurementId missing");var i=f(r)?_object_spread({},r):{},c=e.name;!1!==t.snakeCase&&(c=function(e){return arguments.length>1&&void 0!==arguments[1]&&!arguments[1]?e:e.replace(/\s+/g,"_").toLowerCase()}(c)),i.send_to=t.measurementId,t.debug&&(i.debug_mode=!0),(0,a.gtag)("event",c,i)}(e,d,m,i,u),(null==p?void 0:p.conversionId)&&(null==p?void 0:p.enhancedConversions)?[4,h(e,p,c)]:[3,5];case 4:O=S.sent(),S.label=5;case 5:return(null==p?void 0:p.conversionId)&&o.name&&function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0,a=arguments.length>5?arguments[5]:void 0,i=arguments.length>6?arguments[6]:void 0,c=arguments.length>7?arguments[7]:void 0,u=t.conversionId,s=t.currency,l=f(n)?n:{},_=r.label||o;_||i.throw("Config mapping ads.label missing");var d=_object_spread({send_to:"".concat(u,"/").concat(_),currency:s||"EUR"},l),p=g(a).window.gtag;c&&p("set","user_data",c),p("event","conversion",d)}(e,p,y.ads,w,o.name,i,u,O),(null==v?void 0:v.containerId)&&function(e,t){var r=arguments.length>3?arguments[3]:void 0,n=g(arguments.length>4?arguments[4]:void 0).window,o={event:e.name},a=t.dataLayer||q,i=n[a],c=s(i)?i:[];n[a]=c,c.push(_object_spread({},o,f(r)?r:e))}(e,v,y.gtm,j,i,u),[2]}})}).apply(this,arguments)},on:function(e,t){var r;if("consent"===e&&f(t.data)){var n=t.data,o=(null===(r=t.config)||void 0===r?void 0:r.settings)||{},a=w(o);if(a){var i=g(t.env).window.gtag;if(i){if(!J){var c=j(o);c&&i("consent","default",c),J=!0}var u={};Object.entries(n).forEach(function(e){var t=_sliced_to_array(e,2),r=t[0],n=t[1],o=a[r];if(o){var i=Array.isArray(o)?o:[o],c=n?"granted":"denied";i.forEach(function(e){u[e]=c})}}),0!==Object.keys(u).length&&i("consent","update",u)}}}}},X=Q;return W=k,function(e,t,r,n){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var o=!0,a=!1,i=void 0;try{for(var c,u=function(){var o=c.value;A.call(e,o)||o===r||I(e,o,{get:function(){return t[o]},enumerable:!(n=E(t,o))||n.enumerable})},s=P(t)[Symbol.iterator]();!(o=(c=s.next()).done);o=!0)u()}catch(e){a=!0,i=e}finally{try{o||null==s.return||s.return()}finally{if(a)throw i}}}return e}(I({},"__esModule",{value:!0}),W)}();
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,n=Object.defineProperty,t=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,a={};((e,t)=>{for(var o in t)n(e,o,{get:t[o],enumerable:!0})})(a,{DestinationGtag:()=>L,default:()=>V,destinationGtag:()=>S,resetConsentState:()=>M}),module.exports=(e=a,((e,a,s,i)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of o(a))r.call(e,c)||c===s||n(e,c,{get:()=>a[c],enumerable:!(i=t(a,c))||i.enumerable});return e})(n({},"__esModule",{value:!0}),e));var s=new Set;function i(e,n="https://www.googletagmanager.com/gtag/js?id=",t=globalThis.document){if(s.has(e))return;const o=t.createElement("script");o.src=n+e,t.head.appendChild(o),s.add(e)}function c(e){const n=e;return n.dataLayer=n.dataLayer||[],n.gtag||(n.gtag=function(){n.dataLayer.push(arguments)}),n.gtag}var d=require("@walkeros/web-core");var u=require("@walkeros/core"),g=require("@walkeros/core");async function l(e,n,t,o,r){const a=(0,g.isObject)(n)?n:{},s=t.data?await(0,g.getMappingValue)(e,t.data,{collector:r}):{},i=(null==o?void 0:o.data)?await(0,g.getMappingValue)(e,o.data,{collector:r}):{},c=(0,g.isObject)(s)?s:{},d=(0,g.isObject)(i)?i:{};return(0,g.assign)((0,g.assign)(a,c),d)}var w=require("@walkeros/web-core");var f=require("@walkeros/web-core");var v=require("@walkeros/core"),m=require("@walkeros/web-core");var p=require("@walkeros/core");var b=require("@walkeros/core"),h=require("@walkeros/web-core"),y="dataLayer";function _(e,n,t,o){const{window:r,document:a}=(0,h.getEnv)(t),{containerId:s,dataLayer:i,domain:c}=e,d=i||y,u=r[d],g=(0,b.isArray)(u)?u:[];r[d]=g,g.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),n&&s&&function(e,n,t,o=globalThis.document){const r=t!=y?"&l="+t:"",a=o.createElement("script");a.src=n+e+r,o.head.appendChild(a)}(s,c||"https://www.googletagmanager.com/gtm.js?id=",d,a)}var j=require("@walkeros/core"),I=require("@walkeros/web-core");var O={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]};function k(e){const{como:n=!0}=e;if(!1!==n)return!0===n?O:n}function E(e){const n=k(e);if(!n)return;const t=function(e){const n=new Set;return Object.values(e).forEach(e=>{(Array.isArray(e)?e:[e]).forEach(e=>n.add(e))}),[...n]}(n);if(!t.length)return;const o={};t.forEach(e=>o[e]="denied");const{como_advanced:r}=e;return r&&(o.wait_for_update="number"==typeof r?r:500),o}var q=require("@walkeros/core"),C=require("@walkeros/web-core"),L={},A=!1;function M(){A=!1}function D(e,n){const t=e.settings||{};if(A)return;if(!function(e,n){return!!(e&&Object.keys(e).length>0)||!!n.como_advanced}(e.consent,t))return;const o=E(t);if(!o)return;const{window:r}=(0,C.getEnv)(n),a=c(r);a&&(a("consent","default",o),A=!0)}var S={type:"google-gtag",calls:["call:window.gtag"],config:{settings:{}},init({config:e,env:n,logger:t}){const{settings:o={},loadScript:r}=e,{ga4:a,ads:s,gtm:u}=o;return(null==a?void 0:a.measurementId)||(null==s?void 0:s.conversionId)||(null==u?void 0:u.containerId)||t.throw("Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId"),D(e,n),(null==a?void 0:a.measurementId)&&function(e,n,t,o){const{window:r,document:a}=(0,d.getEnv)(t),{measurementId:s,transport_url:u,server_container_url:g,pageview:l}=e;s||o.throw("Config settings ga4.measurementId missing"),n&&i(s,void 0,a),c(r);const w={};u&&(w.transport_url=u),g&&(w.server_container_url=g),!1===l&&(w.send_page_view=!1);const f=r.gtag;f("js",new Date),f("config",s,w)}(a,r,n,t),(null==s?void 0:s.conversionId)&&function(e,n,t,o){const{window:r,document:a}=(0,f.getEnv)(t),{conversionId:s}=e;s||o.throw("Config settings ads.conversionId missing"),e.currency||(e.currency="EUR"),n&&i(s,void 0,a),c(r);const d=r.gtag;d("js",new Date),e.enhancedConversions?d("config",s,{allow_enhanced_conversions:!0}):d("config",s)}(s,r,n,t),(null==u?void 0:u.containerId)&&_(u,r,n),e},async push(e,{config:n,rule:t={},data:o,env:r,collector:a,logger:s}){const{settings:i={}}=n,{ga4:c,ads:d,gtm:g}=i,f=t.settings||{},b=await l(e,o,n,c,a),h=await l(e,o,n,d,a),_=await l(e,o,n,g,a);let O;(null==c?void 0:c.measurementId)&&function(e,n,t,o,r){const{window:a}=(0,w.getEnv)(o);n.measurementId||r.throw("Config settings ga4.measurementId missing");const s=(0,u.isObject)(t)?{...t}:{};let i=e.name;!1!==n.snakeCase&&(i=function(e,n=!0){return n?e.replace(/\s+/g,"_").toLowerCase():e}(i)),s.send_to=n.measurementId,n.debug&&(s.debug_mode=!0),(0,a.gtag)("event",i,s)}(e,c,b,r,s),(null==d?void 0:d.conversionId)&&(null==d?void 0:d.enhancedConversions)&&(O=await async function(e,n,t){const o=n.enhancedConversions;if(!o)return;const r={};if(o.email){const n=await(0,p.getMappingValue)(e,o.email,{collector:t});n&&(r.email=n)}if(o.phone_number){const n=await(0,p.getMappingValue)(e,o.phone_number,{collector:t});n&&(r.phone_number=n)}if(o.address){const n={};for(const[r,a]of Object.entries(o.address))if(a){const o=await(0,p.getMappingValue)(e,a,{collector:t});o&&(n[r]=o)}Object.keys(n).length>0&&(r.address=n)}return Object.keys(r).length>0?r:void 0}(e,d,a)),(null==d?void 0:d.conversionId)&&t.name&&function(e,n,t={},o,r,a,s,i){const{conversionId:c,currency:d}=n,u=(0,v.isObject)(o)?o:{},g=t.label||r;g||s.throw("Config mapping ads.label missing");const l={send_to:`${c}/${g}`,currency:d||"EUR",...u},{window:w}=(0,m.getEnv)(a),f=w.gtag;i&&f("set","user_data",i),f("event","conversion",l)}(0,d,f.ads,h,t.name,r,s,O),(null==g?void 0:g.containerId)&&function(e,n,t={},o,r){const{window:a}=(0,I.getEnv)(r),s={event:e.name},i=n.dataLayer||y,c=a[i],d=(0,j.isArray)(c)?c:[];a[i]=d,d.push({...s,...(0,j.isObject)(o)?o:e})}(e,g,f.gtm,_,r)},on(e,n){var t;if("consent"!==e||!(0,q.isObject)(n.data))return;const o=n.data,r=(null==(t=n.config)?void 0:t.settings)||{},a=k(r);if(!a)return;const{window:s}=(0,C.getEnv)(n.env),i=s.gtag;if(!i)return;if(!A){const e=E(r);e&&i("consent","default",e),A=!0}const c={};Object.entries(o).forEach(([e,n])=>{const t=a[e];if(!t)return;const o=Array.isArray(t)?t:[t],r=n?"granted":"denied";o.forEach(e=>{c[e]=r})}),0!==Object.keys(c).length&&i("consent","update",c)}},V=S;//# sourceMappingURL=index.js.map
1
+ "use strict";var e,n=Object.defineProperty,t=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,r=Object.prototype.hasOwnProperty,a={};((e,t)=>{for(var o in t)n(e,o,{get:t[o],enumerable:!0})})(a,{DestinationGtag:()=>L,default:()=>V,destinationGtag:()=>S,resetConsentState:()=>M}),module.exports=(e=a,((e,a,s,i)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of o(a))r.call(e,c)||c===s||n(e,c,{get:()=>a[c],enumerable:!(i=t(a,c))||i.enumerable});return e})(n({},"__esModule",{value:!0}),e));var s=new Set;function i(e,n="https://www.googletagmanager.com/gtag/js?id=",t=globalThis.document){if(s.has(e))return;const o=t.createElement("script");o.src=n+e,t.head.appendChild(o),s.add(e)}function c(e){const n=e;return n.dataLayer=n.dataLayer||[],n.gtag||(n.gtag=function(){n.dataLayer.push(arguments)}),n.gtag}var d=require("@walkeros/web-core");var u=require("@walkeros/core"),g=require("@walkeros/core");async function l(e,n,t,o,r){const a=(0,g.isObject)(n)?n:{},s=t.data?await(0,g.getMappingValue)(e,t.data,{collector:r}):{},i=(null==o?void 0:o.data)?await(0,g.getMappingValue)(e,o.data,{collector:r}):{},c=(0,g.isObject)(s)?s:{},d=(0,g.isObject)(i)?i:{};return(0,g.assign)((0,g.assign)(a,c),d)}var w=require("@walkeros/web-core");var f=require("@walkeros/web-core");var v=require("@walkeros/core"),m=require("@walkeros/web-core");var p=require("@walkeros/core");var b=require("@walkeros/core"),h=require("@walkeros/web-core"),y="dataLayer";function _(e,n,t,o){const{window:r,document:a}=(0,h.getEnv)(t),{containerId:s,dataLayer:i,domain:c}=e,d=i||y,u=r[d],g=(0,b.isArray)(u)?u:[];r[d]=g,g.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),n&&s&&function(e,n,t,o=globalThis.document){const r=t!=y?"&l="+t:"",a=o.createElement("script");a.src=n+e+r,o.head.appendChild(a)}(s,c||"https://www.googletagmanager.com/gtm.js?id=",d,a)}var j=require("@walkeros/core"),I=require("@walkeros/web-core");var O={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]};function k(e){const{como:n=!0}=e;if(!1!==n)return!0===n?O:n}function E(e){const n=k(e);if(!n)return;const t=function(e){const n=new Set;return Object.values(e).forEach(e=>{(Array.isArray(e)?e:[e]).forEach(e=>n.add(e))}),[...n]}(n);if(!t.length)return;const o={};t.forEach(e=>o[e]="denied");const{como_advanced:r}=e;return r&&(o.wait_for_update="number"==typeof r?r:500),o}var q=require("@walkeros/core"),C=require("@walkeros/web-core"),L={},A=!1;function M(){A=!1}function D(e,n){const t=e.settings||{};if(A)return;if(!function(e,n){return!!(e&&Object.keys(e).length>0)||!!n.como_advanced}(e.consent,t))return;const o=E(t);if(!o)return;const{window:r}=(0,C.getEnv)(n),a=c(r);a&&(a("consent","default",o),A=!0)}var S={type:"google-gtag",calls:["call:window.gtag"],config:{settings:{}},init({config:e,env:n,logger:t}){const{settings:o={},loadScript:r}=e,{ga4:a,ads:s,gtm:u}=o;return(null==a?void 0:a.measurementId)||(null==s?void 0:s.conversionId)||(null==u?void 0:u.containerId)||t.throw("Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId"),D(e,n),(null==a?void 0:a.measurementId)&&function(e,n,t,o){const{window:r,document:a}=(0,d.getEnv)(t),{measurementId:s,transport_url:u,server_container_url:g,pageview:l}=e;s||o.throw("Config settings ga4.measurementId missing"),n&&i(s,g?`${g.replace(/\/$/,"")}/gtag/js?id=`:void 0,a);c(r);const w={};u&&(w.transport_url=u),g&&(w.server_container_url=g),!1===l&&(w.send_page_view=!1);const f=r.gtag;f("js",new Date),f("config",s,w)}(a,r,n,t),(null==s?void 0:s.conversionId)&&function(e,n,t,o){const{window:r,document:a}=(0,f.getEnv)(t),{conversionId:s}=e;s||o.throw("Config settings ads.conversionId missing"),e.currency||(e.currency="EUR"),n&&i(s,void 0,a),c(r);const d=r.gtag;d("js",new Date),e.enhancedConversions?d("config",s,{allow_enhanced_conversions:!0}):d("config",s)}(s,r,n,t),(null==u?void 0:u.containerId)&&_(u,r,n),e},async push(e,{config:n,rule:t={},data:o,env:r,collector:a,logger:s}){const{settings:i={}}=n,{ga4:c,ads:d,gtm:g}=i,f=t.settings||{},b=await l(e,o,n,c,a),h=await l(e,o,n,d,a),_=await l(e,o,n,g,a);let O;(null==c?void 0:c.measurementId)&&function(e,n,t,o,r){const{window:a}=(0,w.getEnv)(o);n.measurementId||r.throw("Config settings ga4.measurementId missing");const s=(0,u.isObject)(t)?{...t}:{};let i=e.name;!1!==n.snakeCase&&(i=function(e,n=!0){return n?e.replace(/\s+/g,"_").toLowerCase():e}(i)),s.send_to=n.measurementId,n.debug&&(s.debug_mode=!0),(0,a.gtag)("event",i,s)}(e,c,b,r,s),(null==d?void 0:d.conversionId)&&(null==d?void 0:d.enhancedConversions)&&(O=await async function(e,n,t){const o=n.enhancedConversions;if(!o)return;const r={};if(o.email){const n=await(0,p.getMappingValue)(e,o.email,{collector:t});n&&(r.email=n)}if(o.phone_number){const n=await(0,p.getMappingValue)(e,o.phone_number,{collector:t});n&&(r.phone_number=n)}if(o.address){const n={};for(const[r,a]of Object.entries(o.address))if(a){const o=await(0,p.getMappingValue)(e,a,{collector:t});o&&(n[r]=o)}Object.keys(n).length>0&&(r.address=n)}return Object.keys(r).length>0?r:void 0}(e,d,a)),(null==d?void 0:d.conversionId)&&t.name&&function(e,n,t={},o,r,a,s,i){const{conversionId:c,currency:d}=n,u=(0,v.isObject)(o)?o:{},g=t.label||r;g||s.throw("Config mapping ads.label missing");const l={send_to:`${c}/${g}`,currency:d||"EUR",...u},{window:w}=(0,m.getEnv)(a),f=w.gtag;i&&f("set","user_data",i),f("event","conversion",l)}(0,d,f.ads,h,t.name,r,s,O),(null==g?void 0:g.containerId)&&function(e,n,t={},o,r){const{window:a}=(0,I.getEnv)(r),s={event:e.name},i=n.dataLayer||y,c=a[i],d=(0,j.isArray)(c)?c:[];a[i]=d,d.push({...s,...(0,j.isObject)(o)?o:e})}(e,g,f.gtm,_,r)},on(e,n){var t;if("consent"!==e||!(0,q.isObject)(n.data))return;const o=n.data,r=(null==(t=n.config)?void 0:t.settings)||{},a=k(r);if(!a)return;const{window:s}=(0,C.getEnv)(n.env),i=s.gtag;if(!i)return;if(!A){const e=E(r);e&&i("consent","default",e),A=!0}const c={};Object.entries(o).forEach(([e,n])=>{const t=a[e];if(!t)return;const o=Array.isArray(t)?t:[t],r=n?"granted":"denied";o.forEach(e=>{c[e]=r})}),0!==Object.keys(c).length&&i("consent","update",c)}},V=S;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/shared/gtag.ts","../src/ga4/config.ts","../src/ga4/push.ts","../src/shared/mapping.ts","../src/ads/config.ts","../src/ads/push.ts","../src/ads/userData.ts","../src/gtm/config.ts","../src/gtm/push.ts","../src/shared/consent.ts","../src/types/index.ts"],"sourcesContent":["import type { WalkerOS, On, Collector, Logger } from '@walkeros/core';\nimport type { Settings, Destination, Env, Config } from './types';\nimport { initGA4, pushGA4Event } from './ga4';\nimport { initAds, pushAdsEvent, resolveUserData } from './ads';\nimport { initGTM, pushGTMEvent } from './gtm';\nimport { getData } from './shared/mapping';\nimport {\n buildDefaultConsent,\n hasConsentSignal,\n resolveConsentMapping,\n} from './shared/consent';\nimport { initializeGtag } from './shared/gtag';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\n// Types\nexport * as DestinationGtag from './types';\n\n// Track whether default consent has been set\nlet defaultConsentSet = false;\n\n// For testing: allow resetting consent state\nexport function resetConsentState(): void {\n defaultConsentSet = false;\n}\n\n// Establish the Consent Mode v2 denied baseline BEFORE any tool's config call,\n// per Google's required ordering. Gated on the destination's OWN config: a\n// consent signal (config.consent set, or como_advanced) and como !== false.\n// Idempotent via defaultConsentSet (consent state is window-global).\nfunction setupConsentDefault(config: Config, env: Env | undefined): void {\n const settings = config.settings || {};\n if (defaultConsentSet) return;\n if (!hasConsentSignal(config.consent, settings)) return;\n\n const defaultConsent = buildDefaultConsent(settings);\n if (!defaultConsent) return; // como:false or no params\n\n const { window } = getEnv<Env>(env);\n const gtag = initializeGtag(window); // ensure stub exists before any config\n if (!gtag) return;\n\n gtag('consent', 'default', defaultConsent);\n defaultConsentSet = true;\n}\n\nexport const destinationGtag: Destination = {\n type: 'google-gtag',\n\n // Observable env callable for trace-level vendor-call capture. Mirrors the\n // dev-env simulation list (src/examples/env.ts).\n calls: ['call:window.gtag'],\n\n config: { settings: {} },\n\n init({ config, env, logger }) {\n const { settings = {}, loadScript } = config;\n const { ga4, ads, gtm } = settings;\n\n // Fail if no tools are configured\n if (!ga4?.measurementId && !ads?.conversionId && !gtm?.containerId) {\n logger.throw(\n 'Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId',\n );\n }\n\n // Emit the denied consent default before any tool's config call.\n setupConsentDefault(config, env);\n\n // Initialize GA4 if configured\n if (ga4?.measurementId) {\n initGA4(ga4, loadScript, env, logger);\n }\n\n // Initialize Google Ads if configured\n if (ads?.conversionId) {\n initAds(ads, loadScript, env, logger);\n }\n\n // Initialize GTM if configured\n if (gtm?.containerId) {\n initGTM(gtm, loadScript, env, logger);\n }\n\n return config;\n },\n\n async push(event, { config, rule = {}, data, env, collector, logger }) {\n const { settings = {} } = config;\n const { ga4, ads, gtm } = settings;\n const eventMapping = rule.settings || {};\n\n // Resolve data for each tool with proper priority\n const ga4Data = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n ga4,\n collector,\n );\n const adsData = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n ads,\n collector,\n );\n const gtmData = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n gtm,\n collector,\n );\n\n // Push to GA4 if configured\n if (ga4?.measurementId) {\n pushGA4Event(event, ga4, ga4Data, env, logger);\n }\n\n // Resolve enhanced conversions user data if configured\n let adsUserData: Record<string, unknown> | undefined;\n if (ads?.conversionId && ads?.enhancedConversions) {\n adsUserData = await resolveUserData(event, ads, collector);\n }\n\n // @TODO: Fix condition - should check for rule.settings?.ads?.label || rule.name\n // Currently requires rule.name even when label is provided via settings.ads.label\n if (ads?.conversionId && rule.name) {\n pushAdsEvent(\n event,\n ads,\n eventMapping.ads,\n adsData,\n rule.name,\n env,\n logger,\n adsUserData,\n );\n }\n\n // Push to GTM if configured\n if (gtm?.containerId) {\n pushGTMEvent(event, gtm, eventMapping.gtm, gtmData, env, logger);\n }\n },\n\n on(type, context) {\n // Only handle consent events\n if (type !== 'consent' || !isObject(context.data)) return;\n\n const consent = context.data;\n // `on` runs with the runtime (non-generic) context, so config.settings and\n // env surface as the loose base types. Narrowing them to this destination's\n // own Settings/Env needs a core-types change to make `on` generic over\n // Types; tracked as a follow-up. The two `as` casts mark that boundary.\n const settings = (context.config?.settings || {}) as Partial<Settings>;\n\n // Skip if consent mode is disabled (como === false)\n const mapping = resolveConsentMapping(settings);\n if (!mapping) return;\n\n // gtag is available after init() - on() is only called after init completes\n const { window } = getEnv<Env>(context.env as Env);\n const gtag = window.gtag;\n if (!gtag) return;\n\n // Safety net for setups that fire consent without init having seen a signal:\n // establish the denied default once before the first update.\n if (!defaultConsentSet) {\n const defaultConsent = buildDefaultConsent(settings);\n if (defaultConsent) gtag('consent', 'default', defaultConsent);\n defaultConsentSet = true;\n }\n\n // Build gtag consent object for update\n const gtagConsent: Record<string, 'granted' | 'denied'> = {};\n\n // Map walkerOS consent to gtag consent parameters for update\n Object.entries(consent).forEach(([walkerOSGroup, granted]) => {\n const gtagParams = mapping[walkerOSGroup];\n if (!gtagParams) return;\n\n const params = Array.isArray(gtagParams) ? gtagParams : [gtagParams];\n const consentValue = granted ? 'granted' : 'denied';\n\n params.forEach((param) => {\n gtagConsent[param] = consentValue;\n });\n });\n\n // Only proceed if we have consent parameters to update\n if (Object.keys(gtagConsent).length === 0) return;\n\n // Always use update after the initial default\n gtag('consent', 'update', gtagConsent);\n },\n};\n\nexport default destinationGtag;\n","// Gtag script loading and initialization utilities\n\nimport type { WindowWithDataLayer } from '../types';\n\nconst loadedScripts = new Set<string>();\n\n// For testing: allow resetting loaded scripts\nexport function resetLoadedScripts(): void {\n loadedScripts.clear();\n}\n\nexport function addScript(\n id: string,\n src = 'https://www.googletagmanager.com/gtag/js?id=',\n document: Document = globalThis.document,\n): void {\n // Prevent loading the same script multiple times\n if (loadedScripts.has(id)) return;\n\n const script = document.createElement('script');\n script.src = src + id;\n document.head.appendChild(script);\n loadedScripts.add(id);\n}\n\nexport function initializeGtag(\n window: WindowWithDataLayer,\n): Gtag.Gtag | undefined {\n const w = window;\n\n // Setup dataLayer if not exists\n w.dataLayer = w.dataLayer || [];\n\n // Setup gtag function if not exists\n if (!w.gtag) {\n w.gtag = function () {\n w.dataLayer.push(arguments);\n };\n }\n\n return w.gtag;\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GA4Settings, Env } from '../types';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initGA4(\n settings: GA4Settings,\n loadScript: boolean | undefined,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { measurementId, transport_url, server_container_url, pageview } =\n settings;\n\n if (!measurementId) logger.throw('Config settings ga4.measurementId missing');\n\n // Load the gtag script\n if (loadScript) addScript(measurementId, undefined, document);\n\n // Initialize gtag infrastructure\n initializeGtag(window);\n\n const gtagSettings: WalkerOS.AnyObject = {};\n\n // custom transport_url\n if (transport_url) gtagSettings.transport_url = transport_url;\n\n // custom server_container_url\n if (server_container_url)\n gtagSettings.server_container_url = server_container_url;\n\n // disable pageviews\n if (pageview === false) gtagSettings.send_page_view = false;\n\n const gtag = window.gtag!;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', measurementId, gtagSettings);\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GA4Settings, Parameters, Env } from '../types';\nimport { isObject } from '@walkeros/core';\nimport { normalizeEventName } from '../shared/mapping';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushGA4Event(\n event: WalkerOS.Event,\n settings: GA4Settings,\n data: WalkerOS.AnyObject,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window } = getEnv<Env>(env);\n\n if (!settings.measurementId)\n logger.throw('Config settings ga4.measurementId missing');\n\n const eventParams: Parameters = isObject(data) ? { ...data } : {};\n\n // Event name (snake_case default)\n let eventName = event.name; // Assume custom mapped name\n if (settings.snakeCase !== false) {\n // Use snake case if not disabled\n eventName = normalizeEventName(eventName);\n }\n\n // Set the GA4 stream id\n eventParams.send_to = settings.measurementId;\n\n // Debug mode\n if (settings.debug) eventParams.debug_mode = true;\n\n const gtag = window.gtag!;\n gtag('event', eventName, eventParams);\n}\n","// Shared mapping utilities for all Google tools\nimport type { WalkerOS, Collector } from '@walkeros/core';\nimport { getMappingValue, assign, isObject } from '@walkeros/core';\nimport type { BaseSettings, Config } from '../types';\n\nexport function normalizeEventName(\n eventName: string,\n snakeCase = true,\n): string {\n if (!snakeCase) return eventName;\n\n return eventName.replace(/\\s+/g, '_').toLowerCase();\n}\n\nexport async function getData(\n event: WalkerOS.Event,\n data: WalkerOS.AnyObject | undefined,\n config: Config,\n toolSettings: BaseSettings | undefined,\n collector: Collector.Instance,\n): Promise<WalkerOS.AnyObject> {\n const baseData = isObject(data) ? data : {};\n\n // Get config-level mapped data\n const configMappedData = config.data\n ? await getMappingValue(event, config.data, { collector })\n : {};\n\n // Get tool-specific mapped data\n const toolMappedData = toolSettings?.data\n ? await getMappingValue(event, toolSettings.data, { collector })\n : {};\n\n // Ensure all values are objects before merging\n const configData = isObject(configMappedData) ? configMappedData : {};\n const toolData = isObject(toolMappedData) ? toolMappedData : {};\n\n // Merge with proper priority: base <- config <- tool\n return assign(assign(baseData, configData), toolData);\n}\n","import type { Logger } from '@walkeros/core';\nimport type { AdsSettings, Env } from '../types';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initAds(\n settings: AdsSettings,\n loadScript: boolean | undefined,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { conversionId } = settings;\n\n if (!conversionId) logger.throw('Config settings ads.conversionId missing');\n\n // Default currency value\n if (!settings.currency) settings.currency = 'EUR';\n\n if (loadScript) addScript(conversionId, undefined, document);\n\n // Initialize gtag infrastructure\n initializeGtag(window);\n\n const gtag = window.gtag!;\n gtag('js', new Date());\n\n // gtag init call\n if (settings.enhancedConversions) {\n gtag('config', conversionId, { allow_enhanced_conversions: true });\n } else {\n gtag('config', conversionId);\n }\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { AdsSettings, AdsMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushAdsEvent(\n event: WalkerOS.Event,\n settings: AdsSettings,\n mapping: AdsMapping = {},\n data: unknown,\n mappingName: string | undefined,\n env: DestinationWeb.Env | undefined,\n logger: Logger.Instance,\n userData?: Record<string, unknown>,\n): void {\n const { conversionId, currency } = settings;\n const eventData = isObject(data) ? data : {};\n\n // Use label from mapping settings, fallback to mappingName for backward compatibility\n const conversionLabel = mapping.label || mappingName;\n if (!conversionLabel) logger.throw('Config mapping ads.label missing');\n\n const params: Gtag.CustomParams = {\n send_to: `${conversionId}/${conversionLabel}`,\n currency: currency || 'EUR',\n ...eventData,\n };\n\n const { window } = getEnv(env);\n const gtag = window.gtag as Gtag.Gtag;\n\n // Set user data for enhanced conversions (must be before conversion event)\n if (userData) {\n gtag('set', 'user_data', userData);\n }\n\n gtag('event', 'conversion', params);\n}\n","import type { WalkerOS, Collector } from '@walkeros/core';\nimport { getMappingValue } from '@walkeros/core';\nimport type { AdsSettings } from '../types';\n\n/**\n * Resolves user data for Google Enhanced Conversions.\n *\n * enhancedConversions is a UserDataMapping: each field is a mapping value\n * resolved against the event via getMappingValue. Map from event.user\n * (like `user.email`), event.data, or anywhere a mapping value can reach.\n *\n * Returns undefined if no enhanced conversions configured or no user\n * data resolved (the set user_data call should be skipped in that case).\n */\nexport async function resolveUserData(\n event: WalkerOS.Event,\n settings: AdsSettings,\n collector: Collector.Instance,\n): Promise<Record<string, unknown> | undefined> {\n const ec = settings.enhancedConversions;\n if (!ec) return undefined;\n\n const userData: Record<string, unknown> = {};\n\n if (ec.email) {\n const val = await getMappingValue(event, ec.email, { collector });\n if (val) userData.email = val;\n }\n if (ec.phone_number) {\n const val = await getMappingValue(event, ec.phone_number, { collector });\n if (val) userData.phone_number = val;\n }\n if (ec.address) {\n const address: Record<string, unknown> = {};\n for (const [key, mapping] of Object.entries(ec.address)) {\n if (mapping) {\n const val = await getMappingValue(event, mapping, { collector });\n if (val) address[key] = val;\n }\n }\n if (Object.keys(address).length > 0) userData.address = address;\n }\n\n return Object.keys(userData).length > 0 ? userData : undefined;\n}\n","import type { Logger } from '@walkeros/core';\nimport type { GTMSettings, Env } from '../types';\nimport { isArray } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport const defaultDataLayer = 'dataLayer';\nconst defaultDomain = 'https://www.googletagmanager.com/gtm.js?id=';\n\nexport function initGTM(\n settings: GTMSettings,\n loadScript?: boolean,\n env?: Env,\n _logger?: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { containerId, dataLayer, domain } = settings;\n const dataLayerName = dataLayer || defaultDataLayer;\n\n // Initialize the dataLayer (default or custom name). Custom names resolve\n // through Window's index signature as `unknown`, so narrow before reuse.\n const existing = window[dataLayerName];\n const dataLayerArray: unknown[] = isArray(existing) ? existing : [];\n window[dataLayerName] = dataLayerArray;\n\n dataLayerArray.push({\n 'gtm.start': new Date().getTime(),\n event: 'gtm.js',\n });\n\n // Load the gtm script and container\n if (loadScript && containerId)\n addScript(containerId, domain || defaultDomain, dataLayerName, document);\n}\n\nfunction addScript(\n containerId: string,\n src: string,\n dataLayerName: string,\n document: Document = globalThis.document,\n) {\n const dl = dataLayerName != defaultDataLayer ? '&l=' + dataLayerName : '';\n const script = document.createElement('script');\n script.src = src + containerId + dl;\n document.head.appendChild(script);\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GTMSettings, GTMMapping, Env } from '../types';\nimport { isArray, isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\nimport { defaultDataLayer } from './config';\n\nexport function pushGTMEvent(\n event: WalkerOS.Event,\n settings: GTMSettings,\n mapping: GTMMapping = {},\n data: unknown,\n env?: Env,\n _logger?: Logger.Instance,\n): void {\n const { window } = getEnv<Env>(env);\n const obj = { event: event.name }; // Use the name mapping by default\n\n const dataLayerName = settings.dataLayer || defaultDataLayer;\n const existing = window[dataLayerName];\n const dataLayerArray: unknown[] = isArray(existing) ? existing : [];\n window[dataLayerName] = dataLayerArray;\n\n dataLayerArray.push({\n ...obj,\n ...(isObject(data) ? data : event),\n });\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { ConsentMapping, Settings } from '../types';\n\n// walkerOS consent groups -> gtag consent parameters\nexport const DEFAULT_CONSENT_MAPPING: ConsentMapping = {\n marketing: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n functional: ['analytics_storage'],\n};\n\nconst DEFAULT_WAIT_FOR_UPDATE = 500;\n\n/** Resolve the active mapping, or undefined when consent mode is disabled. */\nexport function resolveConsentMapping(\n settings: Partial<Settings>,\n): ConsentMapping | undefined {\n const { como = true } = settings;\n if (como === false) return undefined;\n return como === true ? DEFAULT_CONSENT_MAPPING : como;\n}\n\n/** Flatten a mapping to the unique set of gtag parameter names. */\nexport function collectGtagParams(mapping: ConsentMapping): string[] {\n const params = new Set<string>();\n Object.values(mapping).forEach((value) => {\n (Array.isArray(value) ? value : [value]).forEach((p) => params.add(p));\n });\n return [...params];\n}\n\n/**\n * Build the `consent default` object (all params denied), or undefined when\n * consent mode is disabled or the mapping yields no params. Adds\n * `wait_for_update` when `como_advanced` is truthy.\n */\nexport function buildDefaultConsent(\n settings: Partial<Settings>,\n): Record<string, 'denied' | number> | undefined {\n const mapping = resolveConsentMapping(settings);\n if (!mapping) return undefined;\n\n const params = collectGtagParams(mapping);\n if (!params.length) return undefined;\n\n const result: Record<string, 'denied' | number> = {};\n params.forEach((p) => (result[p] = 'denied'));\n\n const { como_advanced } = settings;\n if (como_advanced)\n result.wait_for_update =\n typeof como_advanced === 'number'\n ? como_advanced\n : DEFAULT_WAIT_FOR_UPDATE;\n\n return result;\n}\n\n/**\n * Is consent genuinely in play, decided from the destination's OWN config only?\n * config.consent set (basic/gated) or como_advanced truthy (advanced). Never\n * reads collector state, and never config.require (consumed by the collector\n * before init runs).\n */\nexport function hasConsentSignal(\n configConsent: WalkerOS.Consent | undefined,\n settings: Partial<Settings>,\n): boolean {\n if (configConsent && Object.keys(configConsent).length > 0) return true;\n return !!settings.como_advanced;\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\n// Extend Window interface with specific dataLayer typing\nexport interface WindowWithDataLayer extends Window {\n dataLayer: unknown[];\n gtag?: Gtag.Gtag;\n [key: string]: unknown; // For custom dataLayer names and other properties\n}\n\ndeclare global {\n interface Window {\n gtag?: Gtag.Gtag;\n [key: string]: unknown; // For custom dataLayer names and other properties\n }\n}\n\n// Gtag-specific environment interface\nexport interface Env extends DestinationWeb.Env {\n window: {\n // Optional: the SDK global is absent until `initializeGtag` installs it.\n gtag?: Gtag.Gtag;\n dataLayer: unknown[];\n };\n document: {\n createElement: (tagName: string) => {\n src: string;\n async?: boolean;\n setAttribute: (name: string, value: string) => void;\n removeAttribute: (name: string) => void;\n };\n head: {\n appendChild: (node: unknown) => void;\n };\n };\n}\n\n// Consent mode configuration\nexport type ConsentMode =\n | false // Disable consent mode\n | true // Use default mapping\n | ConsentMapping; // Custom mapping\n\nexport interface ConsentMapping {\n [walkerOSConsentGroup: string]: string | string[];\n}\n\n// Type bundle\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport type Destination = DestinationWeb.Destination<Types>;\nexport type Config = DestinationWeb.Config<Types>;\n\n// Base settings interface with data field\nexport interface BaseSettings {\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n}\n\n// Unified settings for all Google tools\nexport interface Settings {\n // Consent mode configuration\n como?: ConsentMode;\n // Advanced consent mode (non-EU): emit the denied default at page load and\n // add `wait_for_update`. `true` => wait_for_update: 500; a number sets the ms.\n // Leave unset for basic mode (the EU-safe default).\n como_advanced?: boolean | number;\n // GA4 settings\n ga4?: GA4Settings;\n // Google Ads settings\n ads?: AdsSettings;\n // GTM settings\n gtm?: GTMSettings;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\n// GA4-specific settings\nexport interface GA4Settings extends BaseSettings {\n measurementId: string;\n debug?: boolean;\n pageview?: boolean;\n server_container_url?: string;\n snakeCase?: boolean;\n transport_url?: string;\n}\n\n// Google Ads specific settings\nexport interface AdsSettings extends BaseSettings {\n conversionId: string;\n currency?: string;\n /** Enhanced conversions: maps walkerOS event fields to Google user_data fields. */\n enhancedConversions?: UserDataMapping;\n}\n\nexport interface UserDataMapping {\n email?: WalkerOSMapping.Value;\n phone_number?: WalkerOSMapping.Value;\n address?: {\n first_name?: WalkerOSMapping.Value;\n last_name?: WalkerOSMapping.Value;\n street?: WalkerOSMapping.Value;\n city?: WalkerOSMapping.Value;\n region?: WalkerOSMapping.Value;\n postal_code?: WalkerOSMapping.Value;\n country?: WalkerOSMapping.Value;\n };\n}\n\n// Google Ads specific mapping\nexport interface AdsMapping {\n label?: string; // Conversion label for this specific event\n}\n\n// GTM specific settings\nexport interface GTMSettings extends BaseSettings {\n containerId: string;\n dataLayer?: string;\n domain?: string;\n}\n\n// Unified mapping interface\nexport interface Mapping {\n ga4?: GA4Mapping;\n ads?: AdsMapping;\n gtm?: GTMMapping;\n}\n\n// GA4-specific mapping\nexport interface GA4Mapping {}\n\n// GTM specific mapping\nexport interface GTMMapping {}\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\nexport type Param = WalkerOSMapping.Value;\n\nexport type Parameters = Gtag.ControlParams &\n Gtag.EventParams &\n Gtag.CustomParams;\n"],"mappings":"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","names":["import_core","import_web_core","import_web_core","import_core","import_web_core","import_core","import_core","import_web_core","addScript","import_core","import_web_core","import_core","import_web_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/shared/gtag.ts","../src/ga4/config.ts","../src/ga4/push.ts","../src/shared/mapping.ts","../src/ads/config.ts","../src/ads/push.ts","../src/ads/userData.ts","../src/gtm/config.ts","../src/gtm/push.ts","../src/shared/consent.ts","../src/types/index.ts"],"sourcesContent":["import type { WalkerOS, On, Collector, Logger } from '@walkeros/core';\nimport type { Settings, Destination, Env, Config } from './types';\nimport { initGA4, pushGA4Event } from './ga4';\nimport { initAds, pushAdsEvent, resolveUserData } from './ads';\nimport { initGTM, pushGTMEvent } from './gtm';\nimport { getData } from './shared/mapping';\nimport {\n buildDefaultConsent,\n hasConsentSignal,\n resolveConsentMapping,\n} from './shared/consent';\nimport { initializeGtag } from './shared/gtag';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\n// Types\nexport * as DestinationGtag from './types';\n\n// Track whether default consent has been set\nlet defaultConsentSet = false;\n\n// For testing: allow resetting consent state\nexport function resetConsentState(): void {\n defaultConsentSet = false;\n}\n\n// Establish the Consent Mode v2 denied baseline BEFORE any tool's config call,\n// per Google's required ordering. Gated on the destination's OWN config: a\n// consent signal (config.consent set, or como_advanced) and como !== false.\n// Idempotent via defaultConsentSet (consent state is window-global).\nfunction setupConsentDefault(config: Config, env: Env | undefined): void {\n const settings = config.settings || {};\n if (defaultConsentSet) return;\n if (!hasConsentSignal(config.consent, settings)) return;\n\n const defaultConsent = buildDefaultConsent(settings);\n if (!defaultConsent) return; // como:false or no params\n\n const { window } = getEnv<Env>(env);\n const gtag = initializeGtag(window); // ensure stub exists before any config\n if (!gtag) return;\n\n gtag('consent', 'default', defaultConsent);\n defaultConsentSet = true;\n}\n\nexport const destinationGtag: Destination = {\n type: 'google-gtag',\n\n // Observable env callable for trace-level vendor-call capture. Mirrors the\n // dev-env simulation list (src/examples/env.ts).\n calls: ['call:window.gtag'],\n\n config: { settings: {} },\n\n init({ config, env, logger }) {\n const { settings = {}, loadScript } = config;\n const { ga4, ads, gtm } = settings;\n\n // Fail if no tools are configured\n if (!ga4?.measurementId && !ads?.conversionId && !gtm?.containerId) {\n logger.throw(\n 'Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId',\n );\n }\n\n // Emit the denied consent default before any tool's config call.\n setupConsentDefault(config, env);\n\n // Initialize GA4 if configured\n if (ga4?.measurementId) {\n initGA4(ga4, loadScript, env, logger);\n }\n\n // Initialize Google Ads if configured\n if (ads?.conversionId) {\n initAds(ads, loadScript, env, logger);\n }\n\n // Initialize GTM if configured\n if (gtm?.containerId) {\n initGTM(gtm, loadScript, env, logger);\n }\n\n return config;\n },\n\n async push(event, { config, rule = {}, data, env, collector, logger }) {\n const { settings = {} } = config;\n const { ga4, ads, gtm } = settings;\n const eventMapping = rule.settings || {};\n\n // Resolve data for each tool with proper priority\n const ga4Data = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n ga4,\n collector,\n );\n const adsData = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n ads,\n collector,\n );\n const gtmData = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n gtm,\n collector,\n );\n\n // Push to GA4 if configured\n if (ga4?.measurementId) {\n pushGA4Event(event, ga4, ga4Data, env, logger);\n }\n\n // Resolve enhanced conversions user data if configured\n let adsUserData: Record<string, unknown> | undefined;\n if (ads?.conversionId && ads?.enhancedConversions) {\n adsUserData = await resolveUserData(event, ads, collector);\n }\n\n // @TODO: Fix condition - should check for rule.settings?.ads?.label || rule.name\n // Currently requires rule.name even when label is provided via settings.ads.label\n if (ads?.conversionId && rule.name) {\n pushAdsEvent(\n event,\n ads,\n eventMapping.ads,\n adsData,\n rule.name,\n env,\n logger,\n adsUserData,\n );\n }\n\n // Push to GTM if configured\n if (gtm?.containerId) {\n pushGTMEvent(event, gtm, eventMapping.gtm, gtmData, env, logger);\n }\n },\n\n on(type, context) {\n // Only handle consent events\n if (type !== 'consent' || !isObject(context.data)) return;\n\n const consent = context.data;\n // `on` runs with the runtime (non-generic) context, so config.settings and\n // env surface as the loose base types. Narrowing them to this destination's\n // own Settings/Env needs a core-types change to make `on` generic over\n // Types; tracked as a follow-up. The two `as` casts mark that boundary.\n const settings = (context.config?.settings || {}) as Partial<Settings>;\n\n // Skip if consent mode is disabled (como === false)\n const mapping = resolveConsentMapping(settings);\n if (!mapping) return;\n\n // gtag is available after init() - on() is only called after init completes\n const { window } = getEnv<Env>(context.env as Env);\n const gtag = window.gtag;\n if (!gtag) return;\n\n // Safety net for setups that fire consent without init having seen a signal:\n // establish the denied default once before the first update.\n if (!defaultConsentSet) {\n const defaultConsent = buildDefaultConsent(settings);\n if (defaultConsent) gtag('consent', 'default', defaultConsent);\n defaultConsentSet = true;\n }\n\n // Build gtag consent object for update\n const gtagConsent: Record<string, 'granted' | 'denied'> = {};\n\n // Map walkerOS consent to gtag consent parameters for update\n Object.entries(consent).forEach(([walkerOSGroup, granted]) => {\n const gtagParams = mapping[walkerOSGroup];\n if (!gtagParams) return;\n\n const params = Array.isArray(gtagParams) ? gtagParams : [gtagParams];\n const consentValue = granted ? 'granted' : 'denied';\n\n params.forEach((param) => {\n gtagConsent[param] = consentValue;\n });\n });\n\n // Only proceed if we have consent parameters to update\n if (Object.keys(gtagConsent).length === 0) return;\n\n // Always use update after the initial default\n gtag('consent', 'update', gtagConsent);\n },\n};\n\nexport default destinationGtag;\n","// Gtag script loading and initialization utilities\n\nimport type { WindowWithDataLayer } from '../types';\n\nconst loadedScripts = new Set<string>();\n\n// For testing: allow resetting loaded scripts\nexport function resetLoadedScripts(): void {\n loadedScripts.clear();\n}\n\nexport function addScript(\n id: string,\n src = 'https://www.googletagmanager.com/gtag/js?id=',\n document: Document = globalThis.document,\n): void {\n // Prevent loading the same script multiple times\n if (loadedScripts.has(id)) return;\n\n const script = document.createElement('script');\n script.src = src + id;\n document.head.appendChild(script);\n loadedScripts.add(id);\n}\n\nexport function initializeGtag(\n window: WindowWithDataLayer,\n): Gtag.Gtag | undefined {\n const w = window;\n\n // Setup dataLayer if not exists\n w.dataLayer = w.dataLayer || [];\n\n // Setup gtag function if not exists\n if (!w.gtag) {\n w.gtag = function () {\n w.dataLayer.push(arguments);\n };\n }\n\n return w.gtag;\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GA4Settings, Env } from '../types';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initGA4(\n settings: GA4Settings,\n loadScript: boolean | undefined,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { measurementId, transport_url, server_container_url, pageview } =\n settings;\n\n if (!measurementId) logger.throw('Config settings ga4.measurementId missing');\n\n // Load the gtag script. With a GA4 server container configured, load gtag.js\n // first-party from that container instead of googletagmanager.com.\n if (loadScript) {\n const src = server_container_url\n ? `${server_container_url.replace(/\\/$/, '')}/gtag/js?id=`\n : undefined;\n addScript(measurementId, src, document);\n }\n\n // Initialize gtag infrastructure\n initializeGtag(window);\n\n const gtagSettings: WalkerOS.AnyObject = {};\n\n // custom transport_url\n if (transport_url) gtagSettings.transport_url = transport_url;\n\n // custom server_container_url\n if (server_container_url)\n gtagSettings.server_container_url = server_container_url;\n\n // disable pageviews\n if (pageview === false) gtagSettings.send_page_view = false;\n\n const gtag = window.gtag!;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', measurementId, gtagSettings);\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GA4Settings, Parameters, Env } from '../types';\nimport { isObject } from '@walkeros/core';\nimport { normalizeEventName } from '../shared/mapping';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushGA4Event(\n event: WalkerOS.Event,\n settings: GA4Settings,\n data: WalkerOS.AnyObject,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window } = getEnv<Env>(env);\n\n if (!settings.measurementId)\n logger.throw('Config settings ga4.measurementId missing');\n\n const eventParams: Parameters = isObject(data) ? { ...data } : {};\n\n // Event name (snake_case default)\n let eventName = event.name; // Assume custom mapped name\n if (settings.snakeCase !== false) {\n // Use snake case if not disabled\n eventName = normalizeEventName(eventName);\n }\n\n // Set the GA4 stream id\n eventParams.send_to = settings.measurementId;\n\n // Debug mode\n if (settings.debug) eventParams.debug_mode = true;\n\n const gtag = window.gtag!;\n gtag('event', eventName, eventParams);\n}\n","// Shared mapping utilities for all Google tools\nimport type { WalkerOS, Collector } from '@walkeros/core';\nimport { getMappingValue, assign, isObject } from '@walkeros/core';\nimport type { BaseSettings, Config } from '../types';\n\nexport function normalizeEventName(\n eventName: string,\n snakeCase = true,\n): string {\n if (!snakeCase) return eventName;\n\n return eventName.replace(/\\s+/g, '_').toLowerCase();\n}\n\nexport async function getData(\n event: WalkerOS.Event,\n data: WalkerOS.AnyObject | undefined,\n config: Config,\n toolSettings: BaseSettings | undefined,\n collector: Collector.Instance,\n): Promise<WalkerOS.AnyObject> {\n const baseData = isObject(data) ? data : {};\n\n // Get config-level mapped data\n const configMappedData = config.data\n ? await getMappingValue(event, config.data, { collector })\n : {};\n\n // Get tool-specific mapped data\n const toolMappedData = toolSettings?.data\n ? await getMappingValue(event, toolSettings.data, { collector })\n : {};\n\n // Ensure all values are objects before merging\n const configData = isObject(configMappedData) ? configMappedData : {};\n const toolData = isObject(toolMappedData) ? toolMappedData : {};\n\n // Merge with proper priority: base <- config <- tool\n return assign(assign(baseData, configData), toolData);\n}\n","import type { Logger } from '@walkeros/core';\nimport type { AdsSettings, Env } from '../types';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initAds(\n settings: AdsSettings,\n loadScript: boolean | undefined,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { conversionId } = settings;\n\n if (!conversionId) logger.throw('Config settings ads.conversionId missing');\n\n // Default currency value\n if (!settings.currency) settings.currency = 'EUR';\n\n if (loadScript) addScript(conversionId, undefined, document);\n\n // Initialize gtag infrastructure\n initializeGtag(window);\n\n const gtag = window.gtag!;\n gtag('js', new Date());\n\n // gtag init call\n if (settings.enhancedConversions) {\n gtag('config', conversionId, { allow_enhanced_conversions: true });\n } else {\n gtag('config', conversionId);\n }\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { AdsSettings, AdsMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushAdsEvent(\n event: WalkerOS.Event,\n settings: AdsSettings,\n mapping: AdsMapping = {},\n data: unknown,\n mappingName: string | undefined,\n env: DestinationWeb.Env | undefined,\n logger: Logger.Instance,\n userData?: Record<string, unknown>,\n): void {\n const { conversionId, currency } = settings;\n const eventData = isObject(data) ? data : {};\n\n // Use label from mapping settings, fallback to mappingName for backward compatibility\n const conversionLabel = mapping.label || mappingName;\n if (!conversionLabel) logger.throw('Config mapping ads.label missing');\n\n const params: Gtag.CustomParams = {\n send_to: `${conversionId}/${conversionLabel}`,\n currency: currency || 'EUR',\n ...eventData,\n };\n\n const { window } = getEnv(env);\n const gtag = window.gtag as Gtag.Gtag;\n\n // Set user data for enhanced conversions (must be before conversion event)\n if (userData) {\n gtag('set', 'user_data', userData);\n }\n\n gtag('event', 'conversion', params);\n}\n","import type { WalkerOS, Collector } from '@walkeros/core';\nimport { getMappingValue } from '@walkeros/core';\nimport type { AdsSettings } from '../types';\n\n/**\n * Resolves user data for Google Enhanced Conversions.\n *\n * enhancedConversions is a UserDataMapping: each field is a mapping value\n * resolved against the event via getMappingValue. Map from event.user\n * (like `user.email`), event.data, or anywhere a mapping value can reach.\n *\n * Returns undefined if no enhanced conversions configured or no user\n * data resolved (the set user_data call should be skipped in that case).\n */\nexport async function resolveUserData(\n event: WalkerOS.Event,\n settings: AdsSettings,\n collector: Collector.Instance,\n): Promise<Record<string, unknown> | undefined> {\n const ec = settings.enhancedConversions;\n if (!ec) return undefined;\n\n const userData: Record<string, unknown> = {};\n\n if (ec.email) {\n const val = await getMappingValue(event, ec.email, { collector });\n if (val) userData.email = val;\n }\n if (ec.phone_number) {\n const val = await getMappingValue(event, ec.phone_number, { collector });\n if (val) userData.phone_number = val;\n }\n if (ec.address) {\n const address: Record<string, unknown> = {};\n for (const [key, mapping] of Object.entries(ec.address)) {\n if (mapping) {\n const val = await getMappingValue(event, mapping, { collector });\n if (val) address[key] = val;\n }\n }\n if (Object.keys(address).length > 0) userData.address = address;\n }\n\n return Object.keys(userData).length > 0 ? userData : undefined;\n}\n","import type { Logger } from '@walkeros/core';\nimport type { GTMSettings, Env } from '../types';\nimport { isArray } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport const defaultDataLayer = 'dataLayer';\nconst defaultDomain = 'https://www.googletagmanager.com/gtm.js?id=';\n\nexport function initGTM(\n settings: GTMSettings,\n loadScript?: boolean,\n env?: Env,\n _logger?: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { containerId, dataLayer, domain } = settings;\n const dataLayerName = dataLayer || defaultDataLayer;\n\n // Initialize the dataLayer (default or custom name). Custom names resolve\n // through Window's index signature as `unknown`, so narrow before reuse.\n const existing = window[dataLayerName];\n const dataLayerArray: unknown[] = isArray(existing) ? existing : [];\n window[dataLayerName] = dataLayerArray;\n\n dataLayerArray.push({\n 'gtm.start': new Date().getTime(),\n event: 'gtm.js',\n });\n\n // Load the gtm script and container\n if (loadScript && containerId)\n addScript(containerId, domain || defaultDomain, dataLayerName, document);\n}\n\nfunction addScript(\n containerId: string,\n src: string,\n dataLayerName: string,\n document: Document = globalThis.document,\n) {\n const dl = dataLayerName != defaultDataLayer ? '&l=' + dataLayerName : '';\n const script = document.createElement('script');\n script.src = src + containerId + dl;\n document.head.appendChild(script);\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GTMSettings, GTMMapping, Env } from '../types';\nimport { isArray, isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\nimport { defaultDataLayer } from './config';\n\nexport function pushGTMEvent(\n event: WalkerOS.Event,\n settings: GTMSettings,\n mapping: GTMMapping = {},\n data: unknown,\n env?: Env,\n _logger?: Logger.Instance,\n): void {\n const { window } = getEnv<Env>(env);\n const obj = { event: event.name }; // Use the name mapping by default\n\n const dataLayerName = settings.dataLayer || defaultDataLayer;\n const existing = window[dataLayerName];\n const dataLayerArray: unknown[] = isArray(existing) ? existing : [];\n window[dataLayerName] = dataLayerArray;\n\n dataLayerArray.push({\n ...obj,\n ...(isObject(data) ? data : event),\n });\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { ConsentMapping, Settings } from '../types';\n\n// walkerOS consent groups -> gtag consent parameters\nexport const DEFAULT_CONSENT_MAPPING: ConsentMapping = {\n marketing: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n functional: ['analytics_storage'],\n};\n\nconst DEFAULT_WAIT_FOR_UPDATE = 500;\n\n/** Resolve the active mapping, or undefined when consent mode is disabled. */\nexport function resolveConsentMapping(\n settings: Partial<Settings>,\n): ConsentMapping | undefined {\n const { como = true } = settings;\n if (como === false) return undefined;\n return como === true ? DEFAULT_CONSENT_MAPPING : como;\n}\n\n/** Flatten a mapping to the unique set of gtag parameter names. */\nexport function collectGtagParams(mapping: ConsentMapping): string[] {\n const params = new Set<string>();\n Object.values(mapping).forEach((value) => {\n (Array.isArray(value) ? value : [value]).forEach((p) => params.add(p));\n });\n return [...params];\n}\n\n/**\n * Build the `consent default` object (all params denied), or undefined when\n * consent mode is disabled or the mapping yields no params. Adds\n * `wait_for_update` when `como_advanced` is truthy.\n */\nexport function buildDefaultConsent(\n settings: Partial<Settings>,\n): Record<string, 'denied' | number> | undefined {\n const mapping = resolveConsentMapping(settings);\n if (!mapping) return undefined;\n\n const params = collectGtagParams(mapping);\n if (!params.length) return undefined;\n\n const result: Record<string, 'denied' | number> = {};\n params.forEach((p) => (result[p] = 'denied'));\n\n const { como_advanced } = settings;\n if (como_advanced)\n result.wait_for_update =\n typeof como_advanced === 'number'\n ? como_advanced\n : DEFAULT_WAIT_FOR_UPDATE;\n\n return result;\n}\n\n/**\n * Is consent genuinely in play, decided from the destination's OWN config only?\n * config.consent set (basic/gated) or como_advanced truthy (advanced). Never\n * reads collector state, and never config.require (consumed by the collector\n * before init runs).\n */\nexport function hasConsentSignal(\n configConsent: WalkerOS.Consent | undefined,\n settings: Partial<Settings>,\n): boolean {\n if (configConsent && Object.keys(configConsent).length > 0) return true;\n return !!settings.como_advanced;\n}\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\n// Extend Window interface with specific dataLayer typing\nexport interface WindowWithDataLayer extends Window {\n dataLayer: unknown[];\n gtag?: Gtag.Gtag;\n [key: string]: unknown; // For custom dataLayer names and other properties\n}\n\ndeclare global {\n interface Window {\n gtag?: Gtag.Gtag;\n [key: string]: unknown; // For custom dataLayer names and other properties\n }\n}\n\n// Gtag-specific environment interface\nexport interface Env extends DestinationWeb.Env {\n window: {\n // Optional: the SDK global is absent until `initializeGtag` installs it.\n gtag?: Gtag.Gtag;\n dataLayer: unknown[];\n };\n document: {\n createElement: (tagName: string) => {\n src: string;\n async?: boolean;\n setAttribute: (name: string, value: string) => void;\n removeAttribute: (name: string) => void;\n };\n head: {\n appendChild: (node: unknown) => void;\n };\n };\n}\n\n// Consent mode configuration\nexport type ConsentMode =\n | false // Disable consent mode\n | true // Use default mapping\n | ConsentMapping; // Custom mapping\n\nexport interface ConsentMapping {\n [walkerOSConsentGroup: string]: string | string[];\n}\n\n// Type bundle\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport type Destination = DestinationWeb.Destination<Types>;\nexport type Config = DestinationWeb.Config<Types>;\n\n// Base settings interface with data field\nexport interface BaseSettings {\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n}\n\n// Unified settings for all Google tools\nexport interface Settings {\n // Consent mode configuration\n como?: ConsentMode;\n // Advanced consent mode (non-EU): emit the denied default at page load and\n // add `wait_for_update`. `true` => wait_for_update: 500; a number sets the ms.\n // Leave unset for basic mode (the EU-safe default).\n como_advanced?: boolean | number;\n // GA4 settings\n ga4?: GA4Settings;\n // Google Ads settings\n ads?: AdsSettings;\n // GTM settings\n gtm?: GTMSettings;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\n// GA4-specific settings\nexport interface GA4Settings extends BaseSettings {\n measurementId: string;\n debug?: boolean;\n pageview?: boolean;\n server_container_url?: string;\n snakeCase?: boolean;\n transport_url?: string;\n}\n\n// Google Ads specific settings\nexport interface AdsSettings extends BaseSettings {\n conversionId: string;\n currency?: string;\n /** Enhanced conversions: maps walkerOS event fields to Google user_data fields. */\n enhancedConversions?: UserDataMapping;\n}\n\nexport interface UserDataMapping {\n email?: WalkerOSMapping.Value;\n phone_number?: WalkerOSMapping.Value;\n address?: {\n first_name?: WalkerOSMapping.Value;\n last_name?: WalkerOSMapping.Value;\n street?: WalkerOSMapping.Value;\n city?: WalkerOSMapping.Value;\n region?: WalkerOSMapping.Value;\n postal_code?: WalkerOSMapping.Value;\n country?: WalkerOSMapping.Value;\n };\n}\n\n// Google Ads specific mapping\nexport interface AdsMapping {\n label?: string; // Conversion label for this specific event\n}\n\n// GTM specific settings\nexport interface GTMSettings extends BaseSettings {\n containerId: string;\n dataLayer?: string;\n domain?: string;\n}\n\n// Unified mapping interface\nexport interface Mapping {\n ga4?: GA4Mapping;\n ads?: AdsMapping;\n gtm?: GTMMapping;\n}\n\n// GA4-specific mapping\nexport interface GA4Mapping {}\n\n// GTM specific mapping\nexport interface GTMMapping {}\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\nexport type Param = WalkerOSMapping.Value;\n\nexport type Parameters = Gtag.ControlParams &\n Gtag.EventParams &\n Gtag.CustomParams;\n"],"mappings":"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","names":["import_core","import_web_core","import_web_core","import_core","import_web_core","import_core","import_core","import_web_core","addScript","import_core","import_web_core","import_core","import_web_core"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var n=new Set;function e(e,t="https://www.googletagmanager.com/gtag/js?id=",o=globalThis.document){if(n.has(e))return;const r=o.createElement("script");r.src=t+e,o.head.appendChild(r),n.add(e)}function t(n){const e=n;return e.dataLayer=e.dataLayer||[],e.gtag||(e.gtag=function(){e.dataLayer.push(arguments)}),e.gtag}import{getEnv as o}from"@walkeros/web-core";import{isObject as r}from"@walkeros/core";import{getMappingValue as a,assign as s,isObject as i}from"@walkeros/core";async function c(n,e,t,o,r){const c=i(e)?e:{},d=t.data?await a(n,t.data,{collector:r}):{},g=(null==o?void 0:o.data)?await a(n,o.data,{collector:r}):{},l=i(d)?d:{},u=i(g)?g:{};return s(s(c,l),u)}import{getEnv as d}from"@walkeros/web-core";import{getEnv as g}from"@walkeros/web-core";import{isObject as l}from"@walkeros/core";import{getEnv as u}from"@walkeros/web-core";import{getMappingValue as m}from"@walkeros/core";import{isArray as f}from"@walkeros/core";import{getEnv as w}from"@walkeros/web-core";var v="dataLayer";function p(n,e,t,o){const{window:r,document:a}=w(t),{containerId:s,dataLayer:i,domain:c}=n,d=i||v,g=r[d],l=f(g)?g:[];r[d]=l,l.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),e&&s&&function(n,e,t,o=globalThis.document){const r=t!=v?"&l="+t:"",a=o.createElement("script");a.src=e+n+r,o.head.appendChild(a)}(s,c||"https://www.googletagmanager.com/gtm.js?id=",d,a)}import{isArray as h,isObject as b}from"@walkeros/core";import{getEnv as _}from"@walkeros/web-core";var y={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]};function I(n){const{como:e=!0}=n;if(!1!==e)return!0===e?y:e}function k(n){const e=I(n);if(!e)return;const t=function(n){const e=new Set;return Object.values(n).forEach(n=>{(Array.isArray(n)?n:[n]).forEach(n=>e.add(n))}),[...e]}(e);if(!t.length)return;const o={};t.forEach(n=>o[n]="denied");const{como_advanced:r}=n;return r&&(o.wait_for_update="number"==typeof r?r:500),o}import{isObject as j}from"@walkeros/core";import{getEnv as E}from"@walkeros/web-core";var C={},O=!1;function L(){O=!1}function A(n,e){const o=n.settings||{};if(O)return;if(!function(n,e){return!!(n&&Object.keys(n).length>0)||!!e.como_advanced}(n.consent,o))return;const r=k(o);if(!r)return;const{window:a}=E(e),s=t(a);s&&(s("consent","default",r),O=!0)}var D={type:"google-gtag",calls:["call:window.gtag"],config:{settings:{}},init({config:n,env:r,logger:a}){const{settings:s={},loadScript:i}=n,{ga4:c,ads:d,gtm:l}=s;return(null==c?void 0:c.measurementId)||(null==d?void 0:d.conversionId)||(null==l?void 0:l.containerId)||a.throw("Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId"),A(n,r),(null==c?void 0:c.measurementId)&&function(n,r,a,s){const{window:i,document:c}=o(a),{measurementId:d,transport_url:g,server_container_url:l,pageview:u}=n;d||s.throw("Config settings ga4.measurementId missing"),r&&e(d,void 0,c),t(i);const m={};g&&(m.transport_url=g),l&&(m.server_container_url=l),!1===u&&(m.send_page_view=!1);const f=i.gtag;f("js",new Date),f("config",d,m)}(c,i,r,a),(null==d?void 0:d.conversionId)&&function(n,o,r,a){const{window:s,document:i}=g(r),{conversionId:c}=n;c||a.throw("Config settings ads.conversionId missing"),n.currency||(n.currency="EUR"),o&&e(c,void 0,i),t(s);const d=s.gtag;d("js",new Date),n.enhancedConversions?d("config",c,{allow_enhanced_conversions:!0}):d("config",c)}(d,i,r,a),(null==l?void 0:l.containerId)&&p(l,i,r),n},async push(n,{config:e,rule:t={},data:o,env:a,collector:s,logger:i}){const{settings:g={}}=e,{ga4:f,ads:w,gtm:p}=g,y=t.settings||{},I=await c(n,o,e,f,s),k=await c(n,o,e,w,s),j=await c(n,o,e,p,s);let E;(null==f?void 0:f.measurementId)&&function(n,e,t,o,a){const{window:s}=d(o);e.measurementId||a.throw("Config settings ga4.measurementId missing");const i=r(t)?{...t}:{};let c=n.name;!1!==e.snakeCase&&(c=function(n,e=!0){return e?n.replace(/\s+/g,"_").toLowerCase():n}(c)),i.send_to=e.measurementId,e.debug&&(i.debug_mode=!0),(0,s.gtag)("event",c,i)}(n,f,I,a,i),(null==w?void 0:w.conversionId)&&(null==w?void 0:w.enhancedConversions)&&(E=await async function(n,e,t){const o=e.enhancedConversions;if(!o)return;const r={};if(o.email){const e=await m(n,o.email,{collector:t});e&&(r.email=e)}if(o.phone_number){const e=await m(n,o.phone_number,{collector:t});e&&(r.phone_number=e)}if(o.address){const e={};for(const[r,a]of Object.entries(o.address))if(a){const o=await m(n,a,{collector:t});o&&(e[r]=o)}Object.keys(e).length>0&&(r.address=e)}return Object.keys(r).length>0?r:void 0}(n,w,s)),(null==w?void 0:w.conversionId)&&t.name&&function(n,e,t={},o,r,a,s,i){const{conversionId:c,currency:d}=e,g=l(o)?o:{},m=t.label||r;m||s.throw("Config mapping ads.label missing");const f={send_to:`${c}/${m}`,currency:d||"EUR",...g},{window:w}=u(a),v=w.gtag;i&&v("set","user_data",i),v("event","conversion",f)}(0,w,y.ads,k,t.name,a,i,E),(null==p?void 0:p.containerId)&&function(n,e,t={},o,r){const{window:a}=_(r),s={event:n.name},i=e.dataLayer||v,c=a[i],d=h(c)?c:[];a[i]=d,d.push({...s,...b(o)?o:n})}(n,p,y.gtm,j,a)},on(n,e){var t;if("consent"!==n||!j(e.data))return;const o=e.data,r=(null==(t=e.config)?void 0:t.settings)||{},a=I(r);if(!a)return;const{window:s}=E(e.env),i=s.gtag;if(!i)return;if(!O){const n=k(r);n&&i("consent","default",n),O=!0}const c={};Object.entries(o).forEach(([n,e])=>{const t=a[n];if(!t)return;const o=Array.isArray(t)?t:[t],r=e?"granted":"denied";o.forEach(n=>{c[n]=r})}),0!==Object.keys(c).length&&i("consent","update",c)}},S=D;export{C as DestinationGtag,S as default,D as destinationGtag,L as resetConsentState};//# sourceMappingURL=index.mjs.map
1
+ var n=new Set;function e(e,t="https://www.googletagmanager.com/gtag/js?id=",o=globalThis.document){if(n.has(e))return;const a=o.createElement("script");a.src=t+e,o.head.appendChild(a),n.add(e)}function t(n){const e=n;return e.dataLayer=e.dataLayer||[],e.gtag||(e.gtag=function(){e.dataLayer.push(arguments)}),e.gtag}import{getEnv as o}from"@walkeros/web-core";import{isObject as a}from"@walkeros/core";import{getMappingValue as r,assign as s,isObject as i}from"@walkeros/core";async function c(n,e,t,o,a){const c=i(e)?e:{},d=t.data?await r(n,t.data,{collector:a}):{},g=(null==o?void 0:o.data)?await r(n,o.data,{collector:a}):{},l=i(d)?d:{},u=i(g)?g:{};return s(s(c,l),u)}import{getEnv as d}from"@walkeros/web-core";import{getEnv as g}from"@walkeros/web-core";import{isObject as l}from"@walkeros/core";import{getEnv as u}from"@walkeros/web-core";import{getMappingValue as m}from"@walkeros/core";import{isArray as f}from"@walkeros/core";import{getEnv as w}from"@walkeros/web-core";var v="dataLayer";function p(n,e,t,o){const{window:a,document:r}=w(t),{containerId:s,dataLayer:i,domain:c}=n,d=i||v,g=a[d],l=f(g)?g:[];a[d]=l,l.push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),e&&s&&function(n,e,t,o=globalThis.document){const a=t!=v?"&l="+t:"",r=o.createElement("script");r.src=e+n+a,o.head.appendChild(r)}(s,c||"https://www.googletagmanager.com/gtm.js?id=",d,r)}import{isArray as h,isObject as b}from"@walkeros/core";import{getEnv as _}from"@walkeros/web-core";var y={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]};function I(n){const{como:e=!0}=n;if(!1!==e)return!0===e?y:e}function k(n){const e=I(n);if(!e)return;const t=function(n){const e=new Set;return Object.values(n).forEach(n=>{(Array.isArray(n)?n:[n]).forEach(n=>e.add(n))}),[...e]}(e);if(!t.length)return;const o={};t.forEach(n=>o[n]="denied");const{como_advanced:a}=n;return a&&(o.wait_for_update="number"==typeof a?a:500),o}import{isObject as j}from"@walkeros/core";import{getEnv as E}from"@walkeros/web-core";var C={},O=!1;function L(){O=!1}function A(n,e){const o=n.settings||{};if(O)return;if(!function(n,e){return!!(n&&Object.keys(n).length>0)||!!e.como_advanced}(n.consent,o))return;const a=k(o);if(!a)return;const{window:r}=E(e),s=t(r);s&&(s("consent","default",a),O=!0)}var D={type:"google-gtag",calls:["call:window.gtag"],config:{settings:{}},init({config:n,env:a,logger:r}){const{settings:s={},loadScript:i}=n,{ga4:c,ads:d,gtm:l}=s;return(null==c?void 0:c.measurementId)||(null==d?void 0:d.conversionId)||(null==l?void 0:l.containerId)||r.throw("Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId"),A(n,a),(null==c?void 0:c.measurementId)&&function(n,a,r,s){const{window:i,document:c}=o(r),{measurementId:d,transport_url:g,server_container_url:l,pageview:u}=n;d||s.throw("Config settings ga4.measurementId missing"),a&&e(d,l?`${l.replace(/\/$/,"")}/gtag/js?id=`:void 0,c);t(i);const m={};g&&(m.transport_url=g),l&&(m.server_container_url=l),!1===u&&(m.send_page_view=!1);const f=i.gtag;f("js",new Date),f("config",d,m)}(c,i,a,r),(null==d?void 0:d.conversionId)&&function(n,o,a,r){const{window:s,document:i}=g(a),{conversionId:c}=n;c||r.throw("Config settings ads.conversionId missing"),n.currency||(n.currency="EUR"),o&&e(c,void 0,i),t(s);const d=s.gtag;d("js",new Date),n.enhancedConversions?d("config",c,{allow_enhanced_conversions:!0}):d("config",c)}(d,i,a,r),(null==l?void 0:l.containerId)&&p(l,i,a),n},async push(n,{config:e,rule:t={},data:o,env:r,collector:s,logger:i}){const{settings:g={}}=e,{ga4:f,ads:w,gtm:p}=g,y=t.settings||{},I=await c(n,o,e,f,s),k=await c(n,o,e,w,s),j=await c(n,o,e,p,s);let E;(null==f?void 0:f.measurementId)&&function(n,e,t,o,r){const{window:s}=d(o);e.measurementId||r.throw("Config settings ga4.measurementId missing");const i=a(t)?{...t}:{};let c=n.name;!1!==e.snakeCase&&(c=function(n,e=!0){return e?n.replace(/\s+/g,"_").toLowerCase():n}(c)),i.send_to=e.measurementId,e.debug&&(i.debug_mode=!0),(0,s.gtag)("event",c,i)}(n,f,I,r,i),(null==w?void 0:w.conversionId)&&(null==w?void 0:w.enhancedConversions)&&(E=await async function(n,e,t){const o=e.enhancedConversions;if(!o)return;const a={};if(o.email){const e=await m(n,o.email,{collector:t});e&&(a.email=e)}if(o.phone_number){const e=await m(n,o.phone_number,{collector:t});e&&(a.phone_number=e)}if(o.address){const e={};for(const[a,r]of Object.entries(o.address))if(r){const o=await m(n,r,{collector:t});o&&(e[a]=o)}Object.keys(e).length>0&&(a.address=e)}return Object.keys(a).length>0?a:void 0}(n,w,s)),(null==w?void 0:w.conversionId)&&t.name&&function(n,e,t={},o,a,r,s,i){const{conversionId:c,currency:d}=e,g=l(o)?o:{},m=t.label||a;m||s.throw("Config mapping ads.label missing");const f={send_to:`${c}/${m}`,currency:d||"EUR",...g},{window:w}=u(r),v=w.gtag;i&&v("set","user_data",i),v("event","conversion",f)}(0,w,y.ads,k,t.name,r,i,E),(null==p?void 0:p.containerId)&&function(n,e,t={},o,a){const{window:r}=_(a),s={event:n.name},i=e.dataLayer||v,c=r[i],d=h(c)?c:[];r[i]=d,d.push({...s,...b(o)?o:n})}(n,p,y.gtm,j,r)},on(n,e){var t;if("consent"!==n||!j(e.data))return;const o=e.data,a=(null==(t=e.config)?void 0:t.settings)||{},r=I(a);if(!r)return;const{window:s}=E(e.env),i=s.gtag;if(!i)return;if(!O){const n=k(a);n&&i("consent","default",n),O=!0}const c={};Object.entries(o).forEach(([n,e])=>{const t=r[n];if(!t)return;const o=Array.isArray(t)?t:[t],a=e?"granted":"denied";o.forEach(n=>{c[n]=a})}),0!==Object.keys(c).length&&i("consent","update",c)}},S=D;export{C as DestinationGtag,S as default,D as destinationGtag,L as resetConsentState};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/gtag.ts","../src/ga4/config.ts","../src/ga4/push.ts","../src/shared/mapping.ts","../src/ads/config.ts","../src/ads/push.ts","../src/ads/userData.ts","../src/gtm/config.ts","../src/gtm/push.ts","../src/shared/consent.ts","../src/index.ts","../src/types/index.ts"],"sourcesContent":["// Gtag script loading and initialization utilities\n\nimport type { WindowWithDataLayer } from '../types';\n\nconst loadedScripts = new Set<string>();\n\n// For testing: allow resetting loaded scripts\nexport function resetLoadedScripts(): void {\n loadedScripts.clear();\n}\n\nexport function addScript(\n id: string,\n src = 'https://www.googletagmanager.com/gtag/js?id=',\n document: Document = globalThis.document,\n): void {\n // Prevent loading the same script multiple times\n if (loadedScripts.has(id)) return;\n\n const script = document.createElement('script');\n script.src = src + id;\n document.head.appendChild(script);\n loadedScripts.add(id);\n}\n\nexport function initializeGtag(\n window: WindowWithDataLayer,\n): Gtag.Gtag | undefined {\n const w = window;\n\n // Setup dataLayer if not exists\n w.dataLayer = w.dataLayer || [];\n\n // Setup gtag function if not exists\n if (!w.gtag) {\n w.gtag = function () {\n w.dataLayer.push(arguments);\n };\n }\n\n return w.gtag;\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GA4Settings, Env } from '../types';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initGA4(\n settings: GA4Settings,\n loadScript: boolean | undefined,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { measurementId, transport_url, server_container_url, pageview } =\n settings;\n\n if (!measurementId) logger.throw('Config settings ga4.measurementId missing');\n\n // Load the gtag script\n if (loadScript) addScript(measurementId, undefined, document);\n\n // Initialize gtag infrastructure\n initializeGtag(window);\n\n const gtagSettings: WalkerOS.AnyObject = {};\n\n // custom transport_url\n if (transport_url) gtagSettings.transport_url = transport_url;\n\n // custom server_container_url\n if (server_container_url)\n gtagSettings.server_container_url = server_container_url;\n\n // disable pageviews\n if (pageview === false) gtagSettings.send_page_view = false;\n\n const gtag = window.gtag!;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', measurementId, gtagSettings);\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GA4Settings, Parameters, Env } from '../types';\nimport { isObject } from '@walkeros/core';\nimport { normalizeEventName } from '../shared/mapping';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushGA4Event(\n event: WalkerOS.Event,\n settings: GA4Settings,\n data: WalkerOS.AnyObject,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window } = getEnv<Env>(env);\n\n if (!settings.measurementId)\n logger.throw('Config settings ga4.measurementId missing');\n\n const eventParams: Parameters = isObject(data) ? { ...data } : {};\n\n // Event name (snake_case default)\n let eventName = event.name; // Assume custom mapped name\n if (settings.snakeCase !== false) {\n // Use snake case if not disabled\n eventName = normalizeEventName(eventName);\n }\n\n // Set the GA4 stream id\n eventParams.send_to = settings.measurementId;\n\n // Debug mode\n if (settings.debug) eventParams.debug_mode = true;\n\n const gtag = window.gtag!;\n gtag('event', eventName, eventParams);\n}\n","// Shared mapping utilities for all Google tools\nimport type { WalkerOS, Collector } from '@walkeros/core';\nimport { getMappingValue, assign, isObject } from '@walkeros/core';\nimport type { BaseSettings, Config } from '../types';\n\nexport function normalizeEventName(\n eventName: string,\n snakeCase = true,\n): string {\n if (!snakeCase) return eventName;\n\n return eventName.replace(/\\s+/g, '_').toLowerCase();\n}\n\nexport async function getData(\n event: WalkerOS.Event,\n data: WalkerOS.AnyObject | undefined,\n config: Config,\n toolSettings: BaseSettings | undefined,\n collector: Collector.Instance,\n): Promise<WalkerOS.AnyObject> {\n const baseData = isObject(data) ? data : {};\n\n // Get config-level mapped data\n const configMappedData = config.data\n ? await getMappingValue(event, config.data, { collector })\n : {};\n\n // Get tool-specific mapped data\n const toolMappedData = toolSettings?.data\n ? await getMappingValue(event, toolSettings.data, { collector })\n : {};\n\n // Ensure all values are objects before merging\n const configData = isObject(configMappedData) ? configMappedData : {};\n const toolData = isObject(toolMappedData) ? toolMappedData : {};\n\n // Merge with proper priority: base <- config <- tool\n return assign(assign(baseData, configData), toolData);\n}\n","import type { Logger } from '@walkeros/core';\nimport type { AdsSettings, Env } from '../types';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initAds(\n settings: AdsSettings,\n loadScript: boolean | undefined,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { conversionId } = settings;\n\n if (!conversionId) logger.throw('Config settings ads.conversionId missing');\n\n // Default currency value\n if (!settings.currency) settings.currency = 'EUR';\n\n if (loadScript) addScript(conversionId, undefined, document);\n\n // Initialize gtag infrastructure\n initializeGtag(window);\n\n const gtag = window.gtag!;\n gtag('js', new Date());\n\n // gtag init call\n if (settings.enhancedConversions) {\n gtag('config', conversionId, { allow_enhanced_conversions: true });\n } else {\n gtag('config', conversionId);\n }\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { AdsSettings, AdsMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushAdsEvent(\n event: WalkerOS.Event,\n settings: AdsSettings,\n mapping: AdsMapping = {},\n data: unknown,\n mappingName: string | undefined,\n env: DestinationWeb.Env | undefined,\n logger: Logger.Instance,\n userData?: Record<string, unknown>,\n): void {\n const { conversionId, currency } = settings;\n const eventData = isObject(data) ? data : {};\n\n // Use label from mapping settings, fallback to mappingName for backward compatibility\n const conversionLabel = mapping.label || mappingName;\n if (!conversionLabel) logger.throw('Config mapping ads.label missing');\n\n const params: Gtag.CustomParams = {\n send_to: `${conversionId}/${conversionLabel}`,\n currency: currency || 'EUR',\n ...eventData,\n };\n\n const { window } = getEnv(env);\n const gtag = window.gtag as Gtag.Gtag;\n\n // Set user data for enhanced conversions (must be before conversion event)\n if (userData) {\n gtag('set', 'user_data', userData);\n }\n\n gtag('event', 'conversion', params);\n}\n","import type { WalkerOS, Collector } from '@walkeros/core';\nimport { getMappingValue } from '@walkeros/core';\nimport type { AdsSettings } from '../types';\n\n/**\n * Resolves user data for Google Enhanced Conversions.\n *\n * enhancedConversions is a UserDataMapping: each field is a mapping value\n * resolved against the event via getMappingValue. Map from event.user\n * (like `user.email`), event.data, or anywhere a mapping value can reach.\n *\n * Returns undefined if no enhanced conversions configured or no user\n * data resolved (the set user_data call should be skipped in that case).\n */\nexport async function resolveUserData(\n event: WalkerOS.Event,\n settings: AdsSettings,\n collector: Collector.Instance,\n): Promise<Record<string, unknown> | undefined> {\n const ec = settings.enhancedConversions;\n if (!ec) return undefined;\n\n const userData: Record<string, unknown> = {};\n\n if (ec.email) {\n const val = await getMappingValue(event, ec.email, { collector });\n if (val) userData.email = val;\n }\n if (ec.phone_number) {\n const val = await getMappingValue(event, ec.phone_number, { collector });\n if (val) userData.phone_number = val;\n }\n if (ec.address) {\n const address: Record<string, unknown> = {};\n for (const [key, mapping] of Object.entries(ec.address)) {\n if (mapping) {\n const val = await getMappingValue(event, mapping, { collector });\n if (val) address[key] = val;\n }\n }\n if (Object.keys(address).length > 0) userData.address = address;\n }\n\n return Object.keys(userData).length > 0 ? userData : undefined;\n}\n","import type { Logger } from '@walkeros/core';\nimport type { GTMSettings, Env } from '../types';\nimport { isArray } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport const defaultDataLayer = 'dataLayer';\nconst defaultDomain = 'https://www.googletagmanager.com/gtm.js?id=';\n\nexport function initGTM(\n settings: GTMSettings,\n loadScript?: boolean,\n env?: Env,\n _logger?: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { containerId, dataLayer, domain } = settings;\n const dataLayerName = dataLayer || defaultDataLayer;\n\n // Initialize the dataLayer (default or custom name). Custom names resolve\n // through Window's index signature as `unknown`, so narrow before reuse.\n const existing = window[dataLayerName];\n const dataLayerArray: unknown[] = isArray(existing) ? existing : [];\n window[dataLayerName] = dataLayerArray;\n\n dataLayerArray.push({\n 'gtm.start': new Date().getTime(),\n event: 'gtm.js',\n });\n\n // Load the gtm script and container\n if (loadScript && containerId)\n addScript(containerId, domain || defaultDomain, dataLayerName, document);\n}\n\nfunction addScript(\n containerId: string,\n src: string,\n dataLayerName: string,\n document: Document = globalThis.document,\n) {\n const dl = dataLayerName != defaultDataLayer ? '&l=' + dataLayerName : '';\n const script = document.createElement('script');\n script.src = src + containerId + dl;\n document.head.appendChild(script);\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GTMSettings, GTMMapping, Env } from '../types';\nimport { isArray, isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\nimport { defaultDataLayer } from './config';\n\nexport function pushGTMEvent(\n event: WalkerOS.Event,\n settings: GTMSettings,\n mapping: GTMMapping = {},\n data: unknown,\n env?: Env,\n _logger?: Logger.Instance,\n): void {\n const { window } = getEnv<Env>(env);\n const obj = { event: event.name }; // Use the name mapping by default\n\n const dataLayerName = settings.dataLayer || defaultDataLayer;\n const existing = window[dataLayerName];\n const dataLayerArray: unknown[] = isArray(existing) ? existing : [];\n window[dataLayerName] = dataLayerArray;\n\n dataLayerArray.push({\n ...obj,\n ...(isObject(data) ? data : event),\n });\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { ConsentMapping, Settings } from '../types';\n\n// walkerOS consent groups -> gtag consent parameters\nexport const DEFAULT_CONSENT_MAPPING: ConsentMapping = {\n marketing: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n functional: ['analytics_storage'],\n};\n\nconst DEFAULT_WAIT_FOR_UPDATE = 500;\n\n/** Resolve the active mapping, or undefined when consent mode is disabled. */\nexport function resolveConsentMapping(\n settings: Partial<Settings>,\n): ConsentMapping | undefined {\n const { como = true } = settings;\n if (como === false) return undefined;\n return como === true ? DEFAULT_CONSENT_MAPPING : como;\n}\n\n/** Flatten a mapping to the unique set of gtag parameter names. */\nexport function collectGtagParams(mapping: ConsentMapping): string[] {\n const params = new Set<string>();\n Object.values(mapping).forEach((value) => {\n (Array.isArray(value) ? value : [value]).forEach((p) => params.add(p));\n });\n return [...params];\n}\n\n/**\n * Build the `consent default` object (all params denied), or undefined when\n * consent mode is disabled or the mapping yields no params. Adds\n * `wait_for_update` when `como_advanced` is truthy.\n */\nexport function buildDefaultConsent(\n settings: Partial<Settings>,\n): Record<string, 'denied' | number> | undefined {\n const mapping = resolveConsentMapping(settings);\n if (!mapping) return undefined;\n\n const params = collectGtagParams(mapping);\n if (!params.length) return undefined;\n\n const result: Record<string, 'denied' | number> = {};\n params.forEach((p) => (result[p] = 'denied'));\n\n const { como_advanced } = settings;\n if (como_advanced)\n result.wait_for_update =\n typeof como_advanced === 'number'\n ? como_advanced\n : DEFAULT_WAIT_FOR_UPDATE;\n\n return result;\n}\n\n/**\n * Is consent genuinely in play, decided from the destination's OWN config only?\n * config.consent set (basic/gated) or como_advanced truthy (advanced). Never\n * reads collector state, and never config.require (consumed by the collector\n * before init runs).\n */\nexport function hasConsentSignal(\n configConsent: WalkerOS.Consent | undefined,\n settings: Partial<Settings>,\n): boolean {\n if (configConsent && Object.keys(configConsent).length > 0) return true;\n return !!settings.como_advanced;\n}\n","import type { WalkerOS, On, Collector, Logger } from '@walkeros/core';\nimport type { Settings, Destination, Env, Config } from './types';\nimport { initGA4, pushGA4Event } from './ga4';\nimport { initAds, pushAdsEvent, resolveUserData } from './ads';\nimport { initGTM, pushGTMEvent } from './gtm';\nimport { getData } from './shared/mapping';\nimport {\n buildDefaultConsent,\n hasConsentSignal,\n resolveConsentMapping,\n} from './shared/consent';\nimport { initializeGtag } from './shared/gtag';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\n// Types\nexport * as DestinationGtag from './types';\n\n// Track whether default consent has been set\nlet defaultConsentSet = false;\n\n// For testing: allow resetting consent state\nexport function resetConsentState(): void {\n defaultConsentSet = false;\n}\n\n// Establish the Consent Mode v2 denied baseline BEFORE any tool's config call,\n// per Google's required ordering. Gated on the destination's OWN config: a\n// consent signal (config.consent set, or como_advanced) and como !== false.\n// Idempotent via defaultConsentSet (consent state is window-global).\nfunction setupConsentDefault(config: Config, env: Env | undefined): void {\n const settings = config.settings || {};\n if (defaultConsentSet) return;\n if (!hasConsentSignal(config.consent, settings)) return;\n\n const defaultConsent = buildDefaultConsent(settings);\n if (!defaultConsent) return; // como:false or no params\n\n const { window } = getEnv<Env>(env);\n const gtag = initializeGtag(window); // ensure stub exists before any config\n if (!gtag) return;\n\n gtag('consent', 'default', defaultConsent);\n defaultConsentSet = true;\n}\n\nexport const destinationGtag: Destination = {\n type: 'google-gtag',\n\n // Observable env callable for trace-level vendor-call capture. Mirrors the\n // dev-env simulation list (src/examples/env.ts).\n calls: ['call:window.gtag'],\n\n config: { settings: {} },\n\n init({ config, env, logger }) {\n const { settings = {}, loadScript } = config;\n const { ga4, ads, gtm } = settings;\n\n // Fail if no tools are configured\n if (!ga4?.measurementId && !ads?.conversionId && !gtm?.containerId) {\n logger.throw(\n 'Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId',\n );\n }\n\n // Emit the denied consent default before any tool's config call.\n setupConsentDefault(config, env);\n\n // Initialize GA4 if configured\n if (ga4?.measurementId) {\n initGA4(ga4, loadScript, env, logger);\n }\n\n // Initialize Google Ads if configured\n if (ads?.conversionId) {\n initAds(ads, loadScript, env, logger);\n }\n\n // Initialize GTM if configured\n if (gtm?.containerId) {\n initGTM(gtm, loadScript, env, logger);\n }\n\n return config;\n },\n\n async push(event, { config, rule = {}, data, env, collector, logger }) {\n const { settings = {} } = config;\n const { ga4, ads, gtm } = settings;\n const eventMapping = rule.settings || {};\n\n // Resolve data for each tool with proper priority\n const ga4Data = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n ga4,\n collector,\n );\n const adsData = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n ads,\n collector,\n );\n const gtmData = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n gtm,\n collector,\n );\n\n // Push to GA4 if configured\n if (ga4?.measurementId) {\n pushGA4Event(event, ga4, ga4Data, env, logger);\n }\n\n // Resolve enhanced conversions user data if configured\n let adsUserData: Record<string, unknown> | undefined;\n if (ads?.conversionId && ads?.enhancedConversions) {\n adsUserData = await resolveUserData(event, ads, collector);\n }\n\n // @TODO: Fix condition - should check for rule.settings?.ads?.label || rule.name\n // Currently requires rule.name even when label is provided via settings.ads.label\n if (ads?.conversionId && rule.name) {\n pushAdsEvent(\n event,\n ads,\n eventMapping.ads,\n adsData,\n rule.name,\n env,\n logger,\n adsUserData,\n );\n }\n\n // Push to GTM if configured\n if (gtm?.containerId) {\n pushGTMEvent(event, gtm, eventMapping.gtm, gtmData, env, logger);\n }\n },\n\n on(type, context) {\n // Only handle consent events\n if (type !== 'consent' || !isObject(context.data)) return;\n\n const consent = context.data;\n // `on` runs with the runtime (non-generic) context, so config.settings and\n // env surface as the loose base types. Narrowing them to this destination's\n // own Settings/Env needs a core-types change to make `on` generic over\n // Types; tracked as a follow-up. The two `as` casts mark that boundary.\n const settings = (context.config?.settings || {}) as Partial<Settings>;\n\n // Skip if consent mode is disabled (como === false)\n const mapping = resolveConsentMapping(settings);\n if (!mapping) return;\n\n // gtag is available after init() - on() is only called after init completes\n const { window } = getEnv<Env>(context.env as Env);\n const gtag = window.gtag;\n if (!gtag) return;\n\n // Safety net for setups that fire consent without init having seen a signal:\n // establish the denied default once before the first update.\n if (!defaultConsentSet) {\n const defaultConsent = buildDefaultConsent(settings);\n if (defaultConsent) gtag('consent', 'default', defaultConsent);\n defaultConsentSet = true;\n }\n\n // Build gtag consent object for update\n const gtagConsent: Record<string, 'granted' | 'denied'> = {};\n\n // Map walkerOS consent to gtag consent parameters for update\n Object.entries(consent).forEach(([walkerOSGroup, granted]) => {\n const gtagParams = mapping[walkerOSGroup];\n if (!gtagParams) return;\n\n const params = Array.isArray(gtagParams) ? gtagParams : [gtagParams];\n const consentValue = granted ? 'granted' : 'denied';\n\n params.forEach((param) => {\n gtagConsent[param] = consentValue;\n });\n });\n\n // Only proceed if we have consent parameters to update\n if (Object.keys(gtagConsent).length === 0) return;\n\n // Always use update after the initial default\n gtag('consent', 'update', gtagConsent);\n },\n};\n\nexport default destinationGtag;\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\n// Extend Window interface with specific dataLayer typing\nexport interface WindowWithDataLayer extends Window {\n dataLayer: unknown[];\n gtag?: Gtag.Gtag;\n [key: string]: unknown; // For custom dataLayer names and other properties\n}\n\ndeclare global {\n interface Window {\n gtag?: Gtag.Gtag;\n [key: string]: unknown; // For custom dataLayer names and other properties\n }\n}\n\n// Gtag-specific environment interface\nexport interface Env extends DestinationWeb.Env {\n window: {\n // Optional: the SDK global is absent until `initializeGtag` installs it.\n gtag?: Gtag.Gtag;\n dataLayer: unknown[];\n };\n document: {\n createElement: (tagName: string) => {\n src: string;\n async?: boolean;\n setAttribute: (name: string, value: string) => void;\n removeAttribute: (name: string) => void;\n };\n head: {\n appendChild: (node: unknown) => void;\n };\n };\n}\n\n// Consent mode configuration\nexport type ConsentMode =\n | false // Disable consent mode\n | true // Use default mapping\n | ConsentMapping; // Custom mapping\n\nexport interface ConsentMapping {\n [walkerOSConsentGroup: string]: string | string[];\n}\n\n// Type bundle\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport type Destination = DestinationWeb.Destination<Types>;\nexport type Config = DestinationWeb.Config<Types>;\n\n// Base settings interface with data field\nexport interface BaseSettings {\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n}\n\n// Unified settings for all Google tools\nexport interface Settings {\n // Consent mode configuration\n como?: ConsentMode;\n // Advanced consent mode (non-EU): emit the denied default at page load and\n // add `wait_for_update`. `true` => wait_for_update: 500; a number sets the ms.\n // Leave unset for basic mode (the EU-safe default).\n como_advanced?: boolean | number;\n // GA4 settings\n ga4?: GA4Settings;\n // Google Ads settings\n ads?: AdsSettings;\n // GTM settings\n gtm?: GTMSettings;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\n// GA4-specific settings\nexport interface GA4Settings extends BaseSettings {\n measurementId: string;\n debug?: boolean;\n pageview?: boolean;\n server_container_url?: string;\n snakeCase?: boolean;\n transport_url?: string;\n}\n\n// Google Ads specific settings\nexport interface AdsSettings extends BaseSettings {\n conversionId: string;\n currency?: string;\n /** Enhanced conversions: maps walkerOS event fields to Google user_data fields. */\n enhancedConversions?: UserDataMapping;\n}\n\nexport interface UserDataMapping {\n email?: WalkerOSMapping.Value;\n phone_number?: WalkerOSMapping.Value;\n address?: {\n first_name?: WalkerOSMapping.Value;\n last_name?: WalkerOSMapping.Value;\n street?: WalkerOSMapping.Value;\n city?: WalkerOSMapping.Value;\n region?: WalkerOSMapping.Value;\n postal_code?: WalkerOSMapping.Value;\n country?: WalkerOSMapping.Value;\n };\n}\n\n// Google Ads specific mapping\nexport interface AdsMapping {\n label?: string; // Conversion label for this specific event\n}\n\n// GTM specific settings\nexport interface GTMSettings extends BaseSettings {\n containerId: string;\n dataLayer?: string;\n domain?: string;\n}\n\n// Unified mapping interface\nexport interface Mapping {\n ga4?: GA4Mapping;\n ads?: AdsMapping;\n gtm?: GTMMapping;\n}\n\n// GA4-specific mapping\nexport interface GA4Mapping {}\n\n// GTM specific mapping\nexport interface GTMMapping {}\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\nexport type Param = WalkerOSMapping.Value;\n\nexport type Parameters = Gtag.ControlParams &\n Gtag.EventParams &\n Gtag.CustomParams;\n"],"mappings":";AAIA,IAAM,gBAAgB,oBAAI,IAAY;AAO/B,SAAS,UACd,IACA,MAAM,gDACN,WAAqB,WAAW,UAC1B;AAEN,MAAI,cAAc,IAAI,EAAE,EAAG;AAE3B,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,MAAM,MAAM;AACnB,WAAS,KAAK,YAAY,MAAM;AAChC,gBAAc,IAAI,EAAE;AACtB;AAEO,SAAS,eACd,QACuB;AACvB,QAAM,IAAI;AAGV,IAAE,YAAY,EAAE,aAAa,CAAC;AAG9B,MAAI,CAAC,EAAE,MAAM;AACX,MAAE,OAAO,WAAY;AACnB,QAAE,UAAU,KAAK,SAAS;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,EAAE;AACX;;;ACtCA,SAAS,cAAc;AAEhB,SAAS,QACd,UACA,YACA,KACA,QACM;AACN,QAAM,EAAE,QAAQ,SAAS,IAAI,OAAY,GAAG;AAC5C,QAAM,EAAE,eAAe,eAAe,sBAAsB,SAAS,IACnE;AAEF,MAAI,CAAC,cAAe,QAAO,MAAM,2CAA2C;AAG5E,MAAI,WAAY,WAAU,eAAe,QAAW,QAAQ;AAG5D,iBAAe,MAAM;AAErB,QAAM,eAAmC,CAAC;AAG1C,MAAI,cAAe,cAAa,gBAAgB;AAGhD,MAAI;AACF,iBAAa,uBAAuB;AAGtC,MAAI,aAAa,MAAO,cAAa,iBAAiB;AAEtD,QAAM,OAAO,OAAO;AACpB,OAAK,MAAM,oBAAI,KAAK,CAAC;AAGrB,OAAK,UAAU,eAAe,YAAY;AAC5C;;;ACtCA,SAAS,YAAAA,iBAAgB;;;ACAzB,SAAS,iBAAiB,QAAQ,gBAAgB;AAG3C,SAAS,mBACd,WACA,YAAY,MACJ;AACR,MAAI,CAAC,UAAW,QAAO;AAEvB,SAAO,UAAU,QAAQ,QAAQ,GAAG,EAAE,YAAY;AACpD;AAEA,eAAsB,QACpB,OACA,MACA,QACA,cACA,WAC6B;AAC7B,QAAM,WAAW,SAAS,IAAI,IAAI,OAAO,CAAC;AAG1C,QAAM,mBAAmB,OAAO,OAC5B,MAAM,gBAAgB,OAAO,OAAO,MAAM,EAAE,UAAU,CAAC,IACvD,CAAC;AAGL,QAAM,kBAAiB,6CAAc,QACjC,MAAM,gBAAgB,OAAO,aAAa,MAAM,EAAE,UAAU,CAAC,IAC7D,CAAC;AAGL,QAAM,aAAa,SAAS,gBAAgB,IAAI,mBAAmB,CAAC;AACpE,QAAM,WAAW,SAAS,cAAc,IAAI,iBAAiB,CAAC;AAG9D,SAAO,OAAO,OAAO,UAAU,UAAU,GAAG,QAAQ;AACtD;;;ADnCA,SAAS,UAAAC,eAAc;AAEhB,SAAS,aACd,OACA,UACA,MACA,KACA,QACM;AACN,QAAM,EAAE,OAAO,IAAIA,QAAY,GAAG;AAElC,MAAI,CAAC,SAAS;AACZ,WAAO,MAAM,2CAA2C;AAE1D,QAAM,cAA0BC,UAAS,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;AAGhE,MAAI,YAAY,MAAM;AACtB,MAAI,SAAS,cAAc,OAAO;AAEhC,gBAAY,mBAAmB,SAAS;AAAA,EAC1C;AAGA,cAAY,UAAU,SAAS;AAG/B,MAAI,SAAS,MAAO,aAAY,aAAa;AAE7C,QAAM,OAAO,OAAO;AACpB,OAAK,SAAS,WAAW,WAAW;AACtC;;;AEhCA,SAAS,UAAAC,eAAc;AAEhB,SAAS,QACd,UACA,YACA,KACA,QACM;AACN,QAAM,EAAE,QAAQ,SAAS,IAAIA,QAAY,GAAG;AAC5C,QAAM,EAAE,aAAa,IAAI;AAEzB,MAAI,CAAC,aAAc,QAAO,MAAM,0CAA0C;AAG1E,MAAI,CAAC,SAAS,SAAU,UAAS,WAAW;AAE5C,MAAI,WAAY,WAAU,cAAc,QAAW,QAAQ;AAG3D,iBAAe,MAAM;AAErB,QAAM,OAAO,OAAO;AACpB,OAAK,MAAM,oBAAI,KAAK,CAAC;AAGrB,MAAI,SAAS,qBAAqB;AAChC,SAAK,UAAU,cAAc,EAAE,4BAA4B,KAAK,CAAC;AAAA,EACnE,OAAO;AACL,SAAK,UAAU,YAAY;AAAA,EAC7B;AACF;;;AC9BA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,UAAAC,eAAc;AAEhB,SAAS,aACd,OACA,UACA,UAAsB,CAAC,GACvB,MACA,aACA,KACA,QACA,UACM;AACN,QAAM,EAAE,cAAc,SAAS,IAAI;AACnC,QAAM,YAAYD,UAAS,IAAI,IAAI,OAAO,CAAC;AAG3C,QAAM,kBAAkB,QAAQ,SAAS;AACzC,MAAI,CAAC,gBAAiB,QAAO,MAAM,kCAAkC;AAErE,QAAM,SAA4B;AAAA,IAChC,SAAS,GAAG,YAAY,IAAI,eAAe;AAAA,IAC3C,UAAU,YAAY;AAAA,IACtB,GAAG;AAAA,EACL;AAEA,QAAM,EAAE,OAAO,IAAIC,QAAO,GAAG;AAC7B,QAAM,OAAO,OAAO;AAGpB,MAAI,UAAU;AACZ,SAAK,OAAO,aAAa,QAAQ;AAAA,EACnC;AAEA,OAAK,SAAS,cAAc,MAAM;AACpC;;;ACrCA,SAAS,mBAAAC,wBAAuB;AAahC,eAAsB,gBACpB,OACA,UACA,WAC8C;AAC9C,QAAM,KAAK,SAAS;AACpB,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,WAAoC,CAAC;AAE3C,MAAI,GAAG,OAAO;AACZ,UAAM,MAAM,MAAMA,iBAAgB,OAAO,GAAG,OAAO,EAAE,UAAU,CAAC;AAChE,QAAI,IAAK,UAAS,QAAQ;AAAA,EAC5B;AACA,MAAI,GAAG,cAAc;AACnB,UAAM,MAAM,MAAMA,iBAAgB,OAAO,GAAG,cAAc,EAAE,UAAU,CAAC;AACvE,QAAI,IAAK,UAAS,eAAe;AAAA,EACnC;AACA,MAAI,GAAG,SAAS;AACd,UAAM,UAAmC,CAAC;AAC1C,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,GAAG,OAAO,GAAG;AACvD,UAAI,SAAS;AACX,cAAM,MAAM,MAAMA,iBAAgB,OAAO,SAAS,EAAE,UAAU,CAAC;AAC/D,YAAI,IAAK,SAAQ,GAAG,IAAI;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,UAAS,UAAU;AAAA,EAC1D;AAEA,SAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AACvD;;;AC1CA,SAAS,eAAe;AACxB,SAAS,UAAAC,eAAc;AAEhB,IAAM,mBAAmB;AAChC,IAAM,gBAAgB;AAEf,SAAS,QACd,UACA,YACA,KACA,SACM;AACN,QAAM,EAAE,QAAQ,SAAS,IAAIA,QAAY,GAAG;AAC5C,QAAM,EAAE,aAAa,WAAW,OAAO,IAAI;AAC3C,QAAM,gBAAgB,aAAa;AAInC,QAAM,WAAW,OAAO,aAAa;AACrC,QAAM,iBAA4B,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAClE,SAAO,aAAa,IAAI;AAExB,iBAAe,KAAK;AAAA,IAClB,cAAa,oBAAI,KAAK,GAAE,QAAQ;AAAA,IAChC,OAAO;AAAA,EACT,CAAC;AAGD,MAAI,cAAc;AAChB,IAAAC,WAAU,aAAa,UAAU,eAAe,eAAe,QAAQ;AAC3E;AAEA,SAASA,WACP,aACA,KACA,eACA,WAAqB,WAAW,UAChC;AACA,QAAM,KAAK,iBAAiB,mBAAmB,QAAQ,gBAAgB;AACvE,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,MAAM,MAAM,cAAc;AACjC,WAAS,KAAK,YAAY,MAAM;AAClC;;;AC1CA,SAAS,WAAAC,UAAS,YAAAC,iBAAgB;AAClC,SAAS,UAAAC,eAAc;AAGhB,SAAS,aACd,OACA,UACA,UAAsB,CAAC,GACvB,MACA,KACA,SACM;AACN,QAAM,EAAE,OAAO,IAAIC,QAAY,GAAG;AAClC,QAAM,MAAM,EAAE,OAAO,MAAM,KAAK;AAEhC,QAAM,gBAAgB,SAAS,aAAa;AAC5C,QAAM,WAAW,OAAO,aAAa;AACrC,QAAM,iBAA4BC,SAAQ,QAAQ,IAAI,WAAW,CAAC;AAClE,SAAO,aAAa,IAAI;AAExB,iBAAe,KAAK;AAAA,IAClB,GAAG;AAAA,IACH,GAAIC,UAAS,IAAI,IAAI,OAAO;AAAA,EAC9B,CAAC;AACH;;;ACtBO,IAAM,0BAA0C;AAAA,EACrD,WAAW,CAAC,cAAc,gBAAgB,oBAAoB;AAAA,EAC9D,YAAY,CAAC,mBAAmB;AAClC;AAEA,IAAM,0BAA0B;AAGzB,SAAS,sBACd,UAC4B;AAC5B,QAAM,EAAE,OAAO,KAAK,IAAI;AACxB,MAAI,SAAS,MAAO,QAAO;AAC3B,SAAO,SAAS,OAAO,0BAA0B;AACnD;AAGO,SAAS,kBAAkB,SAAmC;AACnE,QAAM,SAAS,oBAAI,IAAY;AAC/B,SAAO,OAAO,OAAO,EAAE,QAAQ,CAAC,UAAU;AACxC,KAAC,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA,EACvE,CAAC;AACD,SAAO,CAAC,GAAG,MAAM;AACnB;AAOO,SAAS,oBACd,UAC+C;AAC/C,QAAM,UAAU,sBAAsB,QAAQ;AAC9C,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,SAAS,kBAAkB,OAAO;AACxC,MAAI,CAAC,OAAO,OAAQ,QAAO;AAE3B,QAAM,SAA4C,CAAC;AACnD,SAAO,QAAQ,CAAC,MAAO,OAAO,CAAC,IAAI,QAAS;AAE5C,QAAM,EAAE,cAAc,IAAI;AAC1B,MAAI;AACF,WAAO,kBACL,OAAO,kBAAkB,WACrB,gBACA;AAER,SAAO;AACT;AAQO,SAAS,iBACd,eACA,UACS;AACT,MAAI,iBAAiB,OAAO,KAAK,aAAa,EAAE,SAAS,EAAG,QAAO;AACnE,SAAO,CAAC,CAAC,SAAS;AACpB;;;ACxDA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,UAAAC,eAAc;;;ACbvB;;;ADmBA,IAAI,oBAAoB;AAGjB,SAAS,oBAA0B;AACxC,sBAAoB;AACtB;AAMA,SAAS,oBAAoB,QAAgB,KAA4B;AACvE,QAAM,WAAW,OAAO,YAAY,CAAC;AACrC,MAAI,kBAAmB;AACvB,MAAI,CAAC,iBAAiB,OAAO,SAAS,QAAQ,EAAG;AAEjD,QAAM,iBAAiB,oBAAoB,QAAQ;AACnD,MAAI,CAAC,eAAgB;AAErB,QAAM,EAAE,OAAO,IAAIC,QAAY,GAAG;AAClC,QAAM,OAAO,eAAe,MAAM;AAClC,MAAI,CAAC,KAAM;AAEX,OAAK,WAAW,WAAW,cAAc;AACzC,sBAAoB;AACtB;AAEO,IAAM,kBAA+B;AAAA,EAC1C,MAAM;AAAA;AAAA;AAAA,EAIN,OAAO,CAAC,kBAAkB;AAAA,EAE1B,QAAQ,EAAE,UAAU,CAAC,EAAE;AAAA,EAEvB,KAAK,EAAE,QAAQ,KAAK,OAAO,GAAG;AAC5B,UAAM,EAAE,WAAW,CAAC,GAAG,WAAW,IAAI;AACtC,UAAM,EAAE,KAAK,KAAK,IAAI,IAAI;AAG1B,QAAI,EAAC,2BAAK,kBAAiB,EAAC,2BAAK,iBAAgB,EAAC,2BAAK,cAAa;AAClE,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAGA,wBAAoB,QAAQ,GAAG;AAG/B,QAAI,2BAAK,eAAe;AACtB,cAAQ,KAAK,YAAY,KAAK,MAAM;AAAA,IACtC;AAGA,QAAI,2BAAK,cAAc;AACrB,cAAQ,KAAK,YAAY,KAAK,MAAM;AAAA,IACtC;AAGA,QAAI,2BAAK,aAAa;AACpB,cAAQ,KAAK,YAAY,KAAK,MAAM;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,OAAO,EAAE,QAAQ,OAAO,CAAC,GAAG,MAAM,KAAK,WAAW,OAAO,GAAG;AACrE,UAAM,EAAE,WAAW,CAAC,EAAE,IAAI;AAC1B,UAAM,EAAE,KAAK,KAAK,IAAI,IAAI;AAC1B,UAAM,eAAe,KAAK,YAAY,CAAC;AAGvC,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI,2BAAK,eAAe;AACtB,mBAAa,OAAO,KAAK,SAAS,KAAK,MAAM;AAAA,IAC/C;AAGA,QAAI;AACJ,SAAI,2BAAK,kBAAgB,2BAAK,sBAAqB;AACjD,oBAAc,MAAM,gBAAgB,OAAO,KAAK,SAAS;AAAA,IAC3D;AAIA,SAAI,2BAAK,iBAAgB,KAAK,MAAM;AAClC;AAAA,QACE;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,2BAAK,aAAa;AACpB,mBAAa,OAAO,KAAK,aAAa,KAAK,SAAS,KAAK,MAAM;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,GAAG,MAAM,SAAS;AAnJpB;AAqJI,QAAI,SAAS,aAAa,CAACC,UAAS,QAAQ,IAAI,EAAG;AAEnD,UAAM,UAAU,QAAQ;AAKxB,UAAM,aAAY,aAAQ,WAAR,mBAAgB,aAAY,CAAC;AAG/C,UAAM,UAAU,sBAAsB,QAAQ;AAC9C,QAAI,CAAC,QAAS;AAGd,UAAM,EAAE,OAAO,IAAID,QAAY,QAAQ,GAAU;AACjD,UAAM,OAAO,OAAO;AACpB,QAAI,CAAC,KAAM;AAIX,QAAI,CAAC,mBAAmB;AACtB,YAAM,iBAAiB,oBAAoB,QAAQ;AACnD,UAAI,eAAgB,MAAK,WAAW,WAAW,cAAc;AAC7D,0BAAoB;AAAA,IACtB;AAGA,UAAM,cAAoD,CAAC;AAG3D,WAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,eAAe,OAAO,MAAM;AAC5D,YAAM,aAAa,QAAQ,aAAa;AACxC,UAAI,CAAC,WAAY;AAEjB,YAAM,SAAS,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AACnE,YAAM,eAAe,UAAU,YAAY;AAE3C,aAAO,QAAQ,CAAC,UAAU;AACxB,oBAAY,KAAK,IAAI;AAAA,MACvB,CAAC;AAAA,IACH,CAAC;AAGD,QAAI,OAAO,KAAK,WAAW,EAAE,WAAW,EAAG;AAG3C,SAAK,WAAW,UAAU,WAAW;AAAA,EACvC;AACF;AAEA,IAAO,gBAAQ;","names":["isObject","getEnv","isObject","getEnv","isObject","getEnv","getMappingValue","getEnv","addScript","isArray","isObject","getEnv","getEnv","isArray","isObject","isObject","getEnv","getEnv","isObject"]}
1
+ {"version":3,"sources":["../src/shared/gtag.ts","../src/ga4/config.ts","../src/ga4/push.ts","../src/shared/mapping.ts","../src/ads/config.ts","../src/ads/push.ts","../src/ads/userData.ts","../src/gtm/config.ts","../src/gtm/push.ts","../src/shared/consent.ts","../src/index.ts","../src/types/index.ts"],"sourcesContent":["// Gtag script loading and initialization utilities\n\nimport type { WindowWithDataLayer } from '../types';\n\nconst loadedScripts = new Set<string>();\n\n// For testing: allow resetting loaded scripts\nexport function resetLoadedScripts(): void {\n loadedScripts.clear();\n}\n\nexport function addScript(\n id: string,\n src = 'https://www.googletagmanager.com/gtag/js?id=',\n document: Document = globalThis.document,\n): void {\n // Prevent loading the same script multiple times\n if (loadedScripts.has(id)) return;\n\n const script = document.createElement('script');\n script.src = src + id;\n document.head.appendChild(script);\n loadedScripts.add(id);\n}\n\nexport function initializeGtag(\n window: WindowWithDataLayer,\n): Gtag.Gtag | undefined {\n const w = window;\n\n // Setup dataLayer if not exists\n w.dataLayer = w.dataLayer || [];\n\n // Setup gtag function if not exists\n if (!w.gtag) {\n w.gtag = function () {\n w.dataLayer.push(arguments);\n };\n }\n\n return w.gtag;\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GA4Settings, Env } from '../types';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initGA4(\n settings: GA4Settings,\n loadScript: boolean | undefined,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { measurementId, transport_url, server_container_url, pageview } =\n settings;\n\n if (!measurementId) logger.throw('Config settings ga4.measurementId missing');\n\n // Load the gtag script. With a GA4 server container configured, load gtag.js\n // first-party from that container instead of googletagmanager.com.\n if (loadScript) {\n const src = server_container_url\n ? `${server_container_url.replace(/\\/$/, '')}/gtag/js?id=`\n : undefined;\n addScript(measurementId, src, document);\n }\n\n // Initialize gtag infrastructure\n initializeGtag(window);\n\n const gtagSettings: WalkerOS.AnyObject = {};\n\n // custom transport_url\n if (transport_url) gtagSettings.transport_url = transport_url;\n\n // custom server_container_url\n if (server_container_url)\n gtagSettings.server_container_url = server_container_url;\n\n // disable pageviews\n if (pageview === false) gtagSettings.send_page_view = false;\n\n const gtag = window.gtag!;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', measurementId, gtagSettings);\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GA4Settings, Parameters, Env } from '../types';\nimport { isObject } from '@walkeros/core';\nimport { normalizeEventName } from '../shared/mapping';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushGA4Event(\n event: WalkerOS.Event,\n settings: GA4Settings,\n data: WalkerOS.AnyObject,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window } = getEnv<Env>(env);\n\n if (!settings.measurementId)\n logger.throw('Config settings ga4.measurementId missing');\n\n const eventParams: Parameters = isObject(data) ? { ...data } : {};\n\n // Event name (snake_case default)\n let eventName = event.name; // Assume custom mapped name\n if (settings.snakeCase !== false) {\n // Use snake case if not disabled\n eventName = normalizeEventName(eventName);\n }\n\n // Set the GA4 stream id\n eventParams.send_to = settings.measurementId;\n\n // Debug mode\n if (settings.debug) eventParams.debug_mode = true;\n\n const gtag = window.gtag!;\n gtag('event', eventName, eventParams);\n}\n","// Shared mapping utilities for all Google tools\nimport type { WalkerOS, Collector } from '@walkeros/core';\nimport { getMappingValue, assign, isObject } from '@walkeros/core';\nimport type { BaseSettings, Config } from '../types';\n\nexport function normalizeEventName(\n eventName: string,\n snakeCase = true,\n): string {\n if (!snakeCase) return eventName;\n\n return eventName.replace(/\\s+/g, '_').toLowerCase();\n}\n\nexport async function getData(\n event: WalkerOS.Event,\n data: WalkerOS.AnyObject | undefined,\n config: Config,\n toolSettings: BaseSettings | undefined,\n collector: Collector.Instance,\n): Promise<WalkerOS.AnyObject> {\n const baseData = isObject(data) ? data : {};\n\n // Get config-level mapped data\n const configMappedData = config.data\n ? await getMappingValue(event, config.data, { collector })\n : {};\n\n // Get tool-specific mapped data\n const toolMappedData = toolSettings?.data\n ? await getMappingValue(event, toolSettings.data, { collector })\n : {};\n\n // Ensure all values are objects before merging\n const configData = isObject(configMappedData) ? configMappedData : {};\n const toolData = isObject(toolMappedData) ? toolMappedData : {};\n\n // Merge with proper priority: base <- config <- tool\n return assign(assign(baseData, configData), toolData);\n}\n","import type { Logger } from '@walkeros/core';\nimport type { AdsSettings, Env } from '../types';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initAds(\n settings: AdsSettings,\n loadScript: boolean | undefined,\n env: Env | undefined,\n logger: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { conversionId } = settings;\n\n if (!conversionId) logger.throw('Config settings ads.conversionId missing');\n\n // Default currency value\n if (!settings.currency) settings.currency = 'EUR';\n\n if (loadScript) addScript(conversionId, undefined, document);\n\n // Initialize gtag infrastructure\n initializeGtag(window);\n\n const gtag = window.gtag!;\n gtag('js', new Date());\n\n // gtag init call\n if (settings.enhancedConversions) {\n gtag('config', conversionId, { allow_enhanced_conversions: true });\n } else {\n gtag('config', conversionId);\n }\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { AdsSettings, AdsMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushAdsEvent(\n event: WalkerOS.Event,\n settings: AdsSettings,\n mapping: AdsMapping = {},\n data: unknown,\n mappingName: string | undefined,\n env: DestinationWeb.Env | undefined,\n logger: Logger.Instance,\n userData?: Record<string, unknown>,\n): void {\n const { conversionId, currency } = settings;\n const eventData = isObject(data) ? data : {};\n\n // Use label from mapping settings, fallback to mappingName for backward compatibility\n const conversionLabel = mapping.label || mappingName;\n if (!conversionLabel) logger.throw('Config mapping ads.label missing');\n\n const params: Gtag.CustomParams = {\n send_to: `${conversionId}/${conversionLabel}`,\n currency: currency || 'EUR',\n ...eventData,\n };\n\n const { window } = getEnv(env);\n const gtag = window.gtag as Gtag.Gtag;\n\n // Set user data for enhanced conversions (must be before conversion event)\n if (userData) {\n gtag('set', 'user_data', userData);\n }\n\n gtag('event', 'conversion', params);\n}\n","import type { WalkerOS, Collector } from '@walkeros/core';\nimport { getMappingValue } from '@walkeros/core';\nimport type { AdsSettings } from '../types';\n\n/**\n * Resolves user data for Google Enhanced Conversions.\n *\n * enhancedConversions is a UserDataMapping: each field is a mapping value\n * resolved against the event via getMappingValue. Map from event.user\n * (like `user.email`), event.data, or anywhere a mapping value can reach.\n *\n * Returns undefined if no enhanced conversions configured or no user\n * data resolved (the set user_data call should be skipped in that case).\n */\nexport async function resolveUserData(\n event: WalkerOS.Event,\n settings: AdsSettings,\n collector: Collector.Instance,\n): Promise<Record<string, unknown> | undefined> {\n const ec = settings.enhancedConversions;\n if (!ec) return undefined;\n\n const userData: Record<string, unknown> = {};\n\n if (ec.email) {\n const val = await getMappingValue(event, ec.email, { collector });\n if (val) userData.email = val;\n }\n if (ec.phone_number) {\n const val = await getMappingValue(event, ec.phone_number, { collector });\n if (val) userData.phone_number = val;\n }\n if (ec.address) {\n const address: Record<string, unknown> = {};\n for (const [key, mapping] of Object.entries(ec.address)) {\n if (mapping) {\n const val = await getMappingValue(event, mapping, { collector });\n if (val) address[key] = val;\n }\n }\n if (Object.keys(address).length > 0) userData.address = address;\n }\n\n return Object.keys(userData).length > 0 ? userData : undefined;\n}\n","import type { Logger } from '@walkeros/core';\nimport type { GTMSettings, Env } from '../types';\nimport { isArray } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport const defaultDataLayer = 'dataLayer';\nconst defaultDomain = 'https://www.googletagmanager.com/gtm.js?id=';\n\nexport function initGTM(\n settings: GTMSettings,\n loadScript?: boolean,\n env?: Env,\n _logger?: Logger.Instance,\n): void {\n const { window, document } = getEnv<Env>(env);\n const { containerId, dataLayer, domain } = settings;\n const dataLayerName = dataLayer || defaultDataLayer;\n\n // Initialize the dataLayer (default or custom name). Custom names resolve\n // through Window's index signature as `unknown`, so narrow before reuse.\n const existing = window[dataLayerName];\n const dataLayerArray: unknown[] = isArray(existing) ? existing : [];\n window[dataLayerName] = dataLayerArray;\n\n dataLayerArray.push({\n 'gtm.start': new Date().getTime(),\n event: 'gtm.js',\n });\n\n // Load the gtm script and container\n if (loadScript && containerId)\n addScript(containerId, domain || defaultDomain, dataLayerName, document);\n}\n\nfunction addScript(\n containerId: string,\n src: string,\n dataLayerName: string,\n document: Document = globalThis.document,\n) {\n const dl = dataLayerName != defaultDataLayer ? '&l=' + dataLayerName : '';\n const script = document.createElement('script');\n script.src = src + containerId + dl;\n document.head.appendChild(script);\n}\n","import type { WalkerOS, Logger } from '@walkeros/core';\nimport type { GTMSettings, GTMMapping, Env } from '../types';\nimport { isArray, isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\nimport { defaultDataLayer } from './config';\n\nexport function pushGTMEvent(\n event: WalkerOS.Event,\n settings: GTMSettings,\n mapping: GTMMapping = {},\n data: unknown,\n env?: Env,\n _logger?: Logger.Instance,\n): void {\n const { window } = getEnv<Env>(env);\n const obj = { event: event.name }; // Use the name mapping by default\n\n const dataLayerName = settings.dataLayer || defaultDataLayer;\n const existing = window[dataLayerName];\n const dataLayerArray: unknown[] = isArray(existing) ? existing : [];\n window[dataLayerName] = dataLayerArray;\n\n dataLayerArray.push({\n ...obj,\n ...(isObject(data) ? data : event),\n });\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { ConsentMapping, Settings } from '../types';\n\n// walkerOS consent groups -> gtag consent parameters\nexport const DEFAULT_CONSENT_MAPPING: ConsentMapping = {\n marketing: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n functional: ['analytics_storage'],\n};\n\nconst DEFAULT_WAIT_FOR_UPDATE = 500;\n\n/** Resolve the active mapping, or undefined when consent mode is disabled. */\nexport function resolveConsentMapping(\n settings: Partial<Settings>,\n): ConsentMapping | undefined {\n const { como = true } = settings;\n if (como === false) return undefined;\n return como === true ? DEFAULT_CONSENT_MAPPING : como;\n}\n\n/** Flatten a mapping to the unique set of gtag parameter names. */\nexport function collectGtagParams(mapping: ConsentMapping): string[] {\n const params = new Set<string>();\n Object.values(mapping).forEach((value) => {\n (Array.isArray(value) ? value : [value]).forEach((p) => params.add(p));\n });\n return [...params];\n}\n\n/**\n * Build the `consent default` object (all params denied), or undefined when\n * consent mode is disabled or the mapping yields no params. Adds\n * `wait_for_update` when `como_advanced` is truthy.\n */\nexport function buildDefaultConsent(\n settings: Partial<Settings>,\n): Record<string, 'denied' | number> | undefined {\n const mapping = resolveConsentMapping(settings);\n if (!mapping) return undefined;\n\n const params = collectGtagParams(mapping);\n if (!params.length) return undefined;\n\n const result: Record<string, 'denied' | number> = {};\n params.forEach((p) => (result[p] = 'denied'));\n\n const { como_advanced } = settings;\n if (como_advanced)\n result.wait_for_update =\n typeof como_advanced === 'number'\n ? como_advanced\n : DEFAULT_WAIT_FOR_UPDATE;\n\n return result;\n}\n\n/**\n * Is consent genuinely in play, decided from the destination's OWN config only?\n * config.consent set (basic/gated) or como_advanced truthy (advanced). Never\n * reads collector state, and never config.require (consumed by the collector\n * before init runs).\n */\nexport function hasConsentSignal(\n configConsent: WalkerOS.Consent | undefined,\n settings: Partial<Settings>,\n): boolean {\n if (configConsent && Object.keys(configConsent).length > 0) return true;\n return !!settings.como_advanced;\n}\n","import type { WalkerOS, On, Collector, Logger } from '@walkeros/core';\nimport type { Settings, Destination, Env, Config } from './types';\nimport { initGA4, pushGA4Event } from './ga4';\nimport { initAds, pushAdsEvent, resolveUserData } from './ads';\nimport { initGTM, pushGTMEvent } from './gtm';\nimport { getData } from './shared/mapping';\nimport {\n buildDefaultConsent,\n hasConsentSignal,\n resolveConsentMapping,\n} from './shared/consent';\nimport { initializeGtag } from './shared/gtag';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\n// Types\nexport * as DestinationGtag from './types';\n\n// Track whether default consent has been set\nlet defaultConsentSet = false;\n\n// For testing: allow resetting consent state\nexport function resetConsentState(): void {\n defaultConsentSet = false;\n}\n\n// Establish the Consent Mode v2 denied baseline BEFORE any tool's config call,\n// per Google's required ordering. Gated on the destination's OWN config: a\n// consent signal (config.consent set, or como_advanced) and como !== false.\n// Idempotent via defaultConsentSet (consent state is window-global).\nfunction setupConsentDefault(config: Config, env: Env | undefined): void {\n const settings = config.settings || {};\n if (defaultConsentSet) return;\n if (!hasConsentSignal(config.consent, settings)) return;\n\n const defaultConsent = buildDefaultConsent(settings);\n if (!defaultConsent) return; // como:false or no params\n\n const { window } = getEnv<Env>(env);\n const gtag = initializeGtag(window); // ensure stub exists before any config\n if (!gtag) return;\n\n gtag('consent', 'default', defaultConsent);\n defaultConsentSet = true;\n}\n\nexport const destinationGtag: Destination = {\n type: 'google-gtag',\n\n // Observable env callable for trace-level vendor-call capture. Mirrors the\n // dev-env simulation list (src/examples/env.ts).\n calls: ['call:window.gtag'],\n\n config: { settings: {} },\n\n init({ config, env, logger }) {\n const { settings = {}, loadScript } = config;\n const { ga4, ads, gtm } = settings;\n\n // Fail if no tools are configured\n if (!ga4?.measurementId && !ads?.conversionId && !gtm?.containerId) {\n logger.throw(\n 'Config settings missing. Set ga4.measurementId, ads.conversionId, or gtm.containerId',\n );\n }\n\n // Emit the denied consent default before any tool's config call.\n setupConsentDefault(config, env);\n\n // Initialize GA4 if configured\n if (ga4?.measurementId) {\n initGA4(ga4, loadScript, env, logger);\n }\n\n // Initialize Google Ads if configured\n if (ads?.conversionId) {\n initAds(ads, loadScript, env, logger);\n }\n\n // Initialize GTM if configured\n if (gtm?.containerId) {\n initGTM(gtm, loadScript, env, logger);\n }\n\n return config;\n },\n\n async push(event, { config, rule = {}, data, env, collector, logger }) {\n const { settings = {} } = config;\n const { ga4, ads, gtm } = settings;\n const eventMapping = rule.settings || {};\n\n // Resolve data for each tool with proper priority\n const ga4Data = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n ga4,\n collector,\n );\n const adsData = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n ads,\n collector,\n );\n const gtmData = await getData(\n event,\n data as WalkerOS.AnyObject,\n config,\n gtm,\n collector,\n );\n\n // Push to GA4 if configured\n if (ga4?.measurementId) {\n pushGA4Event(event, ga4, ga4Data, env, logger);\n }\n\n // Resolve enhanced conversions user data if configured\n let adsUserData: Record<string, unknown> | undefined;\n if (ads?.conversionId && ads?.enhancedConversions) {\n adsUserData = await resolveUserData(event, ads, collector);\n }\n\n // @TODO: Fix condition - should check for rule.settings?.ads?.label || rule.name\n // Currently requires rule.name even when label is provided via settings.ads.label\n if (ads?.conversionId && rule.name) {\n pushAdsEvent(\n event,\n ads,\n eventMapping.ads,\n adsData,\n rule.name,\n env,\n logger,\n adsUserData,\n );\n }\n\n // Push to GTM if configured\n if (gtm?.containerId) {\n pushGTMEvent(event, gtm, eventMapping.gtm, gtmData, env, logger);\n }\n },\n\n on(type, context) {\n // Only handle consent events\n if (type !== 'consent' || !isObject(context.data)) return;\n\n const consent = context.data;\n // `on` runs with the runtime (non-generic) context, so config.settings and\n // env surface as the loose base types. Narrowing them to this destination's\n // own Settings/Env needs a core-types change to make `on` generic over\n // Types; tracked as a follow-up. The two `as` casts mark that boundary.\n const settings = (context.config?.settings || {}) as Partial<Settings>;\n\n // Skip if consent mode is disabled (como === false)\n const mapping = resolveConsentMapping(settings);\n if (!mapping) return;\n\n // gtag is available after init() - on() is only called after init completes\n const { window } = getEnv<Env>(context.env as Env);\n const gtag = window.gtag;\n if (!gtag) return;\n\n // Safety net for setups that fire consent without init having seen a signal:\n // establish the denied default once before the first update.\n if (!defaultConsentSet) {\n const defaultConsent = buildDefaultConsent(settings);\n if (defaultConsent) gtag('consent', 'default', defaultConsent);\n defaultConsentSet = true;\n }\n\n // Build gtag consent object for update\n const gtagConsent: Record<string, 'granted' | 'denied'> = {};\n\n // Map walkerOS consent to gtag consent parameters for update\n Object.entries(consent).forEach(([walkerOSGroup, granted]) => {\n const gtagParams = mapping[walkerOSGroup];\n if (!gtagParams) return;\n\n const params = Array.isArray(gtagParams) ? gtagParams : [gtagParams];\n const consentValue = granted ? 'granted' : 'denied';\n\n params.forEach((param) => {\n gtagConsent[param] = consentValue;\n });\n });\n\n // Only proceed if we have consent parameters to update\n if (Object.keys(gtagConsent).length === 0) return;\n\n // Always use update after the initial default\n gtag('consent', 'update', gtagConsent);\n },\n};\n\nexport default destinationGtag;\n","import type {\n Mapping as WalkerOSMapping,\n Destination as CoreDestination,\n} from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\n// Extend Window interface with specific dataLayer typing\nexport interface WindowWithDataLayer extends Window {\n dataLayer: unknown[];\n gtag?: Gtag.Gtag;\n [key: string]: unknown; // For custom dataLayer names and other properties\n}\n\ndeclare global {\n interface Window {\n gtag?: Gtag.Gtag;\n [key: string]: unknown; // For custom dataLayer names and other properties\n }\n}\n\n// Gtag-specific environment interface\nexport interface Env extends DestinationWeb.Env {\n window: {\n // Optional: the SDK global is absent until `initializeGtag` installs it.\n gtag?: Gtag.Gtag;\n dataLayer: unknown[];\n };\n document: {\n createElement: (tagName: string) => {\n src: string;\n async?: boolean;\n setAttribute: (name: string, value: string) => void;\n removeAttribute: (name: string) => void;\n };\n head: {\n appendChild: (node: unknown) => void;\n };\n };\n}\n\n// Consent mode configuration\nexport type ConsentMode =\n | false // Disable consent mode\n | true // Use default mapping\n | ConsentMapping; // Custom mapping\n\nexport interface ConsentMapping {\n [walkerOSConsentGroup: string]: string | string[];\n}\n\n// Type bundle\nexport type Types = CoreDestination.Types<Settings, Mapping, Env, InitSettings>;\n\nexport type Destination = DestinationWeb.Destination<Types>;\nexport type Config = DestinationWeb.Config<Types>;\n\n// Base settings interface with data field\nexport interface BaseSettings {\n data?: WalkerOSMapping.Value | WalkerOSMapping.Values;\n}\n\n// Unified settings for all Google tools\nexport interface Settings {\n // Consent mode configuration\n como?: ConsentMode;\n // Advanced consent mode (non-EU): emit the denied default at page load and\n // add `wait_for_update`. `true` => wait_for_update: 500; a number sets the ms.\n // Leave unset for basic mode (the EU-safe default).\n como_advanced?: boolean | number;\n // GA4 settings\n ga4?: GA4Settings;\n // Google Ads settings\n ads?: AdsSettings;\n // GTM settings\n gtm?: GTMSettings;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\n// GA4-specific settings\nexport interface GA4Settings extends BaseSettings {\n measurementId: string;\n debug?: boolean;\n pageview?: boolean;\n server_container_url?: string;\n snakeCase?: boolean;\n transport_url?: string;\n}\n\n// Google Ads specific settings\nexport interface AdsSettings extends BaseSettings {\n conversionId: string;\n currency?: string;\n /** Enhanced conversions: maps walkerOS event fields to Google user_data fields. */\n enhancedConversions?: UserDataMapping;\n}\n\nexport interface UserDataMapping {\n email?: WalkerOSMapping.Value;\n phone_number?: WalkerOSMapping.Value;\n address?: {\n first_name?: WalkerOSMapping.Value;\n last_name?: WalkerOSMapping.Value;\n street?: WalkerOSMapping.Value;\n city?: WalkerOSMapping.Value;\n region?: WalkerOSMapping.Value;\n postal_code?: WalkerOSMapping.Value;\n country?: WalkerOSMapping.Value;\n };\n}\n\n// Google Ads specific mapping\nexport interface AdsMapping {\n label?: string; // Conversion label for this specific event\n}\n\n// GTM specific settings\nexport interface GTMSettings extends BaseSettings {\n containerId: string;\n dataLayer?: string;\n domain?: string;\n}\n\n// Unified mapping interface\nexport interface Mapping {\n ga4?: GA4Mapping;\n ads?: AdsMapping;\n gtm?: GTMMapping;\n}\n\n// GA4-specific mapping\nexport interface GA4Mapping {}\n\n// GTM specific mapping\nexport interface GTMMapping {}\n\nexport type Rule = WalkerOSMapping.Rule<Mapping>;\nexport type Rules = WalkerOSMapping.Rules<Rule>;\nexport type Param = WalkerOSMapping.Value;\n\nexport type Parameters = Gtag.ControlParams &\n Gtag.EventParams &\n Gtag.CustomParams;\n"],"mappings":"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","names":["isObject","getEnv","isObject","getEnv","isObject","getEnv","getMappingValue","getEnv","addScript","isArray","isObject","getEnv","getEnv","isArray","isObject","isObject","getEnv","getEnv","isObject"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/web-destination-gtag",
4
- "version": "4.3.1",
4
+ "version": "4.3.2",
5
5
  "type": "destination",
6
6
  "platform": [
7
7
  "web"
@@ -431,7 +431,7 @@
431
431
  "consent": {
432
432
  "functional": true
433
433
  },
434
- "id": "a9d33123fb791b45",
434
+ "id": "750e81adc774c778",
435
435
  "trigger": "click",
436
436
  "entity": "product",
437
437
  "action": "add",
@@ -581,7 +581,7 @@
581
581
  "consent": {
582
582
  "functional": true
583
583
  },
584
- "id": "9bc066a19ee657db",
584
+ "id": "5bc0f067f3e859be",
585
585
  "trigger": "load",
586
586
  "entity": "order",
587
587
  "action": "complete",
@@ -795,7 +795,7 @@
795
795
  "source_schema": "4",
796
796
  "source_count": 1,
797
797
  "source_trace": "1700000106abcdef1700000106abcdef",
798
- "source_release_default": "4.3.1",
798
+ "source_release_default": "4.3.2",
799
799
  "event_entity": "page",
800
800
  "event_action": "view",
801
801
  "event_trigger": "load",
@@ -888,7 +888,7 @@
888
888
  "consent": {
889
889
  "functional": true
890
890
  },
891
- "id": "c3437163dde00840",
891
+ "id": "feea9fdb34316a2d",
892
892
  "trigger": "load",
893
893
  "entity": "order",
894
894
  "action": "complete",
@@ -968,7 +968,7 @@
968
968
  "consent": {
969
969
  "functional": true
970
970
  },
971
- "id": "3b109da2dab671dd",
971
+ "id": "9f474eece4f7d40d",
972
972
  "trigger": "load",
973
973
  "entity": "page",
974
974
  "action": "view",
@@ -1104,7 +1104,7 @@
1104
1104
  "consent": {
1105
1105
  "functional": true
1106
1106
  },
1107
- "id": "9b4576cce8b123ad",
1107
+ "id": "589ad698bc6c8241",
1108
1108
  "trigger": "load",
1109
1109
  "entity": "order",
1110
1110
  "action": "complete",
@@ -1226,7 +1226,7 @@
1226
1226
  "consent": {
1227
1227
  "functional": true
1228
1228
  },
1229
- "id": "e0ef61e32f98c7af",
1229
+ "id": "e215247d9347ac60",
1230
1230
  "trigger": "load",
1231
1231
  "entity": "page",
1232
1232
  "action": "view",
@@ -1330,7 +1330,7 @@
1330
1330
  "consent": {
1331
1331
  "functional": true
1332
1332
  },
1333
- "id": "873af055e8653251",
1333
+ "id": "bf06b11131e4d071",
1334
1334
  "trigger": "load",
1335
1335
  "entity": "order",
1336
1336
  "action": "complete",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/web-destination-gtag",
3
3
  "description": "Unified Google destination for walkerOS (GA4, Ads, GTM)",
4
- "version": "4.3.1",
4
+ "version": "4.3.2",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -38,8 +38,8 @@
38
38
  "update": "npx npm-check-updates -u && npm update"
39
39
  },
40
40
  "dependencies": {
41
- "@walkeros/core": "4.3.1",
42
- "@walkeros/web-core": "4.3.1"
41
+ "@walkeros/core": "4.3.2",
42
+ "@walkeros/web-core": "4.3.2"
43
43
  },
44
44
  "repository": {
45
45
  "url": "git+https://github.com/elbwalker/walkerOS.git",